fastlink-4.1P-fix95/0000755000265600020320000000000011117263771013405 5ustar tilleaadminfastlink-4.1P-fix95/paper2.ps0000644000265600020320000050610706506236520015151 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvips 5.495 Copyright 1986, 1992 Radical Eye Software %%Title: apaper.dvi %%CreationDate: Mon Jan 3 11:58:57 1994 %%Pages: 17 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips apaper.dvi -o %DVIPSSource: TeX output 1994.01.03:1158 %%BeginProcSet: tex.pro %! /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N} B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0] concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize -72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{ CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N} B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook} if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255 {IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{ pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{ gsave transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{ p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (/a/santa-bb/dancer/schaffer/linkage/avoid/final/apaper.dvi) @start /Fa 1 89 df88 D E /Fb 8 107 df0 D<400004C0000C600018300030180060 0C00C006018003030001860000CC0000780000300000300000780000CC00018600030300060180 0C00C0180060300030600018C0000C40000416187A9623>2 D<01800180018001800180C183F1 8F399C0FF003C003C00FF0399CF18FC1830180018001800180018010147D9417>I<03C00FF01F F83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF80FF003C010127D9317>15 D<0100000000020000000002000000000400000000080000000010000000002000000000FFFFFF FFFCFFFFFFFFFC2000000000100000000008000000000400000000020000000002000000000100 00000026107C922E>32 D<000F0038006000E001C001C001C001C001C001C001C001C001C001C0 01C001C001C001C001C0038007001E00F8001E000700038001C001C001C001C001C001C001C001 C001C001C001C001C001C001C001C000E000600038000F102D7DA117>102 DI106 D E /Fc 27 123 df<7FFF00FFFF80FFFF807FFF0011047D8F18>45 D<3078FCFC783006067785 18>I<0FF8003FFE007FFF00780F00700700F00780E00380E00380E00380E00380E00380E00380 E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380F00780700700780F00 7FFF003FFE000FF800111C7D9B18>79 D91 D93 D<1FE0003FF8007FFC00781E00300E00000700 00070000FF0007FF001FFF007F0700780700E00700E00700E00700F00F00781F003FFFF01FFBF0 07E1F014147D9318>97 D<01FE0007FF001FFF803E0780380300700000700000E00000E00000E0 0000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>99 D<001F80003F80001F8000038000038000038000038000038003E3800FFB801FFF803C1F80380F 80700780700380E00380E00380E00380E00380E00380E00380700780700780380F803C1F801FFF F00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F00380780700380700380E001C0E0 01C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D93 18>I<001F80007FC000FFE000E1E001C0C001C00001C00001C0007FFFC0FFFFC0FFFFC001C000 01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000 7FFF007FFF007FFF00131C7F9B18>I<01E1F007FFF80FFFF81E1E301C0E003807003807003807 003807003807001C0E001E1E001FFC001FF80039E0003800001C00001FFE001FFFC03FFFE07801 F0700070E00038E00038E00038E000387800F07E03F01FFFC00FFF8001FC00151F7F9318>I<7E 0000FE00007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F 00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFF E7FE7FC3FC171C809B18>I<03800007C00007C00007C000038000000000000000000000000000 FFC000FFC000FFC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000 01C00001C00001C00001C000FFFF00FFFF80FFFF00111D7C9C18>I107 D<7FE000FFE0007FE00000E00000E00000E00000E00000E00000E00000E00000E00000E0 0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 007FFFC0FFFFE07FFFC0131C7E9B18>I<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E 1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C 1C1C001C1C1C007F1F1F00FFBFBF807F1F1F001914819318>I<7E3E00FEFF807FFFC00FC1C00F 80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07F C3FCFFE7FE7FC3FC1714809318>I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0 E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E 9318>I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E00380E00 380E00380F00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E00000E00 000E00000E00007FC000FFE0007FC000151E809318>I<7F87E0FF9FF07FBFF803F87803F03003 E00003C00003C0000380000380000380000380000380000380000380000380000380007FFE00FF FF007FFE0015147F9318>114 D<07F7003FFF007FFF00780F00E00700E00700E007007C00007F E0001FFC0003FE00001F00600780E00380E00380F00380F80F00FFFF00FFFC00E7F00011147D93 18>I<0180000380000380000380000380007FFFC0FFFFC0FFFFC0038000038000038000038000 0380000380000380000380000380000380400380E00380E00380E001C1C001FFC000FF80003E00 13197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00 E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC1714809318>I119 D<7F8FF07F9FF07F8FF007070007 8E00039E0001DC0001F80000F80000700000F00000F80001DC00039E00038E000707000F07807F 8FF0FF8FF87F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E01C00E03800E0380070380070700 070700038700038600038E0001CE0001CE0000CC0000CC0000DC00007800007800007800007000 00700000700000F00000E00079E0007BC0007F80003F00001E0000151E7F9318>I<3FFFF07FFF F07FFFF07001E07003C0700780000F00001E00003C0000F80001F00003C0000780000F00701E00 703C0070780070FFFFF0FFFFF0FFFFF014147F9318>I E /Fd 7 115 df<07C00C201070207060 00C000C000C00080008000C010C02060C03F000C0E7E8D0F>99 D<030003800300000000000000 0000000000001C002400460046008C000C0018001800180031003100320032001C0009177F960C >105 D<00180038001000000000000000000000000001C0022004300430086000600060006000 C000C000C000C001800180018001806300E300C60078000D1D80960E>I<3E0C0C0C0C18181818 3030303060606060C0C8C8C8D07007177E960B>108 D<383C0044C6004702004602008E06000C 06000C06000C0C00180C00180C40181840181880300880300F00120E7F8D15>110 D<1C3C22462382230346030603060306030C060C060C0C0C081A3019E018001800300030003000 FC001014808D12>112 D<38F04518463846308C000C000C000C00180018001800180030003000 0D0E7F8D10>114 D E /Fe 9 117 df<0102040C1818303070606060E0E0E0E0E0E0E0E0E0E060 606070303018180C04020108227D980E>40 D<8040203018180C0C0E0606060707070707070707 07070606060E0C0C18183020408008227E980E>I<003000003000003000003000003000003000 003000003000003000003000003000FFFFFCFFFFFC003000003000003000003000003000003000 00300000300000300000300000300016187E931B>43 D<03000700FF0007000700070007000700 0700070007000700070007000700070007000700070007007FF00C157E9412>49 D<0F8030E040708030C038E0384038003800700070006000C00180030006000C08080810183FF0 7FF0FFF00D157E9412>I<0FE030306018701C701C001C00180038006007E000300018000C000E 000EE00EE00EC00C401830300FE00F157F9412>I61 D104 D<080008000800180018003800FF803800380038 00380038003800380038403840384038401C800F000A147F930E>116 D E /Ff 21 121 df<001E0000630000C38001C1800381800301C00701C00F01C00E01C01E03C01C 03C03C03C03C03C03C03C07807807FFF807FFF80780780F00F00F00F00F00F00F00E00F01E00E0 1C00E03C00E03800E0300060700060E00070C0003180001E000012207E9F15>18 D<70F8F8F87005057C840D>58 D<70F8FCFC74040404080810102040060E7C840D>I<00010003 0003000600060006000C000C000C00180018001800300030003000600060006000C000C000C001 80018001800300030003000600060006000C000C000C0018001800180030003000300060006000 6000C000C000C000102D7DA117>61 D<00007E0100038183000E00460038002E0070001E00E000 0E01C0000C0380000C0700000C0F00000C1E0000081E0000083C0000003C000000780000007800 00007800000078000000F0000000F0007FFCF00001E0F00001E0F00003C0700003C0700003C070 0003C038000780380007801C000F800C000B80060033000380C100007F000020217E9F24>71 D<00FFF9FFF0000F801F00000F001E00000F001E00000F001E00001E003C00001E003C00001E00 3C00001E003C00003C007800003C007800003C007800003C007800007800F000007FFFF0000078 00F000007800F00000F001E00000F001E00000F001E00000F001E00001E003C00001E003C00001 E003C00001E003C00003C007800003C007800003C007800003C007800007C00F8000FFF8FFF800 241F7E9E26>I<00FFFFC0000F0070000F0038000F001C000F001E001E001E001E001E001E001E 001E001E003C003C003C003C003C0078003C0070007800E000780380007FFE000078000000F000 0000F0000000F0000000F0000001E0000001E0000001E0000001E0000003C0000003C0000003C0 000003C0000007C00000FFFC00001F1F7E9E1D>80 D<00FFFF80000F00F0000F0038000F001C00 0F001C001E001E001E001E001E001E001E001E003C003C003C003C003C0078003C00F0007801C0 00780700007FFC0000780E0000F0070000F0078000F0038000F003C001E0078001E0078001E007 8001E0078003C00F0003C00F0103C00F0103C00F0207C00702FFFC038C000001F020207E9E23> 82 D<0FFFFFFC1E03C0381803C0181003C0082003C00820078008600780084007800840078008 800F0010000F0000000F0000000F0000001E0000001E0000001E0000001E0000003C0000003C00 00003C0000003C00000078000000780000007800000078000000F0000000F0000000F0000000F0 000001F000007FFFC0001E1F7F9E1B>84 D<00FFF83FF8000FC00F80000F800600000780040000 07C008000003C010000003C020000003E040000001E080000001F100000000F300000000F60000 0000FC0000000078000000007C000000007C000000007C00000000BE000000011E000000021E00 0000061F0000000C0F000000080F800000100780000020078000004007C000008003C000010003 E000030003E0000F0007E000FFE01FFE00251F7F9E26>88 DI< 07803F8007000700070007000E000E000E000E001C001C001CF01D0C3A0E3C0E380F380F700F70 0F700F700FE01EE01EE01EE01CE03CE038607060E031C01F0010207E9F14>98 D<007C01C207010E0F1E0F1C0E3C00780078007800F000F000F000F000F00170017002300C1830 0FC010147E9314>I<001E3000713800E0F001C0700380700780700700E00F00E00F00E00F00E0 1E01C01E01C01E01C01E01C01E03801E03800E07800E0B8006170001E700000700000700000E00 000E00300E00781C00F038006070003FC000151D809316>103 D<01E0000FE00001C00001C000 01C00001C000038000038000038000038000070000070000071F000761800E80C00F00C00E00E0 0E00E01C01C01C01C01C01C01C01C0380380380380380380380704700708700E08700E10700610 E006206003C016207E9F1A>I<00E001E001E000C000000000000000000000000000000E001300 23804380438043808700070007000E000E001C001C001C20384038403840388019000E000B1F7E 9E10>I<0000C00001E00001E00001C0000000000000000000000000000000000000000000001E 00006300004380008380010380010380020700000700000700000700000E00000E00000E00000E 00001C00001C00001C00001C0000380000380000380000380000700000700030700078E000F1C0 006380003E00001328819E13>I<1E07802318C023A06043C0704380704380708700E00700E007 00E00700E00E01C00E01C00E01C00E03821C03841C07041C07081C03083803101801E017147E93 1B>110 D<00F0400388C00705800E03801C03803C0380380700780700780700780700F00E00F0 0E00F00E00F00E00F01C00F01C00703C00705C0030B8000F380000380000380000700000700000 700000700000E00000E0000FFE00121D7E9314>113 D<1E1E0023210023C38043C78043878043 83008700000700000700000700000E00000E00000E00000E00001C00001C00001C00001C000038 000018000011147E9315>I<03C1C00C62201034701038F02038F0203860407000007000007000 00700000E00000E00000E00000E02061C040F1C040F1C080E2C080446300383C0014147E931A> 120 D E /Fg 36 123 df<00003FCE0000E0EE000181FC000381FC000300DC0007001C00070038 00070038000E0038000E0038000E0070000E007000FFFFF0001C0070001C00E0001C00E0001C00 E0001C00E0001C01C0003801C0003801C0003801C0003803800038038000700380007003880070 0710007007100070071000E0071000E0032000E001C000E0000000C0000001C0000001C0000031 80000079800000F3000000620000003C0000001F29829F1B>13 D<7FF0FFE07FE00C037D8A10> 45 D<70F8F8F0E005057B840E>I<00000200000006000000060000000E0000001E0000001E0000 003F0000002F0000004F0000004F0000008F0000010F0000010F0000020F0000020F0000040F00 00040F0000080F0000100F0000100F0000200F80003FFF800040078000C0078000800780010007 80010007800200078002000780060007801E000F80FF807FF81D207E9F22>65 D<0000FC040007030C001C00980030007800E0007801C000380380003003800030070000300E00 00301E0000201E0000203C0000003C00000078000000780000007800000078000000F0000000F0 00FFF0F0000780F0000780F0000F0070000F0070000F0070000F0070001E0038001E0018003E00 1C002E000E00CC000383040000FC00001E217A9F23>71 D<01FFF3FFE0001F003E00001E003C00 001E003C00001E003C00003C007800003C007800003C007800003C007800007800F000007800F0 00007800F000007800F00000F001E00000FFFFE00000F001E00000F001E00001E003C00001E003 C00001E003C00001E003C00003C007800003C007800003C007800003C007800007800F00000780 0F000007800F000007800F00000F801F0000FFF1FFE000231F7D9E22>I<001FFF0000F80000F0 0000F00000F00001E00001E00001E00001E00003C00003C00003C00003C0000780000780000780 000780000F00000F00000F00000F00001E00001E00301E00781E00F83C00F83C00F07800807000 40E00021C0001F000018207D9E18>74 D<01FFF800001F0000001E0000001E0000001E0000003C 0000003C0000003C0000003C00000078000000780000007800000078000000F0000000F0000000 F0000000F0000001E0000001E0000001E0000001E0008003C0010003C0010003C0030003C00200 078006000780060007800C0007801C000F007800FFFFF800191F7D9E1D>76 D<01FF007FE0001F000F00001F0004000017800400001780040000278008000023C008000023C0 08000023C008000041E010000041E010000041F010000040F010000080F0200000807820000080 782000008078200001003C400001003C400001003C400001001E400002001E800002001E800002 000F800002000F800004000F0000040007000004000700000C000700001C00020000FF80020000 231F7D9E22>78 D<01FFFF80001E00E0001E0070001E0038001E003C003C003C003C003C003C00 3C003C003C0078007800780078007800F0007800E000F003C000F00F0000FFFC0000F0000001E0 000001E0000001E0000001E0000003C0000003C0000003C0000003C00000078000000780000007 800000078000000F800000FFF000001E1F7D9E1F>80 D<0007E040001C18C00030058000600380 00C0038001C00180018001000380010003800100038001000380000003C0000003C0000003F800 0001FF800001FFE000007FF000001FF0000001F800000078000000780000003800000038002000 3800200038002000300060007000600060006000E0007000C000E8038000C606000081F800001A 217D9F1A>83 D<7FFC1FF807C003C00780010007800100078001000F0002000F0002000F000200 0F0002001E0004001E0004001E0004001E0004003C0008003C0008003C0008003C000800780010 00780010007800100078001000F0002000F0002000F0002000F0004000F0004000700080007001 000030020000380400000C18000007E000001D20779E22>85 D<00F1800389C00707800E03801C 03803C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C4070 5C40308C800F070013147C9317>97 D<07803F8007000700070007000E000E000E000E001C001C 001CF01D0C3A0E3C0E380F380F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031C0 1F0010207B9F15>I<007E0001C1000300800E07801E07801C07003C0000780000780000780000 F00000F00000F00000F00000F00100700100700200300C0018300007C00011147C9315>I<0000 780003F80000700000700000700000700000E00000E00000E00000E00001C00001C000F1C00389 C00707800E03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C 40F01C40703C40705C40308C800F070015207C9F17>I<007C01C207010E011C013C013802780C 7FF07800F000F000F000F000700170017002380C183007C010147C9315>I<00007800019C0003 3C00033C000718000700000700000E00000E00000E00000E00000E0001FFE0001C00001C00001C 00001C0000380000380000380000380000380000700000700000700000700000700000700000E0 0000E00000E00000E00000C00001C00001C0000180003180007B0000F300006600003C00001629 829F0E>I<003C6000E27001C1E00380E00700E00F00E00E01C01E01C01E01C01E01C03C03803C 03803C03803C03803C07003C07001C0F001C17000C2E0003CE00000E00000E00001C00001C0030 1C00783800F0700060E0003F8000141D7E9315>I<01E0000FE00001C00001C00001C00001C000 038000038000038000038000070000070000071E000763000E81800F01C00E01C00E01C01C0380 1C03801C03801C0380380700380700380700380E10700E20700C20701C20700C40E00CC0600700 14207D9F17>I<00C001E001E001C000000000000000000000000000000E003300230043804300 470087000E000E000E001C001C001C003840388030807080310033001C000B1F7C9E0E>I<01E0 000FE00001C00001C00001C00001C0000380000380000380000380000700000700000703C00704 200E08E00E11E00E21E00E40C01C80001D00001E00001FC00038E0003870003870003838407070 80707080707080703100E03100601E0013207D9F15>107 D<03C01FC003800380038003800700 0700070007000E000E000E000E001C001C001C001C0038003800380038007000700070007100E2 00E200E200E200640038000A207C9F0C>I<1C0F80F0002630C318004740640C004780680E0047 00700E004700700E008E00E01C000E00E01C000E00E01C000E00E01C001C01C038001C01C03800 1C01C038001C01C0708038038071003803806100380380E1003803806200700700660030030038 0021147C9325>I<1C0F802630C04740604780604700704700708E00E00E00E00E00E00E00E01C 01C01C01C01C01C01C03843803883803083807083803107003303001C016147C931A>I<007C00 01C3000301800E01C01E01C01C01E03C01E07801E07801E07801E0F003C0F003C0F003C0F00780 F00700700F00700E0030180018700007C00013147C9317>I<01C1E002621804741C04781C0470 1E04701E08E01E00E01E00E01E00E01E01C03C01C03C01C03C01C0380380780380700380E003C1 C0072380071E000700000700000E00000E00000E00000E00001C00001C0000FFC000171D809317 >I<1C1E002661004783804787804707804703008E00000E00000E00000E00001C00001C00001C 00001C000038000038000038000038000070000030000011147C9313>114 D<00FC030206010C030C070C060C000F800FF007F803FC003E000E700EF00CF00CE00840102060 1F8010147D9313>I<018001C0038003800380038007000700FFF007000E000E000E000E001C00 1C001C001C003800380038003820704070407080708031001E000C1C7C9B0F>I<0E00C03300E0 2301C04381C04301C04701C08703800E03800E03800E03801C07001C07001C07001C07101C0E20 180E20180E201C1E200C264007C38014147C9318>I<0E03803307802307C04383C04301C04700 C08700800E00800E00800E00801C01001C01001C01001C02001C02001C04001C04001C08000E30 0003C00012147C9315>I<0E00C1C03300E3C02301C3E04381C1E04301C0E04701C06087038040 0E0380400E0380400E0380401C0700801C0700801C0700801C0701001C0701001C0602001C0F02 000C0F04000E13080003E1F0001B147C931E>I<0383800CC4401068E01071E02071E02070C040 E00000E00000E00000E00001C00001C00001C00001C040638080F38080F38100E5810084C60078 780013147D9315>I<0E00C03300E02301C04381C04301C04701C08703800E03800E03800E0380 1C07001C07001C07001C07001C0E00180E00180E001C1E000C3C0007DC00001C00001C00003800 F03800F07000E06000C0C0004380003E0000131D7C9316>I<01C04003E08007F1800C1F000802 000004000008000010000020000040000080000100000200000401000802001002003E0C0063FC 0041F80080E00012147D9313>I E /Fh 47 123 df<000E00001E00007E0007FE00FFFE00FFFE 00F8FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE 0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE 0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFFFE17277BA622>49 D<00FF800003FFF0000F FFFC001F03FE003800FF007C007F80FE003FC0FF003FC0FF003FE0FF001FE0FF001FE07E001FE0 3C003FE000003FE000003FC000003FC000007F8000007F000000FE000000FC000001F8000003F0 000003E00000078000000F0000001E0000003C00E0007000E000E000E001C001C0038001C00700 01C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F 800003FFF00007FFFC000F81FE001F00FF003F80FF003F807F803F807F803F807F801F807F800F 007F800000FF000000FF000000FE000001FC000001F8000007F00000FFC00000FFF0000001FC00 00007E0000007F0000007F8000003FC000003FC000003FE000003FE03C003FE07E003FE0FF003F E0FF003FE0FF003FC0FF007FC07E007F807C007F003F01FE001FFFFC0007FFF00000FF80001B27 7DA622>I<00000E0000001E0000003E0000007E000000FE000000FE000001FE000003FE000007 7E00000E7E00000E7E00001C7E0000387E0000707E0000E07E0000E07E0001C07E0003807E0007 007E000E007E000E007E001C007E0038007E0070007E00E0007E00FFFFFFF8FFFFFFF8FFFFFFF8 0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00007FFFF8007FFF F8007FFFF81D277EA622>I<0C0003000F803F000FFFFE000FFFFC000FFFF8000FFFF0000FFFE0 000FFFC0000FFE00000E0000000E0000000E0000000E0000000E0000000E0000000E7FC0000FFF F8000F80FC000E003E000C003F0000001F8000001FC000001FC000001FE000001FE018001FE07C 001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001FC078003F8078003F803C007F001F01FE00 0FFFF80003FFF00000FF80001B277DA622>I<0007F000003FFC0000FFFE0001FC0F0003F01F80 07E03F800FC03F801FC03F801F803F803F801F003F8000007F0000007F0000007F000000FF0000 00FF0FC000FF3FF800FF707C00FFC03E00FFC03F00FF801F80FF801FC0FF001FC0FF001FE0FF00 1FE0FF001FE07F001FE07F001FE07F001FE07F001FE03F001FE03F001FC01F801FC01F803F800F C03F0007E07E0003FFFC0000FFF000003FC0001B277DA622>I<380000003E0000003FFFFFF03F FFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E0070000E0070001C00E0003800 E0007000E000E0000000E0000001C000000380000007800000078000000F0000000F0000001F00 00001F0000003F0000003E0000003E0000007E0000007E0000007E0000007E000000FE000000FE 000000FE000000FE000000FE000000FE000000FE000000FE0000007C0000003800001C297CA822 >I<003FC00001FFF00003FFFC0007C07E000F003F001E001F001E000F803E000F803E000F803F 000F803F000F803FC00F003FF01F001FFC1E001FFE3C000FFFF80007FFE00003FFF80001FFFC00 01FFFE0007FFFF000F0FFF801E03FFC03C01FFC07C007FE078001FE0F80007E0F80007E0F80003 E0F80003E0F80003E0F80003C07C0003C07C0007803F000F001FC03E000FFFFC0003FFF800007F C0001B277DA622>I<007F800001FFF00007FFF8000FE0FC001F807E003F803F007F003F007F00 1F80FF001F80FF001FC0FF001FC0FF001FC0FF001FE0FF001FE0FF001FE0FF001FE07F001FE07F 003FE03F003FE01F807FE00F807FE007C1DFE003FF9FE0007E1FE000001FE000001FC000001FC0 00001FC000003F801F003F803F803F003F803F003F807E003F807C001F01F8001E03F0000FFFE0 0007FF800001FE00001B277DA622>I<000003800000000007C00000000007C0000000000FE000 0000000FE0000000000FE0000000001FF0000000001FF0000000003FF8000000003FF800000000 3FF80000000073FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00 000001C0FF00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E 003FE000000E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF8 0000780007FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C0 0000FF0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 D<00003FF001800003FFFE0380000FFFFF8780003FF007DF8000FF8001FF8001FE00007F8003FC 00003F8007F000001F800FF000000F801FE0000007801FE0000007803FC0000007803FC0000003 807FC0000003807F80000003807F8000000000FF8000000000FF8000000000FF8000000000FF80 00000000FF8000000000FF8000000000FF8000000000FF8000000000FF80000000007F80000000 007F80000000007FC0000003803FC0000003803FC0000003801FE0000003801FE0000007000FF0 0000070007F000000E0003FC00001E0001FE00003C0000FF8000F800003FF007E000000FFFFFC0 000003FFFF000000003FF8000029297CA832>67 D II<00007FE003000003FFFC0700001FFFFF0F00003FF0 0FFF0000FF8001FF0001FE0000FF0003F800003F0007F000003F000FF000001F001FE000000F00 1FE000000F003FC000000F003FC0000007007FC0000007007F80000007007F8000000000FF8000 000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 FF8000000000FF8001FFFFF87F8001FFFFF87F8001FFFFF87FC00000FF003FC00000FF003FC000 00FF001FE00000FF001FE00000FF000FF00000FF0007F00000FF0003F80000FF0001FE0000FF00 00FF8001FF00003FF007BF00001FFFFF1F000003FFFE0F0000007FF003002D297CA836>71 DII75 DIII<0000FFE000 000007FFFC0000003FC07F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF0 0001FE001FE00000FF001FE00000FF003FC000007F803FC000007F807FC000007FC07F8000003F C07F8000003FC07F8000003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF80 00003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003F C07FC000007FC07FC000007FC03FC000007F803FC000007F801FE00000FF001FE00000FF000FF0 0001FE0007F00001FC0003F80003F80001FC0007F00000FF001FE000003FC07F8000000FFFFE00 000000FFE000002B297CA834>I82 D<007F806003FFF0E007FFF9E00F807FE01F001FE03E0007E07C0003E07C0001E0FC0001E0FC00 01E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFE00007FFFE0003FFFFC001FFFFE000F FFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF000000FF8000007F8000003F8600001F8 E00001F8E00001F8E00001F8F00001F0F00001F0F80003F0FC0003E0FF0007C0FFE01F80F3FFFF 00E0FFFE00C01FF0001D297CA826>I87 D<01FF800007FFF0000F81F8001FC07E001FC07E001FC03F000F803F8007003F8000003F80 00003F8000003F80000FFF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F80FE003F 80FE003F80FE003F80FE003F807E007F807F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9A21> 97 DI<001FF80000FFFE0003F01F0007E0 3F800FC03F801F803F803F801F007F800E007F0000007F000000FF000000FF000000FF000000FF 000000FF000000FF000000FF0000007F0000007F0000007F8000003F8001C01F8001C00FC00380 07E0070003F01E0000FFFC00001FE0001A1B7E9A1F>I<00003FF80000003FF80000003FF80000 0003F800000003F800000003F800000003F800000003F800000003F800000003F800000003F800 000003F800000003F800000003F800000003F800001FE3F80000FFFBF80003F03FF80007E00FF8 000FC007F8001F8003F8003F8003F8007F0003F8007F0003F8007F0003F800FF0003F800FF0003 F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F8007F00 03F8003F8003F8001F8003F8000F8007F80007C00FF80003F03BFF8000FFF3FF80003FC3FF8021 2A7EA926>I<003FE00001FFF80003F07E0007C01F000F801F801F800F803F800FC07F000FC07F 0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000FF000000FF0000007F000000 7F0000007F0000003F8000E01F8000E00FC001C007E0038003F81F0000FFFE00001FF0001B1B7E 9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F07F07F07F03E07F00007F00007F00007F0 0007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00007F0 0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 0007F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7F80FC1FE7C1F80FC7C1F007C 383F007E107F007F007F007F007F007F007F007F007F007F007F007F003F007E001F007C001F80 FC000FC1F8001FFFE00018FF800038000000380000003C0000003E0000003FFFF8001FFFFF001F FFFF800FFFFFC007FFFFE01FFFFFF03E0007F07C0001F8F80000F8F80000F8F80000F8F80000F8 7C0001F03C0001E01F0007C00FC01F8003FFFE00007FF0001E287E9A22>II<07000F801FC03FE03FE03FE01FC00F80070000000000000000 00000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 0FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14>I107 DIII<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E0 7F0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007 F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003F E0001D1B7E9A22>II114 D<03FE300FFFF01E03F03800 F0700070F00070F00070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003 FC0000FC60007CE0003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<00 700000700000700000700000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FF FFF007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007 F00007F03807F03807F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA5 1B>IIII121 D<3FFFFF803FFFFF803F007F003C00FE003801FE007803FC007803F8007007F800700FF000700F E000001FC000003FC000007F8000007F000000FF000001FE038001FC038003F8038007F803800F F007800FE007801FE007003FC00F003F801F007F007F00FFFFFF00FFFFFF00191B7E9A1F>I E /Fi 22 120 df<70F8F8F8700505798414>46 D<01E007F00E38181C38FC71FC739E739EE70E E70EE70EE70EE70EE70EE70E739C739C71F838F018060E1E07F801F00F177E9614>64 D<1FC0007FF000707800201800001C00001C0007FC001FFC003C1C00701C00E01C00E01C00E01C 00707C003FFF800F8F8011107E8F14>97 DI<03F80FFC1C1C380870006000E000E000E000E000600070 00380E1C1E0FFC03F00F107E8F14>I<007E00007E00000E00000E00000E00000E00000E0007CE 000FFE001C3E00301E00700E00E00E00E00E00E00E00E00E00E00E00E00E00700E00301E00383E 001FEFC007CFC012177F9614>I<07E00FF01C38301C700CE00EE00EFFFEFFFEE0006000700038 0E1C1E0FFC03F00F107E8F14>I<007C00FE01CE03840380038003807FFEFFFE03800380038003 80038003800380038003800380038003807FFC7FFC0F177F9614>I<07CF001FFF80383B803018 00701C00701C00701C003018003838003FF00037C0007000007000003FF8001FFC003FFE00700F 00E00380E00380E00380E003807007003C1E001FFC0007F00011197F8F14>II<030007800780030000 000000000000007F807F80038003800380038003800380038003800380038003800380FFFCFFFC 0E187D9714>I107 DIII<07C01FF03C78701C701CE00EE00EE00EE00EE00EE00E701C78 3C3C781FF007C00F107E8F14>II114 D<0FD83FF86038C038C038F0007F803FF007F8001C6006E006F006F81CFFF8CFE00F107E8F14> I<030007000700070007007FFCFFFC07000700070007000700070007000700070E070E070E070C 03FC00F00F157F9414>II119 D E /Fj 4 123 df<0C000C008C40EDC07F800C007F80EDC08C400C000C000A0B7D8B 10>3 D<3C62C3C3C040603866C2C3C343661C060203C3C3463C08167D900E>120 D<1818181818FFFF18181818181818181818181818181808167D900E>I<1818181818FF181818 18180018181818FFFF1818181808167D900E>I E /Fk 84 128 df<001F83E000F06E3001C078 780380F8780300F03007007000070070000700700007007000070070000700700007007000FFFF FF8007007000070070000700700007007000070070000700700007007000070070000700700007 00700007007000070070000700700007007000070070000700700007007000070070007FE3FF00 1D20809F1B>11 D<003F0000E0C001C0C00381E00701E00701E007000007000007000007000007 0000070000FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E007 00E00700E00700E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<003FE000E0E0 01C1E00381E00700E00700E00700E00700E00700E00700E00700E00700E0FFFFE00700E00700E0 0700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0 0700E00700E00700E07FE7FE1720809F19>I<001F81F80000F04F040001C07C06000380F80F00 0300F00F000700F00F000700700000070070000007007000000700700000070070000007007000 00FFFFFFFF00070070070007007007000700700700070070070007007007000700700700070070 070007007007000700700700070070070007007007000700700700070070070007007007000700 7007000700700700070070070007007007007FE3FE3FF02420809F26>I<7038F87CFC7EFC7E74 3A0402040204020804080410081008201040200F0E7E9F17>34 D<000300C0000300C0000300C0 000300C00006018000060180000601800006018000060180000C0300000C0300000C0300000C03 00000C0300001806007FFFFFFCFFFFFFFE00300C0000300C0000300C0000300C00006018000060 18000060180000601800FFFFFFFE7FFFFFFC00C030000180600001806000018060000180600001 8060000300C0000300C0000300C0000300C0000300C0000601800006018000060180001F297D9F 26>I<0F0000301880003030600060703001C0602C06C06013F980E0100300E0100300E0100600 E0100C00E0100C00E01018006010300060203000702060003040C0001880C0000F018000000300 E0000303100006060800060604000C0C0400180C0400181C0200301C0200601C0200601C0200C0 1C0201801C0201801C0203000C0406000C04060006040C00060818000310080000E01F257DA126 >37 D<70F8FCFC74040404080810102040060E7C9F0D>39 D<0020004000800100020006000C00 0C00180018003000300030007000600060006000E000E000E000E000E000E000E000E000E000E0 00E000E0006000600060007000300030003000180018000C000C00060002000100008000400020 0B2E7DA112>I<800040002000100008000C00060006000300030001800180018001C000C000C0 00C000E000E000E000E000E000E000E000E000E000E000E000E000C000C000C001C00180018001 8003000300060006000C00080010002000400080000B2E7DA112>I<0006000000060000000600 000006000000060000000600000006000000060000000600000006000000060000000600000006 00000006000000060000FFFFFFF0FFFFFFF0000600000006000000060000000600000006000000 060000000600000006000000060000000600000006000000060000000600000006000000060000 1C207D9A23>43 D<70F8FCFC74040404080810102040060E7C840D>II< 70F8F8F87005057C840D>I<000100030003000600060006000C000C000C001800180018003000 30003000600060006000C000C000C00180018001800300030003000600060006000C000C000C00 180018001800300030003000600060006000C000C000C000102D7DA117>I<03F0000E1C001C0E 00180600380700700380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003 C0F003C0F003C0F003C0F003C0F003C0F003C07003807003807003807807803807001806001C0E 000E1C0003F000121F7E9D17>I<018003800F80F3800380038003800380038003800380038003 8003800380038003800380038003800380038003800380038003800380038007C0FFFE0F1E7C9D 17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F803C02007C00007C0 000780000780000F00000E00001C0000380000700000600000C0000180000300000600400C0040 1800401000803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00100E00200F00780F807807 80780780380F80000F80000F00000F00000E00001C0000380003F000003C00000E00000F000007 800007800007C02007C0F807C0F807C0F807C0F00780400780400F00200E001C3C0003F000121F 7E9D17>I<000600000600000E00000E00001E00002E00002E00004E00008E00008E00010E0002 0E00020E00040E00080E00080E00100E00200E00200E00400E00C00E00FFFFF0000E00000E0000 0E00000E00000E00000E00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE000 10000010000010000010000010000010000011F000161C00180E00100700100780000380000380 0003C00003C00003C07003C0F003C0F003C0E00380400380400700200700100E000C380003E000 121F7E9D17>I<007C000182000701000E03800C07801C07803803003800007800007000007000 00F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003 C07003803803803807001807000C0E00061C0001F000121F7E9D17>I<4000007FFFC07FFF807F FF8040010080020080020080040000080000080000100000200000200000400000400000C00000 C00001C00001800003800003800003800003800007800007800007800007800007800007800007 8000030000121F7D9D17>I<03F0000C0C00100600300300200180600180600180600180700180 7803003E03003F06001FC8000FF00003F80007FC000C7E00103F00300F806003804001C0C001C0 C000C0C000C0C000C0C000806001802001001002000C0C0003F000121F7E9D17>I<03F0000E18 001C0C00380600380700700700700380F00380F00380F003C0F003C0F003C0F003C0F003C07007 C07007C03807C0180BC00E13C003E3C0000380000380000380000700300700780600780E00700C 002018001070000FC000121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F8700514 7C930D>I<70F8F8F8700000000000000000000070F0F8F878080808101010202040051D7C930D> I<7FFFFFE0FFFFFFF0000000000000000000000000000000000000000000000000000000000000 0000FFFFFFF07FFFFFE01C0C7D9023>61 D<001F800000E0700001000800060006000800010008 000100100F00802030C0402060404040C0202041C01C2041C01C2081801C1083801C1083801C10 83801C1083801C1083801C1083801C1081801C1041C01C1041C01C1040C03C2020605C202030CC 40100F0780080000000800000006000070010001C000E01F00001FF0001C207D9F23>64 D<000100000003800000038000000380000007C0000007C0000007C0000009E0000009E0000009 E0000010F0000010F0000010F00000207800002078000020780000403C0000403C0000403C0000 801E0000801E0000FFFE0001000F0001000F0001000F00020007800200078002000780040003C0 0E0003C01F0007E0FFC03FFE1F207F9F22>II<000FC0400070 30C001C009C0038005C0070003C00E0001C01E0000C01C0000C03C0000C07C0000407C00004078 000040F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000 780000007C0000407C0000403C0000401C0000401E0000800E000080070001000380020001C004 0000703800000FC0001A217D9F21>IIII<000FE0200078186000E004E0038002E0070001E0 0F0000E01E0000601E0000603C0000603C0000207C00002078000020F8000000F8000000F80000 00F8000000F8000000F8000000F8000000F8007FFCF80003E0780001E07C0001E03C0001E03C00 01E01E0001E01E0001E00F0001E0070001E0038002E000E0046000781820000FE0001E217D9F24 >III<0FFFC0007C00003C00003C00003C00003C00003C00003C00003C00003C00003C 00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00203C 00F83C00F83C00F83C00F0380040780040700030E0000F800012207E9E17>IIIII<001F800000F0F00001C0380007801E000F000F000E0007001E0007803C 0003C03C0003C07C0003E0780001E0780001E0F80001F0F80001F0F80001F0F80001F0F80001F0 F80001F0F80001F0F80001F0F80001F0780001E07C0003E07C0003E03C0003C03C0003C01E0007 800E0007000F000F0007801E0001C0380000F0F000001F80001C217D9F23>II82 D<07E0800C198010078030038060 0180600180E00180E00080E00080E00080F00000F000007800007F00003FF0001FFC000FFE0003 FF00001F800007800003C00003C00001C08001C08001C08001C08001C0C00180C00380E00300F0 0600CE0C0081F80012217D9F19>I<7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030 800F0010800F0010800F0010800F0010000F0000000F0000000F0000000F0000000F0000000F00 00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F 0000000F0000000F0000000F0000001F800007FFFE001C1F7E9E21>II87 D<7FF83FF80FE00FC007C0070003C0020001E0040001F00C0000F0 080000781000007C1000003C2000003E4000001E4000000F8000000F8000000780000003C00000 07E0000005E0000009F0000018F8000010780000207C0000603C0000401E0000801F0001800F00 01000780020007C0070003C01F8007E0FFE01FFE1F1F7F9E22>II91 D<080410082010201040204020804080408040B85CFC7EFC 7E7C3E381C0F0E7B9F17>II<0C001E0033006180C0C080400A06 7A9E17>I<1FE000303000781800781C00300E00000E00000E00000E0000FE000F8E001E0E0038 0E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>97 D<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E 000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E00780E00780E00780E00 700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C1C1E381E380C700070 00F000F000F000F000F000F00070007000380138011C020E0C03F010147E9314>I<000380003F 8000038000038000038000038000038000038000038000038000038000038003E380061B801C07 80380380380380700380700380F00380F00380F00380F00380F00380F003807003807003803803 803807801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E0038070038070070038070 0380F00380FFFF80F00000F00000F00000F000007000007000003800801800800C010007060001 F80011147F9314>I<007C00C6018F038F07060700070007000700070007000700FFF007000700 07000700070007000700070007000700070007000700070007000700070007007FF01020809F0E >I<0000E003E3300E3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E 380033E0002000002000003000003000003FFE001FFF800FFFC03001E0600070C00030C00030C0 0030C000306000603000C01C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E0000 0E00000E00000E00000E00000E00000E00000E00000E3E000E43000E81800F01C00F01C00E01C0 0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 FFE7FC16207F9F19>I<1C003E003E003E001C000000000000000000000000000E007E000E000E 000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A1F809E0C> I<00E001F001F001F000E0000000000000000000000000007007F000F000700070007000700070 00700070007000700070007000700070007000700070007000700070007000706070F060F0C061 803F000C28829E0E>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00 000E00000E00000E0FF00E07C00E03000E02000E04000E08000E10000E30000E70000EF8000F38 000E1C000E1E000E0E000E07000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E 000E000E000E000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E 80C80C000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00 0E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E 000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C0 0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC 16147F9319>I<01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000 F0F000F0F000F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<0E3E00FE C3800F01C00F00E00E00E00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E 00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00000E00000E00000E00000E00000E 0000FFE000151D7F9319>I<03E0800619801C05803C0780380380780380700380F00380F00380 F00380F00380F00380F003807003807803803803803807801C0B800E138003E380000380000380 000380000380000380000380000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E 000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030 704030C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D0608F800D14 7E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E000E000E00 0E000E000E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E 01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E 03C00603C0030DC001F1FC16147F9319>III<7FC3FC0F01E00701C007018003810001C20000E40000EC 00007800003800003C00007C00004E000087000107000303800201C00601E01E01E0FF07FE1714 809318>II<3FFF380E200E201C40384078407000E001E0 01C00380078007010E011E011C0338027006700EFFFE10147F9314>II<30 307878F87C787830300E057C9E17>127 D E /Fl 21 122 df<387CFEFEFE7C3807077C860F> 46 D<00E00001E0000FE000FFE000F3E00003E00003E00003E00003E00003E00003E00003E000 03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 03E00003E000FFFF80FFFF80111D7C9C1A>49 D<07F0001FFE00383F007C1F80FE0FC0FE0FC0FE 0FE0FE07E07C07E03807E0000FE0000FC0000FC0001F80001F00003E0000780000F00000E00001 C0000380600700600E00601C00E01FFFC03FFFC07FFFC0FFFFC0FFFFC0131D7D9C1A>I<01FC00 07FF000E0F801E0FC03F07E03F07E03F07E03F07E01E0FC0000FC0000F80001F0001FC0001FC00 000F800007C00003E00003F00003F83803F87C03F8FE03F8FE03F8FE03F0FC03F07807E03C0FC0 1FFF8003FC00151D7E9C1A>I<387CFEFEFE7C38000000000000387CFEFEFE7C3807147C930F> 58 D<0000E000000000E000000001F000000001F000000001F000000003F800000003F8000000 06FC00000006FC0000000EFE0000000C7E0000000C7E000000183F000000183F000000303F8000 00301F800000701FC00000600FC00000600FC00000C007E00000FFFFE00001FFFFF000018003F0 00018003F000030001F800030001F800060001FC00060000FC000E0000FE00FFE00FFFE0FFE00F FFE0231F7E9E28>65 D75 D82 D<01FE0007FF801F0FC03E0FC03E0FC0 7C0F807C0300FC0000FC0000FC0000FC0000FC0000FC00007C00007E00003E00603F00C01F81C0 07FF0001FC0013147E9317>99 D<0007F80007F80000F80000F80000F80000F80000F80000F800 00F80000F80000F80000F801F8F80FFEF81F83F83E01F87E00F87C00F87C00F8FC00F8FC00F8FC 00F8FC00F8FC00F8FC00F87C00F87C00F87E00F83E01F81F07F80FFEFF03F8FF18207E9F1D>I< 01FE0007FF800F83C01E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC0000 7C00007C00003E00181E00180F807007FFE000FF8015147F9318>I<001F8000FFC001F3E003E7 E003C7E007C7E007C3C007C00007C00007C00007C00007C000FFFC00FFFC0007C00007C00007C0 0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0 003FFC003FFC0013207F9F10>I108 D110 D<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC007EFC007EFC007EFC007EFC007EFC00 7E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017147F931A>II114 D<0FE63FFE701E600EE006E006F800FFC07FF83FFC1FFE03FE001FC007C007E007F006F81EFFFC C7F010147E9315>I117 D119 D121 D E /Fm 32 122 df<70F8FCFC7404040404080810102040060F7C840E>44 D<008003800F80F380038003800380038003800380038003800380038003800380038003800380 03800380038003800380038003800380038003800380038007C0FFFE0F217CA018>49 D<03F8000C1E001007002007804007C07807C07803C07807C03807C0000780000780000700000F 00000E0000380003F000001C00000F000007800007800003C00003C00003E02003E07003E0F803 E0F803E0F003C04003C0400780200780100F000C1C0003F00013227EA018>51 D<000200000600000E00000E00001E00001E00002E00004E00004E00008E00008E00010E00020E 00020E00040E00040E00080E00100E00100E00200E00200E00400E00800E00FFFFF8000E00000E 00000E00000E00000E00000E00000E00001F0001FFF015217FA018>I<01F000060C000C060018 0700380380700380700380F001C0F001C0F001C0F001E0F001E0F001E0F001E0F001E07001E070 03E03803E01805E00C05E00619E003E1E00001C00001C00001C000038000038030030078070078 0600700C002018001030000FC00013227EA018>57 D66 D<0007E0100038183000E0063001C00170038000F0070000F00E0000701E 0000701C0000303C0000303C0000307C0000107800001078000010F8000000F8000000F8000000 F8000000F8000000F8000000F8000000F800000078000000780000107C0000103C0000103C0000 101C0000201E0000200E000040070000400380008001C0010000E0020000381C000007E0001C24 7DA223>II72 D<03FFF0001F00000F00000F00000F00000F00000F 00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F 00000F00000F00000F00000F00000F00000F00700F00F80F00F80F00F80E00F01E00401C002038 0018700007C00014237EA119>74 D77 D82 D<03F0200C0C601802603001 E07000E0600060E00060E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE 000FFF0003FF80003FC00007E00001E00000F00000F0000070800070800070800070800070C000 60C00060E000C0F000C0C80180C6070081FC0014247DA21B>I85 D<0FE0001838003C0C003C0E00180700000700000700 00070000FF0007C7001E07003C0700780700700700F00708F00708F00708F00F087817083C2390 0FC1E015157E9418>97 D<01FE000703000C07801C0780380300780000700000F00000F00000F0 0000F00000F00000F00000F000007000007800403800401C00800C010007060001F80012157E94 16>99 D<0000E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000 E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F000E0F000E0F000E0F000 E0F000E0F000E0F000E07000E07800E03800E01801E00C02E0070CF001F0FE17237EA21B>I<01 FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F00000F00000F00000F00000F0 00007000007800203800201C00400E008007030000FC0013157F9416>I<003C00C6018F038F03 0F070007000700070007000700070007000700FFF8070007000700070007000700070007000700 07000700070007000700070007000700070007807FF8102380A20F>I<00007001F198071E180E 0E181C07001C07003C07803C07803C07803C07801C07001C07000E0E000F1C0019F00010000010 00001800001800001FFE000FFFC00FFFE03800F0600030400018C00018C00018C0001860003060 00303800E00E038003FE0015217F9518>I<1C003E003E003E001C000000000000000000000000 00000000000E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E00FFC00A227FA10E>105 D<0E00FE001E000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E 000E000E000E00FFE00B237FA20E>108 D<0E1FC07F00FE60E183801E807201C00F003C00E00F 003C00E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E0 0E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800 E0FFE3FF8FFE27157F942A>I<0E1F80FE60C01E80E00F00700F00700E00700E00700E00700E00 700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF1815 7F941B>I<01FC000707000C01801800C03800E0700070700070F00078F00078F00078F00078F0 0078F00078F000787000707800F03800E01C01C00E038007070001FC0015157F9418>I<0E1F00 FE61C00E80600F00700E00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E 0E003C0E003C0E00380F00700E80E00E41C00E3F000E00000E00000E00000E00000E00000E0000 0E00000E00000E0000FFE000171F7F941B>I<0E3CFE461E8F0F0F0F060F000E000E000E000E00 0E000E000E000E000E000E000E000E000E000F00FFF010157F9413>114 D<0F8830786018C018C008C008E008F0007F803FE00FF001F8003C801C800C800CC00CC008E018 D0308FC00E157E9413>I<02000200020002000600060006000E001E003E00FFF80E000E000E00 0E000E000E000E000E000E000E000E000E040E040E040E040E040E040708030801F00E1F7F9E13 >I<0E0070FE07F01E00F00E00700E00700E00700E00700E00700E00700E00700E00700E00700E 00700E00700E00700E00700E00F00E00F006017003827800FC7F18157F941B>II121 D E /Fn 6 123 df0 D<020002000200C218F2783AE00F800F803AE0F278C2180200020002000D0E7E8E12>3 D<060F0F0E1E1E1C3C383830707060E0C04008117F910A>48 D<1F0030806040C0C0C0C0C000C0 00600030000C0033006080C0C0C060C060C060606020C019800600018000C00060006060606060 40C021801F000B1D7E9610>120 D<06000600060006000600060006000600FFF0FFF006000600 060006000600060006000600060006000600060006000600060006000600060006000C1D7E9611 >I<060006000600060006000600FFF0FFF0060006000600060006000600000006000600060006 0006000600FFF0FFF00600060006000600060006000C1D7E9611>I E /Fo 28 128 df<0000FC1E000007026180000E07C38000180F878000380F8380007007000000700700 00007007000000E00E000000E00E000000E00E000000E00E000000E00E000000E00E00003FFFFF F00001C01C000001C01C000001C01C000001C01C000001C01C0000038038000003803800000380 380000038038000003803800000380380000070070000007007000000700700000070070000007 0070000007007000000E00E000000F00F00000FFC7FF000021237FA21C>11 D<3078F8787005057C840E>46 D<0000040000000006000000000E000000001E000000001E0000 00003E000000003F000000004F000000004F000000008F000000008F000000010F000000010780 000002078000000207800000040780000004078000000807C000000803C000001003C000001003 C000002003C000003FFFE000004001E000004001E000008001E000008001E000010001E0000100 00F000020000F000060000F000040000F0000C0000F0003E0001F800FF800FFF8021237EA225> 65 D<0001FC02000F0306003C008C0070005C00E0003C01C0003C0380001C0700001C0F000018 1E0000181E0000083E0000083C0000087C0000087C000000F8000000F8000000F8000000F80000 00F8000000F0000000F0000000F0000000F0000020F0000020F0000040F8000040780000407800 0080380001003C0001001C0002000E000C000700100001C0E000003F00001F247AA223>67 D<0000FE0100070183001C00460070002E00E0001E01C0001E0380000E0780000E0F00000C1E00 000C1E0000043E0000043C0000047C0000047C000000F8000000F8000000F8000000F8000000F8 000000F0000000F0003FFFF00001F0F00000F0F00000F0F00000F0F80001E0780001E0780001E0 380001E01C0001E00E0003E0060004C0038008C001E07040003F800020247AA226>71 D<003FFF0000F80000F00000F00000F00000F00000F00001E00001E00001E00001E00001E00001 E00003C00003C00003C00003C00003C00003C0000780000780000780000780000780000780000F 00700F00F80F00F80F00F01E00E01E00803C0040380030E0000F800018237DA119>74 D<03FFE00FF8003E0007E0003C000380003C000200003C000400003C000800003C001000007800 20000078008000007801000000780200000078040000007808000000F018000000F038000000F0 7C000000F13C000000F23E000000F41E000001E81F000001F00F000001E00F000001E007800001 E007800001E003C00003C003C00003C001E00003C001E00003C000F00003C000F00003C000F800 078000F80007C000FC00FFFC07FF8025227EA126>I<03FFFF0000003E01E000003C007800003C 003C00003C003C00003C003E00003C003E000078003E000078003E000078003E000078003E0000 78007C00007800780000F000F00000F001E00000F007800000FFFC000000F00C000000F0070000 01E007000001E003800001E003800001E003C00001E003C00001E003C00003C007C00003C007C0 0003C007C00003C007C00003C007C04003C007C080078007C08007C003E100FFFC01E300000000 7C0022237EA124>82 D<000FC0800030318000C00B000180070003800700030003000700030007 0003000E0002000E0002000F0002000F0000000F0000000F80000007E0000007FE000003FFC000 01FFE000007FF000000FF8000000F8000000780000003C0000003C0000003C0020003C00400038 004000380040003800600030006000700060006000F000C000E8018000C607000081FC00001924 7DA21B>I87 D<03FC000606000F03000F03 800601800001C0000380000380007F8003E3800F03801C0380380700780700F00708F00708F00F 08F00F08F017107867A01F83C015157D9418>97 D<0780003F8000070000070000070000070000 0700000700000E00000E00000E00000E00000E00000E00001C3F001CC1801D00C01E00601C0070 1C00703800783800783800783800783800783800787000F07000F07000E07001E07001C0700380 E80700C61C0081F00015237BA21B>I<00FF000381C00603C00C03C01C01803800007800007000 00F00000F00000F00000F00000F00000E00000F00000F000807001007001003806001C180007E0 0012157C9416>I<00001E0000FE00001C00001C00001C00001C00001C00001C00003800003800 003800003800003800003800FC700383700700F00C00F01C00703800707800E07000E0F000E0F0 00E0F000E0F000E0E001C0E001C0E001C0E001C07003C07003C0380F801C33C007C3F817237CA2 1B>I<00FE000383800701C00C00E01C00E03800E07800E07000E0FFFFE0F00000F00000F00000 F00000E00000E00000F000407000803000801803000E0C0003F00013157D9416>I<0000078000 1F88800070D18000E0E18001C0700003C0700003C070000780F0000780F0000780F0000780E000 0381E0000181C00002C30000027E00000400000004000000040000000600000007FF800007FFE0 0007FFF0001C007800300018006000180060001800C0001800C0001800C0003000600060003000 C0001C07800003FC00001921809518>103 D<00780003F8000070000070000070000070000070 0000700000E00000E00000E00000E00000E00000E00001C3F001CC1801D00C01E00E01E00E01C0 0E03C01C03801C03801C03801C03801C03801C0700380700380700380700380700380700380E00 700F0078FFE7FF18237FA21B>I<006000F001F001F000E0000000000000000000000000000000 0001C00FC001C001C001C001C00380038003800380038003800700070007000700070007000E00 0F00FFE00C227FA10E>I<000300000780000F80000F8000070000000000000000000000000000 0000000000000000000000000E0000FE00001E00000E00000E00000E00001C00001C00001C0000 1C00001C00001C0000380000380000380000380000380000380000700000700000700000700000 700000700000E00000E00060E000F1C000F18000E300003E0000112C83A10F>I<007803F80070 0070007000700070007000E000E000E000E000E000E001C001C001C001C001C001C00380038003 800380038003800700070007000700070007000E000F00FFE00D237FA20E>108 D<01C1F807E01FC60C183001D80E603801E007801C01E007801C01C007001C03C00F003803800E 003803800E003803800E003803800E003803800E003807001C007007001C007007001C00700700 1C007007001C007007001C00700E003800E00F003C00F0FFE3FF8FFE27157F942A>I<01C3F01F CC1801D00C01E00E01E00E01C00E03C01C03801C03801C03801C03801C03801C07003807003807 00380700380700380700380E00700F0078FFE7FF18157F941B>I<007E000383800600C00C00E0 1C0070380070780078700078F00078F00078F00078F00078E000F0E000F0E000E0F001E07001C0 7003803807001C1C0007F00015157D9418>I<00E1F8000FE60C0000E8060000F0070000E00380 00E0038001C003C001C003C001C003C001C003C001C003C001C003C00380078003800780038007 0003800F0003801E0003801C00074038000730E000070F80000700000007000000070000000E00 00000E0000000E0000000E0000000E0000001E000000FFC000001A1F80941B>I<01C7C01FC8E0 01D1E001E1E001E0C001C00003C000038000038000038000038000038000070000070000070000 0700000700000700000E00000F0000FFF00013157F9413>114 D<008000800080018001000300 030007000F001F00FFF80E000E000E000E000E001C001C001C001C001C001C0038103810381038 103810382038201C4007800D1F7C9E13>116 D<0E0070FE07F00E00F00E00700E00700E00701C 00E01C00E01C00E01C00E01C00E01C00E03801C03801C03801C03801C03803C03805C0380B801C 13C007E3F815157C941B>I<30307878F8F8F8F870700D0576A118>127 D E /Fp 20 122 df<00000300000000000300000000000300000000000780000000000780000000 000FC0000000000FC0000000000FC00000000017E00000000013E00000000013E00000000023F0 0000000021F00000000021F00000000040F80000000040F80000000040F800000000807C000000 00807C00000001807E00000001003E00000001003E00000002003F00000002001F00000002001F 00000004000F80000004000F80000004000F800000080007C00000080007C00000180007E00000 1FFFFFE000001FFFFFE00000200003F00000200001F00000200001F00000400001F80000400000 F80000400000F800008000007C00008000007C00008000007C00010000003E00010000003E0003 0000003F00030000001F00070000001F001F8000003F80FFE00003FFFCFFE00003FFFC2E327EB1 32>65 D76 D82 D<00FE00000303C0000C00E0001000700010003800 3C003C003E001C003E001E003E001E0008001E0000001E0000001E0000001E00000FFE0000FC1E 0003E01E000F801E001F001E003E001E003C001E007C001E00F8001E04F8001E04F8001E04F800 3E04F8003E0478003E047C005E043E008F080F0307F003FC03E01E1F7D9E21>97 D<003F8000E0600380180700040F00041E001E1C003E3C003E7C003E7C0008780000F80000F800 00F80000F80000F80000F80000F80000F80000F800007800007C00007C00003C00011E00011E00 020F000207000403801800E060003F80181F7D9E1D>99 D<000001E000003FE000003FE0000003 E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E00000 01E0000001E0000001E0000001E0000001E0000001E0001F81E000F061E001C019E0078005E00F 0003E00E0003E01E0001E03C0001E03C0001E07C0001E0780001E0F80001E0F80001E0F80001E0 F80001E0F80001E0F80001E0F80001E0F80001E0F80001E0780001E0780001E03C0001E03C0001 E01C0001E01E0003E00E0005E0070009E0038011F000E061FF003F81FF20327DB125>I<003F80 0000E0E0000380380007003C000E001E001E001E001C000F003C000F007C000F0078000F807800 0780F8000780F8000780FFFFFF80F8000000F8000000F8000000F8000000F8000000F800000078 0000007C0000003C0000003C0000801E0000800E0001000F0002000780020001C00C0000F03000 001FC000191F7E9E1D>I<000000F0007F030801C1C41C0380E81C070070080F0078001E003C00 1E003C003E003E003E003E003E003E003E003E003E003E003E003E001E003C001E003C000F0078 00070070000780E00009C1C000087F000018000000180000001800000018000000180000001C00 00000E0000000FFFF80007FFFF0003FFFF800E000FC0180001E0300000F070000070E0000038E0 000038E0000038E0000038E00000387000007070000070380000E01C0001C00700070001C01C00 003FE0001E2F7E9F21>103 D<0F001F801F801F801F800F000000000000000000000000000000 00000000000000000780FF80FF800F800780078007800780078007800780078007800780078007 800780078007800780078007800780078007800780078007800FC0FFF8FFF80D307EAF12>105 D<07800000FF800000FF8000000F80000007800000078000000780000007800000078000000780 000007800000078000000780000007800000078000000780000007800000078000000780000007 801FFC07801FFC078007E007800780078006000780040007800800078010000780600007808000 078100000783800007878000078FC0000793C00007A1E00007C1F0000780F0000780780007807C 0007803C0007803E0007801F0007800F0007800F80078007C0078003C0078003E00FC007F8FFFC 0FFFFFFC0FFF20327EB123>107 D<0780FF80FF800F8007800780078007800780078007800780 078007800780078007800780078007800780078007800780078007800780078007800780078007 800780078007800780078007800780078007800780078007800780078007800FC0FFFCFFFC0E32 7EB112>I<0780FE001FC000FF83078060F000FF8C03C18078000F9001E2003C0007A001E4003C 0007A000F4001E0007C000F8001E0007C000F8001E00078000F0001E00078000F0001E00078000 F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00 078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0 001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E0007 8000F0001E000FC001F8003F00FFFC1FFF83FFF0FFFC1FFF83FFF0341F7E9E38>I<0780FE0000 FF83078000FF8C03C0000F9001E00007A001E00007A000F00007C000F00007C000F000078000F0 00078000F000078000F000078000F000078000F000078000F000078000F000078000F000078000 F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 00F000078000F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1FFF80211F7E9E25> I<001FC00000F0780001C01C00070007000F0007801E0003C01C0001C03C0001E03C0001E07800 00F0780000F0780000F0F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F8 0000F8780000F07C0001F03C0001E03C0001E01E0003C01E0003C00F00078007800F0001C01C00 00F07800001FC0001D1F7E9E21>I<0781FC00FF860700FF8803C00F9001E007A000F007C00078 078000780780003C0780003C0780003E0780001E0780001F0780001F0780001F0780001F078000 1F0780001F0780001F0780001F0780001F0780003E0780003E0780003C0780007C0780007807C0 00F007A000F007A001E00798038007860F000781F8000780000007800000078000000780000007 8000000780000007800000078000000780000007800000078000000FC00000FFFC0000FFFC0000 202D7E9E25>I<01FC100E03301800F0300070600030E00030E00010E00010E00010F00010F800 007E00003FF0001FFF000FFFC003FFE0003FF00001F80000F880003C80003C80001CC0001CC000 1CE0001CE00018F00038F00030CC0060C301C080FE00161F7E9E1A>115 D<00400000400000400000400000400000C00000C00000C00001C00001C00003C00007C0000FC0 001FFFE0FFFFE003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C0 0003C00003C00003C00003C00003C00003C01003C01003C01003C01003C01003C01003C01003C0 1001C02001E02000E0400078C0001F00142C7FAB19>I<078000F000FF801FF000FF801FF0000F 8001F000078000F000078000F000078000F000078000F000078000F000078000F000078000F000 078000F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0 00078000F000078000F000078000F000078000F000078001F000078001F000078001F000038002 F00003C004F00001C008F800007030FF80001FC0FF80211F7E9E25>II121 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 324 377 a Fp(Av)n(oiding)20 b(Recomputation)h(in)g(Link)l(age)g (Analysis)329 562 y Fo(Alejandro)16 b(A.)f(Sc)o(h\177)-24 b(a\013er)804 544 y Fn(\003)211 620 y Fm(Departmen)o(t)14 b(of)j(Computer)e(Science)403 678 y(Rice)g(Univ)o(ersit)o(y)478 736 y(Houston)1177 562 y Fo(Sandeep)i(K.)e(Gupta)1589 544 y Fn(y)1027 620 y Fm(Departmen)o(t)g(of)i (Computer)e(Science)1220 678 y(Rice)g(Univ)o(ersit)o(y)1294 737 y(Houston)493 878 y Fo(K.)h(Shriram)748 860 y Fn(z)265 936 y Fm(Departmen)o(t)e(of)j(Computer)e(Science)457 994 y(Rice)g(Univ)o (ersit)o(y)532 1052 y(Houston)1091 878 y Fo(Rob)q(ert)h(W.)g(Cottingham)g (Jr.)1685 860 y Fn(x)1094 936 y Fm(Departmen)o(t)f(of)h(Cell)f(Biology)1101 994 y(Ba)o(ylor)h(College)f(of)i(Medicine)1299 1052 y(Houston)805 1153 y(Jan)o(uary)g(3,)f(1994)150 1477 y Fl(Keyw)o(ords:)34 b Fk(Genetic)24 b(link)m(age)h(analysis,)h(algorithms,)f(recom)o(bination)f (classes,)i(c)o(hec)o(k-)150 1533 y(p)q(oin)o(ting,)16 b(crash-reco)o(v)o (ery)l(.)150 2274 y Fl(Address)k(for)g(corresp)q(ondence:)27 b Fk(Rob)q(ert)18 b(W.)f(Cottingham)h(Jr.,)h(Departmen)o(t)f(of)g(Cell)150 2331 y(Biology)l(,)e(Ba)o(ylor)f(College)h(of)e(Medicine,)j(One)f(Ba)o(ylor)f (Plaza,)g(Houston,)g(TX)g(77030,)e(USA.)p 150 2370 660 2 v 201 2397 a Fj(\003)219 2413 y Fi(schaffer@c)o(s.)o(ric)o(e.e)o(du)203 2444 y Fj(y)219 2460 y Fi(skgupta@ow)o(ln)o(et.)o(ric)o(e.)o(edu)203 2491 y Fj(z)219 2507 y Fi(shriram@cs)o(.r)o(ice)o(.ed)o(u)203 2538 y Fj(x)219 2554 y Fi(bwc@bcm.tm)o(c.)o(edu)p eop %%Page: 2 2 2 1 bop 150 195 a Fh(Abstract)150 252 y Fk(W)l(e)20 b(describ)q(e)h(four)f (impro)o(v)o(emen)o(ts)f(w)o(e)h(ha)o(v)o(e)f(implemen)o(ted)j(in)e(a)g(v)o (ersion)g(of)f(the)h(genetic)150 308 y(link)m(age)e(analysis)e(programs)f(in) i(the)f(LINKA)o(GE)h(pac)o(k)m(age:)k(sub)q(division)e(of)c(recom)o(bination) 150 364 y(classes,)g(b)q(etter)g(handling)i(of)d(lo)q(ops,)h(b)q(etter)g(co)q (ordination)h(b)q(et)o(w)o(een)f(the)g(optimization)h(and)150 421 y(output)j(routines,)h(and)f(a)f(c)o(hec)o(kp)q(oin)o(ting)j(facilit)o(y) l(.)32 b(The)19 b(unifying)i(theme)e(for)f(all)i(the)f(im-)150 477 y(pro)o(v)o(emen)o(ts)g(is)h(to)e(store)h(a)g(small)h(amoun)o(t)f(of)g (data)g(to)g(a)o(v)o(oid)g(exp)q(ensiv)o(e)i(recomputation)150 534 y(of)c(kno)o(wn)g(results.)26 b(The)17 b(sub)q(division)j(of)c(recom)o (bination)i(classes)g(impro)o(v)o(es)f(on)g(a)g(metho)q(d)150 590 y(of)e(Lathrop)h(and)g(Lalouel)i([Amer.)d(J.)g(Hum.)h(Genetics)h (42\(1988\),)c(pp.)j(498{505].)k(The)c(new)150 647 y(metho)q(d)k(of)g (handling)h(lo)q(ops)g(extends)f(a)g(prop)q(osal)g(of)f(Lange)h(and)g(Elston) g([Hum.)g(Hered.)150 703 y(25\(1975\),)e(pp.)h(95{105])f(for)g(lo)q(opless)j (p)q(edigrees)g(with)f(m)o(ultiple)h(n)o(uclear)f(families)h(at)e(the)150 760 y(earliest)g(generation.)30 b(F)l(rom)18 b(a)g(practical)h(p)q(oin)o(t)g (of)f(view,)i(the)e(most)g(imp)q(ortan)o(t)g(impro)o(v)o(e-)150 816 y(men)o(t)f(ma)o(y)g(b)q(e)h(the)f(c)o(hec)o(kp)q(oin)o(ting)i(facilit)o (y)f(whic)o(h)g(allo)o(ws)g(the)f(user)h(to)f(carry)f(out)h(link)m(age)150 873 y(computations)d(that)f(are)h(m)o(uc)o(h)g(longer)h(than)f(the)g (mean-time-to-failure)h(of)f(the)g(underlying)150 929 y(computer.)964 2678 y(2)p eop %%Page: 3 3 3 2 bop 150 195 a Fh(1)69 b(In)n(tro)r(duction)150 297 y Fk(Link)m(age)29 b(analysis)g(w)o(as)e(fully)j(thrust)d(in)o(to)h(the)g(computer)g(age)g(b)o (y)g(the)g(disco)o(v)o(ery)g(of)150 353 y(the)19 b(Elston-Stew)o(art)g([3)o (])g(algorithm)g(for)g(p)q(edigree)i(tra)o(v)o(ersal)d(and)h(its)h(implemen)o (tation)g(in)150 409 y(LIPED)e([11)o(].)28 b(F)l(rom)18 b(a)f(computer)h (science)i(p)q(ersp)q(ectiv)o(e,)g(the)e(reason)g(the)g(Elston-Stew)o(art)150 466 y(algorithm)f(w)o(orks)e(e\016cien)o(tly)j(is)f(that)f(it)h Fg(avoids)g(r)n(e)n(c)n(omputation)g Fk(on)g(subtrees)f(of)h(the)f(p)q(edi-) 150 522 y(gree)c(b)o(y)g(tra)o(v)o(ersing)f(b)q(ottom-up)h(to)o(w)o(ards)e (the)j(ro)q(ot.)18 b(In)12 b(this)h(pap)q(er)f(w)o(e)g(further)g(adv)m(ance)h (the)150 579 y(theme)e(of)f(a)o(v)o(oiding)h(recomputation)f(in)h(link)m(age) h(analysis)g(b)o(y)e(describing)i(four)e(impro)o(v)o(emen)o(ts)150 635 y(of)15 b(that)f(genre)i(that)e(w)o(e)h(ha)o(v)o(e)g(implemen)o(ted)i(in) f(programs)e(in)i(the)f(LINKA)o(GE)h(pac)o(k)m(age.)221 692 y(Although)d(the)g(Elston-Stew)o(art)g(algorithm)g(made)g(a)g(host)f(of)h (link)m(age)i(problems)f(compu-)150 748 y(tationally)g(tractable)g(for)f(the) h(\014rst)g(time,)g(geneticists)h(still)g(w)o(an)o(t)e(to)g(solv)o(e)h (computationally)150 805 y(in)o(tractable)22 b(link)m(age)h(problems.)39 b(The)21 b(computational)h(requiremen)o(ts)g(caused)g(b)o(y)f(b)q(etter)150 861 y(data)c(collection)j(metho)q(ds)f(and)f(the)g(desire)h(to)e(do)h(m)o (ultilo)q(cus)i(analysis)f(ha)o(v)o(e)f(gro)o(wn)f(at)g(a)150 918 y(m)o(uc)o(h)e(greater)g(rate)f(than)h(the)g(sp)q(eed)i(of)d(readily)j(a) o(v)m(ailable)g(computers.)221 974 y(W)l(e)j(con)o(tin)o(ue)g(an)g(in)o(v)o (estigation)h(started)e(in)i([2)o(])f(concerning)h(b)q(etter)f(sequen)o(tial) h(algo-)150 1030 y(rithms)d(for)g(link)m(age)i(analysis.)30 b(That)18 b(pap)q(er)h(sho)o(w)o(ed)f(signi\014can)o(t)h(hop)q(e)g(that)f(b)q (etter)g(algo-)150 1087 y(rithms)d(can)h(mak)o(e)f(m)o(uc)o(h)g(bigger)g (link)m(age)i(analysis)f(problems)g(computationally)g(tractable.)150 1143 y(As)d(in)g([2)o(],)g(w)o(e)f(demonstrate)g(the)g(impro)o(v)o(emen)o(ts) h(describ)q(ed)h(herein)g(b)o(y)f(implemen)o(ting)h(them)150 1200 y(in)h(some)g(of)f(the)h(programs)e(in)j(the)e(LINKA)o(GE)i(soft)o(w)o (are)d(pac)o(k)m(age)h(and)h(sho)o(w)f(the)h(impro)o(v)o(e-)150 1256 y(men)o(ts)20 b(in)i(computation)e(time)h(exp)q(erimen)o(tally)l(.)38 b(LINKA)o(GE)22 b([7)o(,)e(9])g(is)h(one)g(of)f(the)h(most)150 1313 y(p)q(opular)d(link)m(age)g(analysis)f(pac)o(k)m(ages)g(and)g(is)g (particularly)h(useful)g(for)e(m)o(ultilo)q(cus)i(analysis)150 1369 y(of)d(large)g(disease)h(p)q(edigrees.)221 1426 y(The)f(four)g(impro)o (v)o(emen)o(ts)g(describ)q(ed)i(herein)f(are:)206 1514 y(1.)22 b(Sub)q(division)c(of)d(recom)o(bination)g(classes.)206 1605 y(2.)22 b(More)14 b(e\016cien)o(t)i(m)o(ultiple)h(tra)o(v)o(ersals)d(of)h(p)q (edigrees)i(with)e(lo)q(ops.)206 1697 y(3.)22 b(Better)13 b(co)q(ordination)h (b)q(et)o(w)o(een)g(the)g(optimization)h(routine)f(and)g(the)f(output)h (routine.)206 1788 y(4.)22 b(A)15 b(c)o(hec)o(kp)q(oin)o(ting)i(facilit)o(y)g (that)e(allo)o(ws)h(the)f(user)h(to)f(restart)f(a)i(\\crashed")f(computa-)264 1845 y(tion)g(near)g(the)g(p)q(oin)o(t)h(where)g(the)f(crash)g(o)q(ccurred.) 221 1933 y(The)f(\014rst)g(t)o(w)o(o)g(impro)o(v)o(emen)o(ts)g(can)g(b)q(e)i (view)o(ed)f(as)f(general)h(algorithmic)g(impro)o(v)o(emen)o(ts)150 1989 y(based)23 b(on)f(prop)q(osals)h(in)g(the)f(literature,)j(while)f(the)e (latter)g(t)o(w)o(o)f(impro)o(v)o(emen)o(ts)h(correct)150 2045 y(w)o(eaknesses)e(sp)q(eci\014c)i(to)d(programs)g(in)i(LINKA)o(GE.)g(The)f (sub)q(division)j(of)c(recom)o(bination)150 2102 y(classes)d(impro)o(v)o(es)f (on)g(a)f(prop)q(osal)i(of)f(Lathrop)f(and)i(Lalouel)g([8])f(that)f(w)o(as)g (implemen)o(ted)j(in)150 2158 y(LINKA)o(GE.)e(The)g(new)g(lo)q(op)g (algorithm)g(extends)g(a)f(prop)q(osal)h(of)f(Lange)h(and)g(Elston)g([6)o(])g (for)150 2215 y(handling)h(lo)q(opless)g(p)q(edigrees)g(with)f(m)o(ultiple)h (n)o(uclear)f(families)h(at)e(the)h(earliest)g(generation)150 2271 y(\(Lange)g(and)h(Elston)f(called)i(suc)o(h)e(a)g(p)q(edigree)i Fg(c)n(omplex)p Fk(\).)221 2328 y(All)k(four)e(impro)o(v)o(emen)o(ts)g(help)i (b)o(y)f(a)o(v)o(oiding)g(recomputation)g(of)f(already)i(kno)o(wn)e(v)m(al-) 150 2384 y(ues.)h(The)15 b(\014rst)f(three)h(impro)o(v)o(emen)o(ts)f(sp)q (eed)i(up)f(unin)o(terrupted)h(runs.)k(The)15 b(c)o(hec)o(kp)q(oin)o(ting)150 2441 y(facilit)o(y)h(a)o(v)o(oids)f(signi\014can)o(t)h(recomputation)f(when)h (the)f(computer)h(crashes.)221 2497 y(In)j(terms)e(of)h(practical)h(b)q (ene\014t)h(to)d(the)i(LINKA)o(GE)g(user,)g(the)f(c)o(hec)o(kp)q(oin)o(ting)i (facilit)o(y)150 2554 y(ma)o(y)e(b)q(e)i(the)e(most)g(signi\014can)o(t)i(of)f (the)f(impro)o(v)o(emen)o(ts,)h(b)q(ecause)h(it)f(drastically)h(increases)964 2678 y(3)p eop %%Page: 4 4 4 3 bop 150 195 a Fk(the)21 b(size)h(of)f(link)m(age)h(problems)g(that)e(can) i(b)q(e)f(solv)o(ed)h(reliably)h(on)e(inheren)o(tly)h(unreliable)150 252 y(computers.)221 308 y(W)l(e)g(ha)o(v)o(e)f(implemen)o(ted)j(the)e(c)o (hanges)g(describ)q(ed)i(herein)g(in)e(the)g(already)h(impro)o(v)o(ed)150 364 y(v)o(ersions)18 b(of)g(the)g(LINKA)o(GE)h(programs)e(describ)q(ed)j(in)f ([2],)f(ho)o(w)o(ev)o(er)f(they)i(are)e(essen)o(tially)150 421 y(indep)q(enden)o(t)h(of)d(our)g(previous)i(w)o(ork.)i(Our)d(mo)q (di\014ed)h(programs)e(are)g(in)h(C.)f(The)h(impro)o(v)o(ed)150 477 y(LINKA)o(GE)21 b(programs)f(are)g(a)o(v)m(ailable)i(b)o(y)f(anon)o (ymous)f(FTP)g(from)g(a)g(computer)h(at)f(Rice)150 534 y(Univ)o(ersit)o(y)14 b(\(Curren)o(t)f(instructions:)20 b(ftp)14 b(softlib.cs.rice.edu,)h(cd)f (link)m(age/fastlink,)i(get)d(\014les)150 590 y(from)f(that)g(sub)q (directory;)i(con)o(tact)e(the)h(\014rst)g(author)f(b)o(y)h(e-mail)h(at)e(sc) o(ha\013er@cs.rice.edu)i(for)150 647 y(further)h(assistance\).)221 703 y(The)c(rest)f(of)g(this)i(pap)q(er)f(is)g(organized)h(as)e(follo)o(ws.) 18 b(Section)12 b(2)f(giv)o(es)g(relev)m(an)o(t)g(bac)o(kground)150 760 y(on)k(the)g(LINKA)o(GE)h(programs.)j(Sections)d(3)f(through)g(6)g (describ)q(e)i(the)e(four)g(impro)o(v)o(emen)o(ts.)150 816 y(Sections)h(7)f(and)g(8)g(v)m(alidate)i(the)e(impro)o(v)o(emen)o(ts.)k(W)l (e)d(conclude)h(with)e(a)g(short)f(discussion.)150 959 y Fh(2)69 b(Summary)23 b(of)g(LINKA)n(GE)h(and)f(Related)e(W)-6 b(ork)150 1061 y Fk(A)12 b(thorough)f(treatmen)o(t)g(of)g(genetic)i(link)m(age)g (analysis,)g(including)i(a)c(summary)g(of)h(the)g(LINK-)150 1117 y(A)o(GE)17 b(programs,)f(is)i(giv)o(en)g(in)g(Ott's)f(monograph)g([12)o (].)26 b(In)18 b(this)g(section)g(w)o(e)f(review)h(a)f(few)150 1174 y(facts)12 b(ab)q(out)g(LINKA)o(GE)h(relev)m(an)o(t)g(to)f(this)h(pap)q (er.)19 b(The)13 b(most)e(fundamen)o(tal)i(goal)f(in)h(link)m(age)150 1230 y(analysis)j(is)g(to)f(compute)h(the)f(probabilit)o(y)l(,)i Ff(\022)q Fk(,)f(that)e(a)i(recom)o(bination)g(o)q(ccurs)g(b)q(et)o(w)o(een)f (t)o(w)o(o)150 1287 y(genes)g Ff(G)307 1294 y Fe(1)342 1287 y Fk(and)g Ff(G)466 1294 y Fe(2)486 1287 y Fk(.)221 1343 y(The)h(LINKA)o(GE)g (pac)o(k)m(age)g(con)o(tains)f(four)h(link)m(age)h(analysis)f(programs:)k (LODSCORE,)150 1400 y(ILINK,)j(LINKMAP)l(,)g(and)f(MLINK.)h(The)f(impro)o(v)o (ed)g(sequen)o(tial)h(algorithms)f(in)h([2])e(are)150 1456 y(applicable)f(to)d(all)i(the)e(programs.)26 b(The)18 b(four)f(c)o(hanges)h (describ)q(ed)h(here)f(are)g(applicable)i(to)150 1512 y(LODSCORE)12 b(and)h(ILINK.)g(The)f(impro)o(v)o(ed)h(handling)g(of)f(recom)o(bination)h (classes)f(and)g(lo)q(ops)150 1569 y(are)j(also)g(applicable)j(to)c(LINKMAP)i (and)g(MLINK.)221 1625 y(The)21 b(LODSCORE)h(program)f(searc)o(hes)g(for)g (the)h(maxim)o(um)g(lik)o(eliho)q(o)q(d)i(estimate,)1768 1613 y(^)1765 1625 y Ff(\022)q Fk(,)150 1682 y(of)e(the)h(recom)o(bination)h (probabilit)o(y)g(b)q(et)o(w)o(een)f(t)o(w)o(o)e(genes.)43 b(F)l(or)22 b(eac)o(h)h(candidate)h Ff(\022)q Fk(,)h(its)150 1738 y(lik)o(eliho)q(o)q(d)c(is)e(computed)g(with)g(resp)q(ect)f(to)g(the)h (input)g(p)q(edigree\(s\).)30 b(Giv)o(en)19 b(a)f(set)g(of)g(lo)q(ci,)150 1795 y(LODSCORE)d(will)i(estimate)e Ff(\022)i Fk(for)e(eac)o(h)g(pair)h(of)e (lo)q(ci.)221 1851 y(The)g(notion)h(of)e(recom)o(bination)i(can)g(b)q(e)f (generalized)j(to)c(more)h(than)g(t)o(w)o(o)f(lo)q(ci.)21 b(Supp)q(ose)150 1908 y Ff(G)186 1915 y Fe(1)205 1908 y Ff(;)8 b(G)262 1915 y Fe(2)281 1908 y Ff(;)g(:)g(:)g(:)d(;)j(G)419 1915 y Fd(n)458 1908 y Fk(are)17 b(m)o(ultiple)i(gene)f(lo)q(ci)g(o)q(ccurring)g(in)g(that)f (order.)25 b(Then)18 b(w)o(e)f(can)g(de\014ne)150 1964 y(a)j(v)o(ector)f(\()p Ff(\022)374 1948 y Fe(1)394 1964 y Ff(;)8 b(\022)437 1948 y Fe(2)456 1964 y Ff(;)g(:)g(:)g(:)d(;)j(\022)580 1948 y Fd(n)p Fn(\000)p Fe(1)648 1964 y Fk(\),)21 b(where)f(the)g(comp)q(onen)o(t)g Ff(\022)1178 1948 y Fd(i)1212 1964 y Fk(is)h(the)f(recom)o(bination)g (fraction)150 2021 y(b)q(et)o(w)o(een)c(lo)q(ci)h Ff(G)447 2028 y Fd(i)477 2021 y Fk(and)f Ff(G)602 2028 y Fd(i)p Fe(+1)661 2021 y Fk(.)22 b(W)l(e)15 b(use)i(sup)q(erscripts)f(here)h(b)q(ecause)f (later)1485 2009 y(^)1481 2021 y Ff(\022)1502 2028 y Fd(i)1532 2021 y Fk(will)i(represen)o(t)150 2077 y(the)c Ff(i)243 2060 y Fe(th)293 2077 y Fk(estimate,)f(in)i(a)f(sequence)i(of)e(estimates,)f(to)h (the)g Ff(\022)i Fk(v)o(ector.)j(W)l(e)14 b(will)i(use)f Ff(n)f Fk(to)g(repre-)150 2133 y(sen)o(t)i(the)f(n)o(um)o(b)q(er)h(of)g(lo)q(ci.)23 b(The)16 b(ILINK)h(program)e(searc)o(hes)g(for)h(the)f(maxim)o(um)h(lik)o (eliho)q(o)q(d)150 2190 y(estimate)f(of)g(the)g(m)o(ultilo)q(cus)i Ff(\022)g Fk(v)o(ector.)221 2246 y(Both)c(LODSCORE)h(and)g(ILINK)i(start)c (from)h(an)h(initial)i(solution)f(and)f(use)g(an)g(iterativ)o(e)150 2303 y(pro)q(cedure)g(called)g Fc(gemini)e Fk([5])g(to)g(\014nd)i(the)f (estimate)1104 2291 y(^)1100 2303 y Ff(\022)r Fk(.)19 b(Lik)o(e)13 b(man)o(y)g(iterativ)o(e)g(optimization)150 2359 y(pro)q(cedures,)22 b Fc(gemini)d Fk(can)h(only)g(guaran)o(tee)g(to)f(\014nd)i(a)e Fg(lo)n(c)n(al)g Fk(optim)o(um)h(and)g Fg(not)h(a)g(glob)n(al)150 2416 y Fk(optim)o(um.)f(After)14 b Fc(gemini)g Fk(computes)h(a)g(lo)q(cally)h (optimal)1190 2404 y(^)1187 2416 y Ff(\022)q Fk(,)f(an)g(output)f(pro)q (cedure)i Fc(outf)e Fk(is)150 2472 y(called)k(to)e(rep)q(ort)479 2460 y(^)476 2472 y Ff(\022)q Fk(,)g(the)h(lik)o(eliho)q(o)q(d,)i(and)d(a)g (v)m(ariet)o(y)h(of)f(other)g(statistics.)23 b(The)16 b(in)o(teraction)150 2529 y(b)q(et)o(w)o(een)g Fc(gemini)e Fk(and)h Fc(outf)g Fk(will)i(b)q(e)f (discussed)g(more)f(in)h(Section)g(5.)964 2678 y(4)p eop %%Page: 5 5 5 4 bop 221 195 a Fk(The)22 b(function)h(that)e(computes)h(a)g(com)o(bined)h (lik)o(eliho)q(o)q(d)i(for)d(all)h(the)f(p)q(edigrees)i(and)150 252 y(rep)q(orts)16 b(the)g(v)m(alue)h Fb(\000)p Fk(2)11 b Fb(\002)g Fk(log)q(\(lik)o(eliho)q(o)q(d\))18 b(\(o\013set)c(b)o(y)i(an)g (additiv)o(e)i(scaling)f(term\))e(is)h(called)150 308 y Fc(fun)p Fk(.)36 b(The)21 b(programs)f(try)g(to)g(maximize)i(the)f(v)m(alue)h(of)e (the)h(lik)o(eliho)q(o)q(d,)k(but)c(b)q(ecause)g(of)150 364 y(the)g(min)o(us)h(sign,)h(this)e(corresp)q(onds)h(to)e Fg(minimizing)42 b Fk(the)21 b(v)m(alue)h(of)f Fc(fun)p Fk(.)37 b(Eac)o(h)21 b(time)g(a)150 421 y(new)15 b(candidate)i(v)o(ector)591 409 y(^)587 421 y Ff(\022)608 428 y Fd(i)623 421 y Fk(,)d(pro)o(v)m(ably)i(b)q (etter)g(than)f(previous)h(candidates)g(\()1506 409 y(^)1502 421 y Ff(\022)1523 428 y Fe(1)1542 421 y Ff(;)8 b(:)g(:)g(:)d(;)1647 409 y Fk(^)1644 421 y Ff(\022)1665 428 y Fd(i)p Fn(\000)p Fe(1)1724 421 y Fk(\),)14 b(is)150 477 y(generated)h(this)h(is)g(called)h(an)e Fg(iter)n(ation)32 b Fk(and)15 b(the)h(v)m(alue)h(of)d Fc(fun)h Fk(at)g(the)h(new)1539 465 y(^)1535 477 y Ff(\022)1556 484 y Fd(i)1586 477 y Fk(is)g(rep)q(orted)150 534 y(on)f(the)g(screen)h(along)f (with)h(some)f(diagnostics.)221 590 y(In)e(di\013eren)o(t)g(iterations)g (there)g(ma)o(y)f(b)q(e)h(a)g(v)m(ariable)h(n)o(um)o(b)q(er)f(of)f(calls)i (to)e Fc(fun)p Fk(.)19 b(W)l(e)13 b(denote)150 647 y(a)19 b(call)h(to)e Fc(fun)h Fk(b)o(y)g(FE,)f(short)h(for)f Fg(function)i(evaluation)p Fk(.)31 b(Eac)o(h)19 b(iteration)g(of)g Fc(gemini)f Fk(has)150 703 y(t)o(w)o(o)d(phases.)24 b(The)16 b(\014rst)g(phase)h(searc)o(hes)f(for)g (a)g(new)h(estimate)f(to)1345 691 y(^)1342 703 y Ff(\022)i Fk(that)d(impro)o(v)o(es)i(on)f(the)150 760 y(estimate)11 b(from)g(the)h (previous)g(iteration.)19 b(The)11 b(second)h(phase)g(estimates)f(the)h (gradien)o(t)f(at)g(the)150 816 y(the)j(curren)o(t)387 804 y(^)384 816 y Ff(\022)h Fk(b)o(y)f(p)q(erturbing)h(one)f(dimension)h(at)e(a)h (time.)19 b(Our)c(exp)q(erimen)o(ts)f(suggest)g(that)150 873 y(the)i(\014rst)f(phase)h(often)f(tak)o(es)g(t)o(w)o(o)f(FEs,)h(but)g(there)h (is)g(no)f(upp)q(er)i(b)q(ound)f(on)g(the)g(n)o(um)o(b)q(er)f(of)150 929 y(FEs)f(needed.)21 b(The)15 b(gradien)o(t)g(estimation)f(usually)i(tak)o (es)e Ff(n)c Fb(\000)f Fk(1)14 b(FEs)g(if)h(forw)o(ard)f(di\013erences)150 985 y(are)g(used)h(and)g(2)8 b Fb(\003)g Fk(\()p Ff(n)h Fb(\000)g Fk(1\))k(if)i(cen)o(tral)g(di\013erences)g(are)f(used.)21 b(The)14 b(t)o(w)o(o)f(gradien)o(t)i(estimation)150 1042 y(metho)q(ds)j(are)g (discussed)i(in)f([8)o(].)29 b(There)18 b(are)g(a)g(few)g(exceptions;)j (e.g.,)c(if)i Ff(\022)h Fk(for)d(males)i(and)150 1098 y(females)d(are)f (assumed)h(to)f(b)q(e)h(distinct)h(then)e(the)h(n)o(um)o(b)q(er)g(of)f(FEs)g (for)g(the)h(second)g(phase)f(is)150 1155 y(doubled.)221 1211 y(In)i(con)o(trast)e(to)i(LODSCORE)g(and)g(ILINK,)h(LINKMAP)f(and)g(MLINK)h (tak)o(e)e(m)o(ultiple)150 1268 y(v)m(alues)i(of)e(the)g Ff(\022)i Fk(v)o(ector)e(and)g(computes)h(the)f(lik)o(eliho)q(o)q(d)j(for)d(eac)o(h)h (one.)23 b(The)17 b(computation)150 1324 y(of)e(the)g(lik)o(eliho)q(o)q(d)j (for)c(eac)o(h)h(input)h(v)m(alue)g(and)f(for)g(eac)o(h)g(p)q(edigree)h(are)f (essen)o(tially)i(indep)q(en-)150 1381 y(den)o(t)f(except)g(for)f(some)h (shared)g(input/output.)22 b(Th)o(us)16 b(if)g(the)g(computation)f(crashes)h (in)h(the)150 1437 y(middle,)e(all)f(the)f(lik)o(eliho)q(o)q(d)j (calculations)f(that)d(w)o(ere)h(completed)h(do)f(not)f(need)i(to)f(b)q(e)h (redone)150 1494 y(\(pro)o(vided)21 b(the)f(results)g(w)o(ere)g(written)h(to) e(a)h(\014le)h(b)q(efore)g(the)f(crash\);)i(This)e(explains)i(wh)o(y)150 1550 y(there)15 b(is)h(little)h(need)f(to)e(use)i(a)f(c)o(hec)o(kp)q(oin)o (ting)h(sc)o(heme)g(within)g(LINKMAP)g(and)g(MLINK.)221 1606 y(The)h(basic)g(structure)g(of)g(the)g(lik)o(eliho)q(o)q(d)j(computation)d (is)g(outlined)i(in)e(the)g(section)h(on)150 1663 y(Numerical)g(and)g (Computerized)f(Metho)q(ds)g(in)h([12)o(].)25 b(Inside)19 b(the)e(lo)q(op)g (o)o(v)o(er)f(p)q(edigrees,)j(the)150 1719 y(programs)d(tra)o(v)o(erse)g(a)h (p)q(edigree)h(up)q(dating)g(the)f(probabilities)j(of)c(eac)o(h)i(join)o(t)f (genot)o(yp)q(e)g(for)150 1776 y(eac)o(h)j(individual.)36 b(There)19 b(are)h(sev)o(eral)f(di\013eren)o(t)h(up)q(dating)h(routines,)f(but)g(they)g (all)g(start)150 1832 y(with)c(a)g(double)i(nested)e(lo)q(op)h(o)o(v)o(er)e (the)h(p)q(ossible)i(genot)o(yp)q(es)e(for)f(one)i(paren)o(t)e(and)h(then)h (the)150 1889 y(other)e(paren)o(t.)221 1945 y(Asso)q(ciated)f(with)g(eac)o(h) g(individual)j(is)d(an)f(arra)o(y)g Fc(genarray)f Fk(indexed)k(b)o(y)d(join)o (t)h(genot)o(yp)q(e)150 2002 y(n)o(um)o(b)q(ers.)25 b(W)l(e)17 b(assume)f(that)h(the)f(alleles)j(at)d(eac)o(h)h(lo)q(cus,)h(the)f(haplot)o (yp)q(es,)g(and)g(the)g(geno-)150 2058 y(t)o(yp)q(es)e(are)f(enco)q(ded)j(b)o (y)d(n)o(um)o(b)q(ers.)21 b(The)15 b(sp)q(eci\014c)h(enco)q(ding)h(sc)o(heme) e(used)g(in)h(the)f(programs)150 2115 y(is)i(not)f(imp)q(ortan)o(t)h(here.)24 b(W)l(e)17 b(denote)g(the)f(n)o(um)o(b)q(er)h(of)g(haplot)o(yp)q(es)g(b)o(y)f Ff(h)p Fk(.)25 b(The)16 b(n)o(um)o(b)q(er)h(of)150 2171 y(genot)o(yp)q(es)h (is)h(denoted)f(b)o(y)g Ff(g)h Fk(=)f Ff(h)12 b Fb(\002)h Fk(\()p Ff(h)e Fk(+)i(1\))p Ff(=)p Fk(2)p Ff(:)j Fk(The)j(reason)f(for)f(this)i(form) o(ula)e(is)i(that)e(a)150 2227 y(genot)o(yp)q(e)c(is)h(formed)f(b)o(y)g Fg(cho)n(osing)27 b Fk(t)o(w)o(o)12 b(haplot)o(yp)q(es)h(to)g(mak)o(e)g(the)g (t)o(w)o(o)f(strands.)19 b(If)13 b(the)g(t)o(w)o(o)150 2284 y(strands)j(are)g(di\013eren)o(t)g(and)g(w)o(e)g(think)h(of)f(dra)o(wing)g (the)g(genot)o(yp)q(e)g(as)g(a)g(diagram,)f(then)i(the)150 2340 y(strand)e(that)g(has)h(the)g Fg(lower)32 b Fk(allele)18 b(n)o(um)o(b)q(er)e(at)f(the)h(\014rst)f(heterozygous)h(lo)q(cus)g(is)h (declared)150 2397 y(b)o(y)f(con)o(v)o(en)o(tion)h(to)f(b)q(e)h(the)g Fg(left)33 b Fk(strand;)17 b(and)g(the)f(strand)g(with)h(the)g(higher)g (allele)i(n)o(um)o(b)q(er)150 2453 y(at)c(the)g(\014rst)g(heterozygous)f(lo)q (cus)j(is)e(declared)i(to)d(b)q(e)i(the)f Fg(right)32 b Fk(strand.)221 2510 y(The)13 b(size)h(of)f(a)g Fc(genarray)g Fk(is)g Ff(g)r Fk(.)19 b(F)l(or)13 b(our)g(\014rst)g(impro)o(v)o(emen)o(t)g(it)g(is)h (useful)h(to)d(understand)964 2678 y(5)p eop %%Page: 6 6 6 5 bop 150 195 a Fk(that)18 b(generally)i Ff(h)f Fk(is)h(at)e(most)g(in)i (the)f(h)o(undreds,)h(ev)o(en)f(on)g(long)g(runs,)h(but)f Ff(g)h Fk(ma)o(y)f(b)q(e)g(in)150 252 y(the)c(tens)g(or)g(h)o(undreds)g(of)g (thousands.)20 b(The)15 b(en)o(try)g Fc(genarray[)p Ff(j)s Fc(])d Fk(initially)18 b(stores)c(a)h(scaled)150 308 y(v)o(ersion)21 b(of)f(the)g(probabilit)o(y)i(that)e(the)g(individual)k(has)c(the)h(phenot)o (yp)q(e)g(asso)q(ciated)g(with)150 364 y(genot)o(yp)q(e)f Ff(j)i Fk(giv)o(en)e(the)g(join)o(t)f(genot)o(yp)q(e)h Ff(j)s Fk(.)32 b(After)20 b(tra)o(v)o(ersing)f(the)g(part)g(of)h(the)f(p)q(edigree)150 421 y(including)d(the)d(individual,)j Fc(genarray[)p Ff(j)s Fc(])11 b Fk(stores)h(the)h(probabilit)o(y)h(that)e(the)h(individual)j(has) 150 477 y(genot)o(yp)q(e)g Ff(j)i Fk(and)d(its)h(asso)q(ciated)g(phenot)o(yp) q(e,)g(conditioned)h(on)f(the)g(genot)o(yp)q(es)f(of)g(relativ)o(es)150 534 y(already)j(visited)h(in)f(the)g(tra)o(v)o(ersal)f(and)h(the)f(recom)o (bination)i(fraction.)27 b(F)l(ollo)o(wing)18 b(the)g(no-)150 590 y(tation)i(of)g(Lathrop)g(and)h(Lalouel)h([8)o(],)f(supp)q(ose)h(w)o(e)e (are)g(up)q(dating)h(the)g(probabilit)o(y)h(that)150 647 y(individual)g(with) e(phenot)o(yp)q(e)g Ff(X)i Fk(has)d(join)o(t)g(genot)o(yp)q(e)g Ff(G)p Fk(,)g(conditioned)i(on)e(the)g(collectiv)o(e)150 703 y(join)o(t)14 b(genot)o(yp)q(es)g Ff(Y)25 b Fk(of)13 b(the)h(relativ)o(es)h (that)e(ha)o(v)o(e)h(already)h(b)q(een)g(tra)o(v)o(ersed)e(and)h(a)g (candidate)150 760 y Ff(\022)q Fk(.)20 b(Then)c(the)f(up)q(date)h(rule)g(is:) 613 857 y Ff(P)6 b Fk(\()p Ff(X)q(;)i(G)j Fb(j)h Ff(Y)s(;)c(\022)q Fk(\))k(=)h Ff(P)6 b Fk(\()p Ff(X)16 b Fb(j)c Ff(G)p Fk(\))p Ff(P)6 b Fk(\()p Ff(G)p Fb(j)p Ff(Y)s(;)i(\022)q Fk(\))p Ff(:)150 955 y Fk(If)15 b(w)o(e)f(could)h(compute)g(with)g(arbitrary)e(precision,)j (then)f Ff(P)6 b Fk(\()p Ff(X)16 b Fb(j)c Ff(G)p Fk(\))i(w)o(ould)h(b)q(e)g (the)g(con)o(ten)o(ts)150 1011 y(of)h Fc(genarray)o Fk([)p Ff(G)p Fk(])f(b)q(efore)h(the)h(up)q(date,)f(and)h Ff(P)6 b Fk(\()p Ff(X)q(;)i(G)13 b Fb(j)h Ff(Y)s(;)8 b(\022)q Fk(\))16 b(w)o(ould)g(b)q(e)h(the)f(con)o(ten)o(ts)g(after.)150 1068 y(Ho)o(w)o(ev)o(er,)d(the)h(probabilit)o(y)h(computed)f(is)g(generally)h(so)e (small)i(that)e(under\015o)o(w)h(is)g(a)f(danger.)150 1124 y(Therefore,)18 b(LINKA)o(GE)g(scales)g(all)h(the)f(v)m(alues)h(in)f Fc(genarray)f Fk(and)h(undo)q(es)g(the)g(scaling)h(at)150 1181 y(the)c(v)o(ery)g(end)h(of)f(the)g(lik)o(eliho)q(o)q(d)j(computation.)150 1323 y Fh(3)69 b(Sub)r(dividing)22 b(Recom)n(bination)f(Classes)150 1424 y Fk(In)d(this)g(section,)h(w)o(e)e(describ)q(e)j(ho)o(w)d(w)o(e)h (impro)o(v)o(ed)f(the)h(use)g(of)g(recom)o(bination)g(classes,)g(as)150 1481 y(previously)f(prop)q(osed)g(in)g([8)o(].)22 b(W)l(e)17 b(\014rst)e(need)i(to)f(review)g(what)g(recom)o(bination)h(classes)f(are)150 1537 y(and)f(ho)o(w)g(they)g(are)f(used)i(inside)g(the)f(lik)o(eliho)q(o)q(d) j(computation.)i(Throughout)14 b(this)i(section,)150 1594 y(w)o(e)i(assume)f (that)g(all)i(sample)g(paren)o(tal)e(genot)o(yp)q(es)h(are)g Fg(heter)n(ozygous)j Fk(at)c(all)i(lo)q(ci.)29 b(In)19 b(the)150 1650 y(issues)e(discussed)h(here,)e(the)h(homozygous)e(lo)q(ci)j(can)e(b)q(e) h(ignored)g(since)g(w)o(e)f(kno)o(w)g(what)g(the)150 1707 y(c)o(hild)g(will)f (inherit)h(at)d(homozygous)h(lo)q(ci.)21 b(F)l(or)13 b(this)h(section)h(w)o (e)f(assume)g(w)o(e)g(are)f(w)o(orking)h(on)150 1763 y(a)h(computation)g(for) g(an)g(autosomal)f(c)o(hromosome.)221 1820 y(W)l(e)e(de\014ne)h(a)f Fg(r)n(e)n(c)n(ombination)h(p)n(attern)i Fk(to)d(b)q(e)h(a)f(v)o(ector)f(of)h (length)h Ff(n)t Fb(\000)t Fk(1)g(with)f(v)m(alue)i(0)e(or)f(1)150 1876 y(at)i(eac)o(h)g(p)q(osition.)20 b(Giv)o(en)14 b(a)f(genot)o(yp)q(e)g (for)g(a)g(paren)o(t,)g(the)g(recom)o(bination)h(pattern)f(restricts)150 1933 y(whic)o(h)j(haplot)o(yp)q(es)g(the)g(c)o(hild)h(ma)o(y)e(inherit.)22 b(If)15 b(w)o(e)g(\014x)h(the)g(allele)h(inherited)g(at)e(lo)q(cus)h(1,)f(w)o (e)150 1989 y(then)j(in)o(terpret)f(0)g(in)i(p)q(osition)f Ff(i)f Fk(to)g(mean)g(that)g(the)h(c)o(hild)h(inherits)f(the)g(allele)h(from) e(lo)q(cus)150 2045 y Ff(i)10 b Fk(+)h(1)k(from)g(the)h Fg(same)j Fk(strand)c(as)g(the)h(allele)i(from)d(lo)q(cus)h Ff(i)p Fk(;)f(i.e.,)h(no)f (recom)o(bination)i(o)q(ccurs)150 2102 y(b)q(et)o(w)o(een)g(lo)q(ci)h Ff(i)e Fk(and)h Ff(i)11 b Fk(+)g(1.)24 b(W)l(e)17 b(in)o(terpret)g(1)f(in)i (p)q(osition)f Ff(i)g Fk(to)f(mean)g(that)g(recom)o(bination)150 2158 y(do)q(es)g(o)q(ccur)f(b)q(et)o(w)o(een)h(lo)q(ci)g Ff(i)f Fk(and)g Ff(i)10 b Fk(+)h(1.)221 2215 y(F)l(or)18 b(example,)i(supp)q(ose)g (that)e(the)h(paren)o(t)f(has)h(a)f(3-lo)q(cus)i(phase)f(kno)o(wn)g(genot)o (yp)q(e)f(of)150 2271 y(\(1)j Fb(j)g Fk(2)p Ff(;)8 b Fk(3)20 b Fb(j)h Fk(4)p Ff(;)8 b Fk(5)20 b Fb(j)i Fk(6\).)35 b(If)20 b(inheritance)j(follo)o(ws)d(the)h(recom)o(bination)g(pattern)f(\(1)p Ff(;)8 b Fk(0\),)20 b(then)150 2328 y(the)14 b(c)o(hild)i(could)g(inherit)f (either)g(of)f(the)g(haplot)o(yp)q(es)h(\(1)p Ff(;)8 b Fk(4)p Ff(;)g Fk(6\))j(or)j(\(2)p Ff(;)8 b Fk(3)p Ff(;)g Fk(5\))j(dep)q(ending)17 b(on)d(the)150 2384 y(c)o(hoice)i(of)f(allele)i(at)e(the)g(\014rst)g(lo)q (cus.)221 2441 y(Recall)h(from)e(Section)j(2)e(that)g(the)g(up)q(date)h(of)f (a)g(n)o(uclear)h(family)h(starts)d(with)h(t)o(w)o(o)f(lo)q(ops)150 2497 y(o)o(v)o(er)e(the)g(p)q(ossible)j(genot)o(yp)q(es)d(of)g(eac)o(h)h (paren)o(t.)18 b(Let)13 b Ff(G)1120 2504 y Fe(1)1152 2497 y Fk(b)q(e)g(a)g(p)q(ossible)h(genot)o(yp)q(e)e(for)g(paren)o(t)150 2554 y(1)f(and)g Ff(G)304 2561 y Fe(2)334 2554 y Fk(a)g(p)q(ossible)h(genot)o (yp)q(e)f(for)g(paren)o(t)f(2.)18 b(Let)11 b Ff(R)1093 2561 y Fe(1)1123 2554 y Fk(and)h Ff(R)1243 2561 y Fe(2)1273 2554 y Fk(b)q(e)f(recom)o(bination)h(patterns.)964 2678 y(6)p eop %%Page: 7 7 7 6 bop 150 195 a Fk(Let)17 b(the)g(t)o(w)o(o)e(haplot)o(yp)q(es)i(that)f(an) h(un)o(t)o(yp)q(ed)g(c)o(hild)i(can)e(inherit)h(from)e Ff(G)1463 202 y Fe(1)1499 195 y Fk(consisten)o(t)h(with)150 252 y(pattern)d Ff(R)346 259 y Fe(1)379 252 y Fk(b)q(e)h Ff(H)478 259 y Fe(1)p Fd(l)523 252 y Fk(and)f Ff(H)648 259 y Fe(1)p Fd(r)685 252 y Fk(.)19 b(with)c(the)f(second)h(subscript)g(indicating)h(whether)f(the)f (allele)150 308 y(at)i(lo)q(cus)h(1)f(is)h(inherited)h(from)e(the)g(left)h (strand)f(or)f(the)i(righ)o(t.)23 b(Similarly)l(,)c(let)d Ff(H)1589 315 y Fe(2)p Fd(l)1636 308 y Fk(and)h Ff(H)1764 315 y Fe(2)p Fd(r)150 364 y Fk(b)q(e)f(the)f(t)o(w)o(o)f(haplot)o(yp)q(es)i(that)e(the)i (c)o(hild)g(can)g(inherit)g(from)f Ff(G)1265 371 y Fe(2)1299 364 y Fk(consisten)o(t)h(with)f Ff(R)1649 371 y Fe(2)1669 364 y Fk(.)221 421 y(Lathrop)c(and)g(Lalouel)i(de\014ned)f(a)f Fg(r)n(e)n(c)n(ombination)h(class)i Fk(to)c(b)q(e)i(the)f(set)g(of)g(four)g (genot)o(yp)q(es)150 477 y(formed)16 b(from)f(the)h(haplot)o(yp)q(e)h(pairs)f Fb(f)p Ff(H)876 484 y Fe(1)p Fd(l)906 477 y Ff(H)944 484 y Fe(2)p Fd(l)975 477 y Ff(;)8 b(H)1034 484 y Fe(1)p Fd(l)1063 477 y Ff(H)1101 484 y Fe(2)p Fd(r)1138 477 y Ff(;)g(H)1197 484 y Fe(1)p Fd(r)1232 477 y Ff(H)1270 484 y Fe(2)p Fd(l)1301 477 y Ff(;)g(H)1360 484 y Fe(1)p Fd(r)1395 477 y Ff(H)1433 484 y Fe(2)p Fd(r)1470 477 y Fb(g)p Fk(.)22 b(These)16 b(are)g(the)150 534 y(four)g(genot)o(yp)q(es)g(that)f(a)h(c)o(hild)h(migh)o(t)f(inherit)i (from)d(paren)o(ts)h(with)g(genot)o(yp)q(es)g Ff(G)1607 541 y Fe(1)1643 534 y Fk(and)g Ff(G)1768 541 y Fe(2)1787 534 y Fk(,)150 590 y(if)g(recom)o(bination)g(patterns)e Ff(R)703 597 y Fe(1)738 590 y Fk(and)h Ff(R)861 597 y Fe(2)895 590 y Fk(apply)l(.)221 647 y(F)l(or)f(eac)o(h)h(recom)o(bination)h(class,)f(inside) i(an)e(inner)h(lo)q(op)g(w)o(e)f(need)h(to)e(compute)i(the)f(sum)150 743 y Fc(genarray)341 755 y Fd(c)358 743 y Fk([)p Ff(H)409 750 y Fe(1)p Fd(l)439 743 y Ff(H)477 750 y Fe(2)p Fd(l)508 743 y Fk(])t(+)t Fc(genarray)755 755 y Fd(c)773 743 y Fk([)p Ff(H)824 750 y Fe(1)p Fd(l)854 743 y Ff(H)892 750 y Fe(2)p Fd(r)928 743 y Fk(])t(+)t Fc(genarray)1176 755 y Fd(c)1193 743 y Fk([)p Ff(H)1244 750 y Fe(1)p Fd(r)1280 743 y Ff(H)1318 750 y Fe(2)p Fd(l)1348 743 y Fk(])t(+)t Fc(genarray)1596 755 y Fd(c)1613 743 y Fk([)p Ff(H)1664 750 y Fe(1)p Fd(r)1700 743 y Ff(H)1738 750 y Fe(2)p Fd(r)1775 743 y Fk(])p Ff(;)150 839 y Fk(where)h Fc(genarray)472 851 y Fd(c)505 839 y Fk(is)g(the)f(arra)o(y)g (of)f(genot)o(yp)q(e)i(probabilities)h(for)e(a)g(c)o(hild)i Ff(c)p Fk(.)j(Suc)o(h)c(a)f(sum)g(is)150 895 y(done)c(for)f(eac)o(h)h(c)o (hild)i(in)e(a)g(n)o(uclear)g(family)l(,)i(except)e(p)q(ossibly)h(the)f (\014rst.)18 b(Man)o(y)10 b(recom)o(bination)150 952 y(classes)17 b(\(view)o(ed)g(as)f(unordered)h(sets\))f(con)o(tain)h(exactly)g(the)f Fg(same)k Fk(genot)o(yp)q(es.)j(Therefore,)150 1008 y(in)18 b(v)o(ery)f(early)h(v)o(ersions)f(of)g(the)g(LINKA)o(GE)h(programs)e(the)h (same)g(sum)h(w)o(as)e(b)q(eing)j Fg(r)n(e)n(done)150 1065 y Fk(for)13 b(ev)o(ery)h(iden)o(tical)i(class.)k(By)14 b(rearranging)f(the)h (order)g(of)f(the)h(computation,)g(Lathrop)g(and)150 1121 y(Lalouel)h(did)g (all)g(the)f(iden)o(tical)h(classes)g(consecutiv)o(ely)l(,)g(so)f(that)f(for) g(eac)o(h)h(di\013eren)o(t)g(class)g(the)150 1178 y(four-term)h(sum)g(is)g (done)h(only)g(once.)221 1234 y(It)f(should)i(b)q(e)g(emphasized)g(that)e (the)h(ab)q(o)o(v)o(e)f(sum)h(in)o(v)o(olv)o(es)g(3)g(\015oating-p)q(oin)o(t) g(additions)150 1290 y(and)f(is)f(in)i(a)e(deeply)h(nested)g(lo)q(op;)g(v)o (ersions)g(of)f(the)g(sum)g(\(with)h(di\013eren)o(t)f(arra)o(y)f(indices)k (and)150 1347 y(di\013eren)o(t)h(c)o(hildren\))h(are)f(done)g(tens)g(of)f (millions)j(of)d(times,)i(or)e(more,)h(on)f(long)h(LINKA)o(GE)150 1403 y(computations.)41 b(Therefore,)24 b(w)o(e)e(lo)q(ok)g(at)g(the)g(sum)h (v)o(ery)l(,)g(v)o(ery)f(closely)i(and)e(\014nd)h(more)150 1460 y(opp)q(ortunit)o(y)16 b(to)g(eliminate)i(duplicate)g(additions.)24 b(In)17 b(the)f(sex-link)o(ed)i(case,)e(the)h(four-term)150 1516 y(sum)e(b)q(ecomes)h(a)f(t)o(w)o(o-term)e(sum)j(and)f(there)g(is)h(no)f (b)q(etter)g(w)o(a)o(y)g(to)f(compute)h(it.)221 1573 y(Supp)q(ose)d(w)o(e)f (consider)h(a)e(di\013eren)o(t)i(p)q(ossible)h(genot)o(yp)q(e)e Ff(G)1232 1556 y Fn(0)1232 1584 y Fe(2)1262 1573 y Fk(for)g(the)g(second)g (paren)o(t,)g(while)150 1629 y(k)o(eeping)20 b(the)f(\014rst)f(paren)o(t)g (the)h(same.)31 b(In)19 b(practice,)h(suc)o(h)f(a)g(c)o(hange)f(happ)q(ens)i (frequen)o(tly)150 1686 y(b)q(ecause,)14 b(w)o(e)f(lo)q(op)h(o)o(v)o(er)e (all)j(p)q(ossible)g(genot)o(yp)q(es)e(for)f(paren)o(t)h(2)g(is)h Fg(inside)i Fk(the)d(genot)o(yp)q(e)g(lo)q(op)150 1742 y(for)i(paren)o(t)f (1.)20 b(The)15 b(new)h(4-term)e(sum)i(will)g(b)q(e)150 1838 y Fc(genarray)341 1850 y Fd(c)358 1838 y Fk([)p Ff(H)409 1845 y Fe(1)p Fd(l)439 1838 y Ff(H)481 1819 y Fn(0)477 1849 y Fe(2)p Fd(l)508 1838 y Fk(])t(+)t Fc(genarray)755 1850 y Fd(c)773 1838 y Fk([)p Ff(H)824 1845 y Fe(1)p Fd(l)854 1838 y Ff(H)896 1819 y Fn(0)892 1849 y Fe(2)p Fd(r)928 1838 y Fk(])t(+)t Fc(genarray)1176 1850 y Fd(c)1193 1838 y Fk([)p Ff(H)1244 1845 y Fe(1)p Fd(r)1280 1838 y Ff(H)1322 1819 y Fn(0)1318 1849 y Fe(2)p Fd(l)1348 1838 y Fk(])t(+)t Fc(genarray)1596 1850 y Fd(c)1613 1838 y Fk([)p Ff(H)1664 1845 y Fe(1)p Fd(r)1700 1838 y Ff(H)1742 1819 y Fn(0)1738 1849 y Fe(2)p Fd(r)1775 1838 y Fk(])p Ff(:)150 1934 y Fk(The)c(c)o(hange)g (from)g Ff(G)528 1941 y Fe(2)559 1934 y Fk(to)g Ff(G)648 1918 y Fn(0)648 1946 y Fe(2)679 1934 y Fk(ma)o(y)f(c)o(hange)i(all)g(four)e Fg(genotyp)n(es)k Fk(in)e(the)f(recom)o(bination)h(class,)150 1991 y(but)18 b(it)h(can)f(b)q(e)h(more)f(usefully)i(view)o(ed)f(as)f(a)g (substitution)h(of)f(the)g Fg(haplotyp)n(e)k Ff(H)1614 1974 y Fn(0)1610 2004 y Fe(2)p Fd(l)1659 1991 y Fk(for)c Ff(H)1770 1998 y Fe(2)p Fd(l)150 2047 y Fk(and)d(a)g(substitution)h(of)e(the)h Fg(haplotyp)n(e)k Ff(H)902 2031 y Fn(0)898 2059 y Fe(2)p Fd(r)950 2047 y Fk(for)14 b Ff(H)1057 2054 y Fe(2)p Fd(r)1094 2047 y Fk(.)19 b(T)l(o)c(promote)f(the)h(latter)g(view,)g(let)h(us)150 2103 y(reorganize)f(the)h(previous)g(quadruple)g(sum)f(as)g(follo)o(ws)150 2199 y(\()p Fc(genarray)359 2212 y Fd(c)376 2199 y Fk([)p Ff(H)427 2206 y Fe(1)p Fd(l)457 2199 y Ff(H)499 2181 y Fn(0)495 2211 y Fe(2)p Fd(l)525 2199 y Fk(]+)p Fc(genarray)764 2212 y Fd(c)782 2199 y Fk([)p Ff(H)833 2206 y Fe(1)p Fd(r)869 2199 y Ff(H)911 2181 y Fn(0)907 2211 y Fe(2)p Fd(l)937 2199 y Fk(]\)+\()p Fc(genarray)1211 2212 y Fd(c)1229 2199 y Fk([)p Ff(H)1280 2206 y Fe(1)p Fd(l)1310 2199 y Ff(H)1352 2181 y Fn(0)1348 2211 y Fe(2)p Fd(r)1384 2199 y Fk(]+)p Fc(genarray)1623 2212 y Fd(c)1640 2199 y Fk([)p Ff(H)1691 2206 y Fe(1)p Fd(r)1727 2199 y Ff(H)1769 2181 y Fn(0)1765 2211 y Fe(2)p Fd(r)1802 2199 y Fk(]\))p Ff(:)150 2295 y Fk(Notice)g(that)g(if)g(w) o(e)g(\014x)g Ff(G)599 2302 y Fe(1)619 2295 y Fk(,)f Ff(R)681 2302 y Fe(1)700 2295 y Fk(,)h(and)g Ff(c)p Fk(,)g(eac)o(h)g(paren)o(thesized) h(pair)f(sum)g(dep)q(ends)i(only)e(on)g(a)150 2352 y Fg(haplotyp)n(e)k Fk(for)c(paren)o(t)f(2.)20 b(Three)15 b(imp)q(ortan)o(t)g(consequences)i (are:)206 2441 y(1.)22 b(Ev)o(en)d(though,)h(eac)o(h)f(quadruple)i(sum)e(lik) o(e)i(our)e(\014rst)g(sum)g(is)h(done)g(only)g(once,)g(the)264 2497 y(pair)15 b(sums)g(paren)o(thesized)i(in)f(our)f(third)h(sum)f(o)q(ccur) g(in)h(man)o(y)f(quadruple)i(sums)e(and)264 2554 y(are)g(b)q(eing)h(redone)g (man)o(y)e(times.)964 2678 y(7)p eop %%Page: 8 8 8 7 bop 206 195 a Fk(2.)22 b(If)f(w)o(e)f(could)i(precompute)f(eac)o(h)g(p)q (ossible)h(pair)f(sum,)h(the)f(sum)f(in)i(the)f(inner)g(lo)q(op)264 252 y(w)o(ould)13 b(b)q(ecome)g(a)g Fg(single)f(\015o)n(ating)i(p)n(oint)f (addition)k Fk(of)12 b(t)o(w)o(o)g(terms)g(rather)g(than)h(a)f Fg(triple)264 308 y(\015o)n(ating)j(p)n(oint)k Fk(addition)e(of)e(four)f (terms.)206 394 y(3.)22 b(If)15 b(w)o(e)g(\014x)g Ff(G)476 401 y Fe(1)496 394 y Fk(,)g(the)g(n)o(um)o(b)q(er)g(of)g(p)q(ossible)i(pair)f (sums)f(needed)h(is)g(at)f(most)264 450 y(\(n)o(um)o(b)q(er)g(of)g(recom)o (bination)g(patterns)g Fb(\002)h Fk(n)o(um)o(b)q(er)f(of)g(c)o(hildren)i Fb(\002)f Fc(maxhap)p Fk(\),)264 507 y(whic)o(h)g(is)f(reasonable)h(as)f (long)g(as)g(the)g(n)o(um)o(b)q(er)h(of)f(lo)q(ci)h(is)g(5)f(or)g(less.)221 581 y(Therefore,)i(once)h(inside)h(the)f(\014rst)f(lo)q(op,)h(where)g Ff(G)1141 588 y Fe(1)1178 581 y Fk(is)g(\014xed,)g(w)o(e)g(compute)f(a)g (table)h(of)150 638 y(all)d(the)e(p)q(ossible)j(pair)e(sums.)19 b(Inside)d(the)e(innermost)g(lo)q(op,)g(the)g(triple)g(sum)g(b)q(ecomes)h(a)e (sum)150 694 y(of)i(t)o(w)o(o)f(terms)g(from)h(our)g(table.)221 751 y(In)g(pseudo)q(co)q(de:)22 b(the)15 b(old)h(algorithm)f(lo)q(oks)g(lik)o (e:)311 816 y(F)l(or)g(eac)o(h)g(p)q(ossible)i(genot)o(yp)q(e)e Ff(G)895 823 y Fe(1)930 816 y Fk(of)g(paren)o(t)g(1)402 872 y(F)l(or)g(eac)o(h)g(p)q(ossible)i(genot)o(yp)q(e)e Ff(G)986 879 y Fe(2)1021 872 y Fk(of)g(paren)o(t)g(2)493 929 y(Do)g(probabilit)o(y)h (up)q(date)g(with)g(man)o(y)e(4-term)h(sums)150 994 y(and)g(the)h(new)f (algorithm)g(\(calling)i(the)e(table)h(for)e(c)o(hild)j Ff(c)e(T)1212 1001 y Fd(c)1229 994 y Fk(\))g(lo)q(oks)g(lik)o(e:)311 1059 y(F)l(or)g(eac)o(h)g(p)q(ossible)i(genot)o(yp)q(e)e Ff(G)895 1066 y Fe(1)930 1059 y Fk(of)g(paren)o(t)g(1)402 1115 y(F)l(or)g(eac)o(h)g (haplot)o(yp)q(e)h(H)493 1172 y Ff(T)520 1179 y Fd(c)537 1172 y Fk([)p Ff(H)t Fk(])c Fb( )g Fc(genarray)866 1184 y Fd(c)883 1172 y Fk([)p Ff(H)934 1179 y Fe(1)p Fd(l)964 1172 y Ff(H)t Fk(])d(+)i Fc(genarray)1265 1184 y Fd(c)1282 1172 y Fk([)p Ff(H)1333 1179 y Fe(1)p Fd(r)1369 1172 y Ff(H)t Fk(])402 1228 y(F)l(or)k(eac)o(h)g(p)q(ossible)i(genot)o(yp)q(e)e Ff(G)986 1235 y Fe(2)1021 1228 y Fk(of)g(paren)o(t)g(2)493 1284 y(Do)g(probabilit)o(y) h(up)q(date)g(with)g(2-term)e(sums)150 1349 y(where)h(the)h(t)o(ypical)g (4-term)e(sum:)150 1428 y Fc(genarray)341 1440 y Fd(c)358 1428 y Fk([)p Ff(H)409 1435 y Fe(1)p Fd(l)439 1428 y Ff(H)477 1435 y Fe(2)p Fd(l)508 1428 y Fk(])t(+)t Fc(genarray)755 1440 y Fd(c)773 1428 y Fk([)p Ff(H)824 1435 y Fe(1)p Fd(l)854 1428 y Ff(H)892 1435 y Fe(2)p Fd(r)928 1428 y Fk(])t(+)t Fc(genarray)1176 1440 y Fd(c)1193 1428 y Fk([)p Ff(H)1244 1435 y Fe(1)p Fd(r)1280 1428 y Ff(H)1318 1435 y Fe(2)p Fd(l)1348 1428 y Fk(])t(+)t Fc(genarray)1596 1440 y Fd(c)1613 1428 y Fk([)p Ff(H)1664 1435 y Fe(1)p Fd(r)1700 1428 y Ff(H)1738 1435 y Fe(2)p Fd(r)1775 1428 y Fk(])p Ff(;)150 1507 y Fk(b)q(ecomes)i(the)f(2-term)g(sum:)807 1563 y Ff(T)834 1570 y Fd(c)851 1563 y Fk([)p Ff(H)902 1570 y Fe(2)p Fd(l)932 1563 y Fk(])9 b(+)i Ff(T)1027 1570 y Fd(c)1044 1563 y Fk([)p Ff(H)1095 1570 y Fe(2)p Fd(r)1131 1563 y Fk(])221 1635 y(In)18 b(this)g(simpli\014ed)j(pseudo)q(co)q(de,)e(if)f(there)g(are)g Ff(h)g Fk(haplot)o(yp)q(es)g(and)g Ff(q)i Fk(quadruple)f(sums)150 1692 y(to)14 b(b)q(e)h(computed)g(for)e(a)h(giv)o(en)h(c)o(hoice)h(of)d Ff(G)919 1699 y Fe(1)939 1692 y Fk(,)h(then)h(the)f(old)h(co)q(de)g(do)q(es)g (3)p Ff(q)h Fk(sum)e(op)q(erations,)150 1748 y(while)i(the)e(new)h(co)q(de)g (do)q(es)g Ff(h)8 b Fk(+)h Ff(q)r Fk(,)14 b(where)h Ff(h)f Fk(are)g(done)h(to)f(build)i(table)f Ff(T)20 b Fk(and)15 b Ff(q)h Fk(are)e(done)h(in)150 1804 y(the)i(inner)h(lo)q(op.)25 b(In)18 b(the)f(actual)g(co)q(de,)h(there)f(is)g(a)g(second)g(index)h(to)e (the)h(table)h(dep)q(ending)150 1861 y(on)c(the)g(c)o(hoice)h(of)f(recom)o (bination)g(pattern)g(for)f(paren)o(t)h(1)g(\(whic)o(h)g(determines)h(the)f (v)m(alues)h(of)150 1917 y Ff(H)188 1924 y Fe(1)p Fd(r)240 1917 y Fk(and)g Ff(H)366 1924 y Fe(1)p Fd(l)396 1917 y Fk(.)221 1974 y(The)d(n)o(um)o(b)q(er)h(of)f(en)o(tries)h(in)g(the)f(table)h(is)g(2) 968 1957 y Fe(\()p Fd(n)p Fn(\000)p Fe(1\))1064 1974 y Fb(\002)f Fk(\(n)o(um)o(b)q(er)h(of)f(haplot)o(yp)q(es\))g Fb(\002)h Fk(\(n)o(um)o(b)q(er)150 2030 y(of)k(c)o(hildren\).)26 b(F)l(or)17 b(example,)g(in)h(4-lo)q(cus)g(problem,)g(with)f(allele)i(pro)q(duct)e (\(i.e.,)g(n)o(um)o(b)q(er)g(of)150 2087 y(haplot)o(yp)q(es\))c(2)6 b Fb(\002)g Fk(3)g Fb(\002)g Fk(4)g Fb(\002)g Fk(5)13 b(=)g(120,)g(and)g(at)g (most)f(10)h(c)o(hildren)i(in)f(a)f(family)l(,)h(the)f(table)h(w)o(ould)150 2143 y(ha)o(v)o(e)h(8)10 b Fb(\002)g Fk(120)f Fb(\002)i Fk(10)h(=)h(9600)h (en)o(tries.)150 2283 y Fh(4)69 b(Handling)22 b(Lo)r(ops)150 2384 y Fk(One)e(of)e(the)h(causes)g(of)f(long)i(LINKA)o(GE)f(runs)g(is)g(lo)q (ops)h(in)f(the)g(input)h(p)q(edigree\(s\).)32 b(The)150 2441 y(algorithm)17 b(used)g(in)g(LINKA)o(GE)g(to)f(handle)i(lo)q(ops)f(w)o(as)f (\014rst)g(prop)q(osed)h(b)o(y)g(Lange)g(and)f(El-)150 2497 y(ston)h([6)o(])g(and)g(is)h(also)f(describ)q(ed)i(on)e(pages)g(170{171)f(of) g([12)o(].)26 b(W)l(e)17 b(review)h(it)f(here)h(to)f(k)o(eep)150 2554 y(the)e(pap)q(er)h(self-con)o(tained.)964 2678 y(8)p eop %%Page: 9 9 9 8 bop 221 195 a Fk(Supp)q(ose)16 b(for)e(simplicit)o(y)k(that)c(there)i(is) f(just)g(one)h(one)f(lo)q(op)h(in)g(the)f(p)q(edigree;)i(this)e(is)h(b)o(y) 150 252 y(far)11 b(the)g(most)g(common)g(case.)18 b(LINKA)o(GE)12 b(exp)q(ects)g(the)g(preparer)f(of)g(the)g(input)i(to)d(designate)150 308 y(one)k(individual)j(in)e(the)f(lo)q(op)g(as)g(the)g Fg(lo)n(op)h(br)n(e) n(aker)5 b Fk(,)13 b Ff(b)p Fk(.)19 b(This)c(is)f(done)h(b)o(y)e(making)h(t)o (w)o(o)f(copies)150 364 y(of)j(the)h(individual)j Ff(b)p Fk(,)c(whic)o(h)i(w) o(e)e(call)i Ff(b)852 371 y Fe(1)888 364 y Fk(and)f Ff(b)998 371 y Fe(2)1017 364 y Fk(.)25 b(P)o(erson)16 b Ff(b)1225 371 y Fe(1)1261 364 y Fk(is)i(sho)o(wn)e(as)g(the)h(c)o(hild)i(of)d Ff(b)p Fk('s)150 421 y(paren)o(ts,)i(but)g Ff(b)433 428 y Fe(1)471 421 y Fk(has)g(no)g(sp)q(ouse)h(or)e(c)o(hildren.)31 b(P)o(erson)18 b Ff(b)1200 428 y Fe(2)1237 421 y Fk(has)g Ff(b)p Fk('s)f(sp)q(ouse)i(and)f (c)o(hildren,)150 477 y(but)d(has)g(no)h(paren)o(ts.)221 534 y(If)f(p)q(erson)g Ff(b)f Fk(can)h(ha)o(v)o(e)f(only)h(one)g(join)o(t)g (genot)o(yp)q(e)g(then)g(the)f(mo)q(di\014ed)j(p)q(edigree)f(is)f(com-)150 590 y(puted)21 b(in)h(a)e(manner)h(equiv)m(alen)o(t)i(to)d(ha)o(ving)h(no)g (lo)q(op)g(declared.)38 b(If)21 b(p)q(erson)g Ff(b)f Fk(can)h(ha)o(v)o(e)150 647 y(sev)o(eral)15 b(genot)o(yp)q(es,)f Fb(f)p Ff(G)581 654 y Fe(1)600 647 y Ff(;)8 b(G)657 654 y Fe(2)676 647 y Ff(;)g(:)g(:)g(:)d(;)j (G)814 654 y Fd(p)833 647 y Fb(g)14 b Fk(then)h(the)g(algorithm)f(iterates)h (o)o(v)o(er)e(all)j(these)f(geno-)150 703 y(t)o(yp)q(es.)32 b(F)l(or)18 b(eac)o(h)i(p)q(ossible)h(genot)o(yp)q(e)e Ff(G)900 710 y Fd(i)914 703 y Fk(,)g(the)h(lik)o(eliho)q(o)q(d)i(is)d(computed)h (conditioned)h(on)150 760 y(b)q(oth)f Ff(b)282 767 y Fe(1)322 760 y Fk(and)g Ff(b)435 767 y Fe(2)475 760 y Fk(ha)o(ving)h(genot)o(yp)q(e)f Ff(G)861 767 y Fd(i)875 760 y Fk(.)35 b(Ott)20 b([12)o(])g(denotes)g(this)h (b)o(y)f Ff(P)6 b Fk(\()p Ff(x;)i(G)1572 767 y Fd(i)1586 760 y Fk(\),)20 b(where)h Ff(x)150 816 y Fk(stands)14 b(for)g(the)g(phenot)o(yp)q (e)h(data)f(observ)o(ed)g(on)g(the)g(p)q(edigree)i(mem)o(b)q(ers.)k(Then)14 b(the)h(o)o(v)o(erall)150 873 y(lik)o(eliho)q(o)q(d)j(is)e(giv)o(en)f(b)o(y) 879 904 y Fd(p)858 919 y Fa(X)859 1010 y Fd(i)p Fe(=1)925 960 y Ff(P)6 b Fk(\()p Ff(x;)i(G)1061 967 y Fd(i)1075 960 y Fk(\))221 1080 y(Eac)o(h)17 b(computation)g(of)g Ff(P)6 b Fk(\()p Ff(x;)i(G)793 1087 y Fd(i)806 1080 y Fk(\))17 b(do)q(es)h(a)f(fresh)h(tra)o(v)o(ersal)e(of) h(the)h(en)o(tire)f(p)q(edigree)i(up-)150 1136 y(dating)f Fc(genarray)p Fk(s.)25 b(In)18 b(eac)o(h)g(n)o(uclear)g(family)l(,)h(there)e(is)i(a)e (single)i(represen)o(tativ)o(e,)e Ff(r)q Fk(,)h(suc)o(h)150 1193 y(that)e(the)i Fc(genarray)d Fk(of)i Ff(r)h Fk(is)g(up)q(dated)f(during) h(the)g(tra)o(v)o(ersal;)e(the)h(up)q(date)h(for)e Ff(r)i Fk(is)g(condi-)150 1249 y(tioned)13 b(on)g(the)g(probabilities)i(for)d(the)h(other)g(mem)o(b)q (ers)f(of)h(the)g(n)o(uclear)g(family)l(,)h(so)e(that)g(their)150 1306 y(probabilit)o(y)18 b(up)q(dates)g(are)f(done)g(implicitl)q(y)l(.)28 b(W)l(e)18 b(observ)o(ed)f(the)g(follo)o(wing)h(recomputation)150 1362 y(happ)q(ening)k(and)e(found)h(a)f(simple)h(w)o(a)o(y)f(to)f(a)o(v)o (oid)h(it.)35 b(Supp)q(ose)21 b(that)f(the)g(lo)q(op)h(do)q(es)f(not)150 1418 y(encompass)e(the)g(en)o(tire)g(p)q(edigree.)29 b(Then)18 b(there)g(ma)o(y)f(b)q(e)i(certain)f(n)o(uclear)g(families)i(where)150 1475 y(the)f Fc(genarray)f Fk(v)m(alues)j(are)e(computed)g(indep)q(enden)o (tly)k(of)18 b Ff(b)p Fk('s)h(genot)o(yp)q(e.)32 b(These)19 b(n)o(uclear)150 1531 y(families)d(do)e(not)g(need)h(to)e(b)q(e)i(revisited)h (on)e(eac)o(h)g(tra)o(v)o(ersal,)f(since)j(the)e(up)q(date)h(done)f(will)i(b) q(e)150 1588 y(the)h(same)g(for)g(eac)o(h)g Ff(G)558 1595 y Fd(i)572 1588 y Fk(.)26 b(W)l(e)17 b(ha)o(v)o(e)g(mo)q(di\014ed)h(the)g(p)q (edigree)g(tra)o(v)o(ersal)f(algorithm,)g(so)g(that)150 1644 y(during)f(the)e(tra)o(v)o(ersal)g(for)g(the)h(\014rst)f(p)q(ossible)j(genot) o(yp)q(e)e(of)f Ff(b)p Fk(,)g(whic)o(h)i(w)o(e)e(called)i Ff(G)1619 1651 y Fe(1)1639 1644 y Fk(,)e(the)h(set)150 1701 y(of)g(n)o(uclear)h (families)g(that)f(do)g(not)g(ha)o(v)o(e)g(to)f(b)q(e)i(revisited)g(is)g (iden)o(ti\014ed.)221 1757 y(There)11 b(is)g(a)g(colorful)g(bio)q(c)o (hemical)j(metaphor)c(that)g(captures)h(precisely)i(ho)o(w)d(the)h(decision) 150 1814 y(of)18 b(whether)h(a)g(n)o(uclear)g(family)h(needs)g(to)e(b)q(e)h (revisited)h(is)g(made.)30 b(Imagine)20 b(that)e(w)o(e)h(tak)o(e)150 1870 y(some)14 b(radioactiv)o(e)h(dy)o(e)g(that)f(w)o(e)g(can)h(\\inject")g (in)o(to)f(the)h(p)q(edigree,)h(so)e(that)g(some)g(mem)o(b)q(ers)150 1927 y(will)h(b)q(e)f(radioactiv)o(e)f(and)g(others)g(not.)19 b(If)13 b(a)g(n)o(uclear)g(family)h(represen)o(tativ)o(e)f Ff(r)h Fk(is)g(radioactiv)o(e)150 1983 y(and)19 b(is)h(up)q(dated)f(on)g(the) g(\014rst)g(tra)o(v)o(ersal,)f(then)i(that)e(n)o(uclear)h(family)h(m)o(ust)e (b)q(e)i(revisited,)150 2039 y(and)f Ff(r)g Fk(up)q(dated)g(again,)g(for)e (eac)o(h)i Ff(G)815 2046 y Fd(i)829 2039 y Fk(.)29 b(If)19 b Ff(r)g Fk(is)g(not)f(radioactiv)o(e,)h(then)g(its)f(n)o(uclear)h(family)150 2096 y(do)q(es)d(not)e(need)i(to)f(b)q(e)h(revisited.)21 b(Here)15 b(are)g(the)h(rules)g(w)o(e)e(use)i(for)f(up)q(dates:)221 2152 y Fl(Rule)20 b(1.)k Fk(Before)17 b(the)g(\014rst)f(tra)o(v)o(ersal)g(for)g Ff(G)1026 2159 y Fe(1)1046 2152 y Fk(:)23 b Ff(b)1102 2159 y Fe(1)1121 2152 y Fk(,)17 b Ff(b)1171 2159 y Fe(2)1190 2152 y Fk(,)f(and)h(all)h(the)f(descendan)o(ts)g(of)g Ff(b)1781 2159 y Fe(2)150 2209 y Fk(\()p Ff(b)188 2216 y Fe(1)222 2209 y Fk(has)e(no)g(descendan)o(ts,)h(b)o(y)f(de\014nition\))h(are)f(made)h (radioactiv)o(e.)221 2265 y Fl(Rule)i(2.)i Fk(During)c(the)f(tra)o(v)o(ersal) g(for)f Ff(G)930 2272 y Fe(1)950 2265 y Fk(:)20 b(for)15 b(eac)o(h)g(n)o (uclear)h(family)l(,)g(if)g(an)o(y)f(mem)o(b)q(er)g(of)150 2322 y(the)g(n)o(uclear)h(family)g(is)g(radioactiv)o(e,)f(then)g(the)h (represen)o(tativ)o(e)f(is)h(made)f(radioactiv)o(e.)221 2378 y Fl(Rule)k(3.)k Fk(During)17 b(later)f(tra)o(v)o(ersal)f(for)h Ff(G)966 2385 y Fe(2)985 2378 y Ff(;)8 b(G)1042 2385 y Fe(3)1061 2378 y Ff(;)g(:)g(:)g(:)m Fk(:)22 b(w)o(e)16 b(up)q(date)h(the)f(represen)o (tativ)o(e)g(of)150 2435 y(a)f(n)o(uclear)h(family)g(if)f(and)h(only)g(if)f (the)g(represen)o(tativ)o(e)h(is)f(radioactiv)o(e.)221 2491 y(The)20 b(reason)f(for)g(Rule)h(1)g(is)g(that)f(LINKA)o(GE)h(tak)o(es)f(in)o (to)h(accoun)o(t)f(whic)o(h)i(genot)o(yp)q(es)150 2548 y(an)d(individual)j (can)d(inherit)i(when)e(initializi)q(ng)j Fc(genarray)p Fk(.)27 b(Th)o(us)18 b(for)f Ff(b)1459 2555 y Fe(1)1478 2548 y Fk(,)h Ff(b)1529 2555 y Fe(2)1549 2548 y Fk(,)g(and)g(all)h(the)964 2678 y(9)p eop %%Page: 10 10 10 9 bop 150 195 a Fk(descendan)o(ts)17 b(of)f Ff(b)476 202 y Fe(2)495 195 y Fk(,)h(the)f(initial)j Fc(genarray)c Fk(for)h(eac)o(h)h(tra) o(v)o(ersal)e(dep)q(ends)j(on)e(the)h(c)o(hoice)g(of)150 252 y(genot)o(yp)q(e)e(for)g Ff(b)433 259 y Fe(1)467 252 y Fk(and)h Ff(b)576 259 y Fe(2)610 252 y Fk(and)f(m)o(ust)g(b)q(e)h(recomputed.)221 308 y(When)i(there)g(are)f(m)o(ultiple)j(lo)q(ops,)e(eac)o(h)g(lo)q(op)g(is)g (brok)o(en)g(separately)l(.)28 b(The)18 b(algorithm)150 364 y(iterates)c(o)o(v)o(er)g(all)i(v)o(ectors)d(of)i(genot)o(yp)q(es,)f(where)h (comp)q(onen)o(t)f Ff(j)j Fk(of)d(the)h(v)o(ector)f(is)h(a)f(p)q(ossible)150 421 y(genot)o(yp)q(e)19 b(for)g(the)g Ff(j)525 404 y Fe(th)579 421 y Fk(lo)q(op)h(break)o(er.)32 b(W)l(e)20 b(apply)g(our)f(tra)o(v)o(ersal) f(algorithm)h(to)g(the)g(lo)q(op)150 477 y(whose)d(comp)q(onen)o(t)g(is)g (the)g(least)g(signi\014can)o(t)h(or)f(innermost)g(in)h(the)f(v)o(ector)f (iteration.)22 b(This)150 534 y(is)16 b(the)f(comp)q(onen)o(t)g(that)g(alw)o (a)o(ys)f(c)o(hanges)h(from)g(iteration)g(to)g(iteration.)221 590 y(The)k(ordering)g(of)f(lo)q(ops)i(from)e(inner)i(to)e(outer)g(is)i (determined)g(b)o(y)f(n)o(um)o(b)q(ers)g(that)f(the)150 647 y(user)13 b(supplies)i(in)e(the)g(input)h(p)q(edigree.)21 b(Running)13 b(times)g(for)f(all)i(v)o(ersions)f(of)f(LINKA)o(GE)i(can)150 703 y(v)m(ary)h(widely)i(dep)q(ending)g(on)e(the)h(lo)q(op)f(order)g(c)o (hosen)h(b)o(y)f(the)g(user.)221 760 y(There)k(is)h(another)e(user-sp)q (eci\014ed)k(parameter)c(that)h(can)g(cause)h(the)f(running)h(time)g(to)150 816 y(v)m(ary)13 b(signi\014can)o(tly)l(.)21 b(This)13 b(parameter)f(is)i (the)f Fg(r)n(o)n(ot)g Fk(\(in)g(LINKA)o(GE)g(this)h(is)f(referred)g(to)f(as) h(the)150 873 y Fg(pr)n(ob)n(and)p Fk(\))h(of)g(the)g(p)q(edigree.)21 b(The)14 b(tra)o(v)o(ersal)g(order)g(\\p)q(eels")h(the)f(p)q(edigree)i(to)o (w)o(ards)c(the)j(ro)q(ot)150 929 y(so)j(that)g(the)g(ro)q(ot)g(b)q(elongs)i (to)d(the)i(last)f(n)o(uclear)i(family)f(up)q(dated.)31 b(A)18 b(v)m(ariet)o(y)h(of)f(p)q(eeling)150 985 y(orders)g(are)f(p)q(ossible)j([3)o (,)e(12)o(].)28 b(W)l(e)18 b(ha)o(v)o(e)f(not)h(c)o(hanged)g(the)g(p)q (eeling)i(order)e(in)h(LINKA)o(GE,)150 1042 y(but)14 b(w)o(e)g(mak)o(e)f(no)h (claim)h(that)e(the)h(curren)o(t)f(order)h(alw)o(a)o(ys)f(minimizes)j(the)e (running)h(time.)20 b(A)150 1098 y(go)q(o)q(d,)13 b(but)h(o)o(v)o(erly)g (simplistic)i(heuristic)f(to)e(minimize)j(running)e(time,)g(is)g(to)f(c)o(ho) q(ose)h(the)g(ro)q(ot)150 1155 y(as)j(high)g(as)g(p)q(ossible)i(and)e(the)g (lo)q(op)h(break)o(er\(s\))e(as)g(lo)o(w)h(as)g(p)q(ossible)h(in)g(the)f(p)q (edigree,)i(but)150 1211 y(this)d(c)o(hoice)g(is)f(not)g(pro)o(v)m(ably)h (optimal)g(in)g(all)g(cases.)221 1268 y(Automating)h(the)h(c)o(hoice)h(of)f (proband)g(and)g(lo)q(op)h(break)o(ers,)f(and)g(v)m(arying)h(the)f(p)q (eeling)150 1324 y(order)e(are)h(in)o(teresting)g(researc)o(h)f(questions)i (b)q(ey)o(ond)f(the)g(scop)q(e)g(of)f(this)h(pap)q(er.)25 b(Nev)o(erthe-)150 1381 y(less,)15 b(our)f(idea)h(of)f(not)g(up)q(dating)h(p)q(edigree)h(mem)o (b)q(ers)f(whose)f(probabilit)o(y)i(up)q(date)f(do)q(es)f(not)150 1437 y(dep)q(end)i(on)e(the)g(genot)o(yp)q(e)g(of)f(the)h(lo)q(op)h(break)o (er\(s\))e(will)i(sa)o(v)o(e)e(time)i(on)f(some)f(p)q(edigrees,)j(for)150 1494 y(an)o(y)j(metho)q(d)g(of)g(c)o(ho)q(osing)h(ro)q(ot,)f(lo)q(op)g(break) o(er\(s\),)g(and)g(tra)o(v)o(ersal)f(order.)32 b(Ho)o(w)o(ev)o(er,)19 b(the)150 1550 y(time)d(sa)o(v)o(ed)e(ma)o(y)h(dep)q(end)i(signi\014can)o (tly)f(on)f(those)g(c)o(hoices.)150 1693 y Fh(5)69 b(Co)r(ordinating)23 b(Optimizati)o(on)d(and)k(Output)150 1795 y Fk(The)e(previous)g(v)o(ersions)g (of)f(ILINK)i(and)e(LODSCORE)h(do)g(sev)o(eral)f(w)o(asteful)h(FEs.)38 b(W)l(e)150 1851 y(iden)o(ti\014ed)17 b(three)f(distinct)g(sources)f(of)g(w)o (astefulness:)206 1945 y(1.)22 b(When)10 b(it)h(is)g(decided)h(that)e(the)g (previous)h(estimate)1156 1933 y(^)1153 1945 y Ff(\022)1174 1952 y Fd(i)1198 1945 y Fk(is)g(b)q(etter)g(than)f(the)g(new)h(estimate)267 1989 y(^)264 2001 y Ff(\022)285 2008 y Fd(i)p Fe(+1)344 2001 y Fk(,)k(the)g(gradien)o(t)g(at)688 1989 y(^)684 2001 y Ff(\022)705 2008 y Fd(i)p Fe(+1)780 2001 y Fk(is)g(still)i(calculated)g(but)e(nev)o(er)g (used.)206 2095 y(2.)22 b(The)e(output)g(function)i(ev)m(aluates)f Fc(fun)f Fk(at)g(the)g(optimal)1313 2083 y(^)1309 2095 y Ff(\022)r Fk(,)h(ev)o(en)g(though)f(this)h(w)o(as)264 2152 y(already)15 b(done)h(b)o(y)f Fc(gemini)p Fk(.)206 2246 y(3.)22 b(The)15 b(function)g(whic)o(h)g(rep)q(orts)g(lo)q(dscores)g(reev)m(aluates)g(the)g (lik)o(eliho)q(o)q(d)j(for)c(eac)o(h)g(p)q(edi-)264 2302 y(gree)20 b(at)f(the)i(optimal)684 2290 y(^)681 2302 y Ff(\022)q Fk(,)g(ev)o(en)g (though)f(this)h(w)o(as)e(already)i(done)g(inside)h Fc(fun)d Fk(when)264 2358 y Fc(gemini)14 b Fk(called)j Fc(fun)d Fk(with)i(the)f (optimal)990 2346 y(^)986 2358 y Ff(\022)r Fk(.)221 2452 y(The)f(extra)f(FEs) h(for)f(cause)h(1)g(can)g(b)q(e)h(eliminated)h(b)q(ecause)f(the)f(gradien)o (t)g(at)g(the)g(nonop-)150 2509 y(timal)272 2497 y(^)269 2509 y Ff(\022)290 2516 y Fd(j)r Fe(+1)369 2509 y Fk(is)h(not)g(needed.)952 2678 y(10)p eop %%Page: 11 11 11 10 bop 221 195 a Fk(The)16 b(extra)f(ev)m(aluations)i(from)e(causes)h(2)f (and)i(3)e(can)h(b)q(e)h(eliminated)g(simply)g(b)o(y)f(storing)150 252 y(the)i(v)m(alues)i(when)e(the)g(same)g(calls)h(are)f(made)g(from)g Fc(gemini)p Fk(.)28 b(The)18 b(only)h(subtlet)o(y)f(is)h(that)150 308 y Fc(gemini)e Fk(do)q(es)h(not)g(decide)i(un)o(til)f(shortly)f(after)f (the)h(call)h(to)e Fc(fun)h Fk(whether)g(the)g(v)m(alue)h(used)150 364 y(in)d(the)f(most)f(recen)o(t)g(call)i(is)g(b)q(est)f(so)f(far.)19 b(Th)o(us)c(the)g(lik)o(eliho)q(o)q(d)j(and)d Fc(fun)f Fk(v)m(alues)i(are)e (stored)150 421 y(pro)o(visionally)j(p)q(ending)g(that)d(decision.)221 477 y(The)i(n)o(um)o(b)q(er)h(of)e(FEs)h(in)h(cause)g(1)f(is)h(t)o(ypically)g Ff(n)11 b Fb(\000)g Fk(1)16 b(if)h(forw)o(ard)e(di\013erences)i(are)f(used) 150 534 y(to)d(compute)h(the)h(gradien)o(t)f(and)g(2\()p Ff(n)7 b Fb(\000)h Fk(1\))13 b(if)i(cen)o(tral)f(di\013erences)h(are)f(used.)20 b(Whic)o(h)15 b(metho)q(d)150 590 y(is)h(used,)g(and)g(whether)f(the)h(n)o (um)o(b)q(er)g(of)f(FEs)g(matc)o(hes)g(the)h(t)o(ypical)g(n)o(um)o(b)q(er,)g (b)q(oth)f(dep)q(end)150 647 y(on)g(some)g(program)f(constan)o(ts)g(and)i (the)f(sp)q(eci\014c)i(structure)e(of)g(the)g(problem)h(instance.)221 703 y(Cause)c(2)h(sa)o(v)o(es)e(1)i(FE)f(and)h(cause)g(3)f(sa)o(v)o(es)g(an)h (amoun)o(t)f(of)g(computation)h(whic)o(h)g(is)g(almost)150 760 y(the)k(same)g(as)g(for)f(an)h(FE.)g(It)g(should)h(b)q(e)g(noted)f(that)f (the)h(old)h(v)o(ersions)f(of)g(the)g(LINKA)o(GE)150 816 y(programs)c(did)j (not)e(coun)o(t)h(the)g(computations)f(for)g(output)h(when)g(they)g(rep)q (orted)f(a)h(n)o(um)o(b)q(er)150 873 y(of)d(FE's)g(\(in)i(the)f(\014le)g Fc(final.dat)p Fk(\).)18 b(Th)o(us)13 b(when)g(comparing)g(the)g(\014les)h (pro)q(duced)g(b)o(y)e(old)i(and)150 929 y(new)g(v)o(ersions)h(only)g(the)f (sa)o(vings)g(from)g(cause)g(1)g(are)g(seen)h(in)g(the)f(reduced)i(n)o(um)o (b)q(er)e(of)g(FE's.)221 985 y(In)f(the)g(course)g(of)g(testing)g(our)g(co)q (de)g(to)g(sa)o(v)o(e)f(these)h(FE's)f(w)o(e)h(found)g(and)g Fg(r)n(ep)n(air)n(e)n(d)27 b Fk(a)13 b(bug)150 1042 y(in)f(ILINK)h(and)e (LODSCORE.)g(In)h(some)f(situations)h(the)f(old)h(v)o(ersion)f(w)o(as)f (deciding)k(correctly)150 1098 y(that)250 1086 y(^)246 1098 y Ff(\022)267 1105 y Fd(j)298 1098 y Fk(w)o(as)e(the)h(lo)q(cal)g(optim)o (um,)g(but)g(then)g(rep)q(orting)g(the)f(sligh)o(tly)i(non-optimal)1633 1086 y(^)1630 1098 y Ff(\022)1651 1105 y Fd(j)r Fe(+1)1727 1098 y Fk(and)150 1155 y(its)g(lo)q(dscore)g(as)g(the)g(\014nal)g(v)m(alue.) 21 b(Our)14 b(new)g(co)q(de)g(to)f(co)q(ordinate)i(optimization)f(and)g (output)150 1211 y(corrects)h(this)g(problem.)150 1355 y Fh(6)69 b(Chec)n(kp)r(oin)n(ting)150 1456 y Fk(In)18 b(this)g(section)f(w)o(e)g (describ)q(e)i(ho)o(w)e(w)o(e)g(sa)o(v)o(e)g(partial)g(computations)g(of)g (LODSCORE)h(and)150 1512 y(ILINK,)24 b(so)e(they)h(can)g(b)q(e)h(restarted)e (if)h(the)g(computer)f(crashes.)43 b(F)l(or)22 b(the)h(purp)q(oses)g(of)150 1569 y(c)o(hec)o(kp)q(oin)o(ting,)g(these)e(t)o(w)o(o)f(programs)g(are)g (almost)h(iden)o(tical.)38 b(LODSCORE)21 b(is)h(sligh)o(tly)150 1625 y(more)c(complex)h(b)q(ecause)g(w)o(e)g(m)o(ust)e(store)h(whic)o(h)h (pair)g(of)f(lo)q(ci)i(w)o(e)e(are)g(w)o(orking)g(on,)g(while)150 1682 y(ILINK)f(only)f(w)o(orks)e(on)h(one)g(lo)q(cus)h(ordering)g(p)q(er)g (run.)221 1738 y(There)c(are)f(publicall)q(y)k(a)o(v)m(ailable)e(pac)o(k)m (ages)f(that)f(can)h(c)o(hec)o(kp)q(oin)o(t)h(a)f(general)g(application)150 1795 y(b)o(y)i(taking)g(a)f(core)h(dump)h(of)e(the)h(system)f(state.)19 b(Ho)o(w)o(ev)o(er,)13 b(the)h(pac)o(k)m(ages)g(w)o(e)f(ha)o(v)o(e)h(seen)g (are)150 1851 y(designed)i(for)e(sp)q(eci\014c)j(implemen)o(tations)f(of)e (UNIX)i(and)f(are)f(not)h(p)q(ortable.)20 b(Therefore,)14 b(w)o(e)150 1908 y(implemen)o(ted)k(c)o(hec)o(kp)q(oin)o(ting)g(b)o(y)e(mo)q(difying)h (the)f(LINKA)o(GE)h(source)g(co)q(de)g(in)g(a)e(p)q(ortable)150 1964 y(fashion.)221 2021 y(The)g(programs)f(p)q(erform)h(c)o(hec)o(kp)q(oin)o (ting)i(b)q(efore)e(some)g(calls)h(to)f Fc(fun)p Fk(.)221 2077 y(The)g(functions)h(that)e(mak)o(e)h(calls)h(to)f Fc(fun)f Fk(are:)20 b Fc(initialize)p Fk(,)13 b Fc(firststep)p Fk(,)h Fc(increaset)p Fk(,)150 2133 y Fc(decreaset)p Fk(,)h Fc(gforward)p Fk(,)g(and)h Fc(gcentral)p Fk(.)22 b(After)16 b(the)g(c)o(hanges)h(describ)q (ed)h(in)f(the)f(previous)150 2190 y(section,)j(the)f(output)f(function)i Fc(outf)e Fk(no)h(longer)g(mak)o(es)f(an)o(y)h(calls)g(to)g Fc(fun)p Fk(.)27 b(It)18 b(do)q(es)g(ev)m(al-)150 2246 y(uate)f(the)g(lik)o (eliho)q(o)q(d)j(at)603 2234 y(^)599 2246 y Ff(\022)d Fk(=)f(0)p Ff(:)p Fk(5)g(for)g(ev)o(ery)h(dimension,)i(to)d(rep)q(ort)h(what)f(is)h (called)i(\\Ott's)150 2303 y(generalized)h(LODSCORE".)e(The)g(function)h Fc(initialize)e Fk(is)i(called)g(at)f(the)g(b)q(eginning)i(of)150 2359 y(the)15 b(\014rst)g(iteration)g(and)h(generates)f(one)g(FE.)f(The)i (function)g Fc(firststep)e Fk(is)h(called)i(in)f(ev)o(ery)150 2416 y(subsequen)o(t)k(iteration)g(and)f(generates)g(one)h(FE.)e(In)i(eac)o (h)f(iteration,)i(either)f(the)f(function)150 2472 y Fc(increaset)14 b Fk(or)h Fc(decreaset)f Fk(is)h(called;)i(they)e(generate)g(a)g(v)m(ariable) i(n)o(um)o(b)q(er)e(of)g(estimates)g(of)154 2517 y(^)150 2529 y Ff(\022)h Fk(and)f(call)h Fc(fun)e Fk(to)g(ev)m(aluate)i(eac)o(h)e(one.)20 b(In)15 b(the)g(v)m(ast)g(ma)s(jorit)o(y)e(of)h(iterations)h(w)o(e)f(ha)o(v)o (e)g(seen)952 2678 y(11)p eop %%Page: 12 12 12 11 bop 150 195 a Fc(increaset)13 b Fk(and)h Fc(decreaset)f Fk(generate)h(one)g(or)g(t)o(w)o(o)e(estimates,)i(but)g(there)h(are)e (exceptions.)150 252 y(A)o(t)21 b(the)h(end)h(of)f(eac)o(h)g(iteration)g (either)h Fc(gforward)d Fk(or)i Fc(gcentral)f Fk(is)h(called)i(to)d(estimate) 150 308 y(the)e(gradien)o(t)g(b)o(y)g(generating)g(FEs)g(with)g(a)g(sligh)o (tly)h(p)q(erturb)q(ed)1337 296 y(^)1333 308 y Ff(\022)r Fk(.)31 b(Both)19 b Fc(gforward)f Fk(and)150 364 y Fc(gcentral)h Fk(ha)o(v)o(e)g(a)g (lo)q(op)i(in)f(whic)o(h)h(one)f(dimension)h(is)g(p)q(erturb)q(ed)g(at)e(a)g (time;)j Fc(gforward)150 421 y Fk(mak)o(es)15 b(one)g(FE)g(p)q(er)g(lo)q(op)h (iteration)g(and)f Fc(gcentral)f Fk(mak)o(es)h(t)o(w)o(o)f(FEs)g(p)q(er)i(lo) q(op)g(iteration.)221 477 y(W)l(e)28 b(tak)o(e)g(a)g(c)o(hec)o(kp)q(oin)o(t)h (at)f(the)h(start)e(of)h Fc(initialize)p Fk(,)i Fc(firststep)p Fk(,)p Fc(increaset)p Fk(,)150 534 y Fc(decreaset)p Fk(,)22 b Fc(outf)p Fk(,)g(eac)o(h)g(iteration)g(of)g(the)g(lo)q(op)g(in)g Fc(gforward)p Fk(,)g(and)g(eac)o(h)g(iteration)g(of)150 590 y(the)c(lo)q(op)h(in)p Fc(gcentral)p Fk(.)29 b(Our)18 b(rough)g(goal)g(is)h (to)e(tak)o(e)h(at)f(least)i(one)f(large)g(c)o(hec)o(kp)q(oin)o(t)h(b)q(e-) 150 647 y(t)o(w)o(een)13 b(ev)o(ery)g(t)o(w)o(o)f(FEs;)h(the)h(only)g(time)f (this)h(goal)f(is)h(not)f(met)g(is)h(when)g(a)f(call)i(to)d Fc(increaset)150 703 y Fk(or)17 b(to)f Fc(decreaset)g Fk(mak)o(es)g(more)h (than)g(t)o(w)o(o)f(FEs.)25 b(When)17 b(a)g(crash)g(o)q(ccurs,)g(w)o(e)g(can) g(restart)150 760 y(the)f(computation)g(from)f(the)h(last)f(place)i(where)f (a)g(c)o(hec)o(kp)q(oin)o(t)g(w)o(as)f(completed.)23 b(Since)18 b(this)150 816 y(is)c(usually)g(at)f(most)f(t)o(w)o(o)g(calls)i(to)e(FEs)h(a) o(w)o(a)o(y)l(,)f(it)h(means)g(that)g(w)o(e)g(can)g(ha)o(v)o(e)g(reasonable)g (hop)q(e)150 873 y(of)k(doing)g(runs)g(where)g(the)g(mean-time-to-failure)i (of)d(the)h(computer)g(is)h(ab)q(out)e(the)h(time)h(it)150 929 y(tak)o(es)c(for)h(t)o(w)o(o)f(FEs.)221 985 y(Chec)o(kp)q(oin)o(ting)j (is)f(done)g(b)o(y)g(storing)g(all)g(the)g(relev)m(an)o(t)h(program)e(v)m (ariables)i(in)f(a)g(\014le.)23 b(A)150 1042 y(t)o(ypical)d(c)o(hec)o(kp)q (oin)o(t)g(\014le)g(on)f(the)g(SunOS)i(op)q(erating)e(system)g(has)g(length)g (roughly)h(15,000)150 1098 y(b)o(ytes,)g(whic)o(h)g(is)g(v)o(ery)g(small)g(b) o(y)f(mo)q(dern)h(c)o(hec)o(kp)q(oin)o(ting)h(standards.)32 b(The)20 b(\014le)h(includes)150 1155 y(some)13 b(con)o(trol)f(\015o)o(w)g (information,)h(so)g(w)o(e)f(can)h(tell)h(where)f(the)g(c)o(hec)o(kp)q(oin)o (t)h(w)o(as)e(tak)o(en)g(during)150 1211 y(the)17 b(reco)o(v)o(ery)f(pro)q (cess.)24 b(The)17 b(\014le)h(con)o(tains)e(a)h(sp)q(ecial)h(string)f(at)e (the)i(end)g(so)g(w)o(e)f(can)h(tell)g(if)150 1268 y(the)c(c)o(hec)o(kp)q (oin)o(t)i(is)f(complete.)19 b(The)14 b(reason)f(this)h(is)g(needed)g(is)g (that)f(there)g(is)h(a)f(small)h(c)o(hance)150 1324 y(that)i(the)i(computer)f (ma)o(y)f(crash)h(while)i(a)e(c)o(hec)o(kp)q(oin)o(t)g(is)h(b)q(eing)g (written)g(out.)25 b(T)l(o)17 b(prepare)150 1381 y(for)f(this)i(situation)g (w)o(e)e(k)o(eep)i(a)f(bac)o(kup)g(cop)o(y)g(of)g(the)g(preceding)h(c)o(hec)o (kp)q(oin)o(t)g(\014le)h(after)d(the)150 1437 y(next)d(c)o(hec)o(kp)q(oin)o (t)h(is)g(tak)o(en.)k(If)c(w)o(e)f(detect)g(during)h(the)f(reco)o(v)o(ery)g (pro)q(cess)g(that)f(the)i(principal)150 1494 y(c)o(hec)o(kp)q(oin)o(t)h (\014le)g(has)e(b)q(een)i(corrupted,)f(then)g(w)o(e)g(advise)h(the)f(user)g (as)f(to)g(where)i(to)e(mo)o(v)o(e)g(the)150 1550 y(bac)o(kup)i(c)o(hec)o(kp) q(oin)o(t)h(\014le)g(so)f(w)o(e)f(can)h(reco)o(v)o(er)g(from)f(an)h(earlier)h (p)q(oin)o(t)f(in)h(the)f(execution)h(and)150 1606 y(still)h(not)d(lose)i(to) q(o)f(m)o(uc)o(h.)221 1663 y(When)e(the)g(programs)e(complete)j(their)f(link) m(age)i(computations)d(successfully)l(,)k(the)d(c)o(hec)o(k-)150 1719 y(p)q(oin)o(t)18 b(\014les)g(are)f(deleted)h(at)f(the)g(v)o(ery)g(end)h (of)f(the)g(execution.)27 b(When)18 b(the)f(programs)f(start)150 1776 y(up,)g(they)f(determine)i(whether)e(to)g(start)f(from)h(a)g(c)o(hec)o (kp)q(oin)o(t)h(or)f(start)g(from)f(the)i(b)q(eginning)150 1832 y(dep)q(ending)h(on)f(whether)f(the)g(c)o(hec)o(kp)q(oin)o(t)h(\014le)g (exists)g(in)g(the)f(w)o(orking)g(directory)l(.)221 1889 y(Because)k(ILINK)g (estimates)g(the)f Ff(\022)i Fk(v)o(ector)d(for)h(only)h(one)f(order)h(of)e (lo)q(ci)j(p)q(er)f(run,)g(it)f(is)150 1945 y(common)d(practice)h(to)e(mak)o (e)h(scripts)g(that)g(execute)g(m)o(ultiple)i(runs)f(of)e(ILINK)j(one)e(for)g (eac)o(h)150 2002 y(order.)k(It)13 b(is)h(also)f(p)q(ossible)i(to)e(mak)o(e)g (scripts)g(that)g(execute)h(m)o(ultiple)h(runs)e(of)g(LODSCORE,)150 2058 y(although)20 b(this)g(is)g(not)f(nearly)i(as)e(common)g(b)q(ecause)i (LODSCORE)f(during)g(a)g(single)h(run)150 2115 y(estimates)d Ff(\022)j Fk(for)d(all)h(pairs)g(of)g(lo)q(ci)h(sp)q(eci\014ed.)32 b(If)19 b(a)g(crash)f(o)q(ccurs)h(during)h(the)e(fourth)h(run)150 2171 y(in)i(a)f(script)h(sa)o(y)l(,)f(w)o(e)g(w)o(ould)h(lik)o(e)g(to)f(b)q (e)g(able)h(to)f(k)o(eep)g(the)h(results)f(from)g(the)g(\014rst)g(three)150 2227 y(runs)d(and)g(ha)o(v)o(e)g(the)g(mac)o(hine)g(kno)o(w)g(that)f(when)h (the)g(script)h(is)f(restarted,)f(it)h(should)h(start)150 2284 y(from)d(a)g(crash)g(reco)o(v)o(ery)f(for)h(the)h(fourth)f(run.)20 b(W)l(e)c(call)g(this)g Fg(script-level)e Fk(c)o(hec)o(kp)q(oin)o(ting.)22 b(It)150 2340 y(is)17 b(imp)q(ortan)o(t)g(to)f(realize)j(that)d(script-lev)o (el)j(c)o(hec)o(kp)q(oin)o(ting)f(is)g(essen)o(tially)g(external)g(to)e(the) 150 2397 y(programs)j(themselv)o(es,)i(and)g(has)f(b)q(een)h(in)o(tegrated)f (mainly)h(for)e(the)i(con)o(v)o(enience)g(of)f(the)150 2453 y(user,)14 b(who)f(migh)o(t)g(not)g(b)q(e)h(as)f(a)o(w)o(are)f(of)h(the)h (state)e(of)h(the)h(computation)f(as)g(the)g(computer)h(is.)221 2510 y(The)i(pro)q(cess)h(in)o(tro)q(duces)g(a)f(small)i(auxiliary)f(program) f(that)f(w)o(e)h(call)i Fc(ckpt)p Fk(,)e(whic)o(h)h(b)q(e-)952 2678 y(12)p eop %%Page: 13 13 13 12 bop 150 195 a Fk(ha)o(v)o(es)15 b(as)h(a)g(fron)o(t-end)g(to)f(the)h (user)g(desiring)h(suc)o(h)g(c)o(hec)o(kp)q(oin)o(ting.)23 b(In)17 b(collab)q(oration)g(with)150 252 y(the)j(individual)j(programs)c (ILINK)i(and)f(LODSCORE,)g(the)g Fc(ckpt)f Fk(program)g(k)o(eeps)h(trac)o(k) 150 308 y(of)f(the)h(n)o(um)o(b)q(er)g(of)g(in)o(v)o(o)q(cations)g(of)f(the)h (resp)q(ectiv)o(e)h(program)e(made)h(during)g(the)g(curren)o(t)150 364 y(script.)k(This)17 b(coun)o(t)g(is)g(written)f(to)g(a)h(disk)g(\014le.) 25 b(In)17 b(addition,)g(during)h(execution,)f(the)g(pro-)150 421 y(grams)j(store)h(information)g(on)g(script-lev)o(el)i(output,)f(namely)g (the)f(state)f(of)h(the)g(t)o(w)o(o)f(k)o(ey)150 477 y(output)c(\014les)i Fc(final.out)d Fk(and)h Fc(stream.out)p Fk(,)f(whic)o(h)j(are)e(needed)h(to)f (get)g(the)h(results.)24 b(The)150 534 y(\014le)19 b(\014nal)f Fc(final.out)f Fk(stores)g(a)g(description)i(of)f(the)f(run,)i(the)e(\014nal) 1392 522 y(^)1388 534 y Ff(\022)i Fk(and)f(some)g(diagnos-)150 590 y(tics.)26 b(The)18 b(\014le)g Fc(stream.out)e Fk(store)h(the)g(\014nal) 985 578 y(^)981 590 y Ff(\022)i Fk(and)e(the)h(\014nal)g(lik)o(eliho)q(o)q(d) i(v)m(alues)e(for)f(eac)o(h)150 647 y(p)q(edigree.)221 703 y(Supp)q(ose)f(no)o(w)f(that)g(a)h(script)g(prematurely)g(terminates;)f(when) h(execution)h(is)f(resumed,)150 760 y(the)f(mec)o(hanism)h(kno)o(ws)e(whic)o (h)i(in)o(v)o(o)q(cation)f(of)g(LODSCORE)g(or)f(ILINK)j(in)e(the)g(script)h (w)o(as)150 816 y(last)f(in)i(force.)j(Th)o(us,)15 b(the)g(script)h(is)g (executed)h(again)e(from)g(the)g(b)q(eginning,)i(but)f(completed)150 873 y(in)o(v)o(o)q(cations)h(of)e(the)i(ab)q(o)o(v)o(e)f(programs)f(exit)h (immediately)i(without)e(con)o(tributing)h(an)o(y)f(out-)150 929 y(put.)j(F)l(urther,)13 b(since)i(the)e(state)f(of)h(the)g(output)g (\014les)h(w)o(as)e(sa)o(v)o(ed)h(b)q(efore)g(the)h(crash)f(o)q(ccurred,)150 985 y(these)22 b(\014les)h(can)f(merely)h(b)q(e)g(copied)g(in)o(to)f(from)f (the)h(stored)g(v)o(ersions,)h(th)o(us)f(yielding)i(no)150 1042 y(indication)17 b(that)e(the)g(script)h(had)f(to)f(b)q(e)i(re-started.) 150 1185 y Fh(7)69 b(Metho)r(ds)150 1287 y Fk(W)l(e)13 b(compared)f(the)h (LINKA)o(GE)h(programs)d(describ)q(ed)k(in)e([2])f(to)g(the)h(mo)q(di\014ed)h (new)f(v)o(ersions)150 1343 y(describ)q(ed)19 b(here)e(on)f(some)g(sample)i (runs.)24 b(W)l(e)17 b(\014rst)f(installed)i(the)f(three)g(c)o(hanges)f(that) g(im-)150 1400 y(pro)o(v)o(e)d(the)h(sp)q(eed)g(of)f(the)h(programs)e(and)i (measured)g(the)g(impro)o(v)o(emen)o(t.)19 b(Then)14 b(w)o(e)f(installed)150 1456 y(the)k(c)o(hec)o(kp)q(oin)o(ting)h(facilit)o(y)g(and)f(tried)g(to)f (measure)h(ho)o(w)f(m)o(uc)o(h)h(it)g(slo)o(w)o(ed)g(do)o(wn)f(the)h(pro-)150 1512 y(grams)c(under)j(crash-free)e(op)q(eration,)h(but)f(the)h(slo)o(wdo)o (wn)f(w)o(as)f(to)q(o)h(small)h(to)f(measure)h(with)150 1569 y(an)o(y)j(precision.)31 b(The)18 b(timing)h(exp)q(erimen)o(ts)g(w)o(ere)f (run)h(on)f(an)g(unloaded)i(Sun)f(SP)l(AR)o(Csta-)150 1625 y(tion)e(2)f(computer)h(with)g(32Mb)o(ytes)e(of)i(RAM.)e(This)i(mac)o(hine)h (runs)f(the)g(op)q(erating)f(system)150 1682 y(SunOS,)g(v)o(ersion)f(4.1.2,)e (whic)o(h)i(is)g(an)g(implemen)o(tation)h(of)e(UNIX.)h(T)l(o)g(compile)h(all) g(v)o(ersions)150 1738 y(of)i(the)g(programs)f(w)o(e)h(used)h(the)f Fc(gcc)g Fk(compiler,)h(v)o(ersion)g(2.3.3)d(using)j(the)g Fc(-O)e Fk(\015ag)h(for)g(op-)150 1795 y(timization.)27 b(The)17 b(times)h(rep)q(orted)f(in)h(the)g(next)f(section)h(are)f(the)g(user)g(time)h (giv)o(en)g(b)o(y)f(the)150 1851 y Fc(time)g Fk(command.)25 b(Since)19 b(our)d(test)h(runs)g(w)o(ere)g(usually)i(the)e(only)g(user)h(pro) q(cesses)f(running,)150 1908 y(this)f(is)f(a)g(prett)o(y)g(go)q(o)q(d)g (estimate)g(of)g(the)g(actual)g(time)h(tak)o(en.)150 2051 y Fh(8)69 b(Results)150 2152 y Fk(W)l(e)18 b(presen)o(t)f(results)h(to)f(sho)o (w)g(the)h(p)q(erformance)f(obtained)h(b)o(y)g(our)f(impro)o(v)o(ed)h (implemen-)150 2209 y(tation.)25 b(W)l(e)17 b(did)h(a)f(v)m(ariet)o(y)g(of)f (sample)i(runs)f(alw)o(a)o(ys)f(comparing)h(the)h(v)o(ersion)f(of)f(the)h(co) q(de)150 2265 y(rep)q(orted)j(in)g([2)o(])f(with)h(the)g(v)o(ersion)f (describ)q(ed)j(here.)33 b(W)l(e)20 b(tried)g(to)e(measure)i(the)f(cost)g(of) 150 2322 y(c)o(hec)o(kp)q(oin)o(ting)14 b(b)o(y)f(using)g(new)g(v)o(ersions)g (b)q(oth)g(with)g(and)g(without)g(c)o(hec)o(kp)q(oin)o(ting.)20 b(W)l(e)13 b(w)o(ere)150 2378 y(pleased)i(to)f(\014nd)h(that)e(on)h(our)g (computers,)g(the)g(extra)g(time)h(for)e(c)o(hec)o(kp)q(oin)o(ting)j(in)f(an) o(y)f(non-)150 2435 y(trivial)k(run)e(is)i(less)f(than)f(the)h(time)g(v)m (ariation)g(b)q(et)o(w)o(een)g(di\013eren)o(t)g(executions)g(of)g(the)f(same) 150 2491 y(run.)k(In)14 b(a)f(few)h(cases)f(the)h(time)g(w)o(e)g(measured)f (for)g(a)h(run)g(with)g(c)o(hec)o(kp)q(oin)o(ting)h(w)o(as)e(as)g(m)o(uc)o(h) 150 2547 y(as)i(1\045)g Fg(less)g Fk(than)g(the)g(time)g(measured)h(without)f (c)o(hec)o(kp)q(oin)o(ting.)952 2678 y(13)p eop %%Page: 14 14 14 13 bop 150 155 1745 2 v 149 212 2 57 v 158 212 V 183 195 a Fk(#)15 b(Data)f(Set)p 436 212 V 134 w(Program)p 743 212 V 48 w(No.)20 b(of)15 b(Alleles)p 1064 212 V 52 w(Old)h(Time\(s\))p 1359 212 V 50 w(New)f(Time\(s\))p 1668 212 V 50 w(Sp)q(eedup)p 1886 212 V 1895 212 V 150 213 1745 2 v 149 270 2 57 v 158 270 V 243 253 a(RP01)p 436 270 V 108 w(LODSCORE)p 743 270 V 221 w(2)10 b Fb(\002)g Fk(9)p 1064 270 V 204 w(1121)p 1359 270 V 240 w(468)p 1668 270 V 136 w(2.40)p 1886 270 V 1895 270 V 437 271 1458 2 v 149 326 2 57 v 158 326 V 243 309 a(RP01)p 436 326 V 234 w(ILINK)p 743 326 V 144 w(2)g Fb(\002)g Fk(3)g Fb(\002)g Fk(3)p 1064 326 V 204 w(8671)p 1359 326 V 217 w(3589)p 1668 326 V 136 w(2.42)p 1886 326 V 1895 326 V 437 328 1458 2 v 149 383 2 57 v 158 383 V 243 366 a(RP01)p 436 383 V 234 w(ILINK)p 743 383 V 144 w(2)g Fb(\002)g Fk(3)g Fb(\002)g Fk(4)p 1064 383 V 181 w(71145)p 1359 383 V 194 w(27687)p 1668 383 V 136 w(2.57)p 1886 383 V 1895 383 V 437 384 1458 2 v 149 439 2 57 v 158 439 V 224 422 a(RP01-3)p 436 439 V 215 w(ILINK)p 743 439 V 144 w(2)g Fb(\002)g Fk(6)g Fb(\002)g Fk(9)p 1064 439 V 204 w(6023)p 1359 439 V 217 w(4349)p 1668 439 V 136 w(1.38)p 1886 439 V 1895 439 V 437 441 1458 2 v 149 496 2 57 v 158 496 V 224 479 a(RP01-3)p 436 496 V 125 w(LINKMAP)p 743 496 V 64 w(2)g Fb(\002)h Fk(3)f Fb(\002)g Fk(5)g Fb(\002)g Fk(6)p 1064 496 V 181 w(14200)p 1359 496 V 194 w(13577)p 1668 496 V 136 w(1.05)p 1886 496 V 1895 496 V 437 497 1458 2 v 149 552 2 57 v 158 552 V 247 535 a(BAD)p 436 552 V 240 w(ILINK)p 743 552 V 144 w(2)g Fb(\002)g Fk(4)g Fb(\002)g Fk(4)p 1064 552 V 204 w(4185)p 1359 552 V 217 w(2868)p 1668 552 V 136 w(1.46)p 1886 552 V 1895 552 V 437 554 1458 2 v 149 609 2 57 v 158 609 V 252 592 a(CLP)p 436 609 V 244 w(ILINK)p 743 609 V 65 w(2)g Fb(\002)h Fk(4)f Fb(\002)g Fk(4)g Fb(\002)g Fk(4)p 1064 609 V 204 w(7012)p 1359 609 V 217 w(6285)p 1668 609 V 136 w(1.12)p 1886 609 V 1895 609 V 437 610 1458 2 v 149 665 2 57 v 158 665 V 252 648 a(CLP)p 436 665 V 244 w(ILINK)p 743 665 V 65 w(2)g Fb(\002)h Fk(4)f Fb(\002)g Fk(4)g Fb(\002)g Fk(4)p 1064 665 V 204 w(9705)p 1359 665 V 217 w(9067)p 1668 665 V 136 w(1.07)p 1886 665 V 1895 665 V 437 667 1458 2 v 149 721 2 57 v 158 721 V 252 705 a(CLP)p 436 721 V 154 w(LINKMAP)p 743 721 V 64 w(2)g Fb(\002)h Fk(4)f Fb(\002)g Fk(4)g Fb(\002)g Fk(4)p 1064 721 V 204 w(3445)p 1359 721 V 217 w(3455)p 1668 721 V 136 w(1.00)p 1886 721 V 1895 721 V 150 723 1745 2 v 604 800 a(T)l(able)16 b(1:)k(Execution)c(Times)g(in)g(Seconds)221 925 y(F)l(or)f(simplicit)o(y)j (and)e(consistency)l(,)h(w)o(e)f(rep)q(ort)g(the)g(times)g(tak)o(en)g(b)o(y)g (the)g(v)o(ersions)g(in)h([2)o(])150 981 y(and)g(the)f(new)h(v)o(ersion)f (with)h(c)o(hec)o(kp)q(oin)o(ting.)25 b(Those)16 b(are)g(the)g(t)o(w)o(o)f(v) o(ersions)i(w)o(e)f(ha)o(v)o(e)g(b)q(een)150 1038 y(and)f(will)i(b)q(e)f (distributing.)221 1094 y(W)l(e)f(used)h(the)f(three)g(follo)o(wing)h (disease)g(data)f(sets)g(for)f(our)h(exp)q(erimen)o(ts:)218 1188 y Fb(\017)23 b Fk(RP01:)c(data)14 b(on)i(a)f(large)g(family)l(,)h (UCLA-RP01,)f(with)h(autosomal)e(dominan)o(t)i(retini-)264 1245 y(tis)k(pigmen)o(tosa)g(\(RP1\))f(from)h(the)g(lab)q(oratory)g(of)g(Dr.) f(Stephen)j(P)l(.)e(Daiger)g(at)g(the)264 1301 y(Univ)o(ersit)o(y)f(of)e(T)l (exas)h(Health)h(Science)h(Cen)o(ter)e(at)g(Houston.)29 b(This)18 b(p)q(edigree)i(has)e(7)264 1357 y(generations)g(with)h(190)f(individuals)k (con)o(taining)d(2)f(marriage)h(lo)q(ops)g([1)o(].)30 b(As)18 b(sho)o(wn)264 1414 y(in)c([1],)f(this)h(p)q(edigree)h(had)f(to)f(b)q(e)i (split)g(in)o(to)e(three)h(pieces)h(b)q(ecause)g(desired)g(computa-)264 1470 y(tions)d(with)g(large)f(allele)j(pro)q(ducts)e(on)g(the)g(whole)g (family)h(together)e(to)q(ok)g(prohibitiv)o(ely)264 1527 y(long.)19 b(In)c(the)f(tables)h(of)e(results,)i(RP01-3)d(denotes)j(analysis)g(with)f (the)g(family)h(split)g(in)264 1583 y(three)g(pieces.)218 1677 y Fb(\017)23 b Fk(BAD:)18 b(data)h(on)g(a)g(p)q(ortion)g(of)g(the)g(Old)h (Order)g(Amish)f(p)q(edigree)i(110)d(\(OO)o(A)i(110\),)264 1734 y(with)e(bip)q(olar)i(a\013ectiv)o(e)e(disorder)h(\(BAD\))f(from)g(the)g (lab)q(oratory)g(of)g(Drs.)f(Da)o(vid)i(R.)264 1790 y(Co)o(x)d(and)h(Ric)o (hard)g(M.)f(My)o(ers)g(at)h(the)g(Univ)o(ersit)o(y)g(of)g(California)h(at)e (San)h(F)l(rancisco.)264 1846 y(This)c(p)q(edigree)i(spans)e(5)f(generations) h(with)g(96)g(individuals)j(and)d(con)o(tains)g(1)g(marriage)264 1903 y(lo)q(op)i([10)o(].)218 1997 y Fb(\017)23 b Fk(CLP:)10 b(Data)g(on)h(12)f(families)j(with)e(autosomal)f(dominan)o(t)h(nonsyndromic)h (cleft)f(lift)h(and)264 2053 y(palate)g(\(CLP\))g(from)g(the)h(lab)q(oratory) e(of)h(Dr.)g(Jacqueline)j(T.)d(Hec)o(h)o(t)g(at)g(the)g(Univ)o(ersit)o(y)264 2110 y(of)e(T)l(exas)g(Health)h(Science)i(Cen)o(ter)d(at)g(Houston.)18 b(Diagrams)10 b(of)g(the)h(families)h(are)e(sho)o(wn)264 2166 y(in)k([4)o(].)19 b(The)13 b(families)i(include)g(110)d(individuals)k(in)e (all.)20 b(P)o(edigrees)14 b(1000)e(and)h(1100)f(are)264 2223 y(signi\014can)o(tly)h(larger)f(than)g(the)g(rest.)19 b(P)o(edigree)13 b(1200)e(has)g(a)h(lo)q(op,)h(but)f(it)h(encompasses)264 2279 y(the)i(en)o(tire)h(family)l(,)f(so)g(our)g(new)g(lo)q(op)h(algorithm)f(do)q (es)h(not)f(help.)221 2373 y(In)22 b(most)e(cases,)i(w)o(e)f(ac)o(hiev)o(ed)i (noticeable)f(sp)q(eedups.)40 b(The)22 b(sp)q(eedups)h(here)e(are)g(not)150 2429 y(nearly)f(as)f(large)h(as)f(the)h(sp)q(eedups)h(w)o(e)e(obtained)h(in)h (going)e(from)g(LINKA)o(GE)h(5.1)f(to)g(the)150 2486 y(faster)d(v)o(ersion)g (in)i([2)o(],)e(but)h(are)f(still)i(w)o(orth)o(while.)24 b(Our)16 b(c)o(hanges)h(help)q(ed)h(the)f(most)e(on)i(the)150 2542 y(RP01)12 b(p)q(edigree)i(b)q(ecause)g(its)f(second)g(lo)q(op)h(co)o(v)o(ers)e(only)h (a)g(small)g(part)g(of)f(the)h(p)q(edigree.)21 b(The)952 2678 y(14)p eop %%Page: 15 15 15 14 bop 150 195 a Fk(ab)q(o)o(v)o(e)18 b(computations)g(on)g(the)h(full)g (RP01)e(p)q(edigree)j(are)e(feasible)i(in)f(part)f(b)q(ecause)h(of)f(the)150 252 y(algorithmic)e(c)o(hanges)g(in)g([2])f(and)h(b)q(ecause)g(the)g(allele)i (pro)q(ducts)e(for)f(the)g(lo)q(ci)i(w)o(e)f(c)o(hose)f(are)150 308 y(not)k(to)q(o)f(high.)33 b(Our)20 b(c)o(hanges)f(had)g(the)h(least)f (e\013ect)g(on)g(CLP)h(b)q(ecause)g(the)f(lo)q(op)h(c)o(hange)150 364 y(is)g(irrelev)m(an)o(t)g(there)g(and)f(its)h Fc(genarray)p Fk(s)e(are)h(not)g(dense)h(enough)f(to)g(b)q(ene\014t)h(m)o(uc)o(h)g(from)150 421 y(sub)q(dividing)e(recom)o(bination)e(classes.)221 477 y(By)h(comparing)h(some)f(pairs)h(of)f(runs)h(in)g(the)g(ab)q(o)o(v)o(e)f (table)h(w)o(e)g(can)f(see)h(ho)o(w)f(the)h(three)150 534 y(di\013eren)o(t)i (c)o(hanges)h(a\013ect)e(the)i(sp)q(eedup)g(on)g(sp)q(eci\014c)h(p)q (edigrees.)36 b(F)l(or)20 b(example,)i(the)e(last)150 590 y(LINKMAP)12 b(run)g(sho)o(ws)f(that)g(CLP)h(do)q(es)f(not)h(b)q(ene\014t)g(from)f(either) h(of)f(the)h(\014rst)f(t)o(w)o(o)f(c)o(hanges;)150 647 y(of)15 b(course,)h(this)g(run)g(cannot)f(b)q(ene\014t)i(from)e(the)h(iteration)g(sa) o(ving)f(c)o(hange)h(in)h(LODSCORE)150 703 y(and)g(ILINK.)h(The)f(lo)q(ci)h (used)g(in)f(the)g(last)g(t)o(w)o(o)f(runs)h(are)f(the)h(same.)24 b(The)18 b(non-disease)g(lo)q(ci)150 760 y(in)f(the)f(t)o(w)o(o)e(CLP)i (ILINK)h(runs)f(are)g(completely)h(di\013eren)o(t,)f(although)g(they)g(ha)o (v)o(e)f(the)h(same)150 816 y(n)o(um)o(b)q(er)k(of)e(alleles.)34 b(Th)o(us)20 b(w)o(e)f(see)g(that)g(the)g(iteration)h(sa)o(ving)f(c)o(hange)g (sa)o(v)o(es)g(ab)q(out)g(700)150 873 y(seconds)d(on)f(eac)o(h)h(CLP)g(ILINK) h(run.)k(The)16 b(sp)q(eedups)h(are)e(di\013eren)o(t)h(b)q(ecause)g(the)g(t)o (w)o(o)e(runs)150 929 y(ha)o(v)o(e)f(di\013eren)o(t)h(n)o(um)o(b)q(ers)g(of)g (iterations,)g(but)f(the)h(absolute)g(amoun)o(t)f(of)h(computation)f(sa)o(v)o (ed)150 985 y(is)j(appro)o(ximately)f(the)g(same.)221 1042 y(Comparing)g(the)h(RP01)f(runs)h(v)o(ersus)f(the)h(RP01-3)e(runs,)i(w)o(e)g (see)g(that)f(the)h(new)g(w)o(a)o(y)e(of)150 1098 y(handling)h(lo)q(ops)g(m)o (ust)e(accoun)o(t)g(for)g(most)g(of)h(the)f(sa)o(vings)h(on)g(RP01.)k(Since)d (RP01-3)d(has)i(no)150 1155 y(lo)q(ops,)h(it)h(b)q(ene\014ts)g(only)g(from)e (the)h(\014rst)g(and)h(third)f(c)o(hanges.)221 1211 y(W)l(e)h(see)g(no)g (e\013ectiv)o(e)h(w)o(a)o(y)e(to)h(estimate)g(on)g(pap)q(er)g(what)g(the)g (sp)q(eedup)i(from)e(the)g(three)150 1268 y(sp)q(eed)g(impro)o(v)o(emen)o(ts) f(will)i(b)q(e)f(for)e(a)h(new)h(run)f(b)q(ecause:)206 1362 y(1.)22 b(The)15 b(sa)o(vings)f(from)h(our)f(c)o(hange)h(to)f(recom)o (bination)i(classes)f(dep)q(end)i(on)d(the)h(sparsit)o(y)264 1418 y(patterns)i(of)f(the)i Fc(genarray)p Fk(s)e(of)h(di\013eren)o(t)h (individuals)i(in)e(the)g(p)q(edigree,)h(whic)o(h)f(are)264 1474 y(hard)d(to)f(determine)j(without)e(running)h(the)f(program.)206 1568 y(2.)22 b(The)11 b(sa)o(vings)h(from)f(our)g(b)q(etter)g(lo)q(op)i(tra)o (v)o(ersal)d(algorithm)i(dep)q(end)h(on)e(the)h(lo)q(op)g(struc-)264 1625 y(ture,)f(the)g(c)o(hoice)h(of)e(proband,)i(and)f(the)g(sparsit)o(y)g (patterns.)18 b(Kno)o(wing)11 b(the)g(lo)q(op)h(struc-)264 1681 y(ture)18 b(and)h(proband,)g(it)g(is)h(p)q(ossible)g(to)e(compute)h(b)o (y)f(hand)i(whic)o(h)f(n)o(uclear)g(families)264 1738 y(will)d(not)f(b)q(e)h (revisited)g(for)e(eac)o(h)h(genot)o(yp)q(e)g(of)g(the)g(lo)q(op)g(break)o (er.)20 b(Ho)o(w)o(ev)o(er,)14 b(it)h(is)g(not)264 1794 y(easy)g(to)f (estimate,)h(ho)o(w)g(m)o(uc)o(h)g(time)g(will)i(b)q(e)f(sa)o(v)o(ed)f(b)o(y) g(not)g(visiting)h(those)f(families.)206 1888 y(3.)22 b(The)13 b(sa)o(vings)f(ac)o(hiev)o(ed)i(b)o(y)e(b)q(etter)h(co)q(ordination)h(b)q(et) o(w)o(een)f(optimization)g(and)g(output)264 1944 y(dep)q(end)23 b(on)e(details)h(of)f(the)g(n)o(umerical)i(con)o(v)o(ergence)e(of)g(the)h Ff(\022)h Fk(estimates.)38 b(These)264 2001 y(details)16 b(cannot)f(b)q(e)h (determined)g(without)f(actually)h(doing)g(the)f(run.)150 2144 y Fh(9)69 b(Discussion)150 2246 y Fk(One)12 b(of)f(us)g(\(R)-5 b(W)o(C\))9 b(recen)o(tly)j(ask)o(ed)f(Elston)g(what)f(led)i(to)f(the)g (breakthrough)g(Elston-Stew)o(art)150 2302 y(algorithm.)19 b(Elston)14 b(replied,\\That's)g(the)f(w)o(a)o(y)f(I)i(had)g(alw)o(a)o(ys)f (done)g(the)h([link)m(age])g(computa-)150 2358 y(tions)d(b)o(y)h(hand.")18 b(One)12 b(of)f(the)h(k)o(ey)f(principles)j(of)d(successful)h(p)q(encil)i (and)d(pap)q(er)h(computation)150 2415 y(is)17 b(to)f(write)h(do)o(wn)g(a)f (few)h(in)o(termediate)g(v)m(alues,)h(so)f(they)g(do)f(not)h(ha)o(v)o(e)f(to) g(b)q(e)i(recomputed)150 2471 y(and)g(so)g(they)g(can)g(b)q(e)h(c)o(hec)o(k)o (ed)g(in)g(case)f(of)f(errors.)28 b(The)19 b(principle)h(of)e(a)o(v)o(oiding) h(recompu-)150 2528 y(tation)d(w)o(as)g(w)o(ell)i(understo)q(o)q(d)g(b)q (efore)f(the)g(time)g(of)f(Newton;)h(it)g(w)o(as)f(the)h(stim)o(ulus)h(for)e (the)952 2678 y(15)p eop %%Page: 16 16 16 15 bop 150 195 a Fk(hand-computation)17 b(and)f(publication)i(of)e(v)m (ast)g(logarithm)g(tables,)g(for)g(example.)23 b(Unfortu-)150 252 y(nately)17 b(the)f(principle)j(is)e(to)q(o)e(often)h(forgotten)f(b)o(y)h (late)h(20th)e(cen)o(tury)i(programmers)d(when)150 308 y(they)h(assume)g Fg(inc)n(orr)n(e)n(ctly)30 b Fk(that:)206 399 y(1.)22 b(Ha)o(ving)11 b(the)f(computer)h(recompute)g(in)o(termediate)h(results)f(do)q(es)g(not)f (add)h(signi\014can)o(tly)264 456 y(to)j(the)h(computation)h(time)f(b)q (ecause)h(the)g(computer)f(is)g(so)g(fast.)206 545 y(2.)22 b(If)15 b(the)g(computer)h(crashes,)e(it)i(is)g(satisfactory)e(to)g(restart)g (the)h(program.)221 636 y(W)l(e)j(ha)o(v)o(e)g(corrected)g(three)g(places)h (where)f(the)h(LINKA)o(GE)f(programs)f(w)o(ere)h(sp)q(ending)150 693 y(non)o(trivial)j(amoun)o(ts)e(of)g(time)h(recomputing)g(kno)o(wn)g(v)m (alues)h(in)o(ternally)l(.)35 b(W)l(e)20 b(ha)o(v)o(e)f(made)150 749 y(it)h(p)q(ossible)h(for)e(the)h(LODSCORE)f(and)h(ILINK)h(programs)e(to)g (reco)o(v)o(er)g(from)f(a)i(crash)f(b)o(y)150 806 y(restarting)c(from)f(a)h (recen)o(tly)h(completed)g(lik)o(eliho)q(o)q(d)i(function)e(ev)m(aluation.) 221 862 y(T)l(o)j(stress)g(the)g(imp)q(ortance)h(of)f(the)h(last)f(impro)o(v) o(emen)o(t,)h(consider)h(the)e(follo)o(wing)i(sce-)150 919 y(nario)c(whic)o(h)h(is)g(realistic)g(based)g(on)f(our)g(exp)q(erience)i (with)e(LINKA)o(GE.)h(W)l(e)f(wish)h(to)e(do)h(a)150 975 y(m)o(ultilo)q(cus)d (ILINK)g(run)e(where)g(ev)o(ery)g(function)h(ev)m(aluation)h(tak)o(es)d (roughly)i(a)e(da)o(y)l(.)19 b(W)l(e)12 b(ha)o(v)o(e)150 1032 y(a)o(v)m(ailable)20 b(to)d(us)h(a)g(w)o(orkstation)e(whose)i (mean-time-to-crash)g(is)h(roughly)f(a)g(w)o(eek.)28 b(Giv)o(en)150 1088 y(that)12 b(the)g(ILINK)i(computation)e(will)i(surely)f(tak)o(e)f(at)f (least)i(20)e(function)i(ev)m(aluations,)h(it)f(do)q(es)150 1144 y(not)j(seem)g(w)o(orth)e(trying)i(b)q(ecause)h(the)f(w)o(orkstation)f (is)h(sure)g(to)g(crash)f(during)i(the)f(20)f(da)o(ys)150 1201 y(it)g(w)o(ould)h(tak)o(e)f(to)f(\014nish)j(the)e(run.)221 1257 y(With)h(the)h(c)o(hec)o(kp)q(oin)o(ting)h(facilit)o(y)g(in)f(place,)h (w)o(e)e(no)o(w)g(see)h(no)g(signi\014can)o(t)g(imp)q(edimen)o(t)150 1314 y(to)h(doing)h(our)g(desired)g(ILINK)i(run.)30 b(Because)19 b(op)q(erating)g(systems)f(suc)o(h)h(as)f(UNIX)i(allo)o(w)150 1370 y(pro)q(cesses)d(to)e(run)i(in)g(the)f(\\bac)o(kground")g(at)f(lo)o(w)h (priorit)o(y)l(,)h(w)o(e)f(can)g(do)g(long)h(runs)f(without)150 1427 y(in)o(terfering)g(with)f(other)g(high)h(priorit)o(y)g(computations.)150 1568 y Fh(Ac)n(kno)n(wledgmen)n(ts)150 1669 y Fk(W)l(e)11 b(thank)g(Dr.)f (Ramana)g(M.)h(Idury)g(for)g(his)h(substan)o(tial)f(con)o(tributions)h(to)f (the)g(earlier)h(stages)150 1726 y(of)h(this)h(researc)o(h.)20 b(Thanks)13 b(to)g(Dr.)g(Stephen)i(P)l(.)e(Daiger,)h(Dr.)e(Lori)j(A.)e (Sadler,)h(Dr.)f(Da)o(vid)h(R.)150 1782 y(Co)o(x,)g(Dr.)f(Ric)o(hard)i(M.)f (My)o(ers,)g(Dr.)g(Susan)h(H.)f(Blan)o(ton)h(and)g(Dr.)f(Jacqueline)j(T.)d (Hec)o(h)o(t)h(for)150 1839 y(con)o(tributing)j(the)g(disease)g(family)g (data)f(for)f(our)h(exp)q(erimen)o(ts.)28 b(Dev)o(elopmen)o(t)17 b(of)g(the)h(RP)150 1895 y(data)e(w)o(as)g(supp)q(orted)i(b)o(y)f(gran)o(ts)f (from)g(the)h(National)g(Retinitis)h(Pigmen)o(tosa)f(F)l(oundation)150 1952 y(and)d(the)g(George)f(Gund)h(F)l(oundation.)19 b(The)14 b(Amish)h(family)f(data)f(w)o(ere)h(dev)o(elop)q(ed)h(with)f(the)150 2008 y(supp)q(ort)g(of)f(a)h(gran)o(t)f(from)g(the)h(National)g(Institutes)h (of)e(Health.)20 b(Dev)o(elopmen)o(t)14 b(of)g(the)g(CLP)150 2065 y(data)i(w)o(as)g(supp)q(orted)h(b)o(y)g(gran)o(ts)f(from)g(the)h (National)g(Institutes)g(of)g(Health)g(and)g(Shriners)150 2121 y(Hospital.)i(This)13 b(w)o(ork)e(w)o(as)g(supp)q(orted)h(b)o(y)g(gran)o(ts)f (from)g(the)h(National)g(Science)i(F)l(oundation,)150 2177 y(the)h(Human)g(Genome)f(Program)g(of)g(the)h(National)g(Institutes)g(of)g (Health,)g(the)f(W.)h(M.)f(Kec)o(k)150 2234 y(F)l(oundation.)150 2396 y Fh(References)173 2497 y Fk([1])21 b(S.)11 b(H.)g(Blan)o(ton,)h(J.)f (R.)g(Hec)o(k)o(enliv)o(ely)l(,)j(A.)d(W.)f(Cottingham,)h(J.)g(F)l(riedman,)h (L.)g(A.)f(Sadler,)243 2554 y(M.)k(W)l(agner,)g(L.)h(H.)f(F)l(riedman,)h(and) f(S.)h(P)l(.)f(Daiger.)21 b(Link)m(age)16 b(mapping)h(of)e(autosomal)952 2678 y(16)p eop %%Page: 17 17 17 16 bop 243 195 a Fk(dominan)o(t)17 b(retinitis)g(pigmen)o(tosa)f(\(RP1\))f (to)g(the)i(p)q(ericen)o(tric)h(region)e(of)g(h)o(uman)g(c)o(hro-)243 252 y(mosome)f(8.)k Fg(Genomics)p Fk(,)c(11:857{869,)d(1991.)173 345 y([2])21 b(R.)g(W.)f(Cottingham)h(Jr.,)h(R.)e(M.)h(Idury)l(,)i(and)e(A.)g (A.)g(Sc)o(h\177)-23 b(a\013er.)37 b(F)l(aster)21 b(sequen)o(tial)243 402 y(genetic)d(link)m(age)g(computations.)23 b Fg(A)o(meric)n(an)17 b(Journal)g(of)h(Human)g(Genetics)p Fk(,)d(53:252{)243 458 y(263,)f(1993.)173 552 y([3])21 b(R.)13 b(C.)g(Elston)g(and)h(J.)f(Stew)o (art.)j(A)d(general)h(mo)q(del)h(for)d(the)i(analysis)g(of)f(p)q(edigree)i (data.)243 609 y Fg(Human)i(Her)n(e)n(dity)p Fk(,)d(21:523{542,)e(1971.)173 702 y([4])21 b(J.)h(T.)f(Hec)o(h)o(t,)h(Y.)g(W)l(ang,)g(B.)f(Connor,)i(S.)e (H.)g(Blan)o(ton,)i(and)f(S.)f(P)l(.)g(Daiger.)39 b(Non-)243 759 y(syndromic)21 b(cleft)g(lip)h(and)f(palate:)30 b(No)20 b(evidence)i(of)e(link)m(age)i(to)e(hla)h(or)f(factor)f(13a.)243 815 y Fg(A)o(meric)n(an)d(Journal)g(of)h(Human)f(Genetics)p Fk(,)e(52:1230{1233,)d(1993.)173 909 y([5])21 b(J.)h(M.)g(Lalouel.)41 b(GEMINI)22 b(-)g(a)g(computer)g(program)f(for)g(optimization)i(of)e(general) 243 966 y(nonlinear)e(functions.)28 b(T)l(ec)o(hnical)19 b(Rep)q(ort)e(14,)g (Univ)o(ersit)o(y)h(of)f(Utah,)h(Departmen)o(t)e(of)243 1022 y(Medical)h(Bioph)o(ysics)g(and)e(Computing,)g(Salt)g(Lak)o(e)h(Cit)o(y)l(,)e (Utah,)h(1979.)173 1116 y([6])21 b(K.)h(Lange)h(and)f(R.)f(C.)g(Elston.)40 b(Extensions)22 b(to)g(p)q(edigree)h(analysis.)f(I.)g(Lik)o(eliho)q(o)q(d)243 1172 y(calculation)i(for)e(simple)i(and)f(complex)g(p)q(edigrees.)43 b Fg(Human)23 b(Her)n(e)n(dity)p Fk(,)g(25:95{105,)243 1229 y(1975.)173 1323 y([7])e(G.)16 b(M.)f(Lathrop)i(and)f(J.)g(M.)g(Lalouel.)24 b(Easy)16 b(calculations)i(of)e(lo)q(d)h(scores)f(and)g(genetic)243 1379 y(risks)h(on)g(small)g(computers.)23 b Fg(A)o(meric)n(an)17 b(Journal)h(of)f(Human)h(Genetics)p Fk(,)d(36:460{465,)243 1435 y(1984.)173 1529 y([8])21 b(G.)14 b(M.)g(Lathrop)g(and)g(J.)h(M.)e (Lalouel.)20 b(E\016cien)o(t)15 b(computations)f(in)h(m)o(ultilo)q(cus)h (link)m(age)243 1586 y(analysis.)21 b Fg(A)o(meric)n(an)15 b(Journal)i(of)f(Human)h(Genetics)p Fk(,)c(42:498{505,)f(1988.)173 1680 y([9])21 b(G.)16 b(M.)f(Lathrop,)h(J.)g(M.)g(Lalouel,)h(C.)f(Julier,)i (and)e(J.)g(Ott.)23 b(Strategies)16 b(for)f(m)o(ultilo)q(cus)243 1736 y(link)m(age)20 b(analysis)f(in)h(h)o(umans.)29 b Fg(Pr)n(o)n(c.)19 b(Natl.)f(A)n(c)n(ad.)h(Sci.)g(USA)p Fk(,)e(81:3443{344)o(6,)f(June)243 1792 y(1984.)150 1886 y([10])21 b(A.)14 b(La)o(w,)f(C.)g(W.)h(Ric)o(hard)f(I) q(I)q(I,)i(R.)e(W.)g(Cottingham)g(Jr)h(.,)g(G.)f(M.)g(Lathrop,)g(D.)g(R.)g (Co)o(x,)243 1943 y(and)18 b(R.)f(M.)g(My)o(ers.)26 b(Genetic)18 b(link)m(age)h(analysis)f(of)f(bip)q(olar)i(a\013ectiv)o(e)f(disorder)g(in)g (an)243 1999 y(old)e(order)f(amish)h(p)q(edigree.)21 b Fg(Human)16 b(Genetics)p Fk(,)e(88:562{568,)e(1992.)150 2093 y([11])21 b(J.)15 b(Ott.)k(Estimation)c(of)f(the)h(recom)o(bination)h(fraction)f(in)g (h)o(uman)g(p)q(edigrees{)h(e\016cien)o(t)243 2149 y(computation)g(of)e(the)i (lik)o(eliho)q(o)q(d)i(for)c(h)o(uman)i(link)m(age)g(studies.)21 b Fg(A)o(meric)n(an)15 b(Journal)i(of)243 2206 y(Human)g(Genetics)p Fk(,)d(26:588{597,)e(1974.)150 2300 y([12])21 b(J.)e(Ott.)30 b Fg(A)o(nalysis)17 b(of)j(Human)f(Genetic)g(Linkage)p Fk(.)29 b(The)19 b(Johns)g(Hopkins)g(Univ)o(ersit)o(y)243 2356 y(Press,)c(Baltimore)h (and)f(London,)g(1991.)k(Revised)d(edition.)952 2678 y(17)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.install0000644000265600020320000001345106737457627015757 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 FASTLINK, version 4.1P This file describes installation of sequential FASTLINK, version 4.1P. See README for an overview of all the documentation. Most of these instructions apply to the parallel versions, but you should also read README.parallel, README.p4 (for shared-memory), and README.TreadMarks (for networks) to fully install the parallel version. |*| FTP DIRECTIONS ------------ The code is available by anonymous ftp to a machine at NIH Here are specific instructions: ftp fastlink.nih.gov or equivalently ftp ftp-bimas.cit.nih.gov Login as anonymous, please leave your FULL e-mail address as password. This is very important in case we need to let you know about bugs, fixes, and future versions. cd pub/fastlink To retrieve everything at once binary get fastlink.tar.Z uncompress fastlink.tar.Z tar xvf fastlink.tar All the source code files will be in the subdirectory 4.1P/src They produce fast versions of ilink lodscore linkmap mlink and a FASTLINK-compatible version of unknown In addition to four papers and this README file, the top level directory contains various other pieces of documentation. See the README file for a roadmap to the documentation. |*| SOURCE CODE ORGANIZATION ------------------------ The code is broken up into .h files that have just definitions and declarations, and .c files that have just C procedures. Each file opens with a comment explaining what role that file plays. Here we summarize only which files are needed for which programs: File Name Used in checkpointdefs.h LODSCORE ILINK LINKMAP MLINK commondefs.h LODSCORE ILINK LINKMAP MLINK compar.h ILINK LINKMAP MLINK (parallel versions only) gemdefs.h LODSCORE ILINK ildefs.h ILINK lidefs.h LINKMAP lodefs.h LODSCORE mldefs.h MLINK moddefs.h LODSCORE ILINK LINKMAP MLINK (faster versions) slowmoddefs.h LODSCORE ILINK LINKMAP MLINK (slower versions) strbuff.h LINKMAP MLINK (parallel versions only) unknown.h UNKNOWN automodified.c LODSCORE ILINK LINKMAP MLINK (faster versions) check.c LODSCORE ILINK LINKMAP MLINK ckpt.c auxiliary checkpointing program comgetvect.c LODSCORE ILINK LINKMAP MLINK cominputcode.c ILINK LINKMAP MLINK commoncode.c ILINK LINKMAP MLINK comnuclear.c LODSCORE ILINK LINKMAP MLINK comlike.c LODSCORE ILINK LINKMAP MLINK comoutput.c LINKMAP MLINK (parallel versions only) compar.c ILINK LINKMAP MLINK (parallel versions only) comrec.c LODSCORE ILINK LINKMAP MLINK ilgetvect.c ILINK ilink.c ILINK ilinputcode.c ILINK iloldnuclear.c ILINK iostuff.c LODSCORE ILINK LINKMAP MLINK ligetvect.c LINKMAP liinputcode.c LINKMAP linkmap.c LINKMAP lioldnuclear.c LINKMAP lodscore.c LODSCORE logetvect.c LODSCORE loinputcode.c LODSCORE looldnuclear.c LODSCORE loopbrk.c UNKNOWN mlgetvect.c MLINK mlink.c MLINK mlinputcode.c MLINK mloldnuclear.c MLINK oldsegup.c LODSCORE ILINK LINKMAP MLINK outbuff.c MLINK LINKMAP (parallel versions only) parmodified.c ILINK MLINK LINKMAP (parallel versions only) sexmodified.c LODSCORE ILINK LINKMAP MLINK (faster versions) slowautomodified.c LODSCORE ILINK LINKMAP MLINK (slower versions) slowsexmodified.c LODSCORE ILINK LINKMAP MLINK (slower versions) strbuff.c MLINK LINKMAP (parallel versions only) unknown.c UNKNOWN The distinction between faster and slower versions is explained in the COMPILATION section below. |*| COMPILATION ----------- Part of the distribution is a file called Makefile, which enables you to compile the programs. There are eleven commands you can issue for compilation of sequential FASTLINK: 1. make lodscore 2. make slowlodscore 3. make ilink 4. make slowilink 5. make linkmap 6. make slowlinkmap 7. make mlink 8. make slowmlink 9. make installfast 10. make installslow 11. make unknown 1 and 2 put an executable version of LODSCORE in the file lodscore. 3 and 4 put an executable version of ILINK in the file ilink. 5 and 6 put an executable version of LINKMAP in the file linkmap. 7 and 8 put an executable version of MLINK in the file mlink. 11 puts an executable version of UNKNOWN in the file unknown. 9 does all of 1,3,5, 7 and 11 10 does all of 2,4,6, 8 and 11 In each pair the first version is faster, but may use much more memory depending on the data and run parameters. The second version is slower, though still much faster than LINKAGE 5.1, and uses little memory. If you do not have enough memory to run the faster version, delete the faster version and make the slower one instead. The new compilation structure makes this recompilation much faster than it was in version 1.0 because most of the code does not have to be be recompiled. The Makefile we distribute works on a variety of systems. For a discussion of portability to various systems, see README.portability and the files it refers to. The Makefile we are distributing uses the gcc compiler distributed by the Free Software Foundation. You should read README.Makefile for much more detailed instructions on how to use a different compiler and change constant settings. It is useful that you read README.constants and follow the directions therein before doing any runs with FASTLINK. fastlink-4.1P-fix95/paper6.ps0000644000265600020320000062472406506236530015164 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software %%Title: draft.dvi %%Pages: 16 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips draft.dvi -o %DVIPSParameters: dpi=300, comments removed %DVIPSSource: TeX output 1997.10.09:1627 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginProcSet: special.pro TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{ /CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{ 10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{} N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{itransform lineto} }{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{ itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{ closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp {pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray} N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale true def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial {CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath }N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{ end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin} N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{ /SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (draft.dvi) @start /Fa 23 119 df<7FFFC0FFFFE0FFFFE07FFFC013047D901A>45 D<3078FCFC7830060676851A>I<0000C00001E00001E00003E00003C00007C000078000 0F80000F00000F00001F00001E00003E00003C00007C0000780000780000F80000F00001 F00001E00003E00003C00003C00007C0000780000F80000F00001F00001E00001E00003E 00003C00007C0000780000F80000F00000F0000060000013277DA21A>I<0FFE003FFF80 7FFFC07C07C07001C0F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0 E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E0F001E07001C0 7C07C07FFFC03FFF800FFE00131E7D9D1A>79 D<1FF0003FFC007FFE00780F0030070000 0380000380007F8007FF801FFF803F8380780380700380E00380E00380E0038070078078 0F803FFFFC1FFDFC07F0FC16157D941A>97 DI<00FF8003FFC00FFFE01F01E03C00C0780000700000700000E00000E0 0000E00000E00000E000007000007000007800703C00701F01F00FFFE003FFC000FE0014 157D941A>I<001FC0001FC0001FC00001C00001C00001C00001C00001C00001C001F1C0 07FDC00FFFC01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0E001C0E001C0 E001C07003C07003C03807C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A>I<01F80007FF 000FFF801E07C03C01C07800E07000E0E00070E00070FFFFF0FFFFF0FFFFF0E000007000 007000007800703C00701F01F00FFFE003FFC000FE0014157D941A>I<0007E0001FF000 3FF800787800F03000E00000E00000E00000E0007FFFF0FFFFF0FFFFF000E00000E00000 E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 E0003FFF807FFFC03FFF80151E7F9D1A>I<01F87C07FFFE0FFFFE1E078C1C03803801C0 3801C03801C03801C03801C01C03801E07801FFF001FFE0039F8003800003800001C0000 1FFF801FFFE03FFFF878007C70001CE0000EE0000EE0000EE0000E70001C78003C3E00F8 1FFFF007FFC001FF0017217F941A>II<00C00001E00001E00000C0000000000000000000000000000000000000007F E0007FE0007FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 E00000E00000E00000E00000E00000E0007FFF80FFFFC07FFF80121F7C9E1A>I107 DI<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C 001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C 001C1C1C001C1C1C001C1C1C007F1F1F00FF9F9F807F1F1F00191580941A>II<01F00007FC00 1FFF003E0F803C07807803C07001C0E000E0E000E0E000E0E000E0E000E0E000E0F001E0 7001C07803C03C07803E0F801FFF0007FC0001F00013157D941A>II<07FB801FFF807FFF80780780E0 0380E00380E003807800007FC0003FFC0007FE00003F800007806001C0E001C0E001C0F0 03C0FC0780FFFF00EFFE00E3F80012157C941A>115 D<00C00001C00001C00001C00001 C00001C00001C0007FFFE0FFFFE0FFFFE001C00001C00001C00001C00001C00001C00001 C00001C00001C00001C00001C07001C07001C07001C07000E0E000FFE0007FC0001F0014 1C7F9B1A>II<7F83FCFFC7FE7F83FC0E00E00E00E00E00E00701C00701C00701C00383800383 8003838001C70001C70001C70000EE0000EE0000EE00007C00007C0000380017157F941A >I E /Fb 3 90 df80 DI89 D E /Fc 1 49 df<060F0F0E1E1E1C3C383830707060E0C04008117F91 0A>48 D E /Fd 7 119 df<0000C00000C00001C00001C00003C00005C00005E00008E0 0008E00010E00020E00020E00040E000C0E00080E001FFF0010070020070040070040070 080070180070FE03FE17177F961A>65 D<00E2031E060E0C0E0C0C180C180C180C101810 181018183808F00730003000306060E060C1C07F000F14808D11>103 D<0300038003000000000000000000000000001C002400460046008C000C001800180018 0031003100320032001C0009177F960C>105 D<1F0006000600060006000C000C000C00 0C00181C1866188E190C32003C003F00318060C060C460C460C8C0C8C0700F177E9612> 107 D<383C0044C6004702004602008E06000C06000C06000C0C00180C00180C40181840 181880300880300F00120E7F8D15>110 D<030003000600060006000600FFC00C000C00 0C001800180018001800300030803080310031001E000A147F930D>116 D<1C04260E4606460686040C040C040C0418081808181018100C6007800F0E7F8D11> 118 D E /Fe 5 51 df<0102040C1818303070606060E0E0E0E0E0E0E0E0E0E060606070 303018180C04020108227D980E>40 D<8040203018180C0C0E0606060707070707070707 07070606060E0C0C18183020408008227E980E>I<003000003000003000003000003000 003000003000003000003000003000003000FFFFFCFFFFFC003000003000003000003000 00300000300000300000300000300000300000300016187E931B>43 D<03000700FF000700070007000700070007000700070007000700070007000700070007 00070007007FF00C157E9412>49 D<0F8030E040708030C038E038403800380070007000 6000C00180030006000C08080810183FF07FF0FFF00D157E9412>I E /Ff 1 107 df106 D E /Fg 10 58 df<003F800000E0E0000380380007001C000F001E000E000E00 1E000F001C0007003C0007803C0007803C000780780003C0780003C0780003C0780003C0 F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0 F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0 780003C0780003C0780003C07C0007C03C0007803C0007803C0007801C0007001E000F00 0E000E000F001E0007001C000380380000E0E000003F80001B307DAE21>48 D<00080000380000780001F8003FF800FE7800C078000078000078000078000078000078 000078000078000078000078000078000078000078000078000078000078000078000078 000078000078000078000078000078000078000078000078000078000078000078000078 0000780000780000780000780000780000780000780000780000FC007FFFF87FFFF8152F 7AAE21>I<007F800001FFF0000701F8000C007E0018001F0010000F0020000F80400007 C0400007C0400003E0B00003E0F80003E0FC0003E0FC0003E0FC0003E0780003E0000003 E0000007C0000007C00000078000000F8000000F0000001F0000001E0000003C00000078 00000070000000E0000001C0000003800000070000000E0000000C000000180000003000 000060000000C000200180002003000020060000400C00004008000040100000C03FFFFF C07FFFFF80FFFFFF80FFFFFF801B2F7DAE21>I<003F800001FFF00003C0F80006003C00 08001E0010001F0010000F003C000F803E000F803E000F803E000F801E000F8000000F80 00000F0000000F0000001F0000001E0000003C0000003800000070000000E00000038000 00FF80000000F0000000380000001E0000000F000000078000000780000007C0000003C0 000003E0000003E0300003E0780003E0FC0003E0FC0003E0FC0003E0F80003C0400007C0 400007C06000078030000F0018001E000E003C000780F80001FFF000003F80001B307DAE 21>I<00000C0000000C0000001C0000001C0000003C0000007C0000007C000000BC0000 013C0000013C0000023C0000063C0000043C0000083C0000183C0000103C0000203C0000 603C0000403C0000803C0001803C0001003C0002003C0002003C0004003C0008003C0008 003C0010003C0020003C0020003C0040003C00C0003C00FFFFFFF8FFFFFFF800003C0000 003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000 007E00001FFFF8001FFFF81D2F7EAE21>I<0C0003000F801E000FFFFC000FFFF8000FFF E00008FF0000080000000800000008000000080000000800000008000000080000000800 000008000000080000000800000008000000081FC00008607000098018000A001C000C00 0E00080007000000078000000780000003C0000003C0000003C0000003E0000003E00000 03E0000003E0780003E0F80003E0F80003E0F80003E0F00003C0C00007C0400007804000 078020000F0030000F0018001E000E003C000780F00001FFE000007F00001B307DAE21> I<0003F800001FFE00003C070000F0008001E001C003C003C0038007C0070007C00F0003 800E0000001E0000001C0000003C0000003C0000007C0000007C00000078000000781F80 00F8607000F8803800F9001C00F9000E00FA000700FC000780FC000780FC0003C0FC0003 C0F80003C0F80003E0F80003E0F80003E0F80003E0780003E0780003E0780003E0780003 E07C0003E03C0003C03C0003C03C0007C01E0007801E0007000E000F0007001E0003803C 0001E0780000FFE000003F80001B307DAE21>I<20000000380000003FFFFFF03FFFFFF0 3FFFFFE07FFFFFE060000040400000804000008040000100800002008000020080000400 000008000000080000001000000020000000200000004000000080000000800000010000 0001000000030000000200000006000000060000000C0000000C0000001C0000001C0000 001C0000003C000000380000003800000078000000780000007800000078000000780000 00F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000700000 1C317CAF21>I<003F800000FFE00003C0F80007003C000E000E000C000F001C00070018 000780380003803800038038000380380003803C0003803C0003003E0007001F0006001F 800E000FE01C0007F0380003FC600001FEC00000FF8000003FC000007FF00001C7F80003 03FC000600FE000C007F0018001F8038000FC0700007C0700003C0600001E0E00001E0E0 0000E0E00000E0E00000E0E00000E0E00000C0700000C0700001C038000180380003001C 0007000F001E0007C0780001FFF000003F80001B307DAE21>I<003F800000FFE00003E0 F000078038000F001C001E000E001C000F003C0007007C0007807800078078000780F800 07C0F80003C0F80003C0F80003C0F80003C0F80003E0F80003E0F80003E0F80003E07800 03E0780007E0780007E03C0007E03C0007E01C000BE00E0013E0070013E0038023E001C0 C3E0003F03C0000003C0000003C0000007C000000780000007800000078000000F000000 0F0038000E007C001C007C003C0078003800700070003001E0001C03C0000FFF000001FC 00001B307DAE21>I E /Fh 16 111 df0 D<70F8F8F87005057C8E0E>I<800002C0000660000C3000181800300C00600600C00301 8001830000C600006C00003800003800006C0000C6000183000301800600C00C00601800 3030001860000CC000068000021718789727>I<03F0000FFC001FFE003FFF007FFF807F FF80FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC07FFF807FFF803FFF001F FE000FFC0003F00012147D9519>15 D<0000000C0000003C000000F0000003C000000F00 00003C000000F0000007C000001F00000078000001E00000078000001E00000078000000 E0000000780000001E0000000780000001E0000000780000001F00000007C0000000F000 00003C0000000F00000003C0000000F00000003C0000000C000000000000000000000000 00000000000000000000000000000000000000007FFFFFF8FFFFFFFC1E277C9F27>20 D<000FFFFC007FFFFC01F0000003800000060000000C0000001800000030000000300000 006000000060000000C0000000C0000000C0000000C0000000C0000000C0000000C00000 00C000000060000000600000003000000030000000180000000C00000006000000038000 0001E00000007FFFFC001FFFFC1E1E7C9A27>26 D<018000000000030000000000030000 0000000600000000000600000000000C0000000000180000000000700000000000FFFFFF FFFFC0FFFFFFFFFFC07000000000001800000000000C0000000000060000000000060000 0000000300000000000300000000000180000000002A127C9432>32 D<000000006000000000003000000000003000000000001800000000001800000000000C 00000000000600000000000380FFFFFFFFFFE0FFFFFFFFFFC00000000003800000000006 00000000000C000000000018000000000018000000000030000000000030000000000060 002B127D9432>I<001FFF007FFF01E0000380000600000C000018000030000030000060 0000600000600000C00000C00000FFFFFFFFFFFFC00000C0000060000060000060000030 00003000001800000C000006000003800001E000007FFF001FFF181E7C9A21>50 D<00000300000300000600000600000C00000C0000180000180000300000300000600000 600000C00000C00000C0000180000180000300000300000600000600000C00000C000018 0000180000300000300000600000600000C00000C0000180000180000300000300000300 000600000600000C00000C0000180000180000300000300000600000600000C000004000 00183079A300>54 D<00020000060001E600061C000C0C00180E00300F00301B00301B00 701B80601980603180603180E031C0E031C0E061C0E061C0E061C0E061C0E0C1C0E0C1C0 E0C1C0E0C1C0E181C0E181C0E181C0E181C0E301C0E301C0630180630180760380760380 3603003E07001C06000C0C000E18000FF000180000180000180000122A7DA519>59 D<40000040C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000 C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000 C0C00000C0C00000C0C00000C0C00000C0C00000C0600001806000018030000300180006 000E001C000780780001FFE000007F80001A1F7D9D21>91 D<000F0038007000E001C001 C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C0038007001E 00F0001E000700038001C001C001C001C001C001C001C001C001C001C001C001C001C001 C001C001C001C000E000700038000F10317CA419>102 DI106 D110 D E /Fi 39 123 df<000F000031800060C0 00E0C001C0E00180E00380E00700E00700E00F00E00E00E01E00E01E00E01C01E03C01E0 3C01E03C01E07FFFC07803C07803C07803C0700780F00780F00700F00F00F00E00F00E00 E01C00601C0060380070300070600030C0001180000F000013237EA217>18 D<70F8F8F87005057C840E>58 D<70F8FCFC7404040404080810102040060F7C840E>I< 000080000180000180000300000300000300000600000600000600000C00000C00000C00 00180000180000180000300000300000300000600000600000600000C00000C00000C000 0180000180000180000180000300000300000300000600000600000600000C00000C0000 0C0000180000180000180000300000300000300000600000600000600000C00000C00000 C0000011317DA418>61 DI<007FFFFFC000078003C000078000 C000078000C0000F0000C0000F0000C0000F000080000F000080001E000080001E000080 001E008080001E008000003C010000003C010000003C030000003C070000007FFE000000 780600000078060000007806000000F004000000F004000000F004000000F000000001E0 00000001E000000001E000000001E000000003C000000003C000000003C000000003C000 000007C0000000FFFE00000022227EA120>70 D<00007F00400003C0C080000E00218000 1C0013800070000F8000E000070001C0000700038000070007000007000F000002000E00 0002001E000002003C000002003C00000400780000000078000000007800000000F00000 0000F000000000F000000000F000000000F0003FFF00E00000F000E00000F000E00000F0 00E00001E000F00001E000F00001E000700001E000700003C000380003C000180007C000 0C0009C00006001180000380E08000007F00000022247DA226>I<007FFC1FFF00078001 E000078001E000078001E0000F0003C0000F0003C0000F0003C0000F0003C0001E000780 001E000780001E000780001E000780003C000F00003C000F00003C000F00003C000F0000 7FFFFE000078001E000078001E000078001E0000F0003C0000F0003C0000F0003C0000F0 003C0001E000780001E000780001E000780001E000780003C000F00003C000F00003C000 F00003C000F00007C001F000FFFC3FFF0028227EA128>I<00FFFC0007C0000780000780 000F00000F00000F00000F00001E00001E00001E00001E00003C00003C00003C00003C00 00780000780000780000780000F00000F00000F00000F00001E00001E00001E00001E000 03C00003C00003C00003C00007C000FFFC0016227EA116>I<007FFE000007C000000780 0000078000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E00 00003C0000003C0000003C0000003C00000078000000780000007800000078000000F000 0000F0000000F0001000F0001001E0002001E0002001E0004001E0004003C000C003C000 8003C0018003C0078007C01F00FFFFFF001C227EA121>76 D<007FC00001FF0007C00003 E00007C00005E00007C00005E00009E0000BC00009E0000BC00009E00013C00009E00023 C00011E00027800011E00047800011E00047800011E00087800021E0010F000020F0010F 000020F0020F000020F0040F000040F0041E000040F0081E000040F0081E000040F0101E 000080F0203C00008078203C00008078403C00008078803C000100788078000100790078 0001007900780001007A00780002007C00F00002007C00F00002003800F00006003800F0 000F003001F000FFE0203FFF0030227EA12F>I<007FC003FF0007C000780007C0006000 05E000200009E000400009E000400008F000400008F000400010F8008000107800800010 78008000103C008000203C010000203E010000201E010000201E010000400F020000400F 020000400F020000400782000080078400008007C400008003C400008003C400010001E8 00010001E800010001F800010000F800020000F000020000700002000070000600007000 0F00002000FFE000200028227EA127>I<007FFFF0000007801C000007800F0000078007 00000F000380000F000380000F000380000F000380001E000780001E000780001E000780 001E000F00003C000F00003C001E00003C003C00003C007000007801E000007FFF000000 78000000007800000000F000000000F000000000F000000000F000000001E000000001E0 00000001E000000001E000000003C000000003C000000003C000000003C000000007C000 0000FFFC00000021227EA11F>80 D<1FFFFFFE1E01E00E1801E0063001E0062003C00620 03C0064003C0044003C00440078004800780048007800400078000000F0000000F000000 0F0000000F0000001E0000001E0000001E0000001E0000003C0000003C0000003C000000 3C00000078000000780000007800000078000000F0000000F0000000F0000000F0000001 F00000FFFFC0001F227EA11D>84 D86 D<007FFC03FF0007E000F80007C000E00003C0 00800003E001000001E002000001F006000001F00C000000F018000000F8100000007820 0000007C400000007C800000003D000000003E000000001E000000001F000000001F0000 00002F000000006F80000000C78000000187C000000103C000000203C000000403E00000 0801E000001001F000002000F000004000F800008000F80001800078000300007C000F80 00FC00FFE007FFC028227FA128>88 DI<007FFFFE007E001E0070003C00E0007800C000F0008001 E0018003E0010003C00100078002000F0002001E0000003C0000007C00000078000000F0 000001E0000003C00000078000000F8000000F0000001E0000003C00200078002000F000 4001F0004001E0004003C00080078000800F0001801E0003001E0007003C000F0078007E 00FFFFFE001F227DA121>I<00786001C4E00302E00601C00E01C01C01C03C01C0380380 780380780380780380F00700F00700F00700F00708F00E10700E10701E1030262018C620 0F01C015157E941A>97 D<03C0003F800003800003800003800007000007000007000007 00000E00000E00000E00000E00001C00001C78001D8E001E07003C070038038038038038 0780700780700780700780700780E00F00E00F00E00F00E01E00E01C00601C0060380030 700030C0000F000011237DA215>I<003F0000E0800380C00701C00E03C01C03C03C0000 3C0000780000780000780000F00000F00000F00000F00000700040700040300180380200 1C1C0007E00012157E9415>I<00001E0001FC00001C00001C00001C0000380000380000 380000380000700000700000700000700000E00078E001C4E00302E00601C00E01C01C01 C03C01C0380380780380780380780380F00700F00700F00700F00708F00E10700E10701E 1030262018C6200F01C017237EA219>I<007C000382000701000E01001C010038010078 0200700400FFF800F00000F00000E00000E00000E00000E00000E00080E0008070030030 04001838000FC00011157D9417>I<00001E00000063800000C7800001C7800001C30000 018000000380000003800000038000000380000007000000070000000700000007000000 FFF800000E0000000E0000000E0000000E0000000E0000000E0000001C0000001C000000 1C0000001C0000001C000000380000003800000038000000380000003800000070000000 70000000700000007000000060000000E0000000E0000000E0000000C0000070C00000F1 800000F1000000620000003C000000192D7EA218>I<000F0C00389C00605C00C03801C0 380380380780380700700F00700F00700F00701E00E01E00E01E00E01E00E01E01C00E01 C00E03C00605C0031B8001E380000380000380000700000700000700700E00F00C00F018 006070003FC000161F809417>I<00E000E001E000C00000000000000000000000000000 000000001E0023004380438083808380870007000E000E000E001C001C00380038203840 70407040308031001E000B227EA111>105 D<0000E00001E00001E00000C00000000000 00000000000000000000000000000000000000000000001E000023000043800083800103 80010380010380000700000700000700000700000E00000E00000E00000E00001C00001C 00001C00001C0000380000380000380000380000700000700000700070E000F0C000F180 006300003E0000132C81A114>I<00F0000FE00000E00000E00000E00001C00001C00001 C00001C0000380000380000380000380000700000700F00703080704380E08780E10780E 20300E40001C80001F00001FC0001C7000383800383800381C00381C1070382070382070 3820701840E00C8060070015237DA219>I<01E01FC001C001C001C00380038003800380 07000700070007000E000E000E000E001C001C001C001C00380038003800380070007000 70007100E200E200E200620064001C000B237DA20F>I<3C07E01F004618306180472018 80C087401D00E087801E00E087801C00E087001C00E00E003801C00E003801C00E003801 C00E003801C01C007003801C007003801C007007001C007007043800E007083800E00E08 3800E00E083800E006107001C006203000C003C026157E942B>I<003E0000C1800380C0 0700E00E00E01C00F03C00F03C00F07800F07800F07800F0F001E0F001E0F001C0F003C0 700380700700700600381C001C380007E00014157E9417>111 D<03C0F004631C04740E 08780E08700708700708700F00E00F00E00F00E00F00E00F01C01E01C01E01C01E01C03C 03803803803803C07003C0E0072180071E000700000700000E00000E00000E00000E0000 1C00001C00001C0000FFC000181F819418>I<3C0F004630C04741C08783C08783C08701 808700000E00000E00000E00000E00001C00001C00001C00001C00003800003800003800 0038000070000030000012157E9416>114 D<006000E000E000E000E001C001C001C001 C00380FFFC0380038007000700070007000E000E000E000E001C001C001C001C08381038 103820182018C007000E1F7F9E12>116 D<1E00C02301E04381F04380F0838070838030 8700300700200E00200E00200E00201C00401C00401C00801C00801C01001C01001C0200 0C040006080003F00014157E9418>118 D<1E0018182300383C4380383E4380701E8380 700E83807006870070060700E0040E00E0040E00E0040E00E0041C01C0081C01C0081C01 C0081C01C0101C01C0101C01C0201C03C0400C04C0C00708E10001F03E001F157E9423> I<01E0F006310C081A1C101A3C201C3C201C18201C000038000038000038000038000070 0000700000700000700860E010F0E010F0E020E170404230803C1F0016157E941C>I<1E 00302300704380704380E08380E08380E08700E00701C00E01C00E01C00E01C01C03801C 03801C03801C03801C07001C07001C07001C0F000C3E0003CE00000E00000E00001C0060 1C00F03800F03000E0600080C0004180003E0000141F7E9418>I<00E01003F02007F860 060FC008008008010000020000040000080000100000200000C000010000020000040040 0800801001803F830061FE0040FC0080780014157E9417>I E /Fj 35 123 df<0E1E1E1E1E02020404080810204080070F7D840F>44 D<70F8F8F0E005057A840F>46 D<000FC000106000603800801800801C01001C02201E02 101E04101E04101E04101E08203C08203C0840380840780880F00700E00001C000030000 060000180000200000C0000100000200000400100800301000202000605F80C063FFC040 FF80807F00801E0017227CA019>50 D<0000030000000300000007000000070000000F00 00000F0000001F0000002F0000002F0000004F0000004F80000087800000878000010780 000207800002078000040780000407800008078000080780001007800030078000200780 007FFF80004007C0008007C0008003C0010003C0030003C0020003C0040003C0040003C0 0C0003C03C0007C0FF003FFC1E237DA224>65 D<00FFFFE0000F0038000F001C000F001E 001E000E001E000F001E000F001E000F003C000E003C001E003C001E003C003C00780078 007800F0007801E00078078000FFFF8000F001E000F000F000F0007801E0007801E00038 01E0003C01E0003C03C0007803C0007803C0007803C000F0078000F0078001E0078003C0 078007000F801E00FFFFF00020227DA122>I<00FFFFF000000F003C00000F000E00000F 000700001E000380001E000380001E0001C0001E0001C0003C0001C0003C0001E0003C00 01E0003C0001E000780001E000780001E000780001E000780001E000F00003C000F00003 C000F00003C000F00003C001E000078001E000078001E000070001E0000F0003C0000E00 03C0001C0003C0003C0003C00038000780007000078000E000078001C00007800700000F 801C0000FFFFF0000023227DA125>68 D<00007F00800003808100000E00630000380027 000070001F0000E0000E0001C0000E000380000E000700000E000F000004000E00000400 1E000004003C000004003C00000800780000000078000000007800000000F000000000F0 00000000F000000000F000000000F0003FFC00E00001E000E00001E000E00001E000E000 03C000E00003C000F00003C000700003C0007000078000380007800018000F80001C0013 800006002300000381C1000000FE000000212479A226>71 D<00FFFC00000F8000000F00 00000F0000001E0000001E0000001E0000001E0000003C0000003C0000003C0000003C00 000078000000780000007800000078000000F0000000F0000000F0000000F0000001E000 0001E0000001E0002001E0002003C0004003C0004003C0008003C0008007800180078001 000780030007800F000F803E00FFFFFE001B227DA11F>76 D<00FF800007FC000F80000F 80000F80001780000F80001780001780002F000013C0002F000013C0004F000013C0008F 000023C0009E000023C0011E000023C0011E000023C0021E000043C0043C000043C0043C 000043C0083C000041E0083C000081E01078000081E02078000081E02078000081E04078 000101E040F0000101E080F0000101E100F0000101E100F0000200F201E0000200F201E0 000200F401E0000200F801E0000400F803C0000400F003C0000400F003C0000C00E003C0 001E00C007C000FFC0C07FFC002E227DA12C>I<1FFFFFF81E03C0381803C0183003C018 20078018200780184007801040078010400F0010800F0010800F0010000F0000001E0000 001E0000001E0000001E0000003C0000003C0000003C0000003C00000078000000780000 007800000078000000F0000000F0000000F0000000F0000001E0000001E0000001E00000 01E0000003E00000FFFF00001D2277A123>84 D<00F8C00185C00705C00E03800E03801C 03803C0380380700780700780700780700F00E00F00E00F00E00F00E10F01C20701C2070 3C20305C40308C400F078014157B9419>97 D<03C03F8003800380038007000700070007 000E000E000E000E001C001CF81D0C1E0E3C0638073807380F700F700F700F700FE01EE0 1EE01EE03CE038E038607060E031C01F0010237BA216>I<007E0001C100030180070380 0E07801C07803C0000380000780000780000780000F00000F00000F00000F00000F00100 700100700200300C001830000FC00011157B9416>I<00003C0003F80000380000380000 380000700000700000700000700000E00000E00000E00000E00001C000F9C00185C00705 C00E03800E03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E 10F01C20701C20703C20305C40308C400F078016237BA219>I<00F803840E021C023C02 38027804F018FFE0F000F000E000E000E000E000E002E0026004701830600F800F157A94 16>I<00003E0000470000CF00018F000186000380000380000380000700000700000700 000700000700000E0000FFF0000E00000E00000E00001C00001C00001C00001C00001C00 00380000380000380000380000380000700000700000700000700000700000E00000E000 00E00000E00000C00001C00001C000718000F18000F300006200003C0000182D82A20F> I<001F180030B800E0B801C07001C0700380700780700700E00F00E00F00E00F00E01E01 C01E01C01E01C01E01C01E03800E03800E0780060B8006170001E700000700000700000E 00000E00000E00701C00F01800F0300060E0003F8000151F7E9416>I<00F0000FE00000 E00000E00000E00001C00001C00001C00001C00003800003800003800003800007000007 1F0007218007C0C00F00E00F00E00E00E00E00E01C01C01C01C01C01C01C01C038038038 0380380380380704700708700E08700E10700610E006206003C016237DA219>I<00C001 E001C001C0000000000000000000000000000000001C002300430043008700870087000E 000E001C001C001C00380038003840708070807080710032001C000B217BA00F>I<0000 E00001E00001E00000C0000000000000000000000000000000000000000000000000001E 00002300004380008380008380010380010380000700000700000700000700000E00000E 00000E00000E00001C00001C00001C00001C000038000038000038000038000070000070 0000700070E000F0C000F180006300003C0000132B82A00F>I<00F0000FE00000E00000 E00000E00001C00001C00001C00001C0000380000380000380000380000700000701E007 0210070C700E10F00E10F00E20600E40001D80001E00001FC0001C700038380038380038 1C00381C20703840703840703840701880E01880600F0014237DA216>I<01E01FC001C0 01C001C0038003800380038007000700070007000E000E000E000E001C001C001C001C00 38003800380038007000700070007100E200E200E200E200640038000B237CA20C>I<1C 0F80F8002610C10C00476066060087807807008780780700870070070087007007000E00 E00E000E00E00E000E00E00E000E00E00E001C01C01C001C01C01C001C01C01C001C01C0 3820380380384038038070403803807080380380308070070031003003001E0023157B94 28>I<1C0F002631C04740C08780E08780E08700E08700E00E01C00E01C00E01C00E01C0 1C03801C03801C03801C0704380708380E08380E103806107006203003C016157B941B> I<007E0001C3000381800701C00E01C01C01E03C01E03801E07801E07801E07801E0F003 C0F003C0F00380F00780700700700E00700C0030180018700007C00013157B9419>I<01 C1F002621804741C08780C08700E08700E08701E00E01E00E01E00E01E00E01E01C03C01 C03C01C03C01C07803807003807003C0E003C1C0072380071E000700000700000E00000E 00000E00000E00001C00001C00001C0000FFC000171F7F9419>I<1C1F002620804741C0 8783C08703C08701808700000E00000E00000E00000E00001C00001C00001C00001C0000 38000038000038000038000070000030000012157B9415>114 D<00FC00018300020080 0401800C03800C03000C00000F00000FF00007FC0003FE00003E00000F00000700700700 F00600F00600E004004008002030001FC00011157D9414>I<00C001C001C001C001C003 800380038003800700FFF8070007000E000E000E000E001C001C001C001C003800380038 003810702070207040708031001E000D1F7C9E10>I<1E00602300E04380E04381C08381 C08701C08701C00703800E03800E03800E03801C07001C07001C07001C07081C0E10180E 101C0E101C1E200C262007C3C015157B941A>I<1E03802307C04387C04383C08381C087 00C08700C00700800E00800E00800E00801C01001C01001C01001C02001C02001C04001C 08001C08000C300003C00012157B9416>I<1E0060E02300E1F04380E1F04381C0F08381 C0708701C0308701C030070380200E0380200E0380200E0380201C0700401C0700401C07 00401C0700801C0700801C0701001C0F01000C0F020006138C0003E0F0001C157B9420> I<03C1E0046210083470103CF02038F020386020380000700000700000700000700000E0 0000E00000E00000E02061C040F1C040F1C080E2C100446200383C0014157D9416>I<1E 00302300704380704380E08380E08700E08700E00701C00E01C00E01C00E01C01C03801C 03801C03801C03801C07001C07001C07001C0F000C3E0003CE00000E00000E00001C0060 1C00F03800F03000E0600080C0004380003E0000141F7B9418>I<01E02003F06007F8C0 041F80080100080200000400000800001000002000004000008000010000020000040080 0801001003003F060061FC0040F80080700013157D9414>I E /Fk 31 120 df45 D<70F8F8F87005057A8410>I<00001000003000 00600000600000600000C00000C00000C000018000018000030000030000030000060000 0600000C00000C00000C0000180000180000180000300000300000600000600000600000 C00000C0000180000180000180000300000300000300000600000600000C00000C00000C 0000180000180000300000300000300000600000600000600000C00000C0000014317CA4 1C>I<00FC000387000E01C01C00E0180060380070380070700038700038700038F0003C F0003CF0003CF0003CF0003CF0003CF0003CF0003CF0003CF0003CF0003CF0003CF0003C F0003C7000387000387800783800703800701C00E01C00E00E01C003870000FC0016227D A01C>I<00FC0007FF000E07C01801E01C01E03E01F03E00F03E00F01E01F00C01F00001 E00001C00003C0000700000E0001FE000007800001C00000E00000F000007800007C0000 7C30007C78007CFC007CFC007CFC0078F800F84000F03001E01C07C00FFF8001FC001622 7DA01C>51 D<00004000000000E000000000E000000000E000000001F000000001F00000 0003F800000002780000000278000000043C000000043C000000043C000000081E000000 081E000000101F000000100F000000100F000000200780000020078000006007C0000040 03C000004003C00000FFFFE00000FFFFE000008001E000010000F000010000F000020000 F800020000780002000078000400003C000400003C001E00003E00FFC003FFE0FFC003FF E023237DA229>65 DI69 D<0003F80200001FFF0600007E03860001F000CE0003E0003E00078000 1E000F00001E001F00000E001E000006003E000006003C000006007C000002007C000002 007800000200F800000000F800000000F800000000F800000000F800000000F800000000 F800000000F8000FFFE078000FFFE07C00001E007C00001E003C00001E003E00001E001E 00001E001F00001E000F80001E0007C0001E0003E0002E0001F8006E00007E01C600001F FF02000003FC000023247CA22A>71 D73 D75 DI78 D<01F80807FF181E07983800F8300078700038600018 E00018E00008E00008E00008F000007800007C00003F00003FF8001FFF0007FFC001FFE0 001FF00001F800007800003800003C00001C80001C80001C80001C80001CC00018E00038 E00030F80070CF01E0C7FF8080FE0016247CA21E>83 D<7FFFFFFF007FFFFFFF007801E0 0F006001E003006001E001004001E00100C001E00180C001E001808001E000808001E000 808001E000808001E000800001E000000001E000000001E000000001E000000001E00000 0001E000000001E000000001E000000001E000000001E000000001E000000001E0000000 01E000000001E000000001E000000001E000000001E000000001E000000001E000000001 E0000000FFFFC00000FFFFC00021227DA127>I<00040000000E0000000E0000000E0000 001F0000001F0000003F800000278000002780000043C0000043C0000043C0000081E000 0081E0000101F0000100F0000100F00003FFF8000200780006007C0004003C0004003C00 0C001E000C001E003C003F00FF00FFE01B1A7F991F>97 D 101 DI<003F810001E063000380170006000F000C000700 1C00030038000300780001007800010070000100F0000000F0000000F0000000F0000000 F0000000F001FFE070001F0078000F0078000F0038000F001C000F000C000F0006000F00 0380170001E06300003F81001B1A7E9920>I105 D107 DI110 D<007F800001C0E000070038000E001C001C000E003C000F003800070078000780700003 8070000380F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0F00003C0780007 8078000780380007003C000F001C000E000E001C000700380001C0E000007F80001A1A7E 9920>II114 D<07E100181B003007006003006003 00E00100E00100E00100F00000F800007F80003FF8001FFC000FFE0000FF00000F000007 80000780800380800380800380C00300C00700E00600DC0C0083F000111A7E9917>I<7F FFFF00701E0700601E0100401E0100C01E0180801E0080801E0080801E0080001E000000 1E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E000000 1E0000001E0000001E0000001E0000001E0000001E0000003F000003FFF000191A7F991D >III I E /Fl 34 120 df<00003FF800000003FFFE0000000FF80F8000003FC001C000007F00 07E00000FE000FE00001FE001FF00001FC001FF00003FC001FF00003FC001FF00003FC00 0FE00003FC0007C00003FC0001000003FC0000000003FC0000000003FC0000000003FC00 00000003FC00000000FFFFFFFFF000FFFFFFFFF000FFFFFFFFF00003FC001FF00003FC00 0FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC00 0FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC00 0FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC00 0FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC000FF00003FC00 0FF0007FFFE1FFFF807FFFE1FFFF807FFFE1FFFF8029327FB12D>12 D<0001C0000003C000000FC000007FC0001FFFC000FFFFC000FFBFC000E03FC000003FC0 00003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0 00003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0 00003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0 00003FC000003FC000003FC000003FC000003FC000003FC000003FC0007FFFFFE07FFFFF E07FFFFFE01B2E7AAD28>49 D<003FE00001FFFE0007FFFF800F80FFC01E003FE038001F F07C000FF87E0007FCFF0007FCFF8007FEFF8007FEFF8003FEFF8003FE7F0003FE3E0007 FE000007FE000007FC000007FC00000FF800000FF800000FF000001FE000001FC000003F 8000007F0000007E000000F8000001F0000003E0000007C000000F0000001E000E003C00 0E0038000E0070001E00E0001C01C0001C0300003C07FFFFFC0FFFFFFC1FFFFFFC3FFFFF FC7FFFFFF8FFFFFFF8FFFFFFF8FFFFFFF81F2E7CAD28>I<001FF80000007FFF000001FF FFC00003E03FE00007800FF0000FC00FF8001FE007F8001FE007FC001FE007FC001FE007 FC001FE007FC000FC007FC00078007FC0000000FF80000000FF80000000FF00000001FE0 0000001FC00000003F80000000FE0000003FF80000003FFF800000001FE000000007F000 000007F800000003FC00000003FE00000001FF00000001FF00000001FF80000001FF8000 0001FF801C0001FF803E0001FF807F0001FF80FF8001FF80FF8001FF00FF8001FF00FF80 03FE007F0003FE007E0007FC003C0007F8001FC01FF0000FFFFFC00003FFFF0000003FF8 0000212E7DAD28>I<0000007000000000F000000001F000000003F000000007F0000000 0FF00000000FF00000001FF00000003FF000000077F0000000F7F0000000E7F0000001C7 F000000387F000000707F000000F07F000000E07F000001C07F000003807F000007007F0 0000F007F00000E007F00001C007F000038007F000070007F0000F0007F0000E0007F000 1C0007F000380007F000700007F000E00007F000FFFFFFFFE0FFFFFFFFE0FFFFFFFFE000 000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF0000000 0FF00000000FF000000FFFFFE0000FFFFFE0000FFFFFE0232E7EAD28>I<0C0000300FC0 03F00FFFFFE00FFFFFC00FFFFF800FFFFF000FFFFE000FFFF8000FFFF0000FFF80000E00 00000E0000000E0000000E0000000E0000000E0000000E0000000E0000000E1FF0000E7F FE000FE03F800F800FC00E0007E00C0007F0000007F8000003FC000003FC000003FC0000 03FE000003FE180003FE3E0003FE7F0003FEFF0003FEFF0003FEFF0003FCFF0003FCFE00 03FC780007F8780007F03C000FE01E001FC00FC07F8007FFFF0001FFFC00003FE0001F2E 7CAD28>I<0000FF80000007FFE000001FFFF000007F80F80000FE003C0001F8007C0003 F000FE0007F001FE000FE001FE000FE001FE001FC001FE003FC000FC003FC00078003FC0 0000007F800000007F800000007F80000000FF83FC0000FF8FFF8000FF9C0FC000FFB003 F000FFB001F800FFE001FC00FFC001FE00FFC000FE00FFC000FF00FFC000FF00FF8000FF 80FF8000FF80FF8000FF80FF8000FF807F8000FF807F8000FF807F8000FF807F8000FF80 3F8000FF003FC000FF001FC000FF001FC000FE000FC001FC0007E001FC0003F003F80001 FC0FE00000FFFFC000003FFF0000000FFC0000212E7DAD28>I<38000000003E00000000 3FFFFFFFC03FFFFFFFC03FFFFFFFC03FFFFFFF807FFFFFFF007FFFFFFE007FFFFFFC007F FFFFF80078000038007000007000700000E000F00001C000E000038000E000070000E000 07000000000E000000001C00000000380000000038000000007800000000F000000000F0 00000001F000000001E000000003E000000003E000000007E000000007E00000000FC000 00000FC00000000FC00000001FC00000001FC00000001FC00000001FC00000001FC00000 003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000000 3FC00000001F800000000F00000022307CAF28>I<000000780000000000007800000000 0000FC000000000000FC000000000000FC000000000001FE000000000001FE0000000000 03FF000000000003FF000000000007FF800000000007FF800000000007FF80000000000F FFC0000000000E7FC0000000001E7FE0000000001C3FE0000000001C3FE000000000383F F000000000381FF000000000781FF800000000700FF800000000700FF800000000E00FFC 00000000E007FC00000001E007FE00000001C003FE00000001C003FE000000038003FF00 0000038001FF000000078001FF800000070000FF800000070000FF8000000FFFFFFFC000 000FFFFFFFC000001FFFFFFFE000001C00003FE000003C00003FF000003800001FF00000 3800001FF000007000001FF800007000000FF80000F000000FFC0000E0000007FC0000E0 000007FC0001C0000007FE0003E0000003FE00FFFF8001FFFFFCFFFF8001FFFFFCFFFF80 01FFFFFC36317DB03D>65 DI68 D73 D77 DI82 D<00FFF0000003FFFE00000F803F80000FC00FE0001FE007 F0001FE007F0001FE003F8000FC003FC00078003FC00000003FC00000003FC00000003FC 00000003FC000000FFFC00001FFFFC0000FFE3FC0003FC03FC000FF003FC001FC003FC00 3FC003FC007F8003FC007F8003FC00FF0003FC00FF0003FC00FF0003FC00FF0007FC00FF 0007FC007F800DFC003FC019FE001FE070FFF007FFE07FF000FF803FF024207E9F27>97 D<01F8000000FFF8000000FFF8000000FFF80000000FF800000007F800000007F8000000 07F800000007F800000007F800000007F800000007F800000007F800000007F800000007 F800000007F800000007F800000007F800000007F83FE00007F8FFFC0007FBE07F0007FF 001F8007FE000FC007FC000FE007F80007F007F80007F807F80007F807F80003FC07F800 03FC07F80003FC07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003 FE07F80003FE07F80003FE07F80003FC07F80003FC07F80003FC07F80007F807F80007F8 07F80007F007FC000FE007FE000FC007E7003F8007C3C0FE000780FFF80007003FC00027 327EB12D>I<000FFF00007FFFC001FC01F003F003F007E007F80FE007F81FC007F83FC0 03F03FC001E07F8000007F8000007F800000FF800000FF800000FF800000FF800000FF80 0000FF800000FF800000FF8000007F8000007F8000007F8000003FC0001C3FC0001C1FC0 00380FE0003807E0007003F001E001FC07C0007FFF00000FF8001E207D9F24>I<000000 0FC0000007FFC0000007FFC0000007FFC00000007FC00000003FC00000003FC00000003F C00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0 0000003FC00000003FC00000003FC00007F83FC0003FFF3FC000FE07BFC003F801FFC007 E0007FC00FE0007FC01FC0003FC03FC0003FC03FC0003FC07F80003FC07F80003FC07F80 003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF8000 3FC0FF80003FC07F80003FC07F80003FC07F80003FC03FC0003FC03FC0003FC01FC0003F C00FE0007FC007E000FFC003F003FFE001FC0F3FFE007FFE3FFE000FF03FFE27327DB12D >I<000FFC00007FFF8001FC0FC003F003E007E001F00FE001F81FC000FC3FC000FE3FC0 00FE7F80007E7F80007F7F80007FFF80007FFF80007FFFFFFFFFFFFFFFFFFF800000FF80 0000FF800000FF8000007F8000007F8000007F8000003FC000071FC000071FC0000E0FE0 000E07F0001C03F8007800FE03E0003FFFC00007FE0020207E9F25>I<0001FE00000FFF 80001FC3C0007F07E000FE0FF001FE0FF001FC0FF003FC0FF003FC07E003FC018003FC00 0003FC000003FC000003FC000003FC000003FC000003FC000003FC0000FFFFFC00FFFFFC 00FFFFFC0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00 0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00 0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00 007FFFF0007FFFF0007FFFF0001C327EB119>I<001FF007C000FFFE3FE001F83F79F007 E00FC3F00FE00FE1F00FC007E0E01FC007F0001FC007F0003FC007F8003FC007F8003FC0 07F8003FC007F8003FC007F8001FC007F0001FC007F0000FC007E0000FE00FE00007E00F C00003F83F000006FFFE00000E1FF000000E000000001E000000001E000000001F000000 001F800000001FFFFF80000FFFFFF0000FFFFFFC0007FFFFFE0003FFFFFF0003FFFFFF80 0FFFFFFFC01F00007FC07E00001FE07C00000FE0FC000007E0FC000007E0FC000007E0FC 000007E07E00000FC03E00000F803F00001F800FC0007E0007F803FC0001FFFFF000001F FF0000242F7E9F28>I<01F8000000FFF8000000FFF8000000FFF80000000FF800000007 F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8 00000007F800000007F800000007F800000007F800000007F800000007F807F80007F83F FE0007F8783F0007F8C03F8007F9801FC007FB001FC007FE001FE007FC001FE007FC001F E007FC001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0 07F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007 F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0FFFFC3FFFFFFFF C3FFFFFFFFC3FFFF28327DB12D>I<03C00007E0000FF0001FF8001FF8001FF8001FF800 0FF00007E00003C000000000000000000000000000000000000000000000000000000000 01F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F800 07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 07F80007F80007F80007F80007F800FFFF80FFFF80FFFF8011337DB217>I<01F8000000 FFF8000000FFF8000000FFF80000000FF800000007F800000007F800000007F800000007 F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8 00000007F800000007F800000007F801FFF807F801FFF807F801FFF807F8003F0007F800 3C0007F800780007F800F00007F803C00007F807800007F80F000007F81E000007F87800 0007F8FC000007F9FE000007FBFE000007FFFF000007FE7F800007FC7FC00007F83FC000 07F01FE00007F00FF00007F00FF80007F007FC0007F003FC0007F001FE0007F000FF0007 F000FF8007F0007F8007F0007FC0FFFF81FFFEFFFF81FFFEFFFF81FFFE27327EB12B> 107 D<01F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F800 07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 FFFFC0FFFFC0FFFFC012327DB117>I<03F007F8001FE000FFF03FFE00FFF800FFF0783F 01E0FC00FFF0C03F8300FE000FF1801FC6007F0007F3001FCC007F0007F6001FF8007F80 07FC001FF0007F8007FC001FF0007F8007FC001FF0007F8007F8001FE0007F8007F8001F E0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F80 07F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001F E0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F80 07F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F80FFFFC3FF FF0FFFFCFFFFC3FFFF0FFFFCFFFFC3FFFF0FFFFC3E207D9F43>I<03F007F800FFF03FFE 00FFF0783F00FFF0C03F800FF1801FC007F3001FC007F6001FE007FC001FE007FC001FE0 07FC001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007 F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8 001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0FFFFC3FFFFFFFFC3 FFFFFFFFC3FFFF28207D9F2D>I<0007FC0000007FFFC00001FC07F00003F001F80007E0 00FC000FC0007E001FC0007F003FC0007F803F80003F807F80003FC07F80003FC07F8000 3FC0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003F E0FF80003FE07F80003FC07F80003FC07F80003FC03FC0007F803FC0007F801FC0007F00 0FE000FE0007E000FC0003F803F80001FE0FF000007FFFC0000007FC000023207E9F28> I<03F03F00FFF07FC0FFF1C3E0FFF187E00FF30FF007F60FF007F60FF007FC07E007FC03 C007FC000007FC000007F8000007F8000007F8000007F8000007F8000007F8000007F800 0007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F800 0007F8000007F80000FFFFE000FFFFE000FFFFE0001C207E9F21>114 D<01FF860007FFFE001F00FE003C003E0078001E0078000E00F8000E00F8000E00F8000E 00FC000000FF800000FFFC00007FFFC0007FFFF0003FFFF8001FFFFC0007FFFE0001FFFF 00003FFF000000FF8000003F8060001F80E0000F80E0000F80F0000F80F0000F00F8000F 00FC001E00FE001C00FF807800F3FFF000C07F800019207D9F20>I<001C0000001C0000 001C0000001C0000001C0000003C0000003C0000003C0000007C0000007C000000FC0000 01FC000003FC000007FC00001FFFFE00FFFFFE00FFFFFE0003FC000003FC000003FC0000 03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0000 03FC000003FC000003FC000003FC000003FC038003FC038003FC038003FC038003FC0380 03FC038003FC038001FC038001FC070000FE0700007F0E00003FFC000007F000192E7FAD 1F>I<01F80007E0FFF803FFE0FFF803FFE0FFF803FFE00FF8003FE007F8001FE007F800 1FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001F E007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0 07F8001FE007F8001FE007F8001FE007F8003FE007F8003FE003F8007FE003F8007FE001 FC00DFF000FE039FFF007FFF1FFF000FFC1FFF28207D9F2D>I119 D E /Fm 20 122 df<70F8F8F8700505788416>46 D<00F80003FC0007FE000F07001C3F80387F8078FF8071C3C071C3C0E381C0E381C0E381 C0E381C0E381C0E381C0E381C071C38071C38078FF00387E001C3C000F03C007FFC003FF 0000FC0012197E9816>64 D<1FE0003FF0007FF800783C00300E00000E00000E0003FE00 1FFE003E0E00700E00E00E00E00E00E00E00783E007FFFE03FE7E00F83E013127E9116> 97 D<03F80FFC1FFE3C1E780C7000E000E000E000E000E000F000700778073E0E1FFC0F F803F010127D9116>99 D<003F00007F00003F0000070000070000070000070003C7000F F7001FFF003C1F00780F00700700E00700E00700E00700E00700E00700E00700700F0070 0F003C1F001FFFE00FE7F007C7E014197F9816>I<03E00FF81FFC3C1E780E7007E007FF FFFFFFFFFFE000E000700778073C0F1FFE0FFC03F010127D9116>I<001F00007F8000FF 8001E78001C30001C00001C0007FFF00FFFF00FFFF0001C00001C00001C00001C00001C0 0001C00001C00001C00001C00001C00001C00001C0003FFE007FFF003FFE0011197F9816 >I<03E3C007F7E00FFFE01C1CC0380E00380E00380E00380E00380E001C1C000FF8001F F0001BE0003800001800001FFC001FFF003FFF807803C0E000E0E000E0E000E0E000E070 01C07C07C03FFF800FFE0003F800131C7F9116>I<7E0000FE00007E00000E00000E0000 0E00000E00000E3C000EFE000FFF000F87800F03800E03800E03800E03800E03800E0380 0E03800E03800E03800E03800E03807FC7F0FFE7F87FC7F01519809816>I<018003C003 C0018000000000000000007FC07FC07FC001C001C001C001C001C001C001C001C001C001 C001C001C07FFFFFFF7FFF101A7D9916>I108 D<7E3C00FEFE007FFF000F87800F03800E03800E03800E03800E03800E03800E03800E03 800E03800E03800E03807FC7F0FFE7F87FC7F01512809116>110 D<03E0000FF8001FFC003C1E00780F00700700E00380E00380E00380E00380E00380F007 80700700780F003C1E001FFC000FF80003E00011127E9116>I114 D<0FEC3FFC7FFCF03CE01CE01C70007F801FF007 F8003C600EE00EF00EF81EFFFCFFF8C7E00F127D9116>I<030000070000070000070000 0700007FFF00FFFF00FFFF00070000070000070000070000070000070000070000070100 07038007038007038007870003FE0001FC0000F80011177F9616>I<7E1F80FE3F807E1F 800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E03800E0F 800FFFF007FBF803E3F01512809116>I<7F1FC0FF1FE07F1FC01C07001E0F000E0E000E 0E000E0E00071C00071C00071C00071C0003B80003B80003B80001F00001F00000E00013 127F9116>I<7F1FC07F3FC07F1FC00F1C00073C0003B80003F00001F00000E00001E000 01F00003B800073C00071C000E0E007F1FC0FF3FE07F1FC013127F9116>120 D<7F1FC0FF9FE07F1FC01C07000E07000E0E000E0E00070E00071C00071C00039C00039C 0003980001B80001B80000F00000F00000F00000E00000E00000E00001C00079C0007BC0 007F80003F00003C0000131B7F9116>I E /Fn 3 123 df<040004000400C460E4E03F80 0E003F80E4E0C4600400040004000B0D7E8D11>3 D<0C000C000C000C000C000C00FFC0 FFC00C000C000C000C000C000C000C000C000C000C000C000C000C000C000C000C000C00 0C000A1A7E9310>121 D<0C000C000C000C000C000C00FFC00C000C000C000C000C000C 0000000C000C000C000C000C00FFC0FFC00C000C000C000C000C000A1A7E9310>I E /Fo 85 128 df6 D<001F83E000706E3000C07C780180F8780380F0780700700007007000 07007000070070000700700007007000070070000700700007007000FFFFFFC007007000 070070000700700007007000070070000700700007007000070070000700700007007000 070070000700700007007000070070000700700007007000070070000700700007007800 7FE3FF801D2380A21C>11 D<001FC0000070200000C01000018038000380780007007800 0700300007000000070000000700000007000000070000000700000007000000FFFFF800 070078000700380007003800070038000700380007003800070038000700380007003800 070038000700380007003800070038000700380007003800070038000700380007003800 070038007FE1FF80192380A21B>I<001FD8000070380000C07800018078000380780007 0038000700380007003800070038000700380007003800070038000700380007003800FF FFF800070038000700380007003800070038000700380007003800070038000700380007 003800070038000700380007003800070038000700380007003800070038000700380007 003800070038007FF3FF80192380A21B>I<000FC07F00007031C08000E00B004001801E 00E003803E01E007003C01E007001C00C007001C000007001C000007001C000007001C00 0007001C000007001C000007001C0000FFFFFFFFE007001C01E007001C00E007001C00E0 07001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007 001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E00700 1C00E007001C00E07FF1FFCFFE272380A229>I<7038F87CFC7EFC7E743A040204020402 04020804080410081008201040200F0F7EA218>34 D<70F8FCFC74040404040808101020 40060F7CA20E>39 D<00200040008001000300060004000C000C00180018003000300030 007000600060006000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 006000600060007000300030003000180018000C000C0004000600030001000080004000 200B327CA413>I<800040002000100018000C0004000600060003000300018001800180 01C000C000C000C000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 00C000C000C001C0018001800180030003000600060004000C0018001000200040008000 0B327DA413>I<0001800000018000000180000001800000018000000180000001800000 0180000001800000018000000180000001800000018000000180000001800000018000FF FFFFFEFFFFFFFE0001800000018000000180000001800000018000000180000001800000 01800000018000000180000001800000018000000180000001800000018000000180001F 227D9C26>43 D<70F8FCFC7404040404080810102040060F7C840E>II<70F8F8F87005057C840E>I<000080000180000180000300000300000300000600 000600000600000C00000C00000C00001800001800001800003000003000003000006000 00600000600000C00000C00000C000018000018000018000018000030000030000030000 0600000600000600000C00000C00000C0000180000180000180000300000300000300000 600000600000600000C00000C00000C0000011317DA418>I<01F000071C000C06001803 003803803803807001C07001C07001C07001C0F001E0F001E0F001E0F001E0F001E0F001 E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E07001C07001C07001C07803 C03803803803801C07000C0600071C0001F00013227EA018>I<008003800F80F3800380 038003800380038003800380038003800380038003800380038003800380038003800380 0380038003800380038003800380038007C0FFFE0F217CA018>I<03F0000C1C00100700 2007804003C04003C08003E0F003E0F801E0F801E0F801E02003E00003E00003C00003C0 000780000700000E00001C0000180000300000600000C000018000010000020020040020 0800201800603000403FFFC07FFFC0FFFFC013217EA018>I<03F8000C1E001007002007 804007C07807C07803C07807C03807C0000780000780000700000F00000E0000380003F0 00001C00000F000007800007800003C00003C00003E02003E07003E0F803E0F803E0F003 C04003C0400780200780100F000C1C0003F00013227EA018>I<000200000600000E0000 0E00001E00001E00002E00004E00004E00008E00008E00010E00020E00020E00040E0004 0E00080E00100E00100E00200E00200E00400E00800E00FFFFF8000E00000E00000E0000 0E00000E00000E00000E00001F0001FFF015217FA018>I<1000801E07001FFF001FFE00 1FF80013E00010000010000010000010000010000010000010F800130E00140700180380 1003800001C00001C00001E00001E00001E00001E07001E0F001E0F001E0E001C08001C0 4003C04003802007001006000C1C0003F00013227EA018>I<007E0001C1000300800601 C00E03C01C03C0180180380000380000780000700000700000F0F800F30C00F40600F403 00F80380F801C0F001C0F001E0F001E0F001E0F001E0F001E07001E07001E07001E03801 C03801C01803801C03000C0600070C0001F00013227EA018>I<4000006000007FFFE07F FFC07FFFC0400080C0010080010080020080020000040000080000080000100000300000 200000600000600000600000E00000C00000C00001C00001C00001C00001C00003C00003 C00003C00003C00003C00003C00003C00003C00001800013237DA118>I<01F800060E00 0803001001802001802000C06000C06000C06000C07000C07801803E01003F02001FC400 0FF80003F80003FC00067F00083F80100F803007C06001C06000E0C000E0C00060C00060 C00060C000606000406000C03000801803000E0E0003F00013227EA018>I<01F000060C 000C0600180700380380700380700380F001C0F001C0F001C0F001E0F001E0F001E0F001 E0F001E07001E07003E03803E01805E00C05E00619E003E1E00001C00001C00001C00003 80000380300300780700780600700C002018001030000FC00013227EA018>I<70F8F8F8 70000000000000000000000070F8F8F87005157C940E>I<70F8F8F87000000000000000 0000000070F8F8F87808080808101010204040051F7C940E>I61 D<0001800000018000000180000003C0000003C0000003C0000005 E0000005E000000DF0000008F0000008F0000010F800001078000010780000203C000020 3C0000203C0000401E0000401E0000401E0000800F0000800F0000FFFF00010007800100 0780030007C0020003C0020003C0040003E0040001E0040001E00C0000F00C0000F03E00 01F8FF800FFF20237EA225>65 DI<0007E0100038183000E0063001C00170038000F0070000 F00E0000701E0000701C0000303C0000303C0000307C0000107800001078000010F80000 00F8000000F8000000F8000000F8000000F8000000F8000000F800000078000000780000 107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001C001 0000E0020000381C000007E0001C247DA223>IIII<0007F008003C0C1800E0021801C001B8038000 F8070000780F0000381E0000381E0000183C0000183C0000187C00000878000008780000 08F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8001FFF780000 F8780000787C0000783C0000783C0000781E0000781E0000780F00007807000078038000 B801C000B800E00318003C0C080007F00020247DA226>III<03FFF0001F00000F0000 0F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0000 0F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00700F00F8 0F00F80F00F80E00F01E00401C0020380018700007C00014237EA119>IIIII<000FE00000783C0000E00E0003C0 0780078003C00F0001E00E0000E01E0000F03C0000783C0000787C00007C7C00007C7800 003C7800003CF800003EF800003EF800003EF800003EF800003EF800003EF800003EF800 003EF800003E7800003C7C00007C7C00007C3C0000783E0000F81E0000F00F0001E00F00 01E0078003C003C0078000E00E0000783C00000FE0001F247DA226>II82 D<03F0200C0C601802603001E07000E0600060E00060E00060E00020E00020E00020F000 00F000007800007F00003FF0001FFE000FFF0003FF80003FC00007E00001E00000F00000 F0000070800070800070800070800070C00060C00060E000C0F000C0C80180C6070081FC 0014247DA21B>I<7FFFFFF87807807860078018400780084007800840078008C007800C 800780048007800480078004800780040007800000078000000780000007800000078000 000780000007800000078000000780000007800000078000000780000007800000078000 00078000000780000007800000078000000780000007800000078000000FC00003FFFF00 1E227EA123>IIII<7FF807FF0007E001F80003C000E00003E000C00001E000 800000F001000000F80300000078020000007C040000003E0C0000001E080000001F1000 00000FB000000007A000000007C000000003E000000001E000000001F000000003F80000 000278000000047C0000000C3E000000081E000000101F000000300F8000002007800000 4007C00000C003E000008001E000010001F000030000F000070000F8001F8001FC00FFE0 07FFC022227FA125>II<7FFFFE7E003E78003C7000786000784000F0C000F0C001E08003C08003 C0800780000780000F00001F00001E00003C00003C0000780000780000F00001F00001E0 0103C00103C0010780010780030F00031E00021E00023C00063C000E78001EF8007EFFFF FE18227DA11E>II<0804100820102010 402040208040804080408040B85CFC7EFC7E7C3E381C0F0F7AA218>II<04000E001F001B00318060C0C06080200B087AA218>I<0F E0001838003C0C003C0E0018070000070000070000070000FF0007C7001E07003C070078 0700700700F00708F00708F00708F00F087817083C23900FC1E015157E9418>97 D<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 000E00000E00000E1F000E61C00E80600F00300E00380E003C0E001C0E001E0E001E0E00 1E0E001E0E001E0E001E0E001E0E001C0E003C0E00380F00700C80600C41C0083F001723 7FA21B>I<01FE000703000C07801C0780380300780000700000F00000F00000F00000F0 0000F00000F00000F000007000007800403800401C00800C010007060001F80012157E94 16>I<0000E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E0 0000E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F000E0F000E0 F000E0F000E0F000E0F000E0F000E07000E07800E03800E01801E00C02E0070CF001F0FE 17237EA21B>I<01FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F000 00F00000F00000F00000F000007000007800203800201C00400E008007030000FC001315 7F9416>I<003C00C6018F038F030F070007000700070007000700070007000700FFF807 000700070007000700070007000700070007000700070007000700070007000700070007 807FF8102380A20F>I<00007001F198071E180E0E181C07001C07003C07803C07803C07 803C07801C07001C07000E0E000F1C0019F0001000001000001800001800001FFE000FFF C00FFFE03800F0600030400018C00018C00018C000186000306000303800E00E038003FE 0015217F9518>I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E 00000E00000E00000E00000E00000E1F800E60C00E80E00F00700F00700E00700E00700E 00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E 0070FFE7FF18237FA21B>I<1C001E003E001E001C000000000000000000000000000000 00000E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E00FFC00A227FA10E>I<01C003E003E003E001C00000000000000000000000 000000000001E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000 E000E000E000E000E000E000E000E000E000E000E060E0F0C0F18061803E000B2C82A10F >I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E 00000E00000E00000E03FC0E01F00E01C00E01800E02000E04000E08000E10000E38000E F8000F1C000E1E000E0E000E07000E07800E03C00E01C00E01E00E00F00E00F8FFE3FE17 237FA21A>I<0E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E00FFE00B237FA20E>I<0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E0 0E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E 003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E00 3800E0FFE3FF8FFE27157F942A>I<0E1F80FE60C01E80E00F00700F00700E00700E0070 0E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070 0E0070FFE7FF18157F941B>I<01FC000707000C01801800C03800E0700070700070F000 78F00078F00078F00078F00078F00078F000787000707800F03800E01C01C00E03800707 0001FC0015157F9418>I<0E1F00FE61C00E80600F00700E00380E003C0E001C0E001E0E 001E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F00700E80E00E41C00E 3F000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE000171F7F94 1B>I<01F8200704600E02601C01603801E07800E07800E0F000E0F000E0F000E0F000E0 F000E0F000E0F000E07000E07800E03801E01C01E00C02E0070CE001F0E00000E00000E0 0000E00000E00000E00000E00000E00000E00000E0000FFE171F7E941A>I<0E3CFE461E 8F0F0F0F060F000E000E000E000E000E000E000E000E000E000E000E000E000E000F00FF F010157F9413>I<0F8830786018C018C008C008E008F0007F803FE00FF001F8003C801C 800C800CC00CC008E018D0308FC00E157E9413>I<02000200020002000600060006000E 001E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E 040E040E040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E0070 0E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F0 06017003827800FC7F18157F941B>IIIII<3FFFC038038030078020070060 0E00401C00403C0040380000700000E00001E00001C0000380400700400F00400E00C01C 0080380080780180700780FFFF8012157F9416>III<7070F8F8F8F8F8F870700D057BA118>127 D E /Fp 35 122 df<387CFEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>58 D<000070000000007000000000F800000000F800000000F800000001FC00000001FC0000 0003FE00000003FE00000003FE00000006FF000000067F0000000E7F8000000C3F800000 0C3F800000183FC00000181FC00000381FE00000300FE00000300FE00000600FF0000060 07F00000E007F80000FFFFF80000FFFFF800018001FC00018001FC00038001FE00030000 FE00030000FE000600007F000600007F00FFE00FFFF8FFE00FFFF825227EA12A>65 DI70 D<0003FE0040001FFFC0C0007F00F1C001F8003FC003F0000FC007C00007C00FC00003C0 1F800003C03F000001C03F000001C07F000000C07E000000C07E000000C0FE00000000FE 00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000FFFFC7E00 0FFFFC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC0001FC007E000 1FC003F0001FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>III75 DI< FFF000000FFFFFF800001FFF07F800001FE006FC000037E006FC000037E006FC000037E0 067E000067E0067E000067E0063F0000C7E0063F0000C7E0061F800187E0061F800187E0 060FC00307E0060FC00307E0060FC00307E00607E00607E00607E00607E00603F00C07E0 0603F00C07E00601F81807E00601F81807E00601F81807E00600FC3007E00600FC3007E0 06007E6007E006007E6007E006003FC007E006003FC007E006001F8007E006001F8007E0 06001F8007E006000F0007E0FFF00F00FFFFFFF00600FFFF30227EA135>I<0007FC0000 003FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001F80003F003F 00001F803F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00 000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E0000 0FC07F00001FC07F00001FC03F00001F803F80003F801F80003F000FC0007E0007E000FC 0003F001F80000FC07E000003FFF80000007FC000023227DA12A>79 D82 D<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8000CF8000CFC000CFC0000FF00 00FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FF00007F00003F0000 3FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA11F >I<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F80180E003F801 C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003F80000 0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 03F800000003F800000003F800000003F800000003F800000003F800000003F800000003 F800000003F800000003F800000003F8000003FFFFF80003FFFFF80022227EA127>I87 D<7FFFC1FFF07FFFC1FFF003FC000C0001FE00180000FE00380000FF007000007F806000 003F80C000003FC1C000001FE38000000FE30000000FF700000007FE00000003FC000000 03FC00000001FE00000000FE00000000FF00000000FF80000001FFC0000001BFC0000003 1FE00000070FF000000E0FF000000C07F800001803FC00003803FC00003001FE00006000 FF0000E000FF0001C0007F800180003FC0FFFC03FFFEFFFC03FFFE27227FA12A>I<07FC 001FFF803F07C03F03E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01 F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 D<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC00 00FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF8000FE0014167E9519 >99 D<0001FE000001FE0000003E0000003E0000003E0000003E0000003E0000003E0000 003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E003E 003E007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC 003E00FC003E007C003E007C003E003E007E001E00FE000F83BE0007FF3FC001FC3FC01A 237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00F8FFFFF8 FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC07003FFC000FF00 15167E951A>I<003F8000FFC001E3E003C7E007C7E00F87E00F83C00F80000F80000F80 000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F80000F80000F80000F80 000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007FF8 007FF80013237FA211>I<03FC1E0FFF7F1F0F8F3E07CF3C03C07C03E07C03E07C03E07C 03E07C03E03C03C03E07C01F0F801FFF0013FC003000003000003800003FFF801FFFF00F FFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E78003C7C007C3F01F80FFFE001 FF0018217E951C>II<1C003F007F007F007F003F001C0000000000000000000000 00000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 1F001F001F001F00FFE0FFE00B247EA310>I107 DI110 D<00FE0007FFC00F83E01E00F03E00F87C007C 7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F8 1F01F00F83E007FFC000FE0017167E951C>II114 D<0FF3003FFF00781F00600700E00300E00300F00300FC00 007FE0007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E 00EFFC00C7F00011167E9516>I<01800001800001800001800003800003800007800007 80000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F80000F80000F 80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE0000 F80011207F9F16>II119 D121 D E /Fq 44 118 df<78FCFCFEFE7A02020202040404081010204007127B8510>44 D<78FCFCFCFC7806067B8510>46 D<007E0001C3800700E00E00701E00781C00383C003C 3C003C38001C78001E78001E78001E78001EF8001FF8001FF8001FF8001FF8001FF8001F F8001FF8001FF8001FF8001FF8001FF8001FF8001FF8001FF8001F78001E78001E78001E 78001E7C003E3C003C3C003C1C00381E00780E00700700E001C380007E0018297EA71D> 48 D<00100000700000F0000FF000FFF000F0F00000F00000F00000F00000F00000F000 00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000 00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000 00F00000F00001F8007FFFE07FFFE013287CA71D>I<01FC0007FF000C0FC01803E02001 F06001F04000F84000F8F800FCFC00FCFC007CFC007CFC007C7800FC0000FC0000F80000 F80001F00001F00003E00003C0000780000700000E00001C0000380000300000600000C0 000180000300040200040400080800081000082000183FFFF87FFFF0FFFFF0FFFFF01628 7DA71D>I<007E0003FFC00703E00C01F01000F81C00F83E00FC3E007C3E007C1E007C0C 00FC0000F80000F80000F00001F00001E000038000070000FE000003C00000E00000F800 007C00007C00003E00003E00003F00003F30003F78003FFC003FFC003FFC003EF8003E40 007E40007C3000F81800F00F03E003FFC000FE0018297EA71D>I<0000400000C00001C0 0001C00003C00007C00007C0000BC0000BC00013C00023C00023C00043C000C3C00083C0 0103C00103C00203C00403C00403C00803C01803C01003C02003C02003C04003C08003C0 FFFFFFFFFFFF0003C00003C00003C00003C00003C00003C00003C00003C00007E000FFFF 00FFFF18287EA71D>I<1800101F00E01FFFE01FFFC01FFF001FFE0011F0001000001000 0010000010000010000010000010000010000010FC001303001401C01801E01000E00000 F000007800007800007800007C00007C00007C70007CF8007CF8007CF8007CF800788000 784000F84000F06000F03001E01803C00E0F8007FE0001F80016297DA71D>I<000FC000 3FF000F01801C01803803C07007C0F007C0E00381E00003C00003C00003C00007C000078 0000780000F83F00F8C1C0F900E0FA0070FA0038FC003CFC001EFC001EF8001EF8001FF8 001FF8001FF8001F78001F78001F78001F78001F3C001E3C001E1C003C1E003C0E007807 007003C1E001FFC0007E0018297EA71D>I<2000003800003FFFFF3FFFFF3FFFFE7FFFFE 600004400008400008400010800020800020000040000080000080000100000200000200 000600000400000C00000C00001C00001C00001C00003800003800003800007800007800 00780000780000780000F80000F80000F80000F80000F80000F80000F80000F800007000 182A7DA81D>I<007E0001FF800381E00600F00C00781C003818001C38001C38001C3800 1C38001C3C001C3E00381F00381FC0700FE0E007F98003FF0001FF0000FF8001FFE0031F F00E07F81C03FC3800FE30007E70001E60000FE0000FE00007E00007E00007E00007F000 0670000E78000C3800181E00300F81E003FFC000FE0018297EA71D>I<007E0001FF8007 81C00F00E01E00703C00383C003878003C78003CF8001EF8001EF8001EF8001EF8001FF8 001FF8001FF8001F78001F78003F78003F3C003F1C005F0E005F07009F03831F00FC1F00 001E00001E00001E00003E00003C00003C0000381C00783E00703E00E03C01C01803801C 0F000FFE0003F80018297EA71D>I<000010000000003800000000380000000038000000 007C000000007C000000007C00000000BE00000000BE00000000BE000000011F00000001 1F000000011F000000020F800000020F800000020F8000000407C000000407C000000C07 E000000803E000000803E000001003F000001001F000001001F000002000F800002000F8 00002000F800007FFFFC00007FFFFC000040007C000080003E000080003E000080003E00 0100001F000100001F000300001F800200000F800200000F800600000FC01F80000FC0FF E000FFFEFFE000FFFE272A7EA92C>65 DI<0000FF00200007FFC060001F807060007E0018E000F800 05E001F00003E003E00001E007C00001E00F800000E00F800000E01F000000603F000000 603E000000607E000000207E000000207C000000207C00000000FC00000000FC00000000 FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC000000007C 000000007C000000007E000000207E000000203E000000203F000000201F000000400F80 0000400F8000004007C000008003E000010001F000030000F8000600007E001C00001F80 70000007FFE0000000FF0000232B7DA92A>III<0000FF00200007FFC060001F807060007E0018E000F80005E0 01F00003E003E00001E007C00001E00F800000E00F800000E01F000000603F000000603E 000000607E000000207E000000207C000000207C00000000FC00000000FC00000000FC00 000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0001FFFE7C0001 FFFE7C000007E07E000003E07E000003E03E000003E03F000003E01F000003E00F800003 E00F800003E007C00003E003E00003E001F00005E000F80005E0007E0018E0001FC07060 0007FFC0200000FF0000272B7DA92E>71 DII< FFFFC000FFFFC00007F0000003E0000003E0000003E0000003E0000003E0000003E00000 03E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00000 03E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000103E00001 03E0000103E0000103E0000203E0000203E0000203E0000203E0000603E0000603E0000E 03E0001E03E0007C07E001FCFFFFFFFCFFFFFFFC20297EA825>76 D78 D<0001FF0000000F01E000003C0078000078003C0000E0000E0001E0000F0003C0000780 07800003C00F800003E01F000001F01F000001F03E000000F83E000000F87E000000FC7E 000000FC7C0000007C7C0000007CFC0000007EFC0000007EFC0000007EFC0000007EFC00 00007EFC0000007EFC0000007EFC0000007EFC0000007E7C0000007C7E000000FC7E0000 00FC7E000000FC3E000000F83F000001F81F000001F01F000001F00F800003E007800003 C007C00007C003E0000F8000F0001E000078003C00003C007800000F01E0000001FF0000 272B7DA92E>I82 D<00FE010003FF83000F81E3001E0037003C001F0038000F00780007 0070000700F0000300F0000300F0000300F0000100F8000100F8000100FC0000007C0000 007F0000003FE000001FFE00000FFFE00007FFF80003FFFC00007FFE000007FF0000007F 0000001F8000000F80000007C0000007C0800003C0800003C0800003C0800003C0C00003 C0C0000380C0000380E0000780F0000700F8000E00EE001C00C3C07800C1FFF000803FC0 001A2B7DA921>I<7FFFFFFFF07FFFFFFFF07C00F801F07000F800706000F800304000F8 00104000F80010C000F80018C000F800188000F800088000F800088000F800088000F800 088000F800080000F800000000F800000000F800000000F800000000F800000000F80000 0000F800000000F800000000F800000000F800000000F800000000F800000000F8000000 00F800000000F800000000F800000000F800000000F800000000F800000000F800000000 F800000000F800000000F800000000F800000001FC000000FFFFF80000FFFFF80025297E A82A>II<03FC00000C070000100380003C01C0003E01E0003E00F0001C00F0000800F0 000000F0000000F0000000F000007FF00003E0F0000F80F0001E00F0003C00F0007C00F0 007800F040F800F040F800F040F800F040F801F0407C01F0403C0278801E0C7F8007F01E 001A1A7E991D>97 D<07800000FF800000FF8000000F8000000780000007800000078000 000780000007800000078000000780000007800000078000000780000007800000078000 000783F000078C1C0007B0070007C0038007C003C0078001E0078001E0078000F0078000 F0078000F8078000F8078000F8078000F8078000F8078000F8078000F8078000F0078000 F0078001F0078001E0078001C007C003C00740078007200E0006181C000407E0001D2A7F A921>I<007F0001C0E00700100E00781E00F83C00F83C00707C0020780000F80000F800 00F80000F80000F80000F80000F80000F800007800007C00003C00083C00081E00100E00 2007006001C180007E00151A7E991A>I<00000F000001FF000001FF0000001F0000000F 0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F 0000000F0000000F00003F0F0001C0CF0003802F000F001F001E001F001C000F003C000F 007C000F0078000F0078000F00F8000F00F8000F00F8000F00F8000F00F8000F00F8000F 00F8000F0078000F0078000F003C000F003C000F001E001F000E002F0007004F8001C18F F8007E0FF81D2A7EA921>I<00FE000387800701C00E01E01C00E03C00F03C00F0780078 780078F80078F80078FFFFF8F80000F80000F80000F80000F800007800007800003C0008 3C00081E00100E002007004001C180007E00151A7E991A>I<001F000070C000E1E001C3 E003C3E00381C00780800780000780000780000780000780000780000780000780000780 00FFFE00FFFE000780000780000780000780000780000780000780000780000780000780 0007800007800007800007800007800007800007800007800007800007800007800007C0 00FFFE00FFFE00132A7FA912>I<07800000FF800000FF8000000F800000078000000780 000007800000078000000780000007800000078000000780000007800000078000000780 0000078000000783F800078C1C0007900E0007A0070007A0078007C0078007C007800780 078007800780078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800780078007800780078007800780FFFCFFFCFFFC FFFC1E2A7FA921>104 D<07000F801F801F800F80070000000000000000000000000000 000000000007807F807F800F800780078007800780078007800780078007800780078007 8007800780078007800780078007800780FFF8FFF80D297FA811>I<0780FF80FF800F80 078007800780078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800780078007800780078007800780078007800780 FFFCFFFC0E2A7FA911>108 D<0783F803F800FF8C1C0C1C00FF900E100E000FA0072007 0007A007A0078007C007C0078007C007C007800780078007800780078007800780078007 800780078007800780078007800780078007800780078007800780078007800780078007 800780078007800780078007800780078007800780078007800780078007800780078007 80078007800780078007800780FFFCFFFCFFFCFFFCFFFCFFFC2E1A7F9931>I<0783F800 FF8C1C00FF900E000FA0070007A0078007C0078007C00780078007800780078007800780 078007800780078007800780078007800780078007800780078007800780078007800780 0780078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E1A7F9921>I<00 7E0003C3C00700E00E00701C00383C003C3C003C78001E78001EF8001FF8001FF8001FF8 001FF8001FF8001FF8001FF8001F78001E78001E3C003C3C003C1C00380E00700700E003 C3C0007E00181A7E991D>I<0783F000FF8C1C00FFB00F0007C0078007C003C0078003E0 078001E0078001F0078001F0078000F8078000F8078000F8078000F8078000F8078000F8 078000F8078000F0078001F0078001F0078001E0078003C007C003C007C0078007A00E00 07983C000787E00007800000078000000780000007800000078000000780000007800000 078000000780000007800000FFFC0000FFFC00001D267F9921>I<0787C0FF88E0FF91F0 0FA1F007C1F007C0E007C000078000078000078000078000078000078000078000078000 07800007800007800007800007800007800007800007800007C000FFFE00FFFE00141A7F 9917>114 D<07F0801C0D80300380600180600180E00080E00080F00080F800007E0000 7FE0003FFC001FFE0007FF00003F800007808003C08003C08001C0C001C0C001C0E00180 E00380F00300CC0E0083F800121A7E9917>I<0080000080000080000080000180000180 000180000380000380000780000F80001FFF80FFFF800780000780000780000780000780 000780000780000780000780000780000780000780000780000780400780400780400780 4007804007804007804003C08001C08000E100003E0012257FA417>I<07800780FF80FF 80FF80FF800F800F80078007800780078007800780078007800780078007800780078007 800780078007800780078007800780078007800780078007800780078007800780078007 8007800F8007800F800380178001C027C000E047FC003F87FC1E1A7F9921>I E /Fr 4 123 df<01800180018001804182F18F399C0FF003C003C00FF0399CF18F4182 018001800180018010127E9215>3 D<060F0F0F1E1E1E1C1C3C3838383070706060E0C0 C008157F960B>48 D<02000700070007000700070007000200020002007270FFF8727002 000200070007000700070007000700070007000700070007000700070007000700070007 000200020002000200020002000D267E9C12>121 D<0200070007000700070002000200 4210FFF8FFF8020002000200070007000700070002000000020007000700070007000200 02000200FFF8FFF8421002000200070007000700070002000D257E9C12>I E /Fs 21 128 df<00001FC0FC0000F033820003C03F0F0007007E1F000E00FC1F001E00 FC0F003C007804003C007800003C007800007800F000007800F000007800F000007800F0 00007800F000007800F00000F001E0001FFFFFFFC01FFFFFFFC000F001E00000F001E000 00F001E00001E003C00001E003C00001E003C00001E003C00001E003C00001E003C00003 C007800003C007800003C007800003C007800003C007800003C007800007800F00000780 0F000007800F000007800F000007800F000007800F00000F801F0000FFF0FFF800FFF1FF F800282A7EA922>11 D<387C7EFC7C3807067B8510>46 D<000000200000000060000000 006000000000F000000000F000000001F000000001F000000003F000000003F800000004 F800000004F800000008F800000018F800000010FC000000307C000000207C000000407C 000000407C000000807C000000807E000001003E000001003E000002003E000002003E00 0004003F000004001F000008001F00000FFFFF00001FFFFF000010001F800020000F8000 20000F800040000F800040000F800080000F800080000FC001000007C003000007C00700 0007C00F80000FE0FFE000FFFEFFE000FFFE272A7EA92C>65 D<01FFFFFE0001FFFFFFC0 000FC007E0000F8001F0000F8000F8000F8000F8000F8000FC000F8000FC001F00007C00 1F0000FC001F0000FC001F0000FC001F0000F8001F0001F8003E0001F0003E0003E0003E 0007C0003E000F80003E003F00003FFFFC00007C001F00007C0007C0007C0003E0007C00 03F0007C0001F0007C0001F800F80001F800F80001F800F80001F800F80001F800F80001 F800F80001F001F00003F001F00003F001F00007E001F0000FC001F0001F8001F0003F00 03F000FE007FFFFFF800FFFFFFC00026297EA829>I<01FFFFFF000001FFFFFFC000000F C003F000000F8000F800000F80007C00000F80003E00000F80001F00000F80000F00001F 00000F80001F00000780001F000007C0001F000007C0001F000007C0001F000007C0003E 000007E0003E000007E0003E000007E0003E000007E0003E000007E0003E000007E0007C 000007C0007C00000FC0007C00000FC0007C00000FC0007C00000F80007C00000F8000F8 00001F8000F800001F0000F800001F0000F800003E0000F800003E0000F800007C0001F0 0000F80001F00000F00001F00001E00001F00003C00001F0000F800001F0003F000003F0 00FC00007FFFFFF00000FFFFFF8000002B297EA82D>68 D<00000FF00200007FFC060003 F80E0E0007C0031C001F0000BC003E00007C007C00007C00F800003C01F000003C03E000 001807C00000180FC00000180F800000181F800000181F000000183F000000103F000000 007E000000007E000000007E000000007E00000000FC00000000FC00000000FC00000000 FC00000000FC0003FFFEFC0003FFFEFC000007E0FC000007C07C000007C07C000007C07C 000007C03E000007C03E00000F801E00000F801F00000F800F80000F800780001F8003E0 00278001F000470000FE038300003FFF01000007F80000272B7AA92E>71 D<0001FC020007FF06001E038E003800DC0070007C00E0003C01E0001C03C0001C03C000 1C0380000807800008078000080780000807C0000807C0000007E0000003F0000003FE00 0001FFE00001FFFC0000FFFF00003FFF800007FFC00000FFE000000FE0000003F0000001 F0000001F0000001F0200000F0200000F0200000F0200000E0600001E0600001E0700001 C0700003C0780007807C000700E6001E00E3C07C00C1FFF000803FC0001F2B7DA921>83 D<003F800001C0E000020070000780380007C03C000F803C0007803C0002003C0000003C 0000003C0000003C00003FF80001F0780007C078000F0078001E0078003C0078007C00F0 40F800F040F800F040F800F040F801F040F802F0807C04F0803E187F000FE03C001A1A7D 991D>97 D<001FE000701801C00403803C07003E0F007C1E003C3E00103C00007C00007C 0000F80000F80000F80000F80000F80000F80000F80000F800007800107800103C00201C 00400E008007030001FC00171A7C991A>99 D<0000007800000FF800000FF8000000F000 0000F0000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E000 0001E0000001E0000003C0000FC3C0007833C001E00BC003800BC0070007C00F0007801E 0007803E0007803C0007807C0007807C00078078000F00F8000F00F8000F00F8000F00F8 000F00F8000F00F8001E00F8001E0078001E0078001E0038003E001C005E000E00BE0007 073FE001F83FE01D2A7CA921>I<003F8000E0E001C0700780700F00780E00381E003C3C 003C3C003C7C003C7C007CFFFFF8F80000F80000F80000F80000F80000F80000F8000078 00107800103800201C00400C008007070001F800161A7C991A>I<000000780007E08400 3C3B1C00701C1C00E01E0801E01E0003E01F0003C01F0007C01F0007C01F0007C01F0007 C01E0007C03E0007C03C0003C0780001C0700002E1E000063F000004000000040000000C 0000000C0000000E00000007FFE00003FFF80003FFFC000E003E0018000F003800070070 00070070000700E0000700E0000700E0000700E0000E0070001C0030003800180070000F 03C00001FE00001E287F9A1D>103 D<001E000003FE000003FE0000003C0000003C0000 003C0000003C0000003C0000003C00000078000000780000007800000078000000780000 0078000000F0000000F07F0000F1838000F201C000F401E000F801E001F001E001F001E0 01E001E001E001E001E001E001E001E003C003C003C003C003C003C003C003C003C003C0 03C003C00780078007800780078007800780078007800780078007800F800F80FFF8FFF8 FFF8FFF81D2A7EA921>I<0038007C007C00FC007C003800000000000000000000000000 000000000000F00FF00FF001F001F001E001E001E001E001E001E003C003C003C003C003 C003C00780078007800780078007800F80FFF0FFF00E297EA811>I<0000700000F80001 F80001F80000F80000F00000000000000000000000000000000000000000000000000000 000001E0003FE0003FE00003E00003E00003C00003C00003C00003C00003C00003C00007 80000780000780000780000780000780000F00000F00000F00000F00000F00000F00001E 00001E00001E00001E00001E00001E00003C00003C00003C00703800F87800F87000F0E0 0041C0003F0000153583A812>I<001E000003FE000003FE0000003C0000003C0000003C 0000003C0000003C0000003C000000780000007800000078000000780000007800000078 000000F0000000F00FFC00F00FFC00F007C000F0070000F0040001E0080001E0100001E0 200001E0800001E1800001E3800003C7C00003D3C00003E3E00003C3E00003C1E00003C1 F0000780F0000780F8000780780007807C0007803C0007803E000F807F00FFF9FFE0FFF1 FFE01E2A7EA91F>I<001E03FE03FE003C003C003C003C003C003C007800780078007800 78007800F000F000F000F000F000F001E001E001E001E001E001E003C003C003C003C003 C003C00780078007800780078007800F80FFF8FFF80F2A7EA911>I<00F07F000FF18380 1FF201C001F401E001F801E001F001E001F001E001E001E001E001E001E001E001E001E0 03C003C003C003C003C003C003C003C003C003C003C003C0078007800780078007800780 0780078007800780078007800F800F80FFF8FFF8FFF8FFF81D1A7E9921>110 D<001FC00070F001C03803801C07001E0E000E1E000F3C000F3C000F7C000F7C000F7800 1FF8001FF8001FF8001FF8001FF8003EF8003EF8003C78007C7800783800F03C01E01E03 C007070001F800181A7C991D>I<00F0F80FF11C1FF63E01F43E01F83C01F03C01F00001 F00001E00001E00001E00003C00003C00003C00003C00003C00003C00007800007800007 80000780000780000780000F8000FFFC00FFFC00171A7E9917>114 D<380E7C1FFC1FFC3F7C1F700E100674A81D>127 D E /Ft 22 122 df<000000180000000000003C0000000000003C0000000000003C0000000000007E0000 000000007E0000000000007E000000000000FF000000000000FF000000000000FF000000 0000019F8000000000019F8000000000019F8000000000030FC000000000030FC0000000 00070FE0000000000607E0000000000607E0000000000E07F0000000000C03F000000000 0C03F0000000001803F8000000001801F8000000001801F8000000003000FC0000000030 00FC000000003000FC0000000060007E0000000060007E0000000060007E00000000C000 3F00000000C0003F00000001C0003F8000000180001F8000000180001F8000000380001F C000000300000FC000000300000FC0000007FFFFFFE0000007FFFFFFE0000006000007E0 00000C000003F000000C000003F000000C000003F0000018000001F8000018000001F800 0038000001FC000030000000FC000030000000FC000070000000FE0000600000007E0000 600000007E0000C00000007F0000C00000003F0001C00000003F0001E00000003F8003E0 0000003F800FF00000007FC0FFFE000007FFFFFFFE000007FFFF383C7EBB3C>65 DI<000001FF00008000001FFFE0018000007F007801800001F8000E03800003E0000707 80000FC000018780001F000000CF80003E0000006F80007C0000003F8000F80000003F80 01F00000001F8003F00000000F8007E00000000F8007C000000007800FC000000007800F C000000007801F8000000003801F8000000003803F8000000003803F0000000001803F00 00000001807F0000000001807F0000000001807E0000000000007E000000000000FE0000 00000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000 000000FE000000000000FE000000000000FE000000000000FE000000000000FE00000000 00007E0000007FFFFE7E0000007FFFFE7F000000007FC07F000000001F803F000000001F 803F000000001F803F800000001F801F800000001F801F800000001F800FC00000001F80 0FC00000001F8007E00000001F8007E00000001F8003F00000001F8001F00000001F8000 F80000001F80007C0000003F80003E0000003F80001F0000007F80000FC00000E7800003 E00001C7800001FC0007838000007F803E018000001FFFF80080000001FF800000373D7C BB3F>71 D76 D<000FF00080007FFE018001F00F818003C001C380070000E3800E000037 801C00003F803C00001F803800000F807800000F8070000007807000000780F000000380 F000000380F000000380F000000380F000000180F800000180F800000180FC000001807C 000000007E000000003F000000003FC00000001FF00000000FFF00000007FFF0000003FF FE000001FFFFC00000FFFFF000001FFFF8000003FFFE0000003FFF00000003FF00000000 7F800000001FC00000000FC000000007E000000003E000000003E000000001F0C0000001 F0C0000001F0C0000000F0C0000000F0C0000000F0E0000000F0E0000000F0E0000000E0 F0000000E0F0000001E0F8000001C0F8000001C0FC00000380FE00000780F700000700E1 C0001E00E0F0003C00C07E00F000C00FFFE0008001FF0000243D7CBB2C>83 D<003F80000001C0F0000003003C000004001E00000C000F000018000780001C0007C000 3E0003C0003F0003E0003F0003E0003F0003E0001E0003E000000003E000000003E00000 0003E00000003FE000000FF3E000007E03E00001F803E00003E003E0000FC003E0001F80 03E0003F0003E0003E0003E0007E0003E0007E0003E060FC0003E060FC0003E060FC0003 E060FC0007E060FC0007E0607C000BE0607E000BE0603E0011F0C01F0060F0C007C1807F 8000FE003E0023257CA427>97 D<0007F800003C0E0000F0018001E000C003C000600780 00300F0000701F0000F81F0001F83E0001F83E0001F87E0000F07C0000007C000000FC00 0000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000007C00 00007C0000007E0000003E0000003E00000C1F00000C1F0000180F8000180780003003C0 006001E000C000F00180003C0E000007F8001E257DA423>99 D<0007F800003C1E0000F0 078001C003C003C001E0078000F00F0000F81F0000781E00007C3E00007C3E00007C7E00 003E7C00003E7C00003EFC00003EFC00003EFFFFFFFEFC000000FC000000FC000000FC00 0000FC000000FC0000007C0000007C0000007E0000003E0000003E0000061F0000060F00 000C0F80000C0780001803C0003000E00060007000C0001E07000003FC001F257EA423> 101 D<0000FC0000078300000E0380001C07C0003C0FC000780FC000F80FC000F8078000 F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001 F0000001F0000001F0000001F0000001F0000001F00000FFFFFC00FFFFFC0001F0000001 F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001 F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001 F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001 F0000001F0000001F0000001F0000003F800007FFFE0007FFFE0001A3C7FBB18>I<0000 0007C0000FE01860003838207000F01E40F001E00F80F003C007806007C007C0000F8003 E0000F8003E0000F8003E0001F8003F0001F8003F0001F8003F0001F8003F0001F8003F0 001F8003F0000F8003E0000F8003E0000F8003E00007C007C00003C007800001E00F0000 02F01E00000238380000060FE00000040000000004000000000C000000000C000000000E 000000000E000000000700000000078000000003FFFF000003FFFFF00001FFFFFC0000FF FFFE00078000FF000E00001F801C000007C038000003C078000003C070000001E0F00000 01E0F0000001E0F0000001E0F0000001E0F0000001E078000003C038000003803C000007 801E00000F000700001C0003C0007800007803C000000FFE000024387EA527>I<07000F 801FC01FC01FC00F80070000000000000000000000000000000000000000000000000000 0007C0FFC0FFC00FC007C007C007C007C007C007C007C007C007C007C007C007C007C007 C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C00FE0FF FEFFFE0F397DB815>105 D<03E0000000FFE0000000FFE000000007E000000003E00000 0003E000000003E000000003E000000003E000000003E000000003E000000003E0000000 03E000000003E000000003E000000003E000000003E000000003E000000003E000000003 E000000003E000000003E000000003E000000003E003FFE003E003FFE003E001FF0003E0 00FC0003E000F00003E000E00003E001C00003E003800003E007000003E00E000003E01C 000003E038000003E070000003E0F0000003E1F0000003E3F8000003E7F8000003EEFC00 0003FC7E000003F83E000003F03F000003E01F800003E01F800003E00FC00003E007C000 03E007E00003E003F00003E001F00003E001F80003E000FC0003E000FC0003E0007E0003 E0007F0003E0007F8007F0007FC0FFFF81FFF8FFFF81FFF8253C7DBB2A>107 D<07C0FFC0FFC00FC007C007C007C007C007C007C007C007C007C007C007C007C007C007 C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 C007C007C007C00FE0FFFEFFFE0F3C7DBB15>I<03E01FE0003FC000FFE0607C00C0F800 FFE0801E01003C0007E3000F06001E0003E4000F88001F0003E4000F88001F0003E80007 90000F0003E80007D0000F8003F00007E0000F8003F00007E0000F8003E00007C0000F80 03E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007 C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F80 03E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007 C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F80 03E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007 C0000F8007F0000FE0001FC0FFFF81FFFF03FFFEFFFF81FFFF03FFFE3F257EA443>I<03 E01FE000FFE0607C00FFE0801E0007E3000F0003E4000F8003E4000F8003E800078003E8 0007C003F00007C003F00007C003E00007C003E00007C003E00007C003E00007C003E000 07C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007 C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C0 03E00007C003E00007C003E00007C003E00007C003E00007C007F0000FE0FFFF81FFFFFF FF81FFFF28257EA42C>I<0007FC0000001C070000007001C00001E000F00003C0007800 0780003C000F00001E001F00001F001E00000F003E00000F803E00000F807C000007C07C 000007C07C000007C0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC00 0007E0FC000007E0FC000007E0FC000007E07C000007C07C000007C07E00000FC03E0000 0F803E00000F801E00000F001F00001F000F00001E000780003C0003C000780001E000F0 00007001C000001C0700000007FC000023257EA427>I<03E03FC000FFE0E07800FFE300 1C0007E6000F0003E800078003F80003C003F00003E003E00001F003E00001F003E00000 F803E00000F803E00000FC03E00000FC03E000007C03E000007E03E000007E03E000007E 03E000007E03E000007E03E000007E03E000007E03E000007E03E000007E03E000007C03 E00000FC03E00000FC03E00000F803E00001F803E00001F003E00003E003F00003E003F8 0007C003E8000F8003E4000E0003E3003C0003E1C0F00003E03F800003E000000003E000 000003E000000003E000000003E000000003E000000003E000000003E000000003E00000 0003E000000003E000000003E000000003E000000003E000000007F0000000FFFF800000 FFFF80000027367EA42C>I<03E03E00FFE0C300FFE1078007E20FC003E40FC003E80FC0 03E8078003E8030003F0000003F0000003F0000003E0000003E0000003E0000003E00000 03E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00000 03E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00000 03E0000007F00000FFFFC000FFFFC0001A257EA41E>114 D<00FF02000700C6000C002E 0010001E0030001E0060000E0060000E00E0000600E0000600E0000600F0000600F80006 00FC0000007F0000003FF000003FFF80000FFFE00007FFF00001FFFC00003FFE000001FE 0000003F00C0001F00C0000F80C0000780E0000380E0000380E0000380E0000380F00003 00F0000300F8000700F8000600E4000C00E2001800C1807000807F800019257DA41F>I< 003000000030000000300000003000000030000000300000007000000070000000700000 0070000000F0000000F0000001F0000001F0000003F0000007F000001FFFFE00FFFFFE00 01F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000 01F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000 01F0000001F0018001F0018001F0018001F0018001F0018001F0018001F0018001F00180 01F0018000F0010000F8030000F8030000780200003C0400000E08000003F00019357FB4 1E>I<03E00007C0FFE001FFC0FFE001FFC007E0000FC003E00007C003E00007C003E000 07C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007 C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C0 03E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E0000FC003 E0000FC003E0000FC001E00017C001E00017C000F00027C000F00047C000780087E0001E 0307FF0003FC07FF28257EA42C>I121 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 115 301 a Ft(Automatic)27 b(Selection)h(of)e(Lo)r(op)h(Break)n (ers)g(for)g(Genetic)684 405 y(Link)l(age)f(Analysis)360 627 y Fs(Ann)18 b(Bec)n(k)n(er)677 606 y Fr(\003)125 702 y Fq(Computer)g(Science)g(Departmen)n(t)403 777 y(T)-5 b(ec)n(hnion)450 851 y(Haifa)410 926 y(ISRAEL)1276 627 y Fs(Dan)19 b(Geiger)1587 606 y Fr(y)1038 702 y Fq(Computer)f(Science)g (Departmen)n(t)1316 777 y(T)-5 b(ec)n(hnion)1363 851 y(Haifa)1323 926 y(ISRAEL)690 1105 y Fs(Alejandro)18 b(A.)h(Sc)n(h\177)-29 b(a\013er)1260 1083 y Fr(z)405 1180 y Fq(National)18 b(Human)g(Genome)i(Researc)n(h)f(Institute)606 1254 y(National)f(Institutes)f(of)j(Health)665 1329 y(Bethesda)f(and)g (Baltimore)890 1404 y(U.S.A.)771 1521 y(Octob)r(er)f(9,)i(1997)0 1857 y Fp(Keyw)n(ords:)25 b Fo(Genetics,)17 b(link)m(age)h(analysis,)g (algorithms,)f(lo)q(ops,)i(probabilistic)e(inference,)f(Ba)o(y)o(esian) 0 1918 y(net)o(w)o(orks.)0 1978 y Fp(Running)j(Head:)i Fo(Lo)q(op)d(break)o(ers.)0 2196 y Fp(Address)h(for)g(corresp)r (ondence:)0 2256 y Fo(Alejandro)d(A.)f(Sc)o(h\177)-24 b(a\013er)0 2317 y(NIH/NHGRI)14 b(Suite)i(2000)0 2377 y(333)h(Cassell)g(Driv)o(e)0 2437 y(Baltimore)d(MD)i(21224)0 2497 y(U.S.A.)0 2557 y Fp(F)-6 b(AX:)16 b Fo(\(410\))i(550-7513)p 0 2604 780 2 v 56 2634 a Fn(\003)75 2649 y Fm(anyuta@cs.techni)o(on.ac) o(.il)57 2685 y Fn(y)75 2700 y Fm(dang@cs.technion)o(.ac.i)o(l)57 2735 y Fn(z)75 2750 y Fm(schaffer@helix.n)o(ih.go)o(v)963 2874 y Fo(1)p eop %%Page: 2 2 2 1 bop 0 100 a Fl(Abstract)73 220 y Fo(P)o(edigree)17 b(lo)q(ops)h(p)q(ose)h(a)f(di\016cult)e(computational)h(c)o(hallenge)g (in)g(genetic)g(link)m(age)g(analysis.)26 b(The)0 280 y(most)17 b(p)q(opular)h(link)m(age)f(analysis)h(pac)o(k)m(age,)f Fk(linka)o(ge)p Fo(,)e(uses)j(an)g(algorithm)e(that)i(con)o(v)o(erts)e (a)i(lo)q(op)q(ed)0 340 y(p)q(edigree)i(in)o(to)h(a)g(lo)q(opless)h(p)q (edigree,)f(whic)o(h)f(is)h(tra)o(v)o(ersed)f(man)o(y)f(times.)34 b(The)21 b(con)o(v)o(ersion)f(is)h(con-)0 401 y(trolled)13 b(b)o(y)g(user-selection)g(of)h(individuals)f(to)h(act)f(as)i(lo)q(op)f (break)o(ers.)20 b(The)14 b(selection)e(of)i(lo)q(op)h(break)o(ers)0 461 y(has)23 b(signi\014can)o(t)f(impact)e(on)j(the)f(running)g(time)e (of)i(the)g(subsequen)o(t)g(link)m(age)g(analysis.)39 b(W)l(e)22 b(ha)o(v)o(e)0 521 y(automated)g(the)g(pro)q(cess)h(of)f (selecting)f(lo)q(op)i(break)o(ers,)g(implem)o(e)o(n)o(ted)c(a)k(h)o (ybrid)e(algorithm)g(for)h(it)0 581 y(in)d(the)h Fk(f)l(astlink)e Fo(v)o(ersion)h(of)h Fk(linka)o(ge)p Fo(,)e(and)j(tested)e(it)g(on)i (man)o(y)d(real)i(p)q(edigrees)f(with)h(excellen)o(t)0 641 y(p)q(erformance.)g(W)l(e)15 b(p)q(oin)o(t)g(out)h(that)g(there)e (is)h(no)h(need)f(to)g(break)h(eac)o(h)e(lo)q(op)i(b)o(y)f(a)h (distinct)e(individual)0 702 y(b)q(ecause,)h(with)f(minor)g(mo)q (di\014cation)g(to)h(the)f(algorithms)g(in)h Fk(linka)o(ge/f)-5 b(astlin)o(k)p Fo(,)12 b(a)j(single)f(individ-)0 762 y(ual)g(that)h(participates)f(in)f(m)o(ultiple)e(marriages)j(can)g (serv)o(e)f(as)i(a)g(lo)q(op)g(break)o(er)e(for)h(sev)o(eral)f(lo)q (ops.)22 b(Our)0 822 y(algorithm)17 b(for)h(\014nding)g(lo)q(op)h (break)o(ers,)e(called)g Fk(LoopBreaker)p Fo(,)f(is)h(a)i(com)o (bination)d(of:)25 b(\(1\))18 b(a)g(new)0 882 y(algorithm)c(that)h(is)g (guaran)o(teed)h(to)f(b)q(e)g(optimal)f(on)h(the)g(sp)q(ecial)g(case)g (of)g(p)q(edigrees)g(with)g(no)g(m)o(ultiple)0 942 y(marriages)g(and)h (\(2\))f(an)h(adaptation)h(of)e(a)h(kno)o(wn)g(algorithm)e(for)i (breaking)f(lo)q(ops)h(in)f(general)g(graphs.)0 1002 y(The)h(con)o(tribution)g(of)h(this)f(w)o(ork)h(is)f(the)g(adaptation)i (of)e(abstract)h(metho)q(ds)f(from)f(computer)g(science)0 1063 y(to)i(a)f(c)o(hallenging)g(problem)e(in)i(genetics.)963 2874 y(2)p eop %%Page: 3 3 3 2 bop 0 100 a Fl(1)81 b(In)n(tro)r(duction)0 209 y Fo(P)o(edigree)18 b(lo)q(ops)i(p)q(ose)f(a)g(di\016cult)f (computational)g(c)o(hallenge)g(in)g(genetic)g(link)m(age)g(analysis.) 30 b(In)18 b(this)0 269 y(pap)q(er)25 b(w)o(e)e(address)i(a)f(com)o (binatorial)e(optimization)h(problem,)g(whic)o(h)h(w)o(e)f(call)g(the)h Fj(lo)n(op)g(br)n(e)n(aker)0 330 y(sele)n(ction)16 b Fo(\(LBS\))f(problem)e(that)i(arises)g(for)g(lo)q(op)q(ed)h(p)q (edigrees)e(in)h(the)f(most)g(p)q(opular)i(genetic)d(link)m(age)0 390 y(analysis)e(soft)o(w)o(are)h(pac)o(k)m(age,)g Fk(linka)o(ge)d Fo([1,)h(2)q(,)g(3)q(].)19 b(W)l(e)11 b(implem)o(e)o(n)o(ted)d(our)k (solution)f(in)g Fk(f)l(astlink)e Fo([4,)i(5],)0 450 y(a)17 b(faster)g(v)o(ersion)f(of)h Fk(linka)o(ge)p Fo(.)j(W)l(e)d (illustrate)f(with)g(real)g(examples)f(that)i(our)g(solution)g(to)g (the)g(LBS)0 510 y(problem)e(translates)h(to)h(faster)f(computation)g (times.)73 570 y(Our)g(algorithm)f(for)h(\014nding)g(lo)q(op)h(break)o (ers)f(is)f(a)i(com)o(bination)d(of:)21 b(\(1\))c(a)f(new)g(algorithm)f (that)h(is)0 630 y(guaran)o(teed)k(to)f(b)q(e)g(optimal)f(on)i(the)f (sp)q(ecial)g(case)g(of)g(p)q(edigrees)g(with)g(no)h(m)o(ultiple)c (marriages)i(and)0 691 y(\(2\))e(an)g(adaptation)h(of)f(a)g(kno)o(wn)f (algorithm)g(for)h(breaking)f(lo)q(ops)i(in)e(general)g(graphs.)22 b(W)l(e)16 b(also)g(p)q(oin)o(t)0 751 y(out)k(that)f(there)g(is)g(no)h (need)e(to)i(break)f(eac)o(h)g(lo)q(op)h(b)o(y)f(a)g(distinct)g (individual)f(b)q(ecause,)h(with)g(minor)0 811 y(mo)q(di\014cation)e (to)h(the)f(algorithms)g(in)g Fk(linka)o(ge)p Fo(/)p Fk(f)l(astlin)o(k)p Fo(,)d(a)k(single)f(individual)f(that)i (participates)0 871 y(in)13 b(m)o(ultiple)d(marriages)j(can)h(serv)o(e) e(as)i(a)g(lo)q(op)h(break)o(er)d(for)i(sev)o(eral)e(lo)q(ops.)22 b(This)13 b(idea)h(is)f(adapted)h(from)0 931 y(arti\014cial)h(in)o (telligence)f([6].)73 992 y(Kong)k([7])f(p)q(oin)o(ted)h(out)g(in)f (1991)i(that)e(the)h(ev)m(aluation)f(of)h(the)f(basic)h(Elston-Stew)o (art)g(maxim)n(um)0 1052 y(lik)o(eliho)q(o)q(d)11 b(link)m(age)g (analysis)h(form)o(ula)f(is)h(a)g(sp)q(ecial)f(case)h(of)g(a)h(problem) d(kno)o(wn)i(in)g(statistics)f(and)i(arti\014-)0 1112 y(cial)h(in)o(telligence)d(as)k(\\probabilistic)f(inference)f(in)h(Ba)o (y)o(esian)f(net)o(w)o(orks".)20 b(Kong)c(applied)d(mathemati-)0 1172 y(cal)e(and)h(soft)o(w)o(are)g(to)q(ols)g(dev)o(elop)q(ed)f(for)g (the)g(probabilistic)g(inference)f(problem)g(to)i(deriv)o(e)d(appro)o (ximate)0 1232 y(lik)o(eliho)q(o)q(d)16 b(algorithms)g(for)h(p)q (edigrees)g(where)g(the)f(Elston-Stew)o(art)i([8,)f(9])f(metho)q(d)h (is)f(computation-)0 1293 y(ally)g(infeasible.)22 b(W)l(e)17 b(use)f(the)h(relationship)g(b)q(et)o(w)o(een)f(link)m(age)g(analysis)h (and)h(probabilistic)e(inference)0 1353 y(to)h(impro)o(v)o(e)c(an)k (existing)e(impleme)o(n)o(tation)f(of)i(the)g(Elston-Stew)o(art)h (metho)q(d.)73 1413 y(Our)h(w)o(ork)f(transcends)h(three)e(broad)j (areas:)24 b(com)o(binatorial)16 b(optimization,)f(probabilistic)i (infer-)0 1473 y(ence,)j(and)h(genetics.)33 b(The)20 b(next)g(t)o(w)o(o)h(sections)f(presen)o(t)f(the)i(needed)e(bac)o (kground)i(information)f(to)0 1533 y(enable)c(the)g(presen)o(tation)g (of)h(our)f(results)h(in)f(prop)q(er)g(detail.)21 b(The)c(remainder)d (of)j(the)f(pap)q(er)h(consists)0 1594 y(of)h(a)f(short)i(metho)q(ds)d (section)h(describing)g(our)h(implem)o(en)o(t)o(ation,)d(a)j(section)f (describing)g(our)g(new)h(al-)0 1654 y(gorithm,)c(a)h(results)g (section)g(describing)f(our)h(the)g(p)q(erformance)f(of)h(our)h (algorithm)e(on)h(real)g(data,)g(and)0 1714 y(a)i(discussion)f (section.)0 1880 y Fl(2)81 b(Bac)n(kground)0 1990 y Fo(The)21 b(essen)o(tial)g(input)g(to)h(a)f(genetic)g(link)m(age)g(analysis)g (computation)g(is)g(a)h Fj(p)n(e)n(digr)n(e)n(e)p Fo(.)35 b(T)l(o)22 b(illustrate)0 2050 y(some)17 b(de\014nitions,)i(w)o(e)f (will)f(use)i(a)g(p)q(edigree)f(con)o(taining)g(a)h(\014rst-cousin)g (marriage)f(with)g(3)h(o\013spring)0 2110 y(\(Figure)k(1\).)45 b(The)24 b(p)q(edigree)f(in)h(Figure)f(1)i(is)e(dra)o(wn)i(according)f (to)g(the)g(con)o(v)o(en)o(tions)f(adv)o(o)q(cated)0 2170 y(b)o(y)d(the)g(P)o(edigree)g(Standardization)h(T)l(ask)g(F)l (orce)g([10].)34 b(F)l(or)21 b(algorithmic)d(purp)q(oses)k(w)o(e)e (prefer)g(the)0 2231 y Fj(marriage)15 b(gr)n(aph)e Fo(represen)o (tation)g(of)h(p)q(edigrees)f(promoted)g(b)o(y)h(Lange)g(and)h(Elston)f ([9])f(and)h(Cannings,)0 2291 y(Thompson,)e(and)f(Sk)o(olnic)o(k)e([11) q(].)19 b(A)10 b(marriage)g(graph)i(dra)o(wing)g(of)f(the)g (\014rst-cousin-marriage)g(p)q(edigree)0 2351 y(is)16 b(sho)o(wn)h(in)f(Figure)g(2.)73 2411 y(A)j(marriage)f(graph)i(is)f(an) h(example)d(of)i(a)h Fj(gr)n(aph)p Fo(.)29 b(A)19 b Fj(gr)n(aph)g Fo(consists)g(of)h(t)o(w)o(o)f(sets,)g Fj(vertic)n(es)h Fo(and)0 2471 y Fj(e)n(dges)p Fo(.)34 b(A)20 b(v)o(ertex)e(can)j (represen)o(t)e(an)o(y)h(ob)s(ject;)h(in)f(our)h(usage)g(v)o(ertices)d (represen)o(t)h(individuals)g(and)0 2532 y(marriages.)44 b(An)23 b(edge)h(is)g(a)h(pair)f Fi(v)r(;)8 b(w)24 b Fo(of)g(v)o(ertices.)43 b(In)24 b Fj(undir)n(e)n(cte)n(d)g Fo(graphs)h(the)f(edge)g(pairs)g(are)0 2592 y(unordered)17 b(and)h(an)f(edge)g(is)g(dra)o(wn)h Fi(v)f Fh(\000)-17 b(\000)15 b Fi(w)q Fo(.)24 b(In)16 b Fj(dir)n(e)n(cte)n(d)h Fo(graphs)h(the)f(edge)g(pairs)g(are)g(ordered)g(and)0 2652 y(an)j(edge)g(from)f Fi(v)j Fo(to)e Fi(w)h Fo(is)f(dra)o(wn)g Fi(v)i Fh(!)e Fi(w)q Fo(.)32 b(Tw)o(o)21 b(v)o(ertices)d(are)i Fj(neighb)n(ors)g Fo(if)g(there)f(exists)h(an)g(edge)0 2712 y(b)q(et)o(w)o(een)15 b(them.)963 2874 y(3)p eop %%Page: 4 4 4 3 bop 1 setlinewidth np 693 258 75 0.00 360.00 arc st 1 setlinewidth np 731 577 75 0.00 360.00 arc st 1 setlinewidth np 1592 577 75 0.00 360.00 arc st 1 setlinewidth np 1386 840 75 0.00 360.00 arc st 1 setlinewidth np 1307 1157 75 0.00 360.00 arc st 1 setlinewidth np 960 1155 75 0.00 360.00 arc st 1 setlinewidth np 1283 324 a 1283 193 li 1152 193 li 1152 324 li closepath st 3 setlinewidth np 767 258 a 1152 258 li st 3 setlinewidth np 955 258 a 955 408 li st 1 setlinewidth np 383 643 a 383 512 li 251 512 li 251 643 li closepath st 1 setlinewidth np 1246 643 a 1246 512 li 1115 512 li 1115 643 li closepath st 1 setlinewidth np 589 906 a 589 774 li 458 774 li 458 906 li closepath st 1 setlinewidth np 674 1225 a 674 1094 li 542 1094 li 542 1225 li closepath st 3 setlinewidth np 730 408 a 1180 408 li st 3 setlinewidth np 1180 408 a 1180 512 li st 3 setlinewidth np 730 408 a 730 502 li st 3 setlinewidth np 383 578 a 655 578 li st 3 setlinewidth np 1246 578 a 1518 578 li st 3 setlinewidth np 524 578 a 524 774 li st 3 setlinewidth np 1387 578 a 1387 765 li st 3 setlinewidth np 955 840 a 955 990 li st 3 setlinewidth np 608 1094 a 608 990 li 608 990 li st 3 setlinewidth np 608 990 a 1302 990 li st 3 setlinewidth np 1302 990 a 1302 1084 li st 3 setlinewidth np 955 990 a 955 1084 li st 3 setlinewidth np 589 831 a 1312 831 li st 3 setlinewidth np 589 840 a 1312 840 li st 684 277 a Fg(1)308 596 y(3)1369 859 y(8)928 1178 y(10)1206 279 y(2)716 598 y(4)417 b(5)1577 600 y(6)511 864 y(7)597 1178 y(9)1273 1180 y(11)406 1353 y Fo(Figure)16 b(1:)21 b(A)16 b(\014rst-cousin)h(marriage)e(with)h (three)g(o\013spring)p 1 setlinewidth np 746 1719 60 0.00 360.00 arc st 1 setlinewidth np 776 1974 60 0.00 360.00 arc st 1 setlinewidth np 1465 1974 60 0.00 360.00 arc st 1 setlinewidth np 1300 2184 60 0.00 360.00 arc st 1 setlinewidth np 1237 2438 60 0.00 360.00 arc st 1 setlinewidth np 956 2440 60 0.00 360.00 arc st 1 setlinewidth np 1218 1772 a 1218 1667 li 1113 1667 li 1113 1772 li closepath st 1 setlinewidth np 498 2027 a 498 1922 li 393 1922 li 393 2027 li closepath st 1 setlinewidth np 1188 2027 a 1188 1922 li 1083 1922 li 1083 2027 li closepath st 1 setlinewidth np 663 2238 a 663 2133 li 558 2133 li 558 2238 li closepath st 1 setlinewidth np 730 2493 a 730 2388 li 625 2388 li 625 2493 li closepath st 1000 1893 4 4 v 1000 1887 V 1000 1881 V 1000 1875 V 1000 1869 V 1000 1863 V 1000 1857 V 1000 1851 V 1000 1845 V 1000 1839 V 1000 1833 V 1000 1827 V 1000 1821 V 1000 1815 V 1000 1809 V 1000 1803 V 1000 1803 V 994 1803 V 988 1803 V 982 1803 V 976 1803 V 970 1803 V 964 1803 V 958 1803 V 952 1803 V 946 1803 V 940 1803 V 934 1803 V 928 1803 V 922 1803 V 916 1803 V 910 1803 V 910 1803 V 910 1809 V 910 1815 V 910 1821 V 910 1827 V 910 1833 V 910 1839 V 910 1845 V 910 1851 V 910 1857 V 910 1863 V 910 1869 V 910 1875 V 910 1881 V 910 1887 V 910 1893 V 910 1893 V 916 1893 V 922 1893 V 928 1893 V 934 1893 V 940 1893 V 946 1893 V 952 1893 V 958 1893 V 964 1893 V 970 1893 V 976 1893 V 982 1893 V 988 1893 V 994 1893 V 1000 1893 V 655 2081 V 655 2075 V 655 2069 V 655 2063 V 655 2057 V 655 2051 V 655 2045 V 655 2039 V 655 2033 V 655 2027 V 655 2021 V 655 2015 V 655 2009 V 655 2003 V 655 1997 V 655 1991 V 655 1991 V 649 1991 V 643 1991 V 637 1991 V 631 1991 V 625 1991 V 619 1991 V 613 1991 V 606 1991 V 600 1991 V 594 1991 V 588 1991 V 582 1991 V 576 1991 V 570 1991 V 564 1991 V 564 1991 V 564 1997 V 564 2003 V 564 2009 V 564 2015 V 564 2021 V 564 2027 V 564 2033 V 564 2039 V 564 2045 V 564 2051 V 564 2057 V 564 2063 V 564 2069 V 564 2075 V 564 2081 V 564 2081 V 570 2081 V 576 2081 V 582 2081 V 588 2081 V 594 2081 V 600 2081 V 606 2081 V 613 2081 V 619 2081 V 625 2081 V 631 2081 V 637 2081 V 643 2081 V 649 2081 V 655 2081 V 1345 2081 V 1345 2075 V 1345 2069 V 1345 2063 V 1345 2057 V 1345 2051 V 1345 2045 V 1345 2039 V 1345 2033 V 1345 2027 V 1345 2021 V 1345 2015 V 1345 2009 V 1345 2003 V 1345 1997 V 1345 1991 V 1345 1991 V 1339 1991 V 1333 1991 V 1327 1991 V 1321 1991 V 1315 1991 V 1309 1991 V 1303 1991 V 1297 1991 V 1291 1991 V 1285 1991 V 1279 1991 V 1273 1991 V 1267 1991 V 1261 1991 V 1255 1991 V 1255 1991 V 1255 1997 V 1255 2003 V 1255 2009 V 1255 2015 V 1255 2021 V 1255 2027 V 1255 2033 V 1255 2039 V 1255 2045 V 1255 2051 V 1255 2057 V 1255 2063 V 1255 2069 V 1255 2075 V 1255 2081 V 1255 2081 V 1261 2081 V 1267 2081 V 1273 2081 V 1279 2081 V 1285 2081 V 1291 2081 V 1297 2081 V 1303 2081 V 1309 2081 V 1315 2081 V 1321 2081 V 1327 2081 V 1333 2081 V 1339 2081 V 1345 2081 V 1000 2321 V 1000 2315 V 1000 2309 V 1000 2303 V 1000 2297 V 1000 2291 V 1000 2285 V 1000 2279 V 1000 2273 V 1000 2267 V 1000 2261 V 1000 2255 V 1000 2249 V 1000 2243 V 1000 2237 V 1000 2231 V 1000 2231 V 994 2231 V 988 2231 V 982 2231 V 976 2231 V 970 2231 V 964 2231 V 958 2231 V 952 2231 V 946 2231 V 940 2231 V 934 2231 V 928 2231 V 922 2231 V 916 2231 V 910 2231 V 910 2231 V 910 2237 V 910 2243 V 910 2249 V 910 2255 V 910 2261 V 910 2267 V 910 2273 V 910 2279 V 910 2285 V 910 2291 V 910 2297 V 910 2303 V 910 2309 V 910 2315 V 910 2321 V 910 2321 V 916 2321 V 922 2321 V 928 2321 V 934 2321 V 940 2321 V 946 2321 V 952 2321 V 958 2321 V 964 2321 V 970 2321 V 976 2321 V 982 2321 V 988 2321 V 994 2321 V 1000 2321 V 3 setlinewidth np 798 1750 a 911 1825 li st 3 setlinewidth np 887 1816 a 911 1825 li 894 1807 li st 3 setlinewidth np 1113 1750 a 1001 1825 li st 3 setlinewidth np 1017 1807 a 1001 1825 li 1024 1816 li st 3 setlinewidth np 911 1870 a 775 1915 li st 3 setlinewidth np 796 1902 a 775 1915 li 800 1913 li st 3 setlinewidth np 1001 1870 a 1136 1922 li st 3 setlinewidth np 1111 1919 a 1136 1922 li 1116 1908 li st 3 setlinewidth np 610 2080 a 610 2133 li st 3 setlinewidth np 604 2109 a 610 2133 li 616 2109 li st 3 setlinewidth np 1301 2080 a 1301 2125 li st 3 setlinewidth np 1295 2101 a 1301 2125 li 1307 2101 li st 3 setlinewidth np 498 1990 a 565 2020 li st 3 setlinewidth np 541 2016 a 565 2020 li 546 2005 li st 3 setlinewidth np 715 1990 a 655 2020 li st 3 setlinewidth np 674 2004 a 655 2020 li 679 2014 li st 3 setlinewidth np 1188 1990 a 1256 2020 li st 3 setlinewidth np 1232 2016 a 1256 2020 li 1236 2005 li st 3 setlinewidth np 1406 1990 a 1346 2020 li st 3 setlinewidth np 1365 2004 a 1346 2020 li 1370 2014 li st 3 setlinewidth np 663 2200 a 911 2245 li st 3 setlinewidth np 886 2247 a 911 2245 li 888 2235 li st 3 setlinewidth np 1241 2200 a 1001 2245 li st 3 setlinewidth np 1023 2235 a 1001 2245 li 1025 2247 li st 3 setlinewidth np 911 2305 a 678 2388 li st 3 setlinewidth np 699 2374 a 678 2388 li 702 2386 li st 3 setlinewidth np 1001 2305 a 1233 2380 li st 3 setlinewidth np 1209 2379 a 1233 2380 li 1212 2367 li st 3 setlinewidth np 956 2320 a 956 2380 li st 3 setlinewidth np 950 2356 a 956 2380 li 962 2356 li st 739 1734 a Fq(1)761 1989 y(4)1212 2455 y(11)1156 1735 y(2)432 1989 y(3)571 2049 y(3)p Ff(j)p Fq(4)1125 1992 y(5)296 b(6)598 2204 y(7)667 2458 y(9)931 2456 y(10)1290 2201 y(8)916 1865 y(1)p Ff(j)p Fq(2)919 2289 y(7)p Ff(j)p Fq(8)1261 2051 y(5)p Ff(j)p Fq(6)343 2616 y Fo(Figure)16 b(2:)21 b(Marriage)c(graph)g(for)f(\014rst)h(cousin)f(marriage)f(p)q (edigree)963 2874 y(4)p eop %%Page: 5 5 5 4 bop 1 setlinewidth np 746 171 60 0.00 360.00 arc st 1 setlinewidth np 776 427 60 0.00 360.00 arc st 1 setlinewidth np 1465 427 60 0.00 360.00 arc st 1 setlinewidth np 1300 637 60 0.00 360.00 arc st 1 setlinewidth np 1237 891 60 0.00 360.00 arc st 1 setlinewidth np 956 892 60 0.00 360.00 arc st 1 setlinewidth np 1218 224 a 1218 119 li 1113 119 li 1113 224 li closepath st 1 setlinewidth np 498 479 a 498 374 li 393 374 li 393 479 li closepath st 1 setlinewidth np 1188 479 a 1188 374 li 1083 374 li 1083 479 li closepath st 1 setlinewidth np 730 945 a 730 840 li 625 840 li 625 945 li closepath st 1000 346 4 4 v 1000 340 V 1000 334 V 1000 328 V 1000 322 V 1000 316 V 1000 310 V 1000 304 V 1000 298 V 1000 292 V 1000 286 V 1000 280 V 1000 274 V 1000 268 V 1000 262 V 1000 256 V 1000 256 V 994 256 V 988 256 V 982 256 V 976 256 V 970 256 V 964 256 V 958 256 V 952 256 V 946 256 V 940 256 V 934 256 V 928 256 V 922 256 V 916 256 V 910 256 V 910 256 V 910 262 V 910 268 V 910 274 V 910 280 V 910 286 V 910 292 V 910 298 V 910 304 V 910 310 V 910 316 V 910 322 V 910 328 V 910 334 V 910 340 V 910 346 V 910 346 V 916 346 V 922 346 V 928 346 V 934 346 V 940 346 V 946 346 V 952 346 V 958 346 V 964 346 V 970 346 V 976 346 V 982 346 V 988 346 V 994 346 V 1000 346 V 655 533 V 655 527 V 655 521 V 655 515 V 655 509 V 655 503 V 655 497 V 655 491 V 655 485 V 655 479 V 655 473 V 655 467 V 655 461 V 655 455 V 655 449 V 655 443 V 655 443 V 649 443 V 643 443 V 637 443 V 631 443 V 625 443 V 619 443 V 613 443 V 606 443 V 600 443 V 594 443 V 588 443 V 582 443 V 576 443 V 570 443 V 564 443 V 564 443 V 564 449 V 564 455 V 564 461 V 564 467 V 564 473 V 564 479 V 564 485 V 564 491 V 564 497 V 564 503 V 564 509 V 564 515 V 564 521 V 564 527 V 564 533 V 564 533 V 570 533 V 576 533 V 582 533 V 588 533 V 594 533 V 600 533 V 606 533 V 613 533 V 619 533 V 625 533 V 631 533 V 637 533 V 643 533 V 649 533 V 655 533 V 1345 533 V 1345 527 V 1345 521 V 1345 515 V 1345 509 V 1345 503 V 1345 497 V 1345 491 V 1345 485 V 1345 479 V 1345 473 V 1345 467 V 1345 461 V 1345 455 V 1345 449 V 1345 443 V 1345 443 V 1339 443 V 1333 443 V 1327 443 V 1321 443 V 1315 443 V 1309 443 V 1303 443 V 1297 443 V 1291 443 V 1285 443 V 1279 443 V 1273 443 V 1267 443 V 1261 443 V 1255 443 V 1255 443 V 1255 449 V 1255 455 V 1255 461 V 1255 467 V 1255 473 V 1255 479 V 1255 485 V 1255 491 V 1255 497 V 1255 503 V 1255 509 V 1255 515 V 1255 521 V 1255 527 V 1255 533 V 1255 533 V 1261 533 V 1267 533 V 1273 533 V 1279 533 V 1285 533 V 1291 533 V 1297 533 V 1303 533 V 1309 533 V 1315 533 V 1321 533 V 1327 533 V 1333 533 V 1339 533 V 1345 533 V 1000 774 V 1000 768 V 1000 762 V 1000 756 V 1000 750 V 1000 744 V 1000 738 V 1000 732 V 1000 726 V 1000 720 V 1000 714 V 1000 708 V 1000 702 V 1000 695 V 1000 689 V 1000 683 V 1000 683 V 994 683 V 988 683 V 982 683 V 976 683 V 970 683 V 964 683 V 958 683 V 952 683 V 946 683 V 940 683 V 934 683 V 928 683 V 922 683 V 916 683 V 910 683 V 910 683 V 910 689 V 910 695 V 910 702 V 910 708 V 910 714 V 910 720 V 910 726 V 910 732 V 910 738 V 910 744 V 910 750 V 910 756 V 910 762 V 910 768 V 910 774 V 910 774 V 916 774 V 922 774 V 928 774 V 934 774 V 940 774 V 946 774 V 952 774 V 958 774 V 964 774 V 970 774 V 976 774 V 982 774 V 988 774 V 994 774 V 1000 774 V 3 setlinewidth np 798 202 a 911 277 li st 3 setlinewidth np 887 268 a 911 277 li 894 259 li st 3 setlinewidth np 1113 202 a 1001 277 li st 3 setlinewidth np 1017 259 a 1001 277 li 1024 268 li st 3 setlinewidth np 911 322 a 775 367 li st 3 setlinewidth np 796 354 a 775 367 li 800 365 li st 3 setlinewidth np 1001 322 a 1136 374 li st 3 setlinewidth np 1111 371 a 1136 374 li 1116 360 li st 3 setlinewidth np 610 532 a 610 585 li st 3 setlinewidth np 604 561 a 610 585 li 616 561 li st 3 setlinewidth np 1301 532 a 1301 577 li st 3 setlinewidth np 1295 553 a 1301 577 li 1307 553 li st 3 setlinewidth np 498 442 a 565 472 li st 3 setlinewidth np 541 468 a 565 472 li 546 457 li st 3 setlinewidth np 715 442 a 655 472 li st 3 setlinewidth np 674 456 a 655 472 li 679 466 li st 3 setlinewidth np 1188 442 a 1256 472 li st 3 setlinewidth np 1232 468 a 1256 472 li 1236 457 li st 3 setlinewidth np 1406 442 a 1346 472 li st 3 setlinewidth np 1365 456 a 1346 472 li 1370 466 li st 3 setlinewidth np 1241 652 a 1001 697 li st 3 setlinewidth np 1023 687 a 1001 697 li 1025 699 li st 3 setlinewidth np 911 757 a 678 840 li st 3 setlinewidth np 699 826 a 678 840 li 702 838 li st 3 setlinewidth np 1001 757 a 1233 832 li st 3 setlinewidth np 1209 831 a 1233 832 li 1212 819 li st 3 setlinewidth np 956 772 a 956 832 li st 3 setlinewidth np 950 808 a 956 832 li 962 808 li st 3 setlinewidth np 655 675 a 655 585 li 565 585 li 565 675 li closepath st 3 setlinewidth np 775 675 a 775 585 li 685 585 li 685 675 li closepath st 3 setlinewidth np 775 652 a 911 697 li st 3 setlinewidth np 886 695 a 911 697 li 890 684 li st 1287 652 a Fq(8)1212 907 y(11)736 186 y(1)1156 188 y(2)569 502 y(3)p Ff(j)p Fq(4)435 443 y(3)763 442 y(4)1126 443 y(5)295 b(6)1261 502 y(5)p Ff(j)p Fq(6)721 650 y(7)750 629 y Fr(0)601 649 y Fq(7)667 910 y(9)235 b(10)916 742 y(7)945 720 y Fr(0)959 742 y Ff(j)p Fq(8)916 314 y(1)p Ff(j)p Fq(2)334 1069 y Fo(Figure)16 b(3:)21 b(First-cousin)16 b(marriage)g(with)g(lo)q(op)h(brok)o(en)f(b)o (y)f(cloning)73 1265 y(W)l(e)k(determine)e(a)j(marriage)f(graph)h(from) e(a)i(p)q(edigree)f(as)h(follo)o(ws.)31 b(The)20 b(v)o(ertex)d(set)j (consists)g(of)0 1325 y(t)o(w)o(o)e(disjoin)o(t)g(sets)h Fi(I)i Fo(and)e Fi(M)24 b Fo(where)18 b Fi(I)k Fo(is)c(the)g(set)g(of)h (individuals)e(and)i Fi(M)24 b Fo(is)18 b(the)g(set)h(of)f(marriages.)0 1386 y(The)d(edge)h(set)f(consists)g(of)h(t)o(w)o(o)f(t)o(yp)q(es)g(of) h(edges;)f(An)g(edge)g Fi(m)f Fh(!)g Fi(i)h Fo(from)f(eac)o(h)h (marriage)f(v)o(ertex)g Fi(m)h Fo(to)0 1446 y(eac)o(h)h(individual)f Fi(i)i Fo(who)g(is)f(an)h(o\013spring)h(of)f Fi(m)f Fo(and)i(an)f(edge) f Fi(j)i Fh(!)c Fi(m)i Fo(whenev)o(er)g(individual)f Fi(j)k Fo(is)e(one)0 1506 y(of)h(the)g(sp)q(ouses)i(in)d(marriage)h Fi(m)f Fo(\(See)h(Figure)f(2\).)28 b(W)l(e)17 b(use)i Fi(x)p Fh(j)p Fi(y)g Fo(to)f(denote)g(the)g(marriage)f(v)o(ertex)g(of)0 1566 y(the)g(individuals)f Fi(x)g Fo(and)i Fi(y)r Fo(.)23 b(The)17 b(v)o(ertical)e(bar)i(in)g(this)g(notation)h(separates)f(the)g (t)o(w)o(o)g(participan)o(ts)f(in)0 1626 y(a)h(marriage)e(v)o(ertex)g (as)h(it)g(is)g(used)h(to)f(separate)h(phase)g(in)f(phase-kno)o(wn)h (genot)o(yp)q(es.)73 1687 y(A)e Fj(lo)n(op)g Fo(in)g(a)h(p)q(edigree)e (o)q(ccurs)i(precisely)e(when)h(the)g(marriage)f(graph)i(has)g(a)g Fj(cycle)p Fo(,)h(if)d(one)i(ignores)0 1747 y(the)e(directions)f(on)i (the)f(edges.)20 b(A)14 b Fj(cycle)h Fo(in)f(an)g(undirected)f(graph)i (is)f(a)h(sequence)e(of)h(v)o(ertices)e Fi(v)1798 1754 y Fe(1)1818 1747 y Fi(;)c(:)g(:)g(:)f(v)1929 1754 y Fd(k)0 1807 y Fo(suc)o(h)20 b(there)f(are)h(no)h(duplicate)e(v)o(ertices,)g (except)g Fi(v)990 1814 y Fe(1)1029 1807 y Fo(=)i Fi(v)1112 1814 y Fd(k)1153 1807 y Fo(and)f(eac)o(h)g(pair)g(of)g(consecutiv)o(e)f (v)o(ertices)0 1867 y Fi(v)24 1874 y Fd(i)38 1867 y Fi(;)8 b(v)84 1874 y Fd(i)p Fe(+1)164 1867 y Fo(has)22 b(an)g(edge)g Fi(v)470 1874 y Fd(i)506 1867 y Fh(\000)-17 b(\000)23 b Fi(v)614 1874 y Fd(i)p Fe(+1)694 1867 y Fo(b)q(et)o(w)o(een)e(them.) 35 b(F)l(or)22 b(the)f(lo)q(op)i(in)e(the)g(p)q(edigree)g(of)h(Figure)f (1,)0 1927 y(the)h(corresp)q(onding)h(cycle)d(in)i(Figure)f(2)i(is:)32 b(1)p Fh(j)p Fo(2)p Fi(;)8 b Fo(4)p Fi(;)g Fo(3)p Fh(j)p Fo(4)p Fi(;)g Fo(7)p Fi(;)g Fo(7)p Fh(j)p Fo(8)p Fi(;)g Fo(8)p Fi(;)g Fo(5)p Fh(j)p Fo(6)p Fi(;)g Fo(5)p Fi(;)g Fo(1)q Fh(j)p Fo(2,)26 b(where)c(w)o(e)f(ignore)h(the)0 1988 y(directions)g(on)h(the)g(edges.)41 b(Cannings,)25 b(Thompson,)f(and)f(Sk)o(olnic)o(k)e([11])i(distinguished)f(marriage)0 2048 y(lo)q(ops)e(and)f(in)o(breeding)f(lo)q(ops,)i(but)f(this)f (distinction)g(is)h(neither)e(imp)q(ortan)o(t)h(for)h(our)g(purp)q (oses,)i(nor)0 2108 y(clear)16 b(when)g(a)h(p)q(edigree)e(has)i(m)o (ultiple)c(o)o(v)o(erlapping)j(lo)q(ops.)73 2168 y(A)24 b Fj(p)n(ath)f Fo(in)h(a)h(graph)g(is)f(a)g(sequence)g(of)g(distinct)f (v)o(ertices)g Fi(v)1278 2175 y Fe(1)1297 2168 y Fi(;)8 b(:)g(:)g(:)f(v)1408 2175 y Fd(k)1453 2168 y Fo(suc)o(h)24 b(that)h(eac)o(h)f(pair)g(of)0 2228 y(consecutiv)o(e)d(v)o(ertices)g Fi(v)471 2235 y Fd(i)485 2228 y Fi(;)8 b(v)531 2235 y Fd(i)p Fe(+1)612 2228 y Fo(has)23 b(an)g(edge)g Fi(v)921 2235 y Fd(i)959 2228 y Fh(\000)-17 b(\000)25 b Fi(v)1069 2235 y Fd(i)p Fe(+1)1150 2228 y Fo(b)q(et)o(w)o(een)d(them.)39 b(A)22 b Fj(dir)n(e)n(cte)n(d)g(p)n(ath)g Fo(in)h(a)0 2289 y(directed)17 b(graph,)i(is)f(a)g(path)h(in)f(whic)o(h)f(the)h (edges)g(all)g(p)q(oin)o(t)g(in)g(the)g(forw)o(ard)h(direction.)25 b(A)18 b(graph)h(is)0 2349 y Fj(c)n(onne)n(cte)n(d)f Fo(if)e(there)g(is)g(a)h(path)h(b)q(et)o(w)o(een)d(ev)o(ery)g(t)o(w)o (o)i(v)o(ertices.)k(All)15 b(marriage)h(graphs)h(are)g(connected.)0 2409 y(A)f(connected,)f(undirected)g(graph)i(with)f(no)h(cycles)e(is)h (called)f(a)i Fj(tr)n(e)n(e)p Fo(.)73 2469 y(The)g(essen)o(tial)e(goal) i(of)g(link)m(age)f(analysis)h(is)f(to)h(estimate)e(the)h(recom)o (bination)e(fraction,)i Fi(\022)q Fo(,)h(based)0 2529 y(on)i(genot)o(yp)q(e)f(\(and)h(phenot)o(yp)q(e\))f(information)f(ab)q (out)j(the)e(p)q(edigree.)27 b Fk(linka)o(ge)16 b Fo(and)j(other)f (link)m(age)0 2589 y(analysis)23 b(soft)o(w)o(are)g(pac)o(k)m(ages)g (use)g(maxim)o(um)18 b(lik)o(eliho)q(o)q(d)k(metho)q(ds,)i(so)f(they)f (m)o(ust)g(compute)f(the)0 2650 y(p)q(edigree)12 b(lik)o(eliho)q(o)q(d) f(for)i(di\013eren)o(t)e(candidate)h(v)m(alues)h(of)f Fi(\022)q Fo(.)20 b(T)l(o)13 b(do)g(the)f(computation)f(in)h Fk(LINKA)o(GE)p Fo(,)0 2710 y(one)21 b(individual)f Fi(r)j Fo(is)e(c)o(hosen)g(as)h(the)f Fj(r)n(o)n(ot)p Fo(.)34 b(Let)21 b Fi(P)h Fh(n)14 b Fi(r)23 b Fo(denote)e(the)g(set)g(of)h(all) e(individuals)g(in)h(the)963 2874 y(5)p eop %%Page: 6 6 6 5 bop 0 100 a Fo(p)q(edigree)13 b(except)g Fi(r)q Fo(.)21 b(The)14 b(program)f(computes:)19 b Fi(L)p Fo(\()p Fi(P)7 b Fh(j)p Fi(\022)q Fo(\))14 b(=)g(\006)1173 107 y Fd(g)1193 100 y Fi(P)7 b(r)q(ob)p Fo(\(r)17 b(has)g(genot)o(yp)q(e)g Fi(g)f Fh(j)d Fi(\022)q(;)8 b(P)14 b Fh(n)6 b Fi(r)q Fo(\))p Fi(:)13 b Fo(In)0 160 y(w)o(ords,)j(the)f(lik)o(eliho)q(o)q(d)f (of)h(the)g(p)q(edigree)g(conditional)g(on)h Fi(\022)g Fo(is)g(the)f(sum)f(o)o(v)o(er)g(all)h(genot)o(yp)q(es)h Fi(g)r Fo(,)f(of)g(the)0 220 y(conditional)j(probabilit)o(y)g(that)h Fi(r)h Fo(has)f(genot)o(yp)q(e)g Fi(g)i Fo(conditioned)d(on)h Fi(\022)h Fo(and)f(the)f(information)g(ab)q(out)0 280 y(the)f(other)h(individuals)e(in)i(the)f(p)q(edigree.)24 b(Elston)18 b(and)g(Stew)o(art)g([8])f(w)o(ere)g(the)g(\014rst)h(to)g (observ)o(e)f(that)0 340 y(in)h(lo)q(opless)g(p)q(edigrees)g(with)f (one)h(pair)g(of)h(founders)f(this)g(computation)f(can)h(b)q(e)g(done)g (e\016cien)o(tly)e(b)o(y)0 401 y(tra)o(v)o(ersing)e(the)g(p)q(edigree)g (from)f(b)q(ottom)h(to)h(top.)21 b(Ott)14 b([12)q(])f(extended)h(the)g (Elston-Stew)o(art)h(algorithm)0 461 y(to)e(all)f(lo)q(opless)h(p)q (edigrees.)19 b(Lange)14 b(and)f(Elston)f([9])g(further)g(extended)g (the)g(Elston-Stew)o(art)h(algorithm)0 521 y(to)23 b(lo)q(op)q(ed)h(p)q (edigrees)f(b)o(y)g(de\014ning)g(an)h(op)q(eration)g(w)o(e)e(call)g Fj(cloning)p Fo(.)44 b(In)o(tuitiv)o(ely)20 b(cloning)j(means)0 581 y(making)13 b(t)o(w)o(o)h(copies)f(of)h(an)h(individual)d(and)j (forcing)f(the)f(t)o(w)o(o)h(copies)g(to)g(ha)o(v)o(e)f(the)h(same)f (genot)o(yp)q(e.)20 b(In)0 641 y(terms)14 b(of)h(the)g(marriage)f (graph,)i(an)g(individual)e(v)o(ertex)g Fi(i)h Fo(ma)o(y)e(b)q(e)j (cloned)e(if)h Fi(i)g Fo(has)h(an)g(incoming)d(edge)0 702 y(\(i's)k(paren)o(ts)g(are)h(in)f(the)g(p)q(edigree\))g(and)h Fi(i)f Fo(has)h(an)g(outgoing)h(edge)f(\(i)f(has)h(a)g(c)o(hild)e(in)h (the)g(p)q(edigree\).)0 762 y(T)l(o)j(clone)f Fi(i)p Fo(,)h(add)h(an)f(individual)e(v)o(ertex)g Fi(i)824 744 y Fc(0)855 762 y Fo(and)j(replace)e(eac)o(h)g(edge)g(of)h(the)g(form)f Fi(i)g Fh(!)h Fi(m)f Fo(with)h(an)0 822 y(edge)f Fi(i)131 804 y Fc(0)161 822 y Fh(!)g Fi(m)p Fo(.)29 b(Marriage)20 b(v)o(ertices)d(cannot)j(b)q(e)f(cloned.)30 b(Figure)18 b(3,)i(sho)o(ws)g(the)f(marriage)f(graph)i(in)0 882 y(Figure)e(2,)g (after)g(p)q(erson)h(7)g(has)f(b)q(een)g(cloned.)27 b(Notice)17 b(that)h(b)o(y)g(cloning)g(individual)f(7,)h(the)g(cycle)e(in)0 942 y(the)h(marriage)g(graph)h(\(and)g(hence)f(the)g(lo)q(op)i(in)e (the)g(p)q(edigree\))g(is)h(brok)o(en.)24 b(F)l(or)18 b(this)f(reason)i(w)o(e)e(call)0 1002 y(the)f(cloned)g(individuals)f Fj(lo)n(op)i(br)n(e)n(akers)p Fo(.)73 1063 y(Lange)g(and)g(Elston)g(p)q (oin)o(ted)f(out)h(that)f(after)h(cloning)f(individuals)f(the)h(follo)o (wing)g(algorithm)f(can)0 1123 y(b)q(e)h(used)h(to)f(compute)f(the)h (lik)o(eliho)q(o)q(d.)81 1236 y Fp(Input:)47 b Fj(A)17 b(set)h(of)f(lo)n(op)h(br)n(e)n(akers)f Fh(f)p Fi(b)803 1243 y Fe(1)822 1236 y Fi(;)8 b(:)g(:)g(:)f(;)h(b)952 1243 y Fd(t)967 1236 y Fh(g)p Fj(,)17 b(a)g(set)h(of)g(lo)n(op)f(br)n (e)n(akers)g(clones)i Fh(f)p Fi(b)1683 1218 y Fc(0)1683 1248 y Fe(1)1702 1236 y Fi(;)8 b(:)g(:)g(:)f(;)h(b)1832 1218 y Fc(0)1832 1248 y Fd(t)1847 1236 y Fh(g)p Fi(:)186 1296 y Fj(a)17 b(set)h(of)f(p)n(ossible)h(genotyp)n(es)g(of)g(lo)n(op)f (br)n(e)n(akers)g Fh(f)p Fi(G)1168 1303 y Fe(1)1188 1296 y Fi(;)8 b(:)g(:)g(:)f(;)h(G)1335 1303 y Fd(t)1350 1296 y Fh(g)p Fi(:)81 1356 y Fp(Output:)25 b Fj(The)17 b(likeliho)n(o)n(d) 186 1416 y Fi(l)q(ik)r(e)12 b Fh( )i Fo(0)186 1476 y Fp(F)-5 b(or)16 b Fo(eac)o(h)g(v)o(ector)f([)p Fi(g)576 1483 y Fe(1)596 1476 y Fi(;)8 b(:)g(:)g(:)f(;)h(g)728 1483 y Fd(t)743 1476 y Fo(])14 b Fh(2)g Fi(G)856 1483 y Fe(1)887 1476 y Fh(\002)d(\001)d(\001)g(\001)j(\002)g Fi(G)1094 1483 y Fd(t)257 1537 y Fo(1.)22 b(Compute)15 b(the)h(lik)o(eliho)q(o)q(d)g(of)g(the)g(lo)q(opless)h(p)q(edigree)f (conditional)347 1597 y(on)h Fi(b)436 1604 y Fd(i)466 1597 y Fo(and)g Fi(b)582 1579 y Fc(0)582 1609 y Fd(i)612 1597 y Fo(ha)o(ving)f(the)g(same)f(genot)o(yp)q(e)h Fi(g)1205 1604 y Fd(i)1220 1597 y Fo(,)g(for)g Fi(i)e Fo(=)f(1)p Fi(;)8 b(:)g(:)g(:)g(t:)257 1657 y Fo(2.)22 b(Sum)15 b(the)h(conditional)g(lik)o(eliho)q(o)q(d)f(in)o(to)h Fi(l)q(ik)r(e)p Fo(.)186 1717 y Fp(return)i Fi(l)q(ik)r(e)73 1847 y Fo(Let)f Fi(G)f Fo(=)f Fi(G)306 1854 y Fe(1)337 1847 y Fh(\002)d(\001)c(\001)g(\001)j(\002)h Fi(G)546 1854 y Fd(t)561 1847 y Fo(.)23 b(Link)m(age)18 b(analysis)f (computations)g(can)g(b)q(e)g(slo)o(w)g(when)g(the)g(Cartesian)0 1907 y(pro)q(duct)d(set)f Fi(G)h Fo(of)f(p)q(ossible)g(lo)q(op)h(break) o(er)f(genot)o(yp)q(es)g(is)g(large.)20 b(Let)14 b Fh(j)p Fi(G)1355 1914 y Fd(i)1369 1907 y Fh(j)f Fo(and)h Fh(j)p Fi(G)p Fh(j)f Fo(denote)g(the)g(sizes)g(of)0 1967 y Fi(G)38 1974 y Fd(i)65 1967 y Fo(and)f Fi(G)h Fo(resp)q(ectiv)o(ely)l(.)k(The) 12 b Fj(lo)n(op)i(br)n(e)n(aker)f(sele)n(ction)h Fo(\(LBS\))e(problem)e (is)i(to)h(\014nd)f(a)h(set)f(of)g(individuals)0 2028 y(to)17 b(clone)e(so)i(as)g(to)g(minim)o(iz)o(e)c Fh(j)p Fi(G)p Fh(j)h Fo(=)704 1994 y Fb(Q)743 2038 y Fd(i)766 2028 y Fh(j)p Fi(G)818 2035 y Fd(i)832 2028 y Fh(j)p Fo(,)i(or)g(equiv)m(alen)o(tly)l(,)e(to)i(minimi)o(ze)d(log)c Fh(j)p Fi(G)p Fh(j)14 b Fo(=)g(\006)1722 2035 y Fd(i)1745 2028 y Fo(log)9 b Fh(j)p Fi(G)1868 2035 y Fd(i)1882 2028 y Fh(j)p Fo(.)73 2088 y(The)23 b(lo)q(op)g(break)o(er)f(selection)f (problem)g(applies)h(to)h(implem)o(en)n(tations)d(of)j(the)f (Elston-Stew)o(art)0 2148 y(algorithm)d(in)g(all)h(v)o(ersions)f(of)h Fk(linka)o(ge/f)l(astlin)o(k)p Fo(.)29 b(Other)20 b(algorithms)f(for)h (tra)o(v)o(ersal)f(of)h(lo)q(op)q(ed)0 2208 y(p)q(edigrees,)14 b(also)h(called)f Fj(p)n(e)n(eling)p Fo(,)h(w)o(ere)f(prop)q(osed)i (and)f(implem)o(en)o(te)o(d)d(b)o(y)i(Cannings,)i(Thompson,)e(and)0 2268 y(Sk)o(olnic)o(k)c([11)q(],)i(and)g(b)o(y)g(Lange)h(and)g(Bo)q (ehnk)o(e)e([13)q(].)19 b(A)12 b(related)f(algorithm)g(for)i(p)q (eeling)e(a)i(lo)q(op)q(ed)g(graph)0 2328 y(w)o(as)18 b(considered)e(in)h(a)h(more)e(abstract,)i(non-genetic)f(setting)g(b)o (y)g(Lauritzen)g(and)h(Spiegelhalter)e([14].)0 2389 y(That)j(setting)f (is)g(describ)q(ed)g(in)f(the)h(next)g(section.)27 b(Subsequen)o(t)17 b(pap)q(ers)j([15,)e(16,)g(17)q(])g(dev)o(elop)f(opti-)0 2449 y(mization)12 b(algorithms)h(for)h(\014nding)g(a)h(go)q(o)q(d)h(p) q(eeling)d(order)h(for)g(the)g(Lauritzen-Spiegelhalter)e(metho)q(d.)0 2509 y(These)k(algorithms)g(ha)o(v)o(e)f(not)i(y)o(et)e(b)q(een)h (applied)g(to)h(genetic)e(link)m(age)h(analysis.)73 2569 y(Users)c(of)g Fk(linka)o(ge/f)l(astlin)o(k)d Fo(m)o(ust)i(curren)o (tly)f(solv)o(e)i(instances)g(of)g(the)g(LBS)g(problem)f(man)o(ually)0 2629 y(or)j(with)f(the)h(assistance)g(of)f(a)h(prepro)q(cessor)h (program)e(called)f Fk(loops)g Fo([18)q(])h(whic)o(h)g(iden)o(ti\014es) f(lo)q(ops)i(in)g(a)0 2690 y(giv)o(en)e(p)q(edigree.)20 b Fk(loops)11 b Fo(analyzes)h(a)i(p)q(edigree)e(and)h(rep)q(orts)h(a)f (set)g(of)g(lo)q(ops)h(\(if)e(an)o(y\))h(that)g(it)f(con)o(tains.)0 2750 y(According)k(to)g([19)q(],)f(pp.)21 b(93{96,)d(the)e(suggested)h (usage)g(of)g Fk(loops)d Fo(is:)963 2874 y(6)p eop %%Page: 7 7 7 6 bop 60 100 a Fo(1.)24 b(Run)16 b Fk(loops)f Fo(on)i(the)f(curren)o (t)f(p)q(edigree.)60 196 y(2.)24 b(If)16 b Fk(loops)e Fo(rep)q(orted)j(at)f(least)h(one)f(lo)q(op,)h(c)o(ho)q(ose)f(an)h (individual)e Fi(p)i Fo(in)f(one)g(lo)q(op)h(to)g(clone.)60 293 y(3.)24 b(If)16 b Fi(p)g Fo(is)g(selected)f(in)h(step)g(2,)h(clone) e Fi(p)i Fo(and)g(all)f(previously)f(selected)g(lo)q(op)i(break)o(ers.) 0 379 y(These)h(steps)h(are)f(rep)q(eated)g(un)o(til)g Fk(loops)e Fo(do)q(es)k(not)e(\014nd)h(an)o(y)f(more)f(lo)q(ops.)29 b(The)18 b(pro)q(cedure)g(is)h(not)0 440 y(di\016cult)e(to)i(use)g(to)g (get)g(a)g(v)m(alid)f(lo)q(op)i(break)o(er)e(set.)28 b(Using)19 b(this)g(pro)q(cedure)f(guaran)o(tees)i(a)f(solution)0 500 y(to)f(LBS)g(that)h(is)f Fj(minimal)g Fo(in)g(the)f(sense)h(that)h (no)f(lo)q(op)h(break)o(ers)e(can)h(b)q(e)g(omitted.)25 b(The)18 b(pro)q(cedure)0 560 y(do)q(es)23 b(not)g(guaran)o(tee)g(a)g (solution)f(to)h(LBS)g(that)g(is)f(minim)n(um)c(in)k(the)g(n)o(um)o(b)q (er)f(of)i(lo)q(op)g(break)o(ers.)0 620 y(F)l(urthermore,)16 b(there)h(is)g(no)h(explicit)d(guidance)j(on)g(ho)o(w)g(to)g(c)o(ho)q (ose)g(the)f(lo)q(op)h(and)g(the)g(lo)q(op)g(break)o(er)0 680 y Fi(p)f Fo(at)f(step)h(2,)f(so)h(that)f Fh(j)p Fi(G)p Fh(j)h Fo(is)f(minim)o(ize)o(d.)0 844 y Fl(3)81 b(Bac)n(kground)27 b(from)g(other)g(\014elds)0 954 y Fo(The)15 b(statistics)f(and)i (arti\014cial)e(in)o(telligence)e(literature)h(\(e.g.,)h([14,)h(20]\),) g(treat)f(the)h(follo)o(wing)g(problem)0 1014 y(in)i(whic)o(h)g(lo)q (op)h(break)o(er)e(selection)h(arises)g(as)h(a)g(subproblem.)23 b(The)18 b(input)f(is)g(a)h(directed)e(graph)i(with)0 1074 y(no)j(directed)d(cycles)h(suc)o(h)h(that)h(eac)o(h)e(v)o(ertex)g Fi(v)i Fo(corresp)q(onds)h(to)e(a)h(random)e(v)m(ariable)h Fi(x)1717 1081 y Fd(v)1758 1074 y Fo(and)g(suc)o(h)0 1134 y(that)643 1194 y Fi(P)7 b Fo(\()p Fi(x)728 1201 y Fe(1)748 1194 y Fi(;)h(:)g(:)g(:)f(;)h(x)885 1201 y Fd(n)908 1194 y Fo(\))14 b(=)993 1153 y Fb(Y)1010 1240 y Fd(v)1054 1194 y Fi(P)7 b Fo(\()p Fi(x)1139 1201 y Fd(v)1159 1194 y Fh(j)p Fi(X)1213 1202 y Fd(A)p Fe(\()p Fd(v)q Fe(\))1288 1194 y Fo(\))0 1305 y(where)17 b Fi(X)182 1313 y Fd(A)p Fe(\()p Fd(v)q Fe(\))273 1305 y Fo(are)g(the)g(random)g (v)m(ariables)g(corresp)q(onding)g(to)h(the)f(v)o(ertices)e Fh(f)p Fi(a)f Fo(:)h Fi(a)f Fh(!)h Fi(v)j Fo(is)e(an)h(edge)p Fh(g)p Fo(.)0 1365 y(The)j(output)g(is)g(the)f(probabilit)o(y)g Fi(P)7 b Fo(\()p Fi(Y)31 b Fo(=)20 b Fi(y)r Fh(j)p Fi(Z)j Fo(=)d Fi(z)r Fo(\))f(for)h(an)o(y)g(giv)o(en)f(disjoin)o(t)g(subsets)h (of)g(v)m(ariables)0 1426 y Fi(Y)s(;)8 b(Z)25 b Fh(\032)d(f)p Fi(x)225 1433 y Fe(1)244 1426 y Fi(;)8 b(:)g(:)g(:)g(;)g(x)382 1433 y Fd(n)405 1426 y Fh(g)p Fo(.)34 b(This)21 b(problem)f(is)g (called)g(the)h Fj(infer)n(enc)n(e)h(pr)n(oblem)p Fo(;)h(it)d(includes) g(ev)m(aluating)0 1486 y(the)d(p)q(edigree)g(lik)o(eliho)q(o)q(d)f(in)h (link)m(age)f(analysis)i(as)g(a)f(sp)q(ecial)g(case.)24 b(The)17 b(inference)f(problem)f(is)i(more)0 1546 y(general)f(since)g (the)g(random)f(v)m(ariables)h(can)h(b)q(e)f(discrete,)f(Gaussian,)i (com)o(bination)e(thereof,)g(or)i(other)0 1606 y(t)o(yp)q(es,)c(and)h (there)f(could)g(b)q(e)g(an)o(y)h(structure)f(to)g(the)g(graph)i(as)f (long)f(as)h(it)f(has)h(no)g(directed)e(cycles.)19 b(The)0 1666 y(graph)d(together)e(with)h(the)f(probabilit)o(y)g(distribution)g (is)g(called)g(a)h Fj(Bayesian)h(network)p Fo(.)22 b(The)15 b(inference)0 1727 y(problem)e(has)j(application)e(in)h(domains)f (where)g(a)h(probabilit)o(y)f(distribution)g(serv)o(es)g(as)i(a)f(mo)q (del,)e(suc)o(h)0 1787 y(as)k(economics,)d(so)q(ciology)l(,)i (arti\014cial)g(in)o(telligence,)d(error)j(correcting)g(co)q(des,)g (and)h(other)f(\014elds.)73 1847 y(Kim)22 b(and)h(P)o(earl)g([21])g (dev)o(elop)q(ed)f(a)i(metho)q(d)e(to)i(solv)o(e)e(the)h(inference)f (problem)g(for)h(Ba)o(y)o(esian)0 1907 y(net)o(w)o(orks)17 b(without)h(lo)q(ops)g(and)h(P)o(earl)d([22)q(],)h(una)o(w)o(are)g(of)h ([8,)f(9)q(],)g(extended)f(it)h(to)h(Ba)o(y)o(esian)e(net)o(w)o(orks)0 1967 y(with)e(lo)q(ops)g(\(see)f(also)i([6]\).)k(P)o(earl's)13 b(metho)q(d)g(includes)g(a)h(m)o(ulti-cop)o(y)d(extension)i(of)h(the)f (Lange-Elston)0 2028 y(cloning)18 b(op)q(eration.)27 b(Supp)q(ose)19 b(that)f(individual)f Fi(i)g Fo(to)i(b)q(e)f(cloned)f (has)i(outgoing)g(edges)f Fi(i)e Fh(!)h Fi(m)1826 2035 y Fe(1)1845 2028 y Fi(;)8 b(i)16 b Fh(!)0 2088 y Fi(m)43 2095 y Fe(2)62 2088 y Fi(;)8 b(:)g(:)g(:)g(;)g(i)15 b Fh(!)i Fi(m)314 2095 y Fd(k)335 2088 y Fo(.)25 b(Then)18 b(it)f(is)g(p)q(ossible)h(to)g(clone)f Fi(i)g Fo(with)h Fi(k)i Fo(new)d(copies)h Fi(m)1457 2095 y Fe(1)1476 2088 y Fi(;)8 b(:)g(:)g(:)f(m)1606 2095 y Fd(k)1627 2088 y Fo(.)26 b(Making)17 b(more)0 2148 y(than)g(2)h(copies)e(do)q(es)i(not)f (c)o(hange)g(the)g(applicabilit)o(y)e(of)i(the)g(Lange-Elston)h (algorithm)e(that)i(iterates)0 2208 y(o)o(v)o(er)f Fi(G)h Fo(nor)g(do)q(es)g(it)g(c)o(hange)f(the)h(size)e(of)i Fi(G)p Fo(.)26 b(The)18 b(generalized)e(lo)q(op)j(break)o(er)e (selection)f(problem)g(is)0 2268 y(to)h(\014nd)g(a)h(set)e(of)h (individuals)f(to)h(clone)g(and)g(the)g(n)o(um)o(b)q(er)e(of)i(copies)f (of)i(eac)o(h)e(so)h(as)h(to)f(minimi)o(ze)c(the)0 2328 y(pro)q(duct)183 2295 y Fb(Q)222 2339 y Fd(i)245 2328 y Fh(j)p Fi(G)297 2335 y Fd(i)311 2328 y Fh(j)j Fo(or)h(equiv)m(alen)o (tly)d(the)i(sum)859 2295 y Fb(P)903 2339 y Fd(i)925 2328 y Fo(log)9 b Fh(j)p Fi(G)1048 2335 y Fd(i)1063 2328 y Fh(j)p Fo(.)73 2389 y(P)o(earl's)17 b(cloning)g(has)h(a)g(v)o(ery)f (practical)f(and)i(sp)q(eci\014c)f(application)h(for)f(marriage)g (graphs.)26 b(When)0 2449 y(the)15 b(individual)f Fi(i)h Fo(to)g(b)q(e)g(cloned)g(participates)g(in)f Fj(multiple)k(marriages)d Fo(one)g(can)g(mak)o(e)f(m)o(ultiple)e(clone)0 2509 y(copies)20 b(of)h Fi(i)p Fo(,)f(one)h(p)q(er)f(marriage.)32 b(It)20 b(is)g(clear)g(that)h(this)f(w)o(as)h(not)g(observ)o(ed)e(b)o(y)h(the)g (dev)o(elop)q(ers)g(of)0 2569 y Fk(linka)o(ge)e Fo(b)q(ecause)h(the)h (constan)o(t)g(2)f(is)h(hard-co)q(ded)g(\(i.e.,)f(not)h(represen)o(ted) e(sym)o(b)q(olically\))e(for)k(the)0 2629 y(n)o(um)o(b)q(er)13 b(of)h(p)q(ossible)h(copies)f(of)h(an)f(individual)g(in)g(man)o(y)f (places)h(in)g(the)g(soft)o(w)o(are.)20 b(W)l(e)15 b(ha)o(v)o(e)e(mo)q (di\014ed)0 2690 y Fk(f)l(astlink)g Fo(to)i(allo)o(w)g(m)o(ulti-cop)o (y)d(cloning,)j(and)g(w)o(e)g(illustrate)f(in)g(the)h(results)g (section)f(ho)o(w)i(b)q(ene\014cial)0 2750 y(it)g(is)g(for)g(sp)q(eed.) 963 2874 y(7)p eop %%Page: 8 8 8 7 bop 73 100 a Fo(In)16 b(Ba)o(y)o(esian)f(net)o(w)o(orks)h(eac)o(h)g (v)o(ertex)e Fi(v)k Fo(can)e(b)q(e)g(selected)f(as)i(a)g(lo)q(op)g (break)o(er)e(but)h(if)g Fi(v)h Fo(is)f(selected)0 160 y(it)j(do)q(es)i(not)g(break)e(lo)q(ops)i(formed)e(b)o(y)g(tra)o(v)o (ersing)h(a)g(path)g Fi(a)g Fh(!)g Fi(v)h Fh( )f Fi(b)p Fo(,)g(where)g(b)q(oth)h(edges)f(p)q(oin)o(t)0 220 y(in)o(to)c Fi(v)i Fo(\(b)q(ecause)e(once)g(the)h(v)m(alue)f(of)g Fi(v)i Fo(is)e(kno)o(wn,)g Fi(a)g Fo(and)h Fi(b)f Fo(b)q(ecome)f(dep)q (enden)o(t)h(and)h(a)g(virtual)e(edge)0 280 y(connects)20 b(them\).)32 b(The)20 b(theory)g(explaining)g(this)g(constrain)o(t)g (is)h(dev)o(elop)q(ed)e(in)h([6])g(and)h(it)e(is)i(based)0 340 y(on)c(a)g(graph-theoretic)f(criterion)f(called)h(d-separation)h (that)g(fully)e(c)o(haracterizes)g(whic)o(h)g(v)o(ertices)g(are)0 401 y(conditionally)f(indep)q(enden)o(t)h(of)h(others)f([23)q(].)20 b(This)15 b(criterion)g(is)g(used)g(to)h(justify)f(an)o(y)g(solution)h (to)f(the)0 461 y(inference)e(problem)h(b)q(ecause)h(an)o(y)g(solution) g(m)o(ust)f(use)h(the)g(prop)q(erties)g(of)g(conditional)g(indep)q (endence)0 521 y(in)j(order)h(to)g(b)q(e)g(e\016cien)o(t.)27 b(F)l(or)18 b(marriage)g(graphs)i(the)e(selection)g(of)h(lo)q(op)g (break)o(ers)g(is)f(conceptually)0 581 y(easier)e(b)q(ecause)h (marriage)f(v)o(ertices)f(cannot)i(b)q(e)g(selected)e(and)i(therefore,) f(the)h Fi(a)d Fh(!)g Fi(v)i Fh( )f Fi(b)h Fo(condition)0 641 y(do)q(es)d(not)g(constrain)g(the)g(lo)q(op)g(break)o(er)f (selection.)19 b(Consequen)o(tly)l(,)12 b(in)g(marriage)g(graphs)i(the) e(direction)0 702 y(of)j(the)f(edges)h(can)f(b)q(e)h(ignored)g(for)g (the)f(purp)q(ose)h(of)g(\014nding)g(lo)q(op)g(break)o(ers)f(\(but)h (not)g(for)g(the)f(purp)q(ose)0 762 y(of)j(lik)o(eliho)q(o)q(d)e (computations\).)73 822 y(F)l(or)f(Ba)o(y)o(esian)f(net)o(w)o(orks,)h (Suermon)o(t)e(and)j(Co)q(op)q(er)h([24])d(sho)o(w)o(ed)h(that)h(the)f (LBS)g(problem)e(b)q(elongs)0 882 y(to)20 b(a)g(class)g(of)h(in)o (tractable)d(problems)h(that)h(computer)f(scien)o(tists)f(call)h (NP-complete.)30 b(This)20 b(means)0 942 y(that)g(it)f(is)g(highly)g (unlik)o(ely)e(that)j(there)f(is)g(an)h(algorithm)e(to)i(solv)o(e)f (the)g(problem)f(optimally)f(whose)0 1002 y(computation)c(time)e(gro)o (ws)k(as)f(a)g(p)q(olynomial)e(in)h(the)g(n)o(um)o(b)q(er)f(of)i(v)o (ertices.)k(A)13 b(similar)f(result)h(holds)h(for)0 1063 y(undirected)f(graphs)j(as)f(w)o(ell.)k(F)l(or)c(undirected)e(graphs)i (\014nding)g(a)g(set)f(of)h(v)o(ertices)d(whose)j(remo)o(v)m(al)e (\(or,)0 1123 y(equiv)m(alen)o(tly)l(,)g(cloning\))h(creates)h(a)g (graph)h(with)f(no)h(cycles)e(is)g(kno)o(wn)i(in)e(com)o(binatorial)g (optimization)0 1183 y(as)24 b(the)f(\\)p Fj(fe)n(e)n(db)n(ack)h (vertex)h(set)k Fo(problem,")23 b(and)h(it)e(w)o(as)i(one)f(of)h(the)e (\014rst)i(problems)e(sho)o(wn)h(to)h(b)q(e)0 1243 y(NP-complete)14 b(in)i(the)g(seminal)e(w)o(ork)i(b)o(y)g(Karp)h([25].)73 1303 y(Based)h(on)h(Karp's)f(NP-completeness)e(result,)i(computer)f (scien)o(tists)g(sough)o(t)i(an)f(algorithm)g(that)0 1364 y(has)k(a)f(computation)f(time)f(p)q(olynomial)h(in)g(the)h(size)f (of)h(the)g(input)f(graph)i Fi(H)j Fo(and)d(adheres)f(to)g(the)0 1424 y(follo)o(wing)16 b(prop)q(ert)o(y:)122 1526 y(If)178 1513 y(^)167 1526 y Fi(G)d Fo(is)g(the)f(minim)o(um)n(-size)d(set)k(of) g(genot)o(yp)q(e)g(v)o(ectors)f(for)h(lo)q(op)h(break)o(ers)e(of)h (graph)g Fi(H)k Fo(and)122 1586 y Fi(G)g Fo(is)f(set)g(of)g(genot)o(yp) q(e)h(v)o(ectors)e(found)i(b)o(y)f(the)g(lo)q(op)h(break)o(er)e (selection)g(algorithm,)g(then)122 1646 y(one)h(is)g(guaran)o(teed)h (that)g(log)9 b Fh(j)p Fi(G)p Fh(j)14 b(\024)g Fi(c)d Fh(\002)f Fo(log)g Fh(j)999 1633 y Fo(^)988 1646 y Fi(G)p Fh(j)p Fo(,)16 b(where)g Fi(c)d(>)h Fo(1)j(is)f(some)f(error)h(constan) o(t.)0 1748 y(Suc)o(h)f(an)h(algorithm)e(is)h(called)f(a)i Fj(c)n(onstant)h(appr)n(oximation)f(algorithm)p Fo(.)21 b(The)16 b(\014rst)f(constan)o(t)h(appro)o(xi-)0 1808 y(mation)f(algorithm)g(for)h(lo)q(op)h(break)o(er)e(selection)g(is)h (giv)o(en)f(in)h([26])g(\(whic)o(h)f(app)q(eared)i(in)f(a)g(conference) 0 1868 y(v)o(ersion)c(in)g(early)f(1994\).)22 b(The)12 b(error)h(constan)o(t)f(is)h(4,)g(and)g(the)f(algorithm)f(assures)i (this)g(constan)o(t)f(only)h(if)0 1928 y(the)g(sizes)g(of)g Fh(j)p Fi(G)294 1935 y Fd(i)309 1928 y Fh(j)p Fi(;)8 b(i)13 b Fo(=)h(1)8 b Fi(:)g(:)g(:)g(t)13 b Fo(are)g(all)g(equal.)19 b(A)13 b(constan)o(t)h(appro)o(ximation)e(algorithm)g(that)i(w)o(orks)f (also)0 1988 y(when)i(the)f(sizes)g(of)h Fh(j)p Fi(G)424 1995 y Fd(i)439 1988 y Fh(j)p Fi(;)8 b(i)13 b Fo(=)g(1)8 b Fi(:)g(:)g(:)h(t)14 b Fo(are)h(not)g(necessarily)e(equal)h(is)h (describ)q(ed)f(in)g([27)q(].)20 b(A)14 b(full)g(analysis)0 2049 y(of)h(this)g(algorithm,)e(whic)o(h)i(ac)o(hiev)o(es)e(an)i(error) g(constan)o(t)g(of)g(2,)g(is)g(giv)o(en)f(in)g([28)q(].)20 b(A)14 b(similar)f(algorithm)0 2109 y(is)18 b(also)h(giv)o(en)e(in)h ([29)q(].)27 b(The)18 b(cited)f(error)i(constan)o(ts)g(are)f (determined)e(b)o(y)i(a)g(w)o(orst-case)h(analysis;)g(in)0 2169 y(practice)d(these)g(algorithms)g(usually)h(\014nd)g(closer)f(to)h (optimal)f(solutions,)h(esp)q(ecially)e(when)i(there)f(are)0 2229 y(few)g(lo)q(ops.)22 b(W)l(e)15 b(use)h(the)f(simplest)f(greedy)h (algorithm)g(analyzed)g(in)h([28])f(as)i(part)f(of)g(our)g(h)o(ybrid)f (lo)q(op)0 2289 y(breaking)h(algorithm.)0 2456 y Fl(4)81 b(Metho)r(ds)0 2565 y Fo(Our)24 b(lo)q(op)g(break)o(er)f(selection)g (algorithm)g(is)g(implem)o(en)o(ted)d(b)o(y)k(mo)q(difying)e Fk(f)l(astlink)j(3.0p)e Fo([30].)0 2625 y(It)g(is)g(impleme)o(n)o(ted)d (almost)j(en)o(tirely)e(as)j(a)g(subroutine)g(called)e(from)h(the)g (prepro)q(cessor)h(program)0 2686 y Fk(unkno)o(wn)p Fo(,)12 b(with)i(a)i(few)e(mo)q(di\014cations)g(elsewhere,)g(primarily)e(for)j (the)g(case)g(of)g(m)o(ultiple)c(marriages.)0 2746 y(This)21 b(program)g(organization)h(implies)d(that)j(the)f(p)q(edigree)f(is)h (input)g(with)g(a)h(set)f(of)h(lo)q(op)g(break)o(ers)963 2874 y(8)p eop %%Page: 9 9 9 8 bop 0 100 a Fo(selected)11 b(b)o(y)i(the)g(user,)g(p)q(erhaps)g (with)g(the)g(assistance)g(of)g(the)g Fk(loops)f Fo([18])g(program.)20 b(If)13 b(our)g(algorithm)0 160 y(can)20 b(\014nd)g(a)g(b)q(etter)g (set)g(of)g(lo)q(op)g(break)o(ers,)g(the)g(in)o(termediate)c(represen)o (tation)k(of)g(the)f(p)q(edigree)h(\014le)0 220 y(\()p Fa(pedfile.da)o(t)13 b Fo(and)k Fa(ipedfile.da)o(t)p Fo(\))c(is)j(mo)q(di\014ed)f(accordingly)l(.)21 b(Our)c(metho)q(d)e (could)h(free)g(the)g(user)0 280 y(completely)10 b(from)i(the)h(burden) g(of)h(selecting)e(a)h(lo)q(op)h(break)o(er)f(set,)g(but)g(this)g (deviates)g(from)f(en)o(trenc)o(hed)0 340 y(patterns)22 b(of)g(usage)h(for)f(the)g Fk(linka)o(ge)e Fo(pac)o(k)m(age.)38 b Fk(f)l(astlink)20 b Fo(is)i(a)o(v)m(ailable)f(b)o(y)g(anon)o(ymous)h (ftp)g(at)0 401 y Fa(fastlink.n)o(ih.)o(go)o(v)13 b Fo(in)j(the)g(sub)q (directory)g Fa(pub/fastlin)o(k)p Fo(.)73 461 y(W)l(e)g(compared)f Fk(f)l(astlink)p Fo(,)e(v)o(ersion)i Fk(3.0p)g Fo(to)h(the)g(new)f(v)o (ersion)h(on)g(some)f(data)h(sets)g(with)g(lo)q(op)q(ed)0 521 y(p)q(edigrees.)21 b(All)14 b(the)i(runs)g(w)o(ere)f(done)h(using)h Fk(ILINK)p Fo(.)e(W)l(e)h(use)f(a)i(three-lo)q(cus)f(run)g(\(disease)f (plus)h(t)o(w)o(o)0 581 y(mark)o(ers\))11 b(in)h(eac)o(h)g(case,)g (except)f(ALZ,)h(where)g(the)g(data)i(set)e(has)h(only)f(one)h(mark)o (er)d(lo)q(cus.)20 b(The)13 b(timing)0 641 y(exp)q(erimen)o(ts)h(w)o (ere)i(run)h(on)g(an)h(unloaded)f(Sun)g(SP)l(AR)o(CStation)g(20)g (computer)e(with)i(128)h(Mb)o(ytes)e(of)0 702 y(RAM.)k(This)i(mac)o (hine)d(runs)j(the)f(op)q(erating)i(system)d(SunOS,)h(v)o(ersion)g (5.5,)i(whic)o(h)d(is)i(also)g(kno)o(wn)0 762 y(as)f(Solaris,)g(v)o (ersion)f(2.5,)h(and)g(is)f(an)g(impleme)o(n)o(tation)e(of)i(UNIX.)e(T) l(o)j(compile)d(all)i(v)o(ersions)g(of)g(the)0 822 y(programs)f(w)o(e)g (used)g(the)g Fa(gcc)g Fo(compiler,)e(v)o(ersion)h(2.7.2)i(using)f(the) g Fa(-O)g Fo(\015ag)h(for)g(optimization.)28 b(The)0 882 y(times)17 b(rep)q(orted)j(in)e(the)h(next)g(section)f(are)i(the)e (sum)h(of)g(the)g(user)g(and)h(system)d(times)g(giv)o(en)i(b)o(y)f(the) 0 942 y Fa(time)e Fo(command.)21 b(In)c(those)h(cases)f(where)g(the)f (new)h(algorithm)f(\014nds)i(a)g(b)q(etter)e(set)h(of)h(lo)q(op)g (break)o(ers)0 1002 y(w)o(e)e(also)h(rep)q(ort)f(estimates)f(of)h(the)g (di\013erence)g(in)g(the)g(n)o(um)o(b)q(er)e(of)j(lo)q(op)g(break)o(er) e(v)o(ectors)h(\(i.e.,)e Fh(j)p Fi(G)p Fh(j)p Fo(\).)0 1169 y Fl(5)81 b(New)27 b(Algorithm)0 1278 y Fo(Our)16 b(main)e(con)o(tributions)h(are)h(the)f(dev)o(elopmen)o(t)e(of)j(a)g (fast)g(algorithm)f(for)h(the)f(lo)q(op)h(breaking)g(selec-)0 1339 y(tion)i(problem)f(using)i(generalized)e(cloning,)h(and)h(a)f (demonstration,)g(on)h(real)f(data,)h(of)g(a)f(signi\014can)o(t)0 1399 y(impro)o(v)o(em)o(en)n(t)12 b(in)i(running)h(time)d(of)j(link)m (age)f(computations.)20 b(As)14 b(a)h(subroutine)g(of)f(our)h (algorithm,)e(w)o(e)0 1459 y(dev)o(elop)q(ed)h(another)i(LBS)f (algorithm,)f(termed)f Fk(Sp)m(anningTree)p Fo(,)g(whic)o(h)h(is)h (guaran)o(teed)g(to)h(pro)q(duce)0 1519 y(an)h Fj(optimal)k Fo(lo)q(op)c(break)o(er)e(set)h(whenev)o(er)f(the)h(input)f(p)q (edigree)h(has)h(no)f(m)o(ultiple)d(marriages.)20 b(In)c(this)0 1579 y(section)k(w)o(e)g(\014rst)h(describ)q(e)f(the)g(spanning)h(tree) f(algorithm,)g(then)g(w)o(e)g(describ)q(e)g(our)h(main)e(LBS)i(al-)0 1640 y(gorithm)15 b(for)i(general)f(p)q(edigrees,)g Fk(LoopBreaker)p Fo(,)e(and,)j(\014nally)l(,)e(w)o(e)h(conclude)g(with)g(exp)q(erimen)o (tal)0 1700 y(results.)73 1760 y(Marriage)h(graphs)i(ha)o(v)o(e)d(the)h (prop)q(ert)o(y)g(that)h(ev)o(ery)e(path)h(alternates)g(b)q(et)o(w)o (een)g(a)g(v)o(ertex)f(from)g Fi(I)t Fo(,)0 1820 y(represen)o(ting)g (an)h(individual,)e(and)i(a)g(v)o(ertex)e(from)g Fi(M)5 b Fo(,)17 b(represen)o(ting)e(a)i(marriage.)k(Whenev)o(er)16 b(ev)o(ery)0 1880 y(individual)g(is)h(married)e(at)j(most)e(once,)h (eac)o(h)f(v)o(ertex)g Fi(i)h Fo(in)f Fi(I)21 b Fo(has)d(at)f(most)f(t) o(w)o(o)h(neigh)o(b)q(oring)h(v)o(ertices)0 1941 y Fi(m)43 1948 y Fe(1)77 1941 y Fo(and)d Fi(m)213 1948 y Fe(2)247 1941 y Fo(represen)o(ting)f(the)h(marriage)e(that)i(brough)o(t)h Fi(i)e Fo(ab)q(out)i(and)f(the)g(one)f(marriage)g(that)h Fi(i)g Fo(ma)o(y)0 2001 y(participate)i(in.)24 b(W)l(e)17 b(can)h(no)o(w)f(apply)h(the)f(follo)o(wing)g(three)f(transformations.) 25 b(First,)17 b(ev)o(ery)f(path)i(of)0 2061 y(the)e(form)f Fi(m)242 2068 y Fe(1)275 2061 y Fh(!)f Fi(i)f Fh(!)h Fi(m)476 2068 y Fe(2)512 2061 y Fo(is)i(replaced)f(with)h(an)h(edge)f Fi(m)1086 2068 y Fe(1)1119 2061 y Fh(\000)-17 b(\000)14 b Fi(m)1237 2068 y Fe(2)1256 2061 y Fo(.)21 b(Second,)16 b(ev)o(ery)f(individual)g Fi(i)h Fo(that)0 2121 y(is)d(not)h(married)d (is)i(remo)o(v)o(ed)e(from)h(the)h(marriage)f(graph)i(along)g(with)f (the)g(edge)h Fi(m)1541 2128 y Fe(1)1574 2121 y Fh(!)f Fi(i)p Fo(.)20 b(Third,)14 b(ev)o(ery)0 2181 y(founder)19 b Fi(i)f Fo(is)g(remo)o(v)o(ed)e(from)i(the)g(marriage)f(graph)j(along) f(with)f(the)h(edge)f Fi(i)f Fh(!)h Fi(m)1602 2188 y Fe(2)1621 2181 y Fo(.)28 b(The)18 b(resulting)0 2241 y(undirected)d(graph)i(is)e(denoted)h(b)o(y)f Fi(H)722 2223 y Fc(0)734 2241 y Fo(.)21 b(The)16 b(v)o(ertex)e(set)i(of)g Fi(H)1191 2223 y Fc(0)1219 2241 y Fo(is)g Fi(M)21 b Fo(and)16 b(ev)o(ery)f(edge)g(represen)o(ts)h(an)0 2302 y(individual.)25 b(W)l(e)17 b(no)o(w)h(set)g(the)g(w)o(eigh)o(t)f Fi(w)q Fo(\()p Fi(e)p Fo(\))g(of)h(eac)o(h)g(edge)f Fi(e)h Fo(in)f Fi(H)1299 2284 y Fc(0)1329 2302 y Fo(to)h(b)q(e)g(log)9 b Fh(j)p Fi(G)1581 2309 y Fd(i)1596 2302 y Fh(j)p Fo(|the)17 b(logarithm)0 2362 y(of)g(the)f(n)o(um)o(b)q(er)e(of)j(genot)o(yp)q(es) f(of)h(the)f(corresp)q(onding)h(individual.)73 2422 y(Solving)d(the)f (LBS)h(problem)e(is)i(equiv)m(alen)o(t)e(to)i(remo)o(ving)e(a)i(set)f (of)h(edges)g(whose)g(sum)f(of)h(w)o(eigh)o(ts)f(is)0 2482 y(minim)n(um)d(from)i(the)i(undirected)e(graph)j Fi(H)828 2464 y Fc(0)854 2482 y Fo(suc)o(h)e(that)h(w)o(e)f(remain)f (with)i(a)g(tree.)20 b(This)14 b(is)f(an)h(instance)0 2542 y(of)f(the)f(w)o(ell)g(studied)g(maxim)o(um)c(spanning)14 b(tree)e(problem)f(in)h(com)o(binatorial)f(optimization)g(app)q(earing) 0 2603 y(in)i(virtually)f(ev)o(ery)g(text)g(b)q(o)q(ok)j(on)f(graph)g (algorithms)f(\(e.g.,)f([31]\).)20 b(One)13 b(simple)e(algorithmic)h (solution)0 2663 y(is)17 b(as)i(follo)o(ws.)25 b(Start)18 b(with)f(an)h(empt)o(y)e(graph)i Fi(T)24 b Fo(and)19 b(rep)q(eat)e(the)h(follo)o(wing)f(three)g(steps:)24 b(Select)17 b(an)0 2723 y(edge)j Fi(e)f Fo(in)h Fi(H)262 2705 y Fc(0)294 2723 y Fo(with)g(maxim)n(um)c(w)o(eigh)o(t)j Fi(w)q Fo(\()p Fi(e)p Fo(\).)32 b(If)20 b Fi(e)f Fo(do)q(es)i(not)f (create)g(a)g(cycle)e(in)i Fi(T)7 b Fo(,)20 b(add)g(it)g(to)g Fi(T)7 b Fo(.)963 2874 y(9)p eop %%Page: 10 10 10 9 bop 0 100 a Fo(Remo)o(v)o(e)18 b Fi(e)i Fo(from)f Fi(H)394 82 y Fc(0)406 100 y Fo(.)34 b(This)21 b(algorithm)e(w)o(as)i (sho)o(wn)h(b)o(y)e(Krusk)m(al)g([32)q(])g(to)h(pro)q(duce)g(a)g(tree)e Fi(T)27 b Fo(suc)o(h)0 160 y(that)20 b(the)f(sum)g(of)h(the)f(edge)h(w) o(eigh)o(ts)f(in)g Fi(T)26 b Fo(is)19 b(maxim)o(um)o(.)28 b(Consequen)o(tly)l(,)19 b(the)g(sum)g(of)h(w)o(eigh)o(ts)f(of)0 220 y(the)e(edges)g(left)f(out)i(is)f(minim)n(um)o(.)k(The)c Fj(e)n(dges)h Fo(left)e(out)i(in)e(building)h Fi(T)23 b Fo(from)16 b(the)h(deriv)o(ed)f(graph)i Fi(H)1938 202 y Fc(0)0 280 y Fo(corresp)q(ond)f(to)g(the)f Fj(individuals)h Fo(selected)e(to)h(b)q(e)h(lo)q(op)g(break)o(ers)e(in)h(the)g(marriage) g(graph)h Fi(H)t Fo(.)73 340 y(The)i(con)o(v)o(ersion)f(of)h(the)g (marriage)f(graph)i Fi(H)j Fo(to)c(a)h(graph)g Fi(H)1262 322 y Fc(0)1292 340 y Fo(is)f(needed)f(only)h(for)g(the)g(purp)q(ose)0 401 y(of)24 b(demonstrating)g(via)g(Krusk)m(al's)g(famous)g(result)g (that)g(the)g(join)o(t)g(genot)o(yp)q(e)g(v)o(ector)f(size)h(of)g(the)0 461 y(lo)q(op)18 b(break)o(ers)f(set)g(found)g(b)o(y)g(this)g (algorithm)f(is)h(indeed)g(minim)n(um)o(.)k(Our)c(algorithm)f(can)i(b)q (e)f(easily)0 521 y(describ)q(ed)g(in)g(terms)f(of)i(the)g(marriage)e (graph)j Fi(H)j Fo(itself)16 b(without)i(the)f(transformation)h(to)g (the)f(graph)0 581 y Fi(H)44 563 y Fc(0)56 581 y Fo(,)f(using)g(the)g (notation)h Fi(H)t Fo([)p Fi(V)11 b Fo(].)21 b(The)16 b(notation)h(assumes)f(that)g Fi(V)28 b Fo(is)16 b(a)g(subset)h(of)f (the)g(v)o(ertices)f(of)h Fi(H)t Fo(.)0 641 y(The)h(graph)h Fi(H)t Fo([)p Fi(V)11 b Fo(])16 b(is)h(the)g(undirected)f(graph)h (whose)h(v)o(ertex)d(set)i(is)g Fi(V)28 b Fo(and)17 b(whose)h(edge)f (set)g(consists)0 702 y(of)g(all)e(edges)i(in)f Fi(H)k Fo(that)d(connect)f(t)o(w)o(o)g(v)o(ertices)e(in)i Fi(V)11 b Fo(.)22 b(Our)16 b(algorithm)f(is)h(as)h(follo)o(ws.)73 805 y Fp(ALGORITHM)i(SpanningT)-5 b(ree)81 906 y(Input:)47 b Fj(A)17 b(marriage)g(gr)n(aph)g Fi(H)k Fj(with)d(a)g(marriage)f (vertex)h(set)g Fi(M)5 b Fj(,)186 967 y(an)17 b(individual)i(vertex)g (set)f Fi(I)t Fj(,)e(and)i(a)f(genotyp)n(e)i(ve)n(ctor)e(size)h Fh(j)p Fi(G)1385 974 y Fd(i)1399 967 y Fh(j)g Fj(for)f(e)n(ach)g Fi(i)d Fh(2)g Fi(I)t Fj(.)81 1027 y Fp(Output:)47 b Fj(A)17 b(lo)n(op)g(br)n(e)n(aker)g(set)h Fi(F)24 b Fj(of)17 b(minimum)h(joint)g(genotyp)n(e)g(ve)n(ctor)g(size.)186 1087 y Fi(F)i Fh( )13 b(;)186 1147 y Fp(While)i Fi(I)i Fh(6)p Fo(=)d Fh(;)i Fp(do)257 1207 y Fo(1.)22 b(Pic)o(k)15 b(a)i(v)o(ertex)d Fi(i)g Fh(2)g Fi(I)20 b Fo(for)c(whic)o(h)g Fh(j)p Fi(G)1000 1214 y Fd(i)1014 1207 y Fh(j)g Fo(is)g(maxim)o(um)257 1267 y(2.)22 b Fp(If)16 b Fi(H)t Fo([)p Fi(M)h Fh([)11 b(f)p Fi(i)p Fh(g)p Fo(])k(is)h(not)h(a)f(tree)g Fp(then)g Fi(M)j Fh( )14 b Fi(M)i Fh([)c(f)p Fi(i)p Fh(g)j Fp(else)g Fi(F)21 b Fh( )13 b Fi(F)18 b Fh([)11 b(f)p Fi(i)p Fh(g)257 1328 y Fo(3.)22 b Fi(I)17 b Fh( )d Fi(I)g Fh(n)d(f)p Fi(i)p Fh(g)186 1388 y Fp(return)18 b Fi(F)73 1490 y Fo(When)k(a)g(p)q(edigree)f(con)o(tains)h(m)o(ultiple)d(marriages)h (the)i(transformation)g(from)e Fi(H)26 b Fo(to)c Fi(H)1810 1471 y Fc(0)1844 1490 y Fo(is)g(no)0 1550 y(longer)14 b(justi\014ed)g(and)h(a)f(di\013eren)o(t)g(approac)o(h)h(should)f(b)q (e)h(preferred.)k(The)14 b(idea)g(is)g(that)h(one)f(individual)0 1610 y(that)j(participates)f(in)h(m)o(ultiple)c(marriages)j(can)h(serv) o(e)f(as)h(a)g(lo)q(op)h(break)o(er)e(to)h(sev)o(eral)e(lo)q(ops)j(and) f(the)0 1670 y(question)k(is)f(ho)o(w)h(to)h(select)d(lo)q(op)j(break)o (ers)e(so)i(that)f(the)f(join)o(t)h(genot)o(yp)q(e)g(v)o(ector)f(size)g (of)h(the)f(lo)q(op)0 1730 y(break)o(er)14 b(set)h(is)g(as)g(small)f (as)h(p)q(ossible.)21 b(There)15 b(are)g(t)o(w)o(o,)g(p)q(ossibly)g (con\015icting,)f(selection)g(criteria:)19 b(W)l(e)0 1791 y(should)12 b(select)e(an)i(individual)f(that)h(participates)f(in) g(as)h(man)o(y)e(marriages)h(as)h(p)q(ossible)g(that)g(form)e(lo)q (ops,)0 1851 y(and)16 b(w)o(e)g(should)g(select)e(individuals)h(that)h (ha)o(v)o(e)f(a)h(small)f(genot)o(yp)q(e)g(v)o(ector)g(size)g Fh(j)p Fi(G)1581 1858 y Fd(i)1595 1851 y Fh(j)p Fo(.)21 b(The)16 b(algorithm)0 1911 y(computes)f(for)h(eac)o(h)g(individual)f (a)h(cost)g Fi(f)5 b Fo(\()p Fi(i)p Fo(\))17 b(that)f(dep)q(ends)g(on)h (b)q(oth)g(criteria)e(and)i(greedily)d(c)o(ho)q(oses)0 1971 y(an)20 b(individual)e Fi(i)h Fo(with)h(the)f(smallest)f(cost)h (as)h(a)g(lo)q(op)g(break)o(er.)31 b(It)19 b(then)g(remo)o(v)o(es)e (the)i(individual)f Fi(i)0 2031 y Fo(from)g(the)h(marriage)f(graph.)31 b(If)19 b(the)g(resulting)f(graph)i(has)g(no)g(m)o(ultiple)c(marriages) i(an)o(ymore,)g(then)0 2091 y Fk(Sp)m(anningTree)c Fo(resolv)o(es)h (the)h(remaining)f(problem)g(optimally)l(.)73 2152 y(The)f(function)f Fi(f)19 b Fo(uses)14 b(a)g(heuristic)e(estimate)g(of)i(the)f(n)o(um)o (b)q(er)f(of)i(lo)q(ops)g(in)f(whic)o(h)g Fi(i)g Fo(participates)h(b)o (y)0 2212 y(\014rst)g(remo)o(ving)f(from)g(the)h(marriage)f(graph)i(v)o (ertices)d(that)j(do)f(not)h(participate)f(in)f(an)o(y)h(lo)q(op)h(and) g(then)0 2272 y(c)o(hec)o(king)d(the)i(n)o(um)o(b)q(er)e(of)i(v)o (ertices)e(that)j(are)f(neigh)o(b)q(ors)g(of)g Fi(i)g Fo(in)f(the)h(remaining)e(graph.)22 b(This)14 b(n)o(um)o(b)q(er)0 2332 y(is)f(denoted)h(b)o(y)e Fi(d)p Fo(\()p Fi(i)p Fo(\)|)h(the)h (degree)e(of)i Fi(i)p Fo(.)20 b(The)13 b(function)g Fi(f)19 b Fo(is)13 b(then)g(de\014ned)h(b)o(y)e Fi(f)5 b Fo(\()p Fi(i)p Fo(\))14 b(=)g(log)q(\()p Fh(j)p Fi(G)1764 2339 y Fd(i)1778 2332 y Fh(j)p Fo(\))p Fi(=d)p Fo(\()p Fi(v)1903 2339 y Fd(i)1917 2332 y Fo(\).)0 2392 y(Lo)o(w)19 b(v)m(alues)f(of)g Fi(f)5 b Fo(\()p Fi(i)p Fo(\))18 b(indicate)f(that)i(individual)e Fi(i)g Fo(breaks)i(eac)o(h)e(lo)q(op)i(at)f(the)g(cost)h(of)f(adding)h (only)f(a)0 2453 y(small)d(n)o(um)o(b)q(er)f(of)j(genot)o(yp)q(es)f(to) h(the)f(lo)q(op)h(break)o(ers)f(set.)21 b(The)16 b(algorithm)f(is)h(as) h(follo)o(ws.)951 2874 y(10)p eop %%Page: 11 11 11 10 bop 73 100 a Fp(ALGORITHM)19 b(Lo)r(opBreak)n(er)81 193 y(Input:)47 b Fj(A)17 b(marriage)g(gr)n(aph)g Fi(H)k Fj(with)d(a)g(marriage)f(vertex)h(set)g Fi(M)5 b Fj(,)186 253 y(an)17 b(individual)i(vertex)g(set)f Fi(I)t Fj(,)e(and)i(a)f (genotyp)n(e)i(ve)n(ctor)e(size)h Fh(j)p Fi(G)1385 260 y Fd(i)1399 253 y Fh(j)g Fj(for)f(e)n(ach)g Fi(i)d Fh(2)g Fi(I)t Fj(.)81 314 y Fp(Output:)47 b Fj(A)17 b(lo)n(op)g(br)n(e)n(aker) g(set)h Fi(F)24 b Fj(having)19 b(low)f(joint)g(genotyp)n(e)g(ve)n(ctor) g(size.)186 374 y Fi(F)i Fh( )13 b(;)186 434 y Fo(Rep)q(eatedly)i(remo) o(v)o(e)f(from)h Fi(H)20 b Fo(an)o(y)c(v)o(ertex)f(in)h Fi(I)f Fh([)c Fi(M)21 b Fo(that)c(has)g(only)f(one)h(neigh)o(b)q(or)186 494 y Fp(If)f Fo(no)h(individual)e(is)h(m)o(ultiply)d(married)h Fp(then)19 b(return)c Fi(F)23 b Fh([)16 b Fo(SpanningT)l(ree\()p Fi(H)t Fo(\))186 615 y Fp(While)f Fo(the)h(graph)h Fi(H)j Fo(is)c(not)h(empt)o(y)d Fp(do)257 675 y Fo(1.)22 b(Pic)o(k)15 b(an)i(individual)e Fi(i)h Fo(for)g(whic)o(h)g(log)q(\()p Fh(j)p Fi(G)1104 682 y Fd(i)1118 675 y Fh(j)p Fo(\))p Fi(=d)p Fo(\()p Fi(i)p Fo(\))h(is)f(minim)n(um)c(in)k Fi(H)257 735 y Fo(2.)22 b Fi(F)e Fh( )14 b Fi(F)j Fh([)12 b(f)p Fi(i)p Fh(g)257 795 y Fo(3.)22 b Fi(I)17 b Fh( )d Fi(I)g Fh(n)d(f)p Fi(i)p Fh(g)257 855 y Fo(4.)22 b(Rep)q(eatedly)15 b(remo)o(v)o(e)f(from)h Fi(H)21 b Fo(an)o(y)16 b(v)o(ertex)f(in)g Fi(I)g Fh([)c Fi(M)22 b Fo(that)17 b(has)g(only)f(one)g(neigh)o(b)q(or) 257 915 y Fp(If)h Fo(no)f(individual)f(is)h(m)o(ultiply)e(married)g Fp(then)i Fo(return)g Fi(F)23 b Fh([)16 b Fo(SpanningT)l(ree\()p Fi(H)t Fo(\))186 976 y Fp(return)i Fi(F)73 1069 y Fo(The)d(lo)q(op)h (break)o(er)f(sets)g(found)h(b)o(y)e Fk(LoopBreaker)g Fo(are)h(not)h(guaran)o(teed)f(to)h(b)q(e)f(optimal)f(but)h(in)0 1129 y(the)g(data)h(sets)g(w)o(e)f(ha)o(v)o(e)f(examined,)f(the)i (results)h(seem)d(optimal,)h(due)h(to)h(the)f(small)f(n)o(um)o(b)q(er)f (of)j(lo)q(ops)0 1190 y(in)g(h)o(uman)f(p)q(edigrees,)73 1250 y(There)24 b(are)g(some)f(subtle)g(tec)o(hnical)g(c)o(hanges)h(w)o (e)f(in)o(tro)q(duced)h(to)g(solv)o(e)f(t)o(w)o(o)h(implem)o(en)o (tation)0 1310 y(problems.)18 b(One)12 b(problem)e(is)h(that)h Fk(linka)o(ge)p Fo(/)p Fk(f)l(astlink)c Fo(requires)i(the)i(input)f(p)q (edigree)g(to)h(corresp)q(ond)0 1370 y(to)18 b(a)g(marriage)f(graph)i (that)f(is)f(a)h(tree)f(\(cf.)26 b(the)17 b(discussion)h(on)g(the)g(MD) f(data)i(set)e(b)q(elo)o(w\).)26 b(When)18 b(a)0 1430 y(p)q(edigree)f(has)h(a)f(lo)q(op)h(break)o(er)f(with)g Fi(k)i Fo(marriages,)d(it)h(ma)o(y)e(b)q(e)j(the)f(case)g(that)g (making)f Fi(k)e Fo(+)e(1)17 b(copies)0 1491 y(disconnects)g(the)h (marriage)f(graph.)26 b(Therefore,)17 b(w)o(e)g(start)i(with)e(2)h (copies)g(and)g(k)o(eep)f(adding)h(copies,)0 1551 y(unless)e(the)g (marriage)f(graph)j(b)q(ecomes)d(disconnected.)73 1611 y(A)f(second)g(problem)e(in)i Fk(f)l(astlink)e Fo(is)i(to)g(estimate)e (the)i(sizes)f(of)i(p)q(ossible)f(genot)o(yp)q(e)g(sets)g Fh(j)p Fi(G)1816 1618 y Fd(i)1831 1611 y Fh(j)p Fo(.)20 b(F)l(or)0 1671 y(this)13 b(purp)q(ose)g(w)o(e)f(emplo)o(y)f(the)h (user's)h(initial)e(selection)h(for)h(lo)q(op)g(break)o(ers)f(and)i (carry)e(out)h Fk(f)l(astlink)p Fo('s)0 1731 y(built-in)f(genot)o(yp)q (e)g(inference)f(algorithm)h(in)g(order)h(to)g(rule)f(out)h(imp)q (ossible)e(genot)o(yp)q(es.)20 b(This)13 b(metho)q(d)0 1792 y(do)q(es)j(not)f(rule)f(out)h(all)g(imp)q(ossible)e(genot)o(yp)q (es,)i(ho)o(w)o(ev)o(er,)e(it)i(pro)o(vides)f(su\016cien)o (tly-accurate)f(relativ)o(e)0 1852 y(estimates)i(of)h Fh(j)p Fi(G)322 1859 y Fd(i)337 1852 y Fh(j)g Fo(for)g(di\013eren)o(t)g (candidate)g(lo)q(op)h(break)o(ers.)0 2017 y Fl(6)81 b(Results)0 2126 y Fo(W)l(e)15 b(illustrate)g(the)g(p)q(erformance)g (of)g(the)h(new)f(v)o(ersion)g(of)h Fk(f)l(astlink)d Fo(using)j(the)g(follo)o(wing)f(data)h(sets,)0 2186 y(eac)o(h)22 b(con)o(taining)h(one)g(lo)q(op)q(ed)g(p)q(edigree.)40 b(W)l(e)23 b(also)g(tested)g(with)f(a)h(few)g(other)g(lo)q(op)q(ed)g(p) q(edigrees)0 2247 y(where)16 b(the)h(new)g(soft)o(w)o(are)f(did)h(not)g (c)o(hange)g(the)f(user's)h(lo)q(op)g(break)o(er)f(selection.)21 b(The)c(running)g(time)0 2307 y(of)g Fk(LoopBreaker)d Fo(is)i(to)q(o)i(negligible)c(to)j(b)q(e)f(e\013ectiv)o(ely)e (measured.)73 2410 y Fh(\017)24 b Fo(BAD:)12 b(data)i(on)g(a)g(p)q (ortion)g(of)g(the)f(Old)g(Order)g(Amish)e(p)q(edigree)i(110)h(\(OO)o (A)f(110\),)h(with)g(bip)q(olar)122 2470 y(a\013ectiv)o(e)h(disorder)i (\(BAD\))f(from)f(the)h(lab)q(oratory)i(of)f(Da)o(vid)f(R.)g(Co)o(x)g (and)h(Ric)o(hard)f(M.)g(My)o(ers)122 2530 y(at)i(the)g(Univ)o(ersit)o (y)d(of)j(California)f(at)i(San)f(F)l(rancisco)35 b([33)q(].)25 b(This)18 b(p)q(edigree)f(has)h(1)h(lo)q(op.)26 b(The)122 2591 y(assumed)16 b(mo)q(de)f(of)i(inheritance)e(is)h(dominan)o(t)f (with)h(reduced)f(p)q(enetrance.)73 2690 y Fh(\017)24 b Fo(ALZ:)12 b(Data)i(on)f(an)g(Amish)e(family)f(with)j(Alzheime)o(r's) d(disease)i(from)g(Margaret)h(P)o(ericak-V)l(ance,)122 2750 y(Jonathan)24 b(Haines,)e(and)h(Marcy)e(Sp)q(eer)h([34)q(].)38 b(The)22 b(p)q(edigree)g(w)o(as)g(sen)o(t)g(to)g(us)h(with)f(4)g(lo)q (op)951 2874 y(11)p eop %%Page: 12 12 12 11 bop 277 51 1397 2 v 276 112 2 61 v 285 112 V 310 94 a Fo(Data)17 b(Set)p 523 112 V 50 w(Old)f Fi(N)p 712 112 V 55 w Fo(New)g Fi(N)p 916 112 V 55 w Fo(Old)f(Time)p 1172 112 V 48 w(New)h(Time)p 1442 112 V 48 w(Sp)q(eedup)p 1672 112 V 277 113 1397 2 v 276 174 2 61 v 285 174 V 356 155 a(ALZ)p 523 174 V 113 w(15552)p 712 174 V 108 w(8256)p 916 174 V 168 w(67m)p 1172 174 V 181 w(18m)p 1442 174 V 167 w(3.7)p 1672 174 V 277 175 1397 2 v 276 234 2 61 v 285 234 V 350 216 a(BAD)p 523 234 V 205 w(8)p 712 234 V 179 w(3)p 916 234 V 164 w(154s)p 1172 234 V 204 w(61s)p 1442 234 V 169 w(2.5)p 1672 234 V 277 235 1397 2 v 276 294 2 61 v 285 294 V 375 276 a(JP)p 523 294 V 182 w(126)p 712 294 V 180 w(6)p 916 294 V 164 w(329s)p 1172 294 V 204 w(16s)p 1442 294 V 182 w(21)p 1672 294 V 277 296 1397 2 v 276 354 2 61 v 285 354 V 364 336 a(MD)p 523 354 V 144 w(3072)p 712 354 V 157 w(32)p 916 354 V 118 w(1297m)p 1172 354 V 182 w(28m)p 1442 354 V 180 w(46)p 1672 354 V 277 356 1397 2 v 276 414 2 61 v 285 414 V 346 396 a(RP01)p 523 414 V 127 w(1296)p 712 414 V 133 w(364)p 916 414 V 143 w(247m)p 1172 414 V 181 w(41m)p 1442 414 V 167 w(6.0)p 1672 414 V 277 416 1397 2 v 401 496 a(T)l(able)g(1:)22 b(Comparison)16 b(of)h Fk(f)l(astlink)d Fo(3.0P)j(and)f(new)h(co)q(de)122 639 y(break)o(ers,)j(but)h(with)f (our)h(new)g(co)q(de)g(w)o(e)f(disco)o(v)o(ered)f(that)i(this)f (disconnected)g(the)g(p)q(edigree.)122 699 y(Only)f(3)g(lo)q(op)h (break)o(ers)f(are)g(needed.)30 b(The)19 b(results)g(in)g(the)g(table)g (use)h(3)f(of)h(the)f(original)g(lo)q(op)122 759 y(break)o(ers)d(to)g (start.)22 b(The)16 b(assumed)g(mo)q(de)f(of)i(inheritance)e(is)h (dominan)o(t.)73 861 y Fh(\017)24 b Fo(JP:)13 b(data)h(on)g(a)g(small)e (family)f(some)i(of)g(whose)h(o\013spring)h(exhibit)d(autosomal)i (recessiv)o(e)d(juv)o(enile)122 921 y(parkinsonism)k(from)g(Sho)s(ji)h (Tsuji)h([35].)k(This)16 b(is)g(a)h(small)d(p)q(edigree)i(\(n)o(um)o(b) q(er)f(547)i(in)f(the)g(cited)122 981 y(pap)q(er\))i(with)g(one)g(lo)q (op)h(created)e(b)o(y)g(a)h(marriage)f(of)h(second)g(cousins)g(once)g (remo)o(v)o(ed.)23 b(W)l(e)18 b(use)122 1041 y(the)e(p)q(edigree)g(as)h (sen)o(t)e(to)i(us)g(b)o(y)e(Dr.)22 b(Tsuji.)73 1143 y Fh(\017)i Fo(MD:)14 b(data)h(on)h(a)e(large)h(family)d(exhibiting)i (t)o(w)o(o)g(clinically)e(distinct)i(forms)g(of)g(m)o(uscular)f (dystro-)122 1203 y(ph)o(y)i(from)g(Ken)g(Morgan,)i(T)l(racey)e(W)l (eiler,)f(Cheryl)h(Green)o(b)q(erg,)g(and)h(Klaus)g(W)l(rogemann)g ([36].)122 1263 y(The)h(p)q(edigree)f(w)o(as)h(presen)o(ted)f(to)h(us)g (with)f(7)h(lo)q(op)g(break)o(ers.)22 b(There)17 b(are)f(2)h(m)o (ultiply)d(married)122 1324 y(individuals.)20 b(The)c(mo)q(de)g(of)g (inheritance)f(is)h(recessiv)o(e.)73 1425 y Fh(\017)24 b Fo(RP01:)30 b(data)21 b(on)g(a)f(large)g(family)l(,)f(UCLA-RP01,)j (with)e(autosomal)g(dominan)o(t)f(retinitis)g(pig-)122 1486 y(men)o(tosa)e(\(RP1\))i(from)e(the)i(lab)q(oratory)g(of)g (Stephen)f(P)l(.)g(Daiger.)28 b(This)18 b(p)q(edigree)g(has)h(2)g(lo)q (ops)122 1546 y(and)i(2)f(m)o(ultiply)d(married)i(individuals.)32 b(As)20 b(sho)o(wn)h(in)f([37],)g(this)g(p)q(edigree)g(had)h(to)f(b)q (e)h(split)122 1606 y(in)o(to)13 b(3)h(pieces)f(b)q(ecause)h (computation)e(on)j(the)e(whole)h(family)d(together)j(w)o(as)g (prohibitiv)o(ely)d(long.)122 1666 y(Here)k(w)o(e)h(lea)o(v)o(e)e(the)i (lo)q(ops)i(in.)0 1780 y(More)e(detailed)f(descriptions)h(of)h(the)f (data)h(sets)f(can)h(b)q(e)f(found)h(in)f(the)g(pap)q(ers)h(cited)e (for)h(eac)o(h)g(one.)73 1840 y(The)i(results)f(are)g(sho)o(wn)h(in)f (T)l(able)g(1.)25 b(W)l(e)17 b(rep)q(ort)h(a)g(n)o(um)o(b)q(er)e Fi(N)5 b Fo(,)17 b(whic)o(h)g(is)g(the)g(n)o(um)o(b)q(er)f(of)h(lo)q (op)0 1901 y(break)o(er)12 b(genot)o(yp)q(e)h(v)o(ectors)f(for)h(whic)o (h)f(the)h(lik)o(eliho)q(o)q(d)f(is)g(not)i(pro)o(v)m(ably)e(0,)i(b)o (y)e(an)o(y)h(of)g(the)g(preliminary)0 1961 y(c)o(hec)o(ks)j(in)h Fk(f)l(astlink)p Fo(.)22 b(The)17 b(n)o(um)o(b)q(er)e Fi(N)23 b Fo(is)17 b(not)h(a)f(p)q(erfect)g(predictor)g(of)g(running)h (time)d(b)q(ecause)i(the)0 2021 y(preliminary)10 b(c)o(hec)o(ks)i(for)h (0)g(lik)o(eliho)q(o)q(d)f(are)h(not)h(exhaustiv)o(e;)e(the)h(p)q (edigree)f(tra)o(v)o(ersal)g(time)f(v)m(aries)i(with)0 2081 y(the)j(lo)q(op)i(break)o(er)e(genot)o(yp)q(es,)g(and)h(the)g(a)o (v)o(erage)f(p)q(edigree)g(tra)o(v)o(ersal)g(time)e(c)o(hanges)j(when)g (the)f(lo)q(op)0 2141 y(break)o(er)f(set)i(c)o(hanges.)73 2202 y(The)24 b(impro)o(v)o(em)o(e)o(n)o(ts)d(on)j(BAD)f(and)h(JP)g (illustrate)f(that)h(ev)o(en)e(on)j(1-lo)q(op)g(p)q(edigrees,)f(link)m (age)0 2262 y(exp)q(erts)d(will)f(not)h(alw)o(a)o(ys)g(c)o(ho)q(ose)g (the)g(optimal)e(lo)q(op)j(break)o(er.)35 b(The)21 b(impro)o(v)o(em)o (e)o(n)o(ts)d(on)k(MD)e(and)0 2322 y(RP01)h(illustrate)d(the)i(case)g (of)g(m)o(ultiple)c(marriages)j(in)h(di\013eren)o(t)f(w)o(a)o(ys.)31 b(The)20 b(original)g(MD)g(used)g(7)0 2382 y(lo)q(op)14 b(break)o(ers;)f(b)o(y)f(using)i(m)o(ulti-cop)o(y)c(cloning,)j(w)o(e)g (can)g(reduce)f(the)h(n)o(um)o(b)q(er)e(to)j(5.)20 b(Both)13 b(the)g(original)0 2442 y(RP01)19 b(and)h(the)e(new)h(RP01)g(use)g(2)g (lo)q(op)g(break)o(ers,)f(but)h(m)o(ulti-cop)o(y)d(cloning)j(allo)o(ws) f(us)h(to)g(break)g(a)0 2503 y(lo)q(op)e(in)f(a)h(di\013eren)o(t)e (place)h(where)g Fh(j)p Fi(G)715 2510 y Fd(i)729 2503 y Fh(j)g Fo(is)g(smaller.)73 2563 y(The)21 b(impro)o(v)o(em)o(en)n(ts)d (in)i(ALZ)h(are)g(imp)q(ortan)o(t)e(ev)o(en)h(b)q(ey)o(ond)h(the)f (running)h(time)e(c)o(hange.)34 b(The)0 2623 y(original)20 b(ALZ)g(p)q(edigree)f(w)o(as)i(presen)o(ted)e(to)i(us)f(with)g(4)g(lo)q (op)h(break)o(ers.)32 b(Using)20 b(our)g(algorithm)f(w)o(e)0 2683 y(disco)o(v)o(ered)i(that)i(the)f(asso)q(ciated)h(marriage)f (graph)h(is)f(disconnected,)h(and)g(only)g(3)f(lo)q(op)i(break)o(ers)0 2743 y(should)13 b(b)q(e)f(used.)20 b(Using)12 b(4)h(lo)q(op)g(break)o (ers)f Fk(linka)o(ge)p Fo(/)p Fk(f)l(astlin)o(k)d Fo(giv)o(es)j (plausible,)g(but)g(wrong)i(results.)951 2874 y(12)p eop %%Page: 13 13 13 12 bop 0 100 a Fk(linka)o(ge)p Fo(/)p Fk(f)l(astlink)8 b Fo(had)13 b(a)g(longstanding)g(\015a)o(w)f(that)h(some)e(p)q (edigrees)h(with)g(disconnected)f(marriage)0 160 y(graphs)i(w)o(ould)f (b)q(e)g(tolerated)f(without)i(a)f(crash)g(or)g(0)h(lik)o(eliho)q(o)q (d;)e(this)h(\015a)o(w)g(is)g(no)o(w)g(\014xed)g(automatically)0 220 y(b)o(y)k(using)g Fk(LoopBreaker)p Fo(.)0 386 y Fl(7)81 b(Discussion)0 496 y Fo(In)22 b(this)g(pap)q(er,)i(w)o(e)e(addressed)h (the)f(lo)q(op)h(break)o(er)f(selection)f(\(LBS\))h(problem)f(in)h (genetic)f(link)m(age)0 556 y(analysis)e(and)f(impleme)o(n)o(ted)d (practical)j(solutions)h(in)e Fk(f)l(astlink)p Fo(.)26 b(W)l(e)18 b(presen)o(ted)f(an)i(optimal)e(algo-)0 616 y(rithm)d(for)i(p)q(edigrees)g(without)g(m)o(ultiple)d(marriages)i(and) h(an)h(appro)o(ximation)d(algorithm)h(for)h(general)0 676 y(p)q(edigrees.)23 b(The)17 b(latter)g(algorithm)f(uses)h(a)g (generalized)f(cloning)h(op)q(eration)g(that)h(allo)o(ws)f(more)e(than) 0 737 y(2)i(copies)f(of)h(a)h(m)o(ultiply)13 b(married)i(individual.)21 b(W)l(e)c(illustrated)f(that)h(the)f(new)h(algorithm)f(sp)q(eeds)h(up)0 797 y(the)f(computations)g(on)h(real)e(p)q(edigrees.)73 857 y(Users)22 b(of)h Fk(f)l(astlink)d Fo(will)h(no)i(longer)g(ha)o(v)o (e)e(to)i(think)f(carefully)f(ab)q(out)j(where)e(to)g(break)h(their)0 917 y(p)q(edigree)i(lo)q(ops.)49 b(F)l(or)26 b(the)f(sak)o(e)g(of)g (bac)o(kw)o(ards)h(compatibilit)o(y)c(to)k(previous)f(v)o(ersions)g(of) g Fk(link-)0 977 y(a)o(ge/f)l(astlink)20 b Fo(and)j(syn)o(tactic)g (compatibilit)o(y)c(with)k(other)h(programs,)g(w)o(e)f(require)f(the)h (user)g(to)0 1038 y(c)o(ho)q(ose)17 b(a)f(lo)q(op)h(break)o(er)f(set.) 21 b(Cho)q(osing)d(a)f(v)m(alid)e(lo)q(op)j(break)o(er)d(set)h(is)g (not)h(di\016ciult)d(to)j(do)g(using)f(the)0 1098 y Fk(loops)h Fo(program,)i(as)h(describ)q(ed)e(in)g(Section)h(2.)29 b(What)20 b(is)e(di\016cult)g(for)h(users)g(to)g(do,)g(and)h(what)f(w)o (e)0 1158 y(ha)o(v)o(e)14 b(automated)h(is)g(to)h(c)o(ho)q(ose)g(a)g (lo)q(op)g(break)o(er)e(set)h(that)h(leads)f(to)h(a)g(fast)f(running)h (time)d(of)j(the)f(link-)0 1218 y(age)i(analysis.)k(W)l(e)16 b(\014xed)g(the)g(longstanding)h(\015a)o(w)g(that)f Fk(linka)o(ge)p Fo(/)p Fk(f)l(astlink)d Fo(migh)o(t)h(giv)o(e)h(plausible,)0 1278 y(incorrect)g(results)h(when)h(the)f(user)g(sp)q(eci\014ed)g(to)q (o)h(man)o(y)e(lo)q(op)i(break)o(ers.)73 1339 y(Our)k(implem)o(en)n (tation)d(is)j(sp)q(eci\014c)f(to)h Fk(f)l(astlink)p Fo(,)e(but)i(the)g(algorithms)e(w)o(e)i(describ)q(ed)f(ma)o(y)f(b)q(e)0 1399 y(applicable)j(to)h(other)h(soft)o(w)o(are)f(pac)o(k)m(ages.)42 b(Most)23 b(notably)l(,)i Fk(vitesse)d Fo([38])h(is)f(curren)o(tly)g (the)h(b)q(est)0 1459 y(link)m(age)14 b(analysis)h(pac)o(k)m(age)g(for) g(large)f(simple)f(p)q(edigrees,)h(but)h(it)f(do)q(es)h(not)g(curren)o (tly)e(accept)h(complex)0 1519 y(p)q(edigrees.)23 b(It)16 b(seems)f(p)q(ossible)i(to)g(extend)f Fk(vitesse)g Fo(to)h(complex)e(p) q(edigrees)i(using)g(the)f(approac)o(h)i(of)0 1579 y(Lange)f(and)g (Elston)g([9],)e(in)h(whic)o(h)g(case)g(our)h(algorithms)e(for)h(the)g (LBS)h(problem)e(w)o(ould)h(apply)l(.)73 1640 y(Our)d(w)o(ork)g(follo)o (ws)f(in)h(the)f(spirit)h(of)g(some)e(other)i(pap)q(ers)h(suc)o(h)e(as) i([13,)e(7)q(])g(that)h(de\014ned)g(mathemat-)0 1700 y(ically)18 b(precise)g(optimization)f(problems)h(based)h(on)h (existing)e(link)m(age)h(analysis)g(soft)o(w)o(are,)h(presen)o(ted)0 1760 y(new)f(algorithms)g(for)h(those)f(problems,)g(and)h(demonstrated) e(the)i(practicalit)o(y)d(of)j(these)f(algorithms)0 1820 y(with)d(soft)o(w)o(are)g(impleme)o(n)o(tations.)0 1987 y Fl(Ac)n(kno)n(wledgmen)n(ts)0 2096 y Fo(The)g(researc)o(h)e(of)i(Dan) h(Geiger)e(is)g(supp)q(orted)i(b)o(y)e(the)g(fund)h(for)f(promotion)h (of)f(researc)o(h)g(at)h(the)f(T)l(ec)o(h-)0 2156 y(nion.)29 b(Thanks)19 b(to)g(Da)o(vid)g(R.)f(Co)o(x,)g(Stephen)h(Daiger,)g (Cheryl)f(Green)o(b)q(erg,)h(Ken)f(Morgan,)i(Ric)o(hard)0 2216 y(M.)f(My)o(ers,)g(Marcy)h(Sp)q(eer,)g(Sho)s(ji)g(Tsuji,)g(T)l (racey)f(W)l(eiler,)g(and)i(Klaus)f(W)l(rogemann)f(for)h(pro)o(viding)0 2277 y(the)g(data)g(sets)g(used)g(in)g(this)f(pap)q(er.)33 b(The)20 b(collection)e(of)i(the)g(ALZ)g(data)g(set)g(w)o(as)g(supp)q (orted)h(b)o(y)f(a)0 2337 y(gran)o(t)c(from)f(NIH.)g(The)h(collection)e (of)i(the)g(MD)g(data)h(set)f(w)o(as)g(supp)q(orted)h(b)o(y)f(gran)o (ts)h(from)e(the)g(Med-)0 2397 y(ical)i(Researc)o(h)g(Council)h(of)g (Canada,)h(the)f(Muscular)g(Dystroph)o(y)g(Asso)q(ciation)g(of)g (Canada,)i(and)e(the)0 2457 y(Children's)e(Hospital)h(of)g(Winnip)q(eg) g(Researc)o(h)g(F)l(oundation.)24 b(The)17 b(dev)o(elopmen)o(t)d(of)j (the)g(RP01)h(data)0 2517 y(set)j(w)o(as)g(supp)q(orted)h(b)o(y)e(gran) o(ts)i(from)d(the)i(National)g(Retinitis)e(Pigmen)o(tosa)h(F)l (oundation)i(and)f(the)0 2578 y(George)c(Gund)f(F)l(oundation.)73 2638 y(Thanks)g(to)g(Jurg)g(Ott)f(for)h(answ)o(ering)g(some)e (questions)i(ab)q(out)g(the)g Fk(loops)e Fo(program.)20 b(Thanks)d(to)0 2698 y(Emil)e(Ginzburg)i(for)h(stim)o(ulating)d (discussions.)24 b(Thanks)18 b(to)f(Doron)i(Bustan,)e(Y)l(ael)f(Zbar,)h (and)h(other)951 2874 y(13)p eop %%Page: 14 14 14 13 bop 0 100 a Fo(studen)o(ts)17 b(of)f(the)h(AI)e(lab)i(course)f (of)h(Win)o(ter)f(1997)i(at)f(the)f(T)l(ec)o(hnion)g(computer)f (science)g(departmen)o(t)0 160 y(who)i(help)q(ed)f(us)g(test)g(v)m (arious)h(alternativ)o(e)e(algorithms)h(for)g(the)g(LBS)h(problem.)0 345 y Fl(References)24 455 y Fo([1])24 b(Lathrop)18 b(GM,)e(Lalouel)g (JM,)g(Julier)f(C,)h(Ott)g(J:)22 b(Strategies)16 b(for)h(m)o(ultilo)q (cus)d(link)m(age)i(analysis)g(in)100 515 y(h)o(umans.)21 b(Pro)q(c)16 b(Nat)h(Acad)f(Sci)f(1984;)j(81:3443{3446.)24 613 y([2])24 b(Lathrop)e(GM,)d(Lalouel)h(JM:)33 b(Easy)20 b(calculations)g(of)g(lo)q(d)g(scores)h(and)f(genetic)f(risks)h(on)h (small)100 673 y(computers.)f(Am)15 b(J)h(Hum)f(Genet)g(1984;)j (36:460{465.)24 771 y([3])24 b(Lathrop)g(GM,)e(Lalouel)h(JM,)e(Julier)h (C,)g(Ott,)h(J:)40 b(Multilo)q(cus)21 b(link)m(age)i(analysis)f(in)g(h) o(umans:)100 831 y(detection)16 b(of)h(link)m(age)f(and)i(estimation)d (of)i(recom)o(bination.)j(Am)15 b(J)i(Hum)e(Genet)h(1985;)i(37:482{)100 891 y(498.)24 989 y([4])24 b(Cottingham)16 b(Jr.)g(R)-5 b(W,)15 b(Idury)g(RM,)g(Sc)o(h\177)-24 b(a\013er)16 b(AA:)k(F)l(aster)c (sequen)o(tial)f(genetic)g(link)m(age)h(compu-)100 1049 y(tations.)22 b(Am)14 b(J)j(Hum)d(Genet)i(1993;)i(53:252{263.)24 1147 y([5])24 b(Sc)o(h\177)-24 b(a\013er)19 b(AA,)e(Gupta)i(SK,)f (Shriram)f(K,)h(Cottingham)g(Jr.)g(R)-5 b(W:)27 b(Av)o(oiding)17 b(recomputation)g(in)100 1207 y(link)m(age)f(analysis.)22 b(Hum)14 b(Hered)h(1994;)j(44:225{237.)24 1305 y([6])24 b(P)o(earl)12 b(J.)j(Probabilistic)d(Reasoning)h(in)f(In)o(telligen)o (t)e(Systems:)18 b(Net)o(w)o(orks)12 b(of)g(Plausible)g(Inference.)100 1365 y(Morgan)17 b(Kaufmann,)f(San)h(Mateo,)f(California,)f(1988.)24 1463 y([7])24 b(Kong)e(A:)35 b(E\016cien)o(t)19 b(metho)q(ds)i(for)g (computing)f(link)m(age)h(lik)o(eliho)q(o)q(ds)f(of)h(recessiv)o(e)e (diseases)i(in)100 1523 y(in)o(bred)16 b(p)q(edigrees)21 b(Genet)16 b(Epidem)e(1991;)k(8:81{103.)24 1621 y([8])24 b(Elston)18 b(R)o(C,)f(Stew)o(art)h(J:)25 b(A)17 b(general)g(mo)q(del)f (for)i(the)g(analysis)f(of)h(p)q(edigree)f(data.)26 b(Hum)16 b(Hered)100 1681 y(1971;)i(21:523{542.)24 1779 y([9])24 b(Lange)h(K,)d(Elston)i(R)o(C:)42 b(Extensions)24 b(to)f(p)q(edigree)g (analysis.)g(I.)g(Lik)o(eliho)q(o)q(d)g(calculation)g(for)100 1839 y(simple)14 b(and)j(complex)d(p)q(edigrees.)21 b(Hum)15 b(Hered)g(1975;)i(25:95{105.)0 1937 y([10])24 b(Bennett)17 b(RL,)h(Steinhaus)h(KA,)e(Uhric)o(h)g(SB,)g(O'Sulliv)m(an)g(CK,)h (Resta)g(R)o(G,)g(Lo)q(c)o(hner-Do)o(yle)g(D.,)100 1997 y(Mark)o(el)c(DS,)g(Vincen)o(t)f(V,)h(Hamanishi)f(J:)19 b(Recommendations)12 b(for)j(Standardized)g(Human)f(P)o(edi-)100 2058 y(gree)i(Nomenclature.)j(Am)c(J)h(Hum)e(Genet)i(1995;)i (56:745{752.)0 2155 y([11])24 b(Cannings)16 b(C,)f(Thompson)g(EA,)f(Sk) o(olnic)o(k)f(MH:)19 b(Probabilit)o(y)14 b(functions)h(on)g(complex)e (p)q(edigrees.)100 2216 y(Adv)j(Appl)f(Prob)i(1978;)h(10:26{61.)0 2313 y([12])24 b(Ott)17 b(J:)23 b(Estimation)16 b(of)i(the)e(recom)o (bination)g(fraction)g(in)h(h)o(uman)f(p)q(edigrees:)22 b(E\016cien)o(t)16 b(compu-)100 2374 y(tation)g(of)g(the)f(lik)o(eliho) q(o)q(d)f(for)i(h)o(uman)f(link)m(age)g(studies.)k(Am)14 b(J)i(Hum)d(Genet)j(1974;)g(26:588{597.)0 2471 y([13])24 b(Lange)j(K,)d(Bo)q(ehnk)o(e)h(M:)48 b(Extensions)25 b(to)h(p)q(edigree)f(analysis.)g(V.)g(Optimal)e(calculation)i(of)100 2532 y(mendelian)14 b(lik)o(eliho)q(o)q(ds.)21 b(Hum)14 b(Hered)h(1983;)j(33:291{301.)0 2629 y([14])24 b(Lauritzen)e(SL,)h (Spiegelhalter)e(DJ:)39 b(Lo)q(cal)23 b(computations)f(with)g (probabilities)f(on)i(graphical)100 2690 y(structures)16 b(and)g(their)f(application)g(to)h(Exp)q(ert)f(Systems)g(\(with)g (discussion\).)20 b(J)c(Ro)o(y)o(al)f(Stat)g(So)q(c)100 2750 y(B)h(1988;)h(50:157{224.)951 2874 y(14)p eop %%Page: 15 15 15 14 bop 0 100 a Fo([15])24 b(Reed)18 b(B:)26 b(Finding)18 b(appro)o(ximate)e(separators)k(and)e(computing)f(the)h(treewidth)g (quic)o(kly)l(.)24 b(Pro)q(c.)100 160 y(24th)17 b(Ann.)f(A)o(CM)f (Symp.)g(Theory)h(Comp.,)f(1992,)i(221{228.)0 259 y([16])24 b(Bec)o(k)o(er)14 b(A.,)i(Geiger)g(D:)22 b(A)16 b(su\016cien)o(tly)f (fast)i(algorithm)e(for)i(\014nding)g(close)f(to)h(optimal)e(junction) 100 319 y(trees.)21 b(Pro)q(c.)16 b(12th)h(Conf.)g(Uncertain)o(t)o(y)d (in)i(Artif.)f(In)o(tel.,)f(1996,)j(81{88.)0 418 y([17])24 b(Shoikhet)16 b(K.,)g(Geiger)g(D:)22 b(A)16 b(practical)g(algorithm)g (for)g(\014nding)h(optimal)e(triangulations.)23 b(Pro)q(c.)100 478 y(AAAI)15 b(97,)h(1997,)i(to)e(app)q(ear.)0 577 y([18])24 b(Xie)15 b(X,)h(Ott)g(J:)21 b(Finding)16 b(all)g(lo)q(ops)h(in)f(a)g(p) q(edigree.)21 b(Am)15 b(J)h(Hum)e(Genet)i(1992;)i(51:A205.)0 676 y([19])24 b(T)l(erwilliger)e(JD,)h(Ott)h(J.)42 b(Handb)q(o)q(ok)25 b(of)f(Human)e(Genetic)g(Link)m(age.)44 b(The)23 b(Johns)h(Hopkins)100 736 y(Univ)o(ersit)o(y)14 b(Press,)i(Baltimore)e(and)j(London,)g(1994.) 0 835 y([20])24 b(P)o(earl)17 b(J.)26 b(F)l(usion,)17 b(propagation)j(and)e(structuring)f(in)h(b)q(elief)e(net)o(w)o(orks.)25 b(Arti\014cial)16 b(In)o(telligence)100 896 y(1986;)i(29:241{288.)0 995 y([21])24 b(Kim)15 b(H,)g(P)o(earl)h(J:)22 b(A)16 b(computational)g(mo)q(del)f(for)h(com)o(bined)f(causal)h(and)h (diagnostic)g(reasoning)100 1055 y(in)f(inference)f(systems.)20 b(Pro)q(c.)c(8th)h(In)o(ter.)e(Join)o(t)g(Conf.)i(Art.)e(In)o(tel.,)f (1983,)j(190{193.)0 1154 y([22])24 b(P)o(earl,)13 b(J:)j(A)d(constrain) o(t-propagation)i(approac)o(h)f(to)g(probabilistic)e(reasoning.)17 b(Pro)q(c.)c(W)l(orkshop)100 1214 y(on)20 b(Uncertain)o(t)o(y)d(and)j (Probabilit)o(y)e(in)h(Arti\014cial)f(In)o(telligence,)e(Los)k (Angeles,)f(CA)g(\(1985\))i(31{)100 1274 y(42;)28 b(also)19 b(in)f(L.N.)f(Kanal)h(and)h(J.F.)e(Lemmer)e(\(Eds.\),)j(Uncertain)o(t)o (y)e(in)i(Arti\014cial)e(In)o(telligence,)100 1334 y(North-Holland,)g (Amsterdam,)d(1986,)k(357{370.)0 1433 y([23])24 b(Geiger)13 b(D,)g(V)l(erma)e(TS,)j(P)o(earl)e(J:)k(Iden)o(tifying)c(indep)q (endence)g(in)h(Ba)o(y)o(esian)f(net)o(w)o(orks.)k(Net)o(w)o(orks)100 1494 y(1990;)i(20:507{534.)0 1593 y([24])24 b(Suermon)o(t)13 b(HJ,)f(Co)q(op)q(er)k(GF:)h(Probabilistic)c(inference)f(in)h(m)o (ultiply)e(connected)i(b)q(elief)f(net)o(w)o(orks)100 1653 y(using)17 b(lo)q(op)g(cutsets.)k(In)o(t)16 b(J)g(Appro)o(x)g (Reasoning)h(1990;)g(4:283{306.)0 1752 y([25])24 b(Karp,)29 b(RM:)51 b(Reducibilit)o(y)23 b(among)j(com)o(binatorial)f(problems.)49 b(In)26 b(R.E.Miller)e(and)j(J.W.)100 1812 y(Thatc)o(her)22 b(\(Eds.\),)h(Complexit)o(y)c(of)j(Computer)f(Computations,)i(Plen)o (um)d(Press,)j(New)f(Y)l(ork,)100 1872 y(1972,)c(85{103.)0 1971 y([26])24 b(Bar-Y)l(eh)o(uda)17 b(R,)f(Geiger)h(D,)g(Naor)g(J,)g (Roth)g(RM:)23 b(Appro)o(ximation)15 b(algorithms)i(for)g(the)g(v)o (ertex)100 2031 y(feedbac)o(k)c(set)h(problem)e(with)i(applications)g (to)g(constrain)o(t)g(satisfaction)h(and)f(ba)o(y)o(esian)g(inference) 100 2092 y(SIAM)h(J.)h(Computing,)g(in)f(press.)0 2191 y([27])24 b(Bec)o(k)o(er)17 b(A.)h(and)i(Geiger)f(D.,)g(The)g(lo)q(op)h (cutset)f(problem,)f(Pro)q(c.)h(of)h(the)f(T)l(en)o(th)f(conference)h (on)100 2251 y(Uncertain)o(t)o(y)c(in)g(Arti\014cial)g(In)o (telligence,)e(1994,)k(60{68.)0 2350 y([28])24 b(Bec)o(k)o(er)18 b(A,)h(Geiger)h(D:)32 b(Optimization)18 b(of)j(P)o(earl's)e(metho)q(d)g (of)h(conditioning)g(and)h(greedy-lik)o(e)100 2410 y(appro)o(ximation)g (algorithms)g(for)h(the)g(v)o(ertex)e(feedbac)o(k)g(set)i(problem)37 b(Arti\014cial)20 b(In)o(telligence)100 2470 y(1996;)e(83:167{188.)0 2569 y([29])24 b(Bafna)c(V.,)g(Berman)e(P)l(.,)i(and)g(F)l(ujito)g(T.,) 32 b(Constan)o(t)21 b(ratio)f(appro)o(ximations)f(of)h(the)g(w)o(eigh)o (ted)100 2629 y(feedbac)o(k)f(v)o(ertex)f(set)h(problem)f(for)i (undirected)e(graphs,)33 b(Pro)q(c.)20 b(Sixth)f(Ann)o(ual)g(In)o (ternational)100 2690 y(Symp)q(osium)13 b(on)i(Algorithms)e(and)i (Computation)g(\(ISAA)o(C)e(95\))i(.)k(Lecture)14 b(Notes)h(in)f (Computer)100 2750 y(Science,)h(v)o(olume)f(1004.)22 b(,)16 b(Springer-V)l(erlag,)f(Berlin,)g(1995,)i(142{151.)951 2874 y(15)p eop %%Page: 16 16 16 15 bop 0 100 a Fo([30])24 b(Sc)o(h\177)-24 b(a\013er)19 b(AA.)26 b(F)l(aster)18 b(link)m(age)g(analysis)h(computations)e(for)i (p)q(edigrees)f(with)g(lo)q(ops)h(or)g(un)o(used)100 160 y(alleles.)h(Hum)15 b(Hered)g(1996;)i(46:226{235.)0 262 y([31])24 b(Ev)o(en)16 b(S:)21 b(Graph)c(Algorithms,)j(Computer)15 b(Science)g(Press,)h(Ro)q(c)o(kville,)d(Maryland,)j(1979.)0 363 y([32])24 b(Krusk)m(al)c(JB:)29 b(On)19 b(the)f(shortest)i (spanning)g(subtree)f(of)g(a)h(graph)g(and)f(the)g(tra)o(v)o(eling)f (salesman)100 423 y(problem.)i(Pro)q(c)d(Amer)d(Math)i(So)q(c)h(1956;)g (7:48{50.)0 525 y([33])24 b(La)o(w)g(A,)e(Ric)o(hard)g(I)q(I)q(I)h(CW,) f(Cottingham)h(Jr)g(.)g(R)-5 b(W,)22 b(Lathrop)i(GM,)e(Co)o(x)h(DR,)g (My)o(ers)f(RM:)100 585 y(Genetic)17 b(link)m(age)g(analysis)h(of)g (bip)q(olar)g(a\013ectiv)o(e)f(disorder)h(in)f(an)h(Old)g(Order)f (Amish)f(p)q(edigree.)100 645 y(Hum)f(Genet)h(1992;)h(88:562{568.)0 747 y([34])24 b(P)o(ericak-V)l(ance)13 b(MA,)f(Johnson)j(CC,)f(Rimmle)o (r)d(JB,)i(Saunders)i(AM,)d(Robinson)j(LC,)f(Hondt)g(EG,)100 807 y(Jac)o(kson)22 b(CE,)f(Haines)g(JL:)36 b(Alzheimer)18 b(demen)o(tia)h(and)j(APOE-4)g(in)e(an)i(Amish)d(p)q(opulation.)100 868 y(Ann)d(Neur)g(1996;)h(39:700{704.)0 969 y([35])24 b(Matsumine)18 b(H,)g(Saito)i(M,)f(Shimo)q(da-Matsuba)o(y)o(ashi)g(S,)g (T)l(anak)m(a)i(H,)d(Ishik)m(a)o(w)o(a)h(A,)g(Nak)m(aga)o(w)o(a-)100 1029 y(Hattori)14 b(Y,)g(Y)l(ok)o(o)q(c)o(hi)f(M,)h(Koba)o(y)o(ashi)h (T,)f(Igarashi)h(S,)f(T)l(ak)m(ano)i(H,)d(Sanp)q(ei)i(K,)f(Koik)o(e)f (R,)h(Mori)g(H,)100 1090 y(Kondo)k(T,)f(Mizutani)g(Y,)f(Sc)o(h\177)-24 b(a\013er)17 b(AA,)f(Y)l(amam)o(ura)f(Y,)h(Nak)m(am)o(ura)h(S,)f (Kuzuhara)i(S,)f(Tsuji)g(S,)100 1150 y(Mizuno)h(Y:)26 b(Lo)q(calization)19 b(of)f(a)g(gene)g(for)h(an)f(autosomal)g(recessiv) o(e)f(form)g(of)h(Juv)o(enile)e(P)o(arkin-)100 1210 y(sonism)g(to)g(c)o (hromosome)e(6q25.2-27.)23 b(Am)15 b(J)h(Hum)f(Genet)h(1997;)h (60:588{596.)0 1312 y([36])24 b(W)l(eiler)17 b(T,)g(Green)o(b)q(erg)h (CR,)g(Nylen)e(E,)i(Hallida)o(y)e(W,)i(Morgan)h(K,)e(Eggerston)j(D,)d (W)l(rogemann)100 1372 y(K:)22 b(Lim)o(b-Girdle)14 b(m)o(uscular)h (dystroph)o(y)i(and)g(Miy)o(oshi)e(m)o(y)o(opath)o(y)f(in)j(an)g(ab)q (original)g(Canadian)100 1432 y(kindred)h(map)f(to)h Fj(LGMD2B)f Fo(and)i(segregate)g(with)f(the)f(same)h(haplot)o(yp)q(e.) 26 b(Am)17 b(J)h(Hum)e(Genet)100 1492 y(1996;)i(59:872{878.)0 1594 y([37])24 b(Blan)o(ton)e(SH,)f(Hec)o(k)o(enliv)n(ely)d(JR,)k (Cottingham)f(A)-5 b(W,)21 b(F)l(riedman)f(J,)i(Sadler)g(LA,)f(W)l (agner)i(M,)100 1654 y(F)l(riedman)12 b(LH,)i(Daiger)f(SP:)18 b(Link)m(age)c(mapping)f(of)h(autosomal)g(dominan)o(t)f(retinitis)f (pigmen)o(tosa)100 1714 y(\(RP1\))17 b(to)g(the)f(p)q(ericen)o(tric)e (region)i(of)h(h)o(uman)e(c)o(hromosome)f(8.)21 b(Genomics)15 b(1991;)j(11:857{869.)0 1816 y([38])24 b(O'Connell)16 b(JR,)h(W)l(eeks)f(DE:)24 b(The)17 b(VITESSE)g(algorithm)f(for)h(rapid) g(exact)g(m)o(ultilo)q(cus)d(link)m(age)100 1876 y(analysis)k(via)g (genot)o(yp)q(e)f(set-reco)q(ding)h(and)h(fuzzy)e(inheritance.)24 b(Nature)17 b(Genet)h(1995;)h(11:402{)100 1936 y(408.)951 2874 y(16)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/traverse.ps0000644000265600020320000055070506506236516015623 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvips 5.528 Copyright 1986, 1994 Radical Eye Software %%Title: traverse.dvi %%CreationDate: Thu Jul 14 13:30:30 1994 %%Pages: 15 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips traverse.dvi -o %DVIPSParameters: dpi=300, comments removed %DVIPSSource: TeX output 1994.07.14:1330 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{ statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{ pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get} B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{cc 1 add D }B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail} B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{ 3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{ 3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginProcSet: special.pro TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{ /CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{ 10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{} N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{itransform lineto} }{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{ itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{ closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp {pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray} N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial {CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath }N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{ end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin} N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{ /SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (/a/santa-bb/dancer/schaffer/linkage/docs/traverse.dvi) @start /Fa 13 121 df<1FE0003FF8007FFC00781E00300E0000070000070000FF0007 FF001FFF007F0700780700E00700E00700E00700F00F00781F003FFFF01FFBF007E1F014 147D9318>97 D<01FE0007FF001FFF803E0780380300700000700000E00000E00000E000 00E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318 >99 D<001F80003F80001F8000038000038000038000038000038003E3800FFB801FFF80 3C1F80380F80700780700380E00380E00380E00380E00380E00380E00380700780700780 380F803C1F801FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F003807 80700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E03 C01FFF8007FF0001FC0012147D9318>I<01E1F007FFF80FFFF81E1E301C0E0038070038 07003807003807003807001C0E001E1E001FFC001FF80039E0003800001C00001FFE001F FFC03FFFE07801F0700070E00038E00038E00038E000387800F07E03F01FFFC00FFF8001 FC00151F7F9318>103 D<7FE000FFE0007FE00000E00000E00000E00000E00000E00000 E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 E00000E00000E00000E00000E0007FFFC0FFFFE07FFFC0131C7E9B18>108 D<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00 E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC1714809318>110 D<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000E0E000E0E000E0E000 E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E9318>I<7E3E00FE FF807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E00380E00380E00380F 00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E00000E00000E 00000E00007FC000FFE0007FC000151E809318>I<07F7003FFF007FFF00780F00E00700 E00700E007007C00007FE0001FFC0003FE00001F00600780E00380E00380F00380F80F00 FFFF00FFFC00E7F00011147D9318>115 D<7E07E0FE0FE07E07E00E00E00E00E00E00E0 0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC 03FFFE01FCFC1714809318>117 D119 D<7F8FF07F9FF07F8FF0070700078E00039E0001DC0001F800 00F80000700000F00000F80001DC00039E00038E000707000F07807F8FF0FF8FF87F8FF0 15147F9318>I E /Fb 1 1 df0 D E /Fc 8 123 df<001E0000630000C38001C1800381800301C00701C00F01C00E01C0 1E03C01C03C03C03C03C03C03C03C07807807FFF807FFF80780780F00F00F00F00F00F00 F00E00F01E00E01C00E03C00E03800E0300060700060E00070C0003180001E000012207E 9F15>18 D<000002000000060000000E0000000E0000001E0000001F0000002F0000002F 0000004F0000008F0000008F0000010F0000010F0000020F0000040F0000040F0000080F 8000080780001007800020078000200780007FFF80004007800080078001800780010007 8002000780020007C0040003C00C0003C01E0007C0FF807FFC1E207E9F22>65 D<0FFFFFFC1E03C0381803C0181003C0082003C008200780086007800840078008400780 08800F0010000F0000000F0000000F0000001E0000001E0000001E0000001E0000003C00 00003C0000003C0000003C00000078000000780000007800000078000000F0000000F000 0000F0000000F0000001F000007FFFC0001E1F7F9E1B>84 D<001E3000713800E0F001C0 700380700780700700E00F00E00F00E00F00E01E01C01E01C01E01C01E01C01E03801E03 800E07800E0B8006170001E700000700000700000E00000E00300E00781C00F038006070 003FC000151D809316>103 D<0F006060118070F02180E0F821C0E07841C0E0384380E0 188381C0100701C0100701C0100701C0100E0380200E0380200E0380200E0380400E0380 400E0380800E078080060781000709860001F078001D147E9321>119 D<03C1C00C62201034701038F02038F020386040700000700000700000700000E00000E0 0000E00000E02061C040F1C040F1C080E2C080446300383C0014147E931A>I<0F006011 80702180E021C0E041C0E04380E08381C00701C00701C00701C00E03800E03800E03800E 03800E07000C07000C07000E0F00061E0003EE00000E00000E00001C0078180078380070 700060600021C0001F0000141D7E9316>I<01E02003F04007F8C00C1F80080100000200 00040000080000100000600000C0000100000200000400800801001003003F060061FC00 40F80080700013147E9315>I E /Fd 27 122 df69 DI<0003FE0040001FFFC0C0007F00F1C001 F8003FC003F0000FC007C00007C00FC00003C01F800003C03F000001C03F000001C07F00 0000C07E000000C07E000000C0FE00000000FE00000000FE00000000FE00000000FE0000 0000FE00000000FE00000000FE000FFFFC7E000FFFFC7F00001FC07F00001FC03F00001F C03F00001FC01F80001FC00FC0001FC007E0001FC003F0001FC001FC003FC0007F80E7C0 001FFFC3C00003FF00C026227DA12C>I76 D78 D<0007FC0000003FFF800000FC07E00003F001F80007 E000FC000FC0007E001F80003F001F80003F003F00001F803F00001F807F00001FC07E00 000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE0000 0FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F00001FC07F00001FC03F00001F 803F80003F801F80003F000FC0007E0007E000FC0003F001F80000FC07E000003FFF8000 0007FC000023227DA12A>II<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F80380 6003F80180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C000 03F800000003F800000003F800000003F800000003F800000003F800000003F800000003 F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8 00000003F800000003F800000003F800000003F800000003F8000003FFFFF80003FFFFF8 0022227EA127>84 D87 D<07FC001FFF803F07C03F03E03F01E03F01F01E01F00001F00001F0003FF003FDF0 1FC1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E 951B>97 DI<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC 0000FC0000FC0000FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF8000 FE0014167E9519>I<0001FE000001FE0000003E0000003E0000003E0000003E0000003E 0000003E0000003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE 001F007E003E003E007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E 00FC003E00FC003E00FC003E007C003E007C003E003E007E001E00FE000F83BE0007FF3F C001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8 FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC070 03FFC000FF0015167E951A>I<03FC1E0FFF7F1F0F8F3E07CF3C03C07C03E07C03E07C03 E07C03E07C03E03C03C03E07C01F0F801FFF0013FC003000003000003800003FFF801FFF F00FFFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E78003C7C007C3F01F80FFF E001FF0018217E951C>103 DI<1C003E007F007F007F003E001C00000000000000 0000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F00 1F001F001F001F001F001F00FFE0FFE00B247EA310>I108 DI112 D114 D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0007FF8003FFE000FFF 0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F00011167E9516 >I<0180000180000180000180000380000380000780000780000F80003F8000FFFF00FF FF000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F 81800F81800F81800F81800F81800F830007C30003FE0000F80011207F9F16>III120 DI E /Fe 27 122 df<00000200000006000000060000000E0000001E0000001E0000003F00 00002F0000004F0000004F0000008F0000010F0000010F0000020F0000020F0000040F00 00040F0000080F0000100F0000100F0000200F80003FFF800040078000C0078000800780 01000780010007800200078002000780060007801E000F80FF807FF81D207E9F22>65 D<01FFFFFC001E0038001E0018001E0008001E0008003C0008003C0008003C0008003C00 080078001000780800007808000078080000F0100000F0300000FFF00000F0300001E020 0001E0200001E0200001E0200003C0000003C0000003C0000003C0000007800000078000 0007800000078000000F800000FFF800001E1F7D9E1E>70 D<01FFF0001F00001E00001E 00001E00003C00003C00003C00003C0000780000780000780000780000F00000F00000F0 0000F00001E00001E00001E00001E00003C00003C00003C00003C0000780000780000780 000780000F8000FFF800141F7D9E12>73 D<01FFF03FE0001F000F80001E000E00001E00 0800001E001000003C002000003C004000003C010000003C020000007804000000780800 000078100000007830000000F0F0000000F1F8000000F278000000F478000001E83C0000 01F03C000001E03C000001E01E000003C01E000003C01E000003C00F000003C00F000007 800F00000780078000078007800007800780000F8007C000FFF03FF800231F7D9E23>75 D<01FFF800001F0000001E0000001E0000001E0000003C0000003C0000003C0000003C00 000078000000780000007800000078000000F0000000F0000000F0000000F0000001E000 0001E0000001E0000001E0008003C0010003C0010003C0030003C0020007800600078006 0007800C0007801C000F007800FFFFF800191F7D9E1D>I<01FF007FE0001F000F00001F 0004000017800400001780040000278008000023C008000023C008000023C008000041E0 10000041E010000041F010000040F010000080F020000080782000008078200000807820 0001003C400001003C400001003C400001001E400002001E800002001E800002000F8000 02000F800004000F0000040007000004000700000C000700001C00020000FF8002000023 1F7D9E22>78 D<0007E040001C18C0003005800060038000C0038001C001800180010003 80010003800100038001000380000003C0000003C0000003F8000001FF800001FFE00000 7FF000001FF0000001F80000007800000078000000380000003800200038002000380020 00300060007000600060006000E0007000C000E8038000C606000081F800001A217D9F1A >83 D<0FFFFFF01E0780E0180780201007802020078020200F0020600F0020400F002040 0F0020801E0040001E0000001E0000001E0000003C0000003C0000003C0000003C000000 78000000780000007800000078000000F0000000F0000000F0000000F0000001E0000001 E0000001E0000001E0000003E00000FFFF00001C1F789E21>I<00F1800389C00707800E 03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C40F0 1C40703C40705C40308C800F070013147C9317>97 D<07803F8007000700070007000E00 0E000E000E001C001C001CF01D0C3A0E3C0E380F380F700F700F700F700FE01EE01EE01E E01CE03CE038607060E031C01F0010207B9F15>I<007E0001C1000300800E07801E0780 1C07003C0000780000780000780000F00000F00000F00000F00000F00100700100700200 300C0018300007C00011147C9315>I<0000780003F80000700000700000700000700000 E00000E00000E00000E00001C00001C000F1C00389C00707800E03801C03803C03803807 00780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40308C 800F070015207C9F17>I<007C01C207010E011C013C013802780C7FF07800F000F000F0 00F000700170017002380C183007C010147C9315>I<00007800019C00033C00033C0007 18000700000700000E00000E00000E00000E00000E0001FFE0001C00001C00001C00001C 0000380000380000380000380000380000700000700000700000700000700000700000E0 0000E00000E00000E00000C00001C00001C0000180003180007B0000F300006600003C00 001629829F0E>I<003C6000E27001C1E00380E00700E00F00E00E01C01E01C01E01C01E 01C03C03803C03803C03803C03803C07003C07001C0F001C17000C2E0003CE00000E0000 0E00001C00001C00301C00783800F0700060E0003F8000141D7E9315>I<01E0000FE000 01C00001C00001C00001C000038000038000038000038000070000070000071E00076300 0E81800F01C00E01C00E01C01C03801C03801C03801C0380380700380700380700380E10 700E20700C20701C20700C40E00CC060070014207D9F17>I<00C001E001E001C0000000 00000000000000000000000E003300230043804300470087000E000E000E001C001C001C 003840388030807080310033001C000B1F7C9E0E>I<03C01FC003800380038003800700 0700070007000E000E000E000E001C001C001C001C003800380038003800700070007000 7100E200E200E200E200640038000A207C9F0C>108 D<1C0F80F0002630C31800474064 0C004780680E004700700E004700700E008E00E01C000E00E01C000E00E01C000E00E01C 001C01C038001C01C038001C01C038001C01C0708038038071003803806100380380E100 38038062007007006600300300380021147C9325>I<1C0F802630C04740604780604700 704700708E00E00E00E00E00E00E00E01C01C01C01C01C01C01C03843803883803083807 083803107003303001C016147C931A>I<007C0001C3000301800E01C01E01C01C01E03C 01E07801E07801E07801E0F003C0F003C0F003C0F00780F00700700F00700E0030180018 700007C00013147C9317>I<01C1E002621804741C04781C04701E04701E08E01E00E01E 00E01E00E01E01C03C01C03C01C03C01C0380380780380700380E003C1C0072380071E00 0700000700000E00000E00000E00000E00001C00001C0000FFC000171D809317>I<1C1E 002661004783804787804707804703008E00000E00000E00000E00001C00001C00001C00 001C000038000038000038000038000070000030000011147C9313>114 D<00FC030206010C030C070C060C000F800FF007F803FC003E000E700EF00CF00CE00840 1020601F8010147D9313>I<018001C0038003800380038007000700FFF007000E000E00 0E000E001C001C001C001C003800380038003820704070407080708031001E000C1C7C9B 0F>I<0E00C03300E02301C04381C04301C04701C08703800E03800E03800E03801C0700 1C07001C07001C07101C0E20180E20180E201C1E200C264007C38014147C9318>I<0E00 C03300E02301C04381C04301C04701C08703800E03800E03800E03801C07001C07001C07 001C07001C0E00180E00180E001C1E000C3C0007DC00001C00001C00003800F03800F070 00E06000C0C0004380003E0000131D7C9316>121 D E /Ff 74 128 df<001F83E000F06E3001C078780380F8780300F0300700700007007000070070000700 7000070070000700700007007000FFFFFF80070070000700700007007000070070000700 700007007000070070000700700007007000070070000700700007007000070070000700 7000070070000700700007007000070070007FE3FF001D20809F1B>11 D<003F0000E0C001C0C00381E00701E00701E00700000700000700000700000700000700 00FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 E00700E00700E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<001F81F8 0000F04F040001C07C06000380F80F000300F00F000700F00F0007007000000700700000 0700700000070070000007007000000700700000FFFFFFFF000700700700070070070007 007007000700700700070070070007007007000700700700070070070007007007000700 700700070070070007007007000700700700070070070007007007000700700700070070 070007007007007FE3FE3FF02420809F26>14 D<7038F87CFC7EFC7E743A040204020402 0804080410081008201040200F0E7E9F17>34 D<70F8FCFC74040404080810102040060E 7C9F0D>39 D<0020004000800100020006000C000C001800180030003000300070006000 60006000E000E000E000E000E000E000E000E000E000E000E000E0006000600060007000 300030003000180018000C000C000600020001000080004000200B2E7DA112>I<800040 002000100008000C00060006000300030001800180018001C000C000C000C000E000E000 E000E000E000E000E000E000E000E000E000E000C000C000C001C0018001800180030003 00060006000C00080010002000400080000B2E7DA112>I<70F8FCFC7404040408081010 2040060E7C840D>44 DI<70F8F8F87005057C840D>I<00010003 0003000600060006000C000C000C00180018001800300030003000600060006000C000C0 00C00180018001800300030003000600060006000C000C000C0018001800180030003000 3000600060006000C000C000C000102D7DA117>I<03F0000E1C001C0E00180600380700 700380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0 F003C0F003C0F003C0F003C0F003C07003807003807003807807803807001806001C0E00 0E1C0003F000121F7E9D17>I<018003800F80F380038003800380038003800380038003 80038003800380038003800380038003800380038003800380038003800380038007C0FF FE0F1E7C9D17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F8 03C02007C00007C0000780000780000F00000E00001C0000380000700000600000C00001 80000300000600400C00401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F000 0C1C00100E00200F00780F80780780780780380F80000F80000F00000F00000E00001C00 00380003F000003C00000E00000F000007800007800007C02007C0F807C0F807C0F807C0 F00780400780400F00200E001C3C0003F000121F7E9D17>I<000600000600000E00000E 00001E00002E00002E00004E00008E00008E00010E00020E00020E00040E00080E00080E 00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E 00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE00010000010000010 000010000010000010000011F000161C00180E001007001007800003800003800003C000 03C00003C07003C0F003C0F003C0E00380400380400700200700100E000C380003E00012 1F7E9D17>I<007C000182000701000E03800C07801C0780380300380000780000700000 700000F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C0 7003C07003C07003803803803807001807000C0E00061C0001F000121F7E9D17>I<4000 007FFFC07FFF807FFF804001008002008002008004000008000008000010000020000020 0000400000400000C00000C00001C0000180000380000380000380000380000780000780 00078000078000078000078000078000030000121F7D9D17>I<03F0000C0C0010060030 03002001806001806001806001807001807803003E03003F06001FC8000FF00003F80007 FC000C7E00103F00300F806003804001C0C001C0C000C0C000C0C000C0C0008060018020 01001002000C0C0003F000121F7E9D17>I<03F0000E18001C0C00380600380700700700 700380F00380F00380F003C0F003C0F003C0F003C0F003C07007C07007C03807C0180BC0 0E13C003E3C0000380000380000380000700300700780600780E00700C00201800107000 0FC000121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F87005147C930D>I< 70F8F8F8700000000000000000000070F0F8F878080808101010202040051D7C930D>I< 0FC0307040384038E03CF03CF03C603C0038007000E000C0018001800100030002000200 02000200020002000000000000000000000007000F800F800F8007000E207D9F15>63 D<000100000003800000038000000380000007C0000007C0000007C0000009E0000009E0 000009E0000010F0000010F0000010F00000207800002078000020780000403C0000403C 0000403C0000801E0000801E0000FFFE0001000F0001000F0001000F0002000780020007 8002000780040003C00E0003C01F0007E0FFC03FFE1F207F9F22>65 DI<000FC040007030C001C009C0 038005C0070003C00E0001C01E0000C01C0000C03C0000C07C0000407C00004078000040 F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000 780000007C0000407C0000403C0000401C0000401E0000800E0000800700010003800200 01C0040000703800000FC0001A217D9F21>IIII<000FE0200078186000E004E0038002E0070001E0 0F0000E01E0000601E0000603C0000603C0000207C00002078000020F8000000F8000000 F8000000F8000000F8000000F8000000F8000000F8007FFCF80003E0780001E07C0001E0 3C0001E03C0001E01E0001E01E0001E00F0001E0070001E0038002E000E0046000781820 000FE0001E217D9F24>III<0FFFC0007C 00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C 00003C00003C00003C00003C00003C00003C00003C00003C00003C00203C00F83C00F83C 00F83C00F0380040780040700030E0000F800012207E9E17>IIIII<001F800000F0F00001C0380007801E000F000F000E0007001E00 07803C0003C03C0003C07C0003E0780001E0780001E0F80001F0F80001F0F80001F0F800 01F0F80001F0F80001F0F80001F0F80001F0F80001F0780001E07C0003E07C0003E03C00 03C03C0003C01E0007800E0007000F000F0007801E0001C0380000F0F000001F80001C21 7D9F23>II82 D<07E0800C198010078030038060018060 0180E00180E00080E00080E00080F00000F000007800007F00003FF0001FFC000FFE0003 FF00001F800007800003C00003C00001C08001C08001C08001C08001C0C00180C00380E0 0300F00600CE0C0081F80012217D9F19>I<7FFFFFE0780F01E0600F0060400F0020400F 0020C00F0030800F0010800F0010800F0010800F0010000F0000000F0000000F0000000F 0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F 0000000F0000000F0000000F0000000F0000000F0000000F0000001F800007FFFE001C1F 7E9E21>IIII<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E 7B9F17>92 D<1FE000303000781800781C00300E00000E00000E00000E0000FE000F8E00 1E0E00380E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317> 97 D<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E0000 0E00000E3E000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E0078 0E00780E00780E00700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F8 0E0C1C1E381E380C70007000F000F000F000F000F000F00070007000380138011C020E0C 03F010147E9314>I<000380003F80000380000380000380000380000380000380000380 00038000038000038003E380061B801C0780380380380380700380700380F00380F00380 F00380F00380F00380F003807003807003803803803807801C07800E1B8003E3F815207E 9F19>I<03F0000E1C001C0E00380700380700700380700380F00380FFFF80F00000F000 00F00000F000007000007000003800801800800C010007060001F80011147F9314>I<00 7C00C6018F038F07060700070007000700070007000700FFF00700070007000700070007 000700070007000700070007000700070007000700070007007FF01020809F0E>I<0000 E003E3300E3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E38 0033E0002000002000003000003000003FFE001FFF800FFFC03001E0600070C00030C000 30C00030C000306000603000C01C038003FC00141F7F9417>I<0E0000FE00000E00000E 00000E00000E00000E00000E00000E00000E00000E00000E00000E3E000E43000E81800F 01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E 01C00E01C00E01C00E01C0FFE7FC16207F9F19>I<1C003E003E003E001C000000000000 000000000000000E007E000E000E000E000E000E000E000E000E000E000E000E000E000E 000E000E000E000E00FFC00A1F809E0C>I<00E001F001F001F000E00000000000000000 00000000007007F000F00070007000700070007000700070007000700070007000700070 007000700070007000700070007000706070F060F0C061803F000C28829E0E>I<0E0000 FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0FF0 0E07C00E03000E02000E04000E08000E10000E30000E70000EF8000F38000E1C000E1E00 0E0E000E07000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE000E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618 000E80C80C000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E00E00E00 0E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E 00E00E000E00E00E000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F 01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E 01C00E01C00E01C00E01C0FFE7FC16147F9319>I<01F800070E001C03803801C03801C0 7000E07000E0F000F0F000F0F000F0F000F0F000F0F000F07000E07000E03801C03801C0 1C0380070E0001F80014147F9317>I<0E3E00FEC3800F01C00F00E00E00E00E00F00E00 700E00780E00780E00780E00780E00780E00780E00700E00F00E00E00F01E00F01C00EC3 000E3E000E00000E00000E00000E00000E00000E00000E00000E0000FFE000151D7F9319 >I<03E0800619801C05803C0780380380780380700380F00380F00380F00380F00380F0 0380F003807003807803803803803807801C0B800E138003E38000038000038000038000 0380000380000380000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E00 0E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F 9030704030C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D0 608F800D147E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E00 0E000E000E000E000E000E000E000E080E080E080E080E080610031001E00D1C7F9B12> I<0E01C0FE1FC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 C00E01C00E01C00E01C00E01C00E03C00603C0030DC001F1FC16147F9319>III<7FC3FC0F01E00701C007018003810001C20000E40000EC00007800003800 003C00007C00004E000087000107000303800201C00601E01E01E0FF07FE1714809318> II<3FFF380E200E201C4038407840 7000E001E001C00380078007010E011E011C0338027006700EFFFE10147F9314>I<3030 7878F87C787830300E057C9E17>127 D E /Fg 19 119 df<0000001C000000001C0000 00003C000000003C000000007C00000000FC00000000FC00000001FC00000001FC000000 037C000000037C000000067C0000000E7C0000000C7C000000187C000000187C00000030 7C000000307E000000603E000000603E000000C03E000001C03E000001803E000003003E 000003003E000006003E000006003E00000FFFFE00000FFFFE000018003E000038003E00 0030003E000060003E000060003E0000C0003F0000C0001F000180001F000380001F0003 80001F000FC0003F00FFF007FFF8FFF007FFF0252A7CA92C>65 D<003FFFFFFF003FFFFF FF0001F8003F0001F0000F0001F0000E0001F0000E0001F000060003E000060003E00006 0003E0000E0003E0000C0007C0000C0007C0180C0007C0180C0007C01800000F80300000 0F803000000F807000000F80F000001FFFE000001FFFE000001F01E000001F00E000003E 00C000003E00C000003E00C000003E00C000007C018000007C000000007C000000007C00 000000F800000000F800000000F800000000F800000001F000000001F000000001F00000 0003F00000007FFFC00000FFFFC0000028297CA827>70 D<003FFFE0003FFFE00001F800 0001F0000001F0000001F0000001F0000003E0000003E0000003E0000003E0000007C000 0007C0000007C0000007C000000F8000000F8000000F8000000F8000001F0000001F0000 001F0000001F0000003E0000003E0000003E0000003E0000007C0000007C0000007C0000 007C000000F8000000F8000000F8000000F8000001F0000001F0000001F0000003F00000 FFFF8000FFFF80001B297DA817>73 D<003FFFE01FFF003FFFE01FFE0001F80007F00001 F00007800001F00007000001F0000C000001F00018000003E00030000003E00060000003 E001C0000003E00380000007C00600000007C00C00000007C01800000007C0300000000F 80E00000000F81C00000000F83E00000000F87E00000001F0FE00000001F19F00000001F 71F00000001FE1F00000003FC0F80000003F00F80000003E00F80000003E007C0000007C 007C0000007C007C0000007C003E0000007C003E000000F8003E000000F8003F000000F8 001F000000F8001F000001F0001F800001F0000F800001F0000F800003F0001FC0007FFF 80FFFC00FFFF81FFFC0030297CA82E>75 D<003FFFF000003FFFF0000001F800000001F0 00000001F000000001F000000001F000000003E000000003E000000003E000000003E000 000007C000000007C000000007C000000007C00000000F800000000F800000000F800000 000F800000001F000000001F000000001F000000001F000000003E000000003E00000000 3E000100003E000180007C000300007C000300007C000300007C00060000F800060000F8 000E0000F8000C0000F8001C0001F0003C0001F000780001F000F80003F007F8007FFFFF F000FFFFFFF00021297CA825>I<003FF800FFFC003FF800FFFC0000FC000FC00001FC00 07000001FC0006000001BE0006000001BE00060000033E000C0000031F000C0000031F00 0C0000031F000C0000061F00180000060F80180000060F80180000060F801800000C07C0 3000000C07C03000000C07C03000000C03E03000001803E06000001803E06000001803E0 6000001801F06000003001F0C000003001F0C000003000F8C000003000F8C000006000F9 80000060007D80000060007D80000060007D800000C0007F000000C0003F000000C0003F 000000C0003F00000180001E00000180001E00000380001E000007C0000E00007FFC000C 0000FFFC000C00002E297CA82C>78 D<003FFFFF80003FFFFFF00001F801F80001F0007C 0001F0003E0001F0003E0001F0003F0003E0003F0003E0003F0003E0003F0003E0003F00 07C0007E0007C0007E0007C0007E0007C000FC000F8000F8000F8001F0000F8003E0000F 8007C0001F001F00001FFFFC00001F000000001F000000003E000000003E000000003E00 0000003E000000007C000000007C000000007C000000007C00000000F800000000F80000 0000F800000000F800000001F000000001F000000001F000000003F00000007FFF800000 FFFF80000028297CA829>80 D<00003F010001FFC30003C0E70007007F000E003E001C00 1E0038001E0078001E0070001C00F0001C00F0001C00F0001C01F0001801F0001801F000 0001F8000000FC000000FF000000FFF000007FFE00003FFF00001FFF800003FFC000007F C000000FE0000003E0000003E0000003E0000001E0180001E0180001E0180001E0380003 C0380003C03800038038000780780007007C000E007C001C0077003800E3C0F000C1FFE0 00807F0000202B7BA922>83 D<0FFFFFFFF80FFFFFFFF81F803E01F81E007C00781C007C 003038007C003038007C00303000F800303000F800306000F800306000F800606001F000 60C001F00060C001F000600001F000000003E000000003E000000003E000000003E00000 0007C000000007C000000007C000000007C00000000F800000000F800000000F80000000 0F800000001F000000001F000000001F000000001F000000003E000000003E000000003E 000000003E000000007C000000007C000000007C00000000FC000000FFFFF80000FFFFF8 0000252975A82B>I<003E000000E1180001C0BC000380FC00070078000F0078001E0078 001E0078003E00F0007C00F0007C00F0007C00F000F801E000F801E000F801E000F801E0 00F003C000F003C180F003C180F003C180F0078300700F8300700B82003833860018618C 000F80F800191A79991F>97 D<000003C000007FC000007FC0000007C000000780000007 80000007800000078000000F0000000F0000000F0000000F0000001E0000001E0000001E 0000001E00003E3C0000E13C0001C0BC000380FC00070078000F0078001E0078001E0078 003E00F0007C00F0007C00F0007C00F000F801E000F801E000F801E000F801E000F003C0 00F003C180F003C180F003C180F0078300700F8300700B82003833860018618C000F80F8 001A2A79A91F>100 D<001F800070C001C0600380600700600F00601E00603E00C03C00 C07C03807C1E007FF000F80000F80000F80000F80000F80000F00000F00000F000207000 607800C03801801807000C1C0007F000131A79991B>I<0007C0001C6600383F00703F00 E01E01E01E03C01E03C01E07803C0F803C0F803C0F803C1F00781F00781F00781F00781E 00F01E00F01E00F01E00F01E01E01E03E00E03E00605E0031BC001F3C00003C00003C000 0780000780000780000700700F00F80E00F81C00F03800E070003F800018267C991B> 103 D<001C003E003E003C003800000000000000000000000000000000000007800CE018 6030F030F060F060F061E0C1E001E003C003C00780078007800F000F000F0C1E0C1E0C1E 183C181C301C200C4007800F287BA712>105 D<00780FF80FF800F800F000F000F000F0 01E001E001E001E003C003C003C003C007800780078007800F000F000F000F001E001E00 1E001E003C003C003C003C00780078C078C078C0F0C0F1807180718033001E000D2A7AA9 0F>108 D<07807C0008C1870010E2038030F4038030FC03C060F803C060F003C060F003 C0C1E0078001E0078001E0078001E0078003C00F0003C00F0003C00F0003C01E0007801E 0007801E0C07803C0C07803C080F003C180F0078100F0038300F0038601E0018C00C000F 001E1A7B9922>110 D<0781F808C30C10E40E30FC1E30F83E60F03E60F01C60F000C1E0 0001E00001E00001E00003C00003C00003C00003C0000780000780000780000780000F00 000F00000F00000F00001E00000C0000171A7B9919>114 D<003F0000E0C001C0600380 600300E00701E00701E00700C007800007E00007FC0007FE0003FF0001FF80001F800007 800007803803807C03807C0380F80700700600600E00600C003830000FC000131A7B9918 >I<03C01C04703E08303E10783E30781E20781E60780E60F00EC0F00C00F00C01E00C01 E00C01E01803C01803C01803C0180780300780300780200780600780600780C003808003 810001C200007C00171A7B991B>118 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 224 307 a Fg(Pe)m(digr)m(e)m(e)23 b(T)-5 b(r)m(aversal)23 b(in)e(F)-6 b(ASTLINK)757 409 y Ff(Alejandro)16 b(A.)f(Sc)o(h\177)-23 b(a\013er)819 465 y(Rice)15 b(Univ)o(ersit)o(y)224 571 y(This)f(do)q(cumen)o(t)f(is)g(mean)o(t)g(to)f(accompan)o(y)h(F)-5 b(ASTLINK,)13 b(v)o(ersion)g(2.0)f(and)h(b)q(ey)o(ond.)224 628 y(It)g(describ)q(es)h(some)e(asp)q(ects)h(of)f(p)q(edigree)i(tra)o (v)o(ersal)d(in)j(F)-5 b(ASTLINK.)13 b(It)f(is)h(primarily)224 684 y(in)o(tended)21 b(for)d(computer)h(scien)o(tists)h(and)f(exp)q (erts)h(in)g(link)m(age)g(analysis)g(who)f(ma)o(y)224 741 y(wish)d(to)f(mo)q(dify)g(the)h(LINKA)o(GE)f(or)g(F)-5 b(ASTLINK)16 b(co)q(de)g(in)g(v)m(arious)g(w)o(a)o(ys.)295 797 y(Ev)o(erything)21 b(written)f(in)i(this)f(do)q(cumen)o(t)h(also)e (applies)j(to)d(LINKA)o(GE.)h(This)224 854 y(do)q(cumen)o(t)14 b(is)f(based)g(on)g(m)o(y)g(o)o(wn)f(approac)o(h)h(to)f(understanding)i (p)q(edigree)h(tra)o(v)o(ersal)224 910 y(and)20 b(m)o(y)g(o)o(wn)f (terminology)l(.)34 b(So)20 b(far)f(as)h(I)g(kno)o(w,)g(o)o(v)o(erlaps) f(with)i(other)e(descrip-)224 967 y(tions)i(of)f(p)q(edigree)i(tra)o(v) o(ersal)e(are)g(largely)h(inciden)o(tal.)38 b(Thanks)21 b(to)f(Meg)g(Gelder)224 1023 y(Ehm)14 b(\(Rice)h(Univ)o(ersit)o(y\),)f (Sandeep)i(Gupta)d(\(Rice)i(Univ)o(ersit)o(y\),)f(and)h(Prof.)j(Daniel) 224 1079 y(W)l(eeks)11 b(\(Univ)o(ersit)o(y)g(of)f(Pittsburgh\))h(for)f (asking)g(enough)h(questions)h(ab)q(out)e(p)q(edigree)224 1136 y(tra)o(v)o(ersal)k(to)h(motiv)m(ate)g(me)g(to)g(write)g(this)h (do)q(cumen)o(t.)295 1192 y(Thanks)k(to)g(Darrell)h(Ro)q(ot)e(\(Oregon) h(Health)h(Sciences)i(Univ)o(ersit)o(y\))d(for)g(con-)224 1249 y(tributing)14 b(P)o(ostScript)f(\014les)g(with)h(the)f(\014rst)f (3)h(sample)g(p)q(edigrees)i(sho)o(wn)d(b)q(elo)o(w.)20 b(His)224 1305 y(p)q(edigrees)d(w)o(ere)e(dra)o(wn)f(with:)295 1362 y(P)o(edDra)o(w)h(v.4.4r2)g(b)o(y)i(P)o(aul)g(Mamelk)m(a,)g (Bennet)g(Dyk)o(e,)g(and)f(Jean)i(MacCleur,)224 1418 y(Departmen)o(t)i(of)g(Genetics,)j(South)o(w)o(est)d(F)l(oundation)h (for)g(Biomedical)h(Researc)o(h,)224 1475 y(1993.)295 1531 y(Thanks)e(to)f(Prof.)33 b(Elizab)q(eth)22 b(Thompson)e(\(Univ)o (ersit)o(y)g(of)f(W)l(ashington\))h(for)224 1588 y(con)o(tributing)g(a) f(P)o(ostScript)f(\014le)i(with)g(the)f(last)g(sample)g(p)q(edigree)i (sho)o(wn)d(b)q(elo)o(w.)224 1644 y(Her)d(p)q(edigree)i(w)o(as)d(dra)o (wn)h(with)h(psdra)o(w,)e(for)h(whic)o(h)h(the)f(reference)h(is:)295 1700 y(Gey)o(er,)10 b(C.)g(J.,)h(Soft)o(w)o(are)e(for)h(calculating)i (gene)f(surviv)m(al)h(and)e(m)o(ultigene)i(descen)o(t)224 1757 y(probabilities)18 b(and)e(for)f(p)q(edigree)i(manipulation)g(and) f(dra)o(wing,)f(T)l(ec)o(hnical)i(Rep)q(ort)224 1813 y(No.)j(153,)14 b(Departmen)o(t)g(of)h(Statistics,)g(Univ)o(ersit)o(y)h (of)e(W)l(ashington,)h(1988.)295 1870 y(This)i(do)q(cumen)o(t)h (describ)q(es)g(p)q(edigree)h(tra)o(v)o(ersal)c(for)i(lo)q(opless)h(p)q (edigrees.)26 b(The)224 1926 y(issue)k(of)e(lo)q(ops)i(is)f(dealt)g (with)g(in)h(the)f(accompan)o(ying)g(do)q(cumen)o(t)g Fe(L)n(o)n(ops)f(in)224 1983 y(F)-5 b(ASTLINK)p Ff(.)13 b(This)i(do)q(cumen)o(t)h(should)g(b)q(e)g(read)f(b)q(efore)h(the)f(lo) q(ops)h(do)q(cumen)o(t.)224 2104 y Fd(Wh)n(y)j(T)-5 b(ra)n(v)n(erse)19 b(the)f(P)n(edigree)224 2190 y Ff(A)12 b(fundamen)o(tal)g(goal)f(in)h (all)h(the)e(programs)f(in)j(LINKA)o(GE/F)-5 b(ASTLINK)13 b(is)f(to)f(com-)224 2247 y(pute)k(the)g(p)q(edigree)h(lik)o(eliho)q(o) q(d)i(for)c(a)g(candidate)i(v)m(alue)f(of)g Fc(\022)q Ff(.)20 b(Ho)o(w)14 b(the)h(candidates)224 2303 y(are)e(generated)g(v)m (aries)h(from)e(program)g(to)g(program.)18 b(The)c(computation)f(is)g (done)h(b)o(y)224 2360 y(selecting)20 b(one)e(individual)k Fc(A)c Ff(to)g(b)q(e)h(the)g(\\proband")f(and)g(computing)h(for)f Fc(A)g Ff(and)224 2416 y(eac)o(h)e(genot)o(yp)q(e)g Fc(g)r Ff(,)e(the)i(probabilit)o(y)h(that)e Fc(A)g Ff(has)h(genot)o(yp)q(e)g Fc(g)g Ff(conditioned)i(on)d(the)960 2577 y(1)p eop %%Page: 2 2 2 1 bop 224 307 a Ff(kno)o(wn)17 b(genot)o(yp)q(e)g(information)h(of)f (the)g(rest)g(of)g(the)g(p)q(edigree)i(and)e(the)h(candidate)224 364 y Fc(\022)q Ff(.)295 420 y(LINKA)o(GE/F)-5 b(ASTLINK)23 b(uses)g(a)e(simple)j(lo)q(op)e(breaking)h(strategy)e(that)g(al-)224 477 y(lo)o(ws)f(us)h(to)e(assume)i(in)g(this)g(do)q(cumen)o(t)f(that)g (all)h(p)q(edigrees)h(are)e(lo)q(opless.)36 b(The)224 533 y(issue)15 b(of)f(lo)q(ops)h(is)g(discussed)g(in)h(detail)f(in)g (the)f(accompan)o(ying)h(do)q(cumen)o(t)g Fe(L)n(o)n(ops)f(in)224 589 y(F)-5 b(ASTLINK)p Ff(.)295 646 y(The)18 b(reason)f(for)g(the)h (term)g(\\tra)o(v)o(ersal")e(is)i(that)f(it)i(is)f(natural)g(to)f(up)q (date)h(the)224 702 y(conditional)j(genot)o(yp)q(e)e(probabilities)i (for)d(one)h(family)h(at)e(a)h(time.)31 b(This)20 b(raises)f(a)224 759 y(ma)s(jor)h(question:)34 b(when)22 b(up)q(dating)h(the)e (conditional)j(genot)o(yp)q(e)d(probabilit)o(y)i(for)224 815 y(mem)o(b)q(ers)15 b(of)g(some)g(n)o(uclear)h(family)l(,)g(what)e (should)j(w)o(e)e(condition)h(on,)f(b)q(esides)i Fc(\022)q Ff(?)295 872 y(A)d Fe(nucle)n(ar)h(family)g Ff(consists)g(of)f(t)o(w)o (o)f(paren)o(ts)h(and)h(all)g(the)g(c)o(hildren)h(whic)o(h)f(they)224 928 y(pro)q(duced)j(together.)25 b(Some)17 b(geneticists)h(use)g(the)f (term)g Fe(ful)r(l)g(sibship)g Ff(to)f(mean)h(the)224 985 y(same)e(thing)h(as)f(what)f(I)i(am)f(calling)h(n)o(uclear)g (family)l(.)295 1041 y(A)j(\(v)m(alid\))i(tra)o(v)o(ersal)e(sequence)i (is)f(a)f(sequence)i(of)e(visits)i(to)e(n)o(uclear)h(families)224 1098 y(done)c(in)g(suc)o(h)f(a)g(w)o(a)o(y)f(that:)280 1184 y(1.)22 b(Eac)o(h)13 b(n)o(uclear)h(family)g(has)f(one)h(visit)g (during)g(whic)o(h)g(the)g(genot)o(yp)q(e)f(probabil-)338 1240 y(ities)k(of)g(one)f(of)h(its)f(mem)o(b)q(ers)h(are)g(up)q(dated)g (conditional)h(on)f(the)g(genot)o(yp)q(es)338 1297 y(of)f(the)g(other)g (mem)o(b)q(ers)h(of)e(the)i(n)o(uclear)g(family)g(\(whic)o(h)g(ha)o(v)o (e)f(b)q(een)h(in)h(turn)338 1353 y(conditioned)f(on)e(other)g (individuals\))j(and)d Fc(\022)q Ff(.)280 1444 y(2.)22 b(The)e(nesting)g(of)f(the)g(conditionals)i(is)f(suc)o(h)g(that)f(at)g (the)g(last)h(up)q(date,)g(the)338 1500 y(proband's)c(genot)o(yp)q(e)g (probabilities)i(are)d(up)q(dated)i(\(indirectly\))h(conditional)338 1557 y(on)d(the)g(observ)o(ed)g(data)g(for)g(the)g(rest)g(of)f(the)i(p) q(edigree)g(and)g Fc(\022)q Ff(.)295 1643 y(Elston)d(and)f(Stew)o(art)g (made)h(the)g(fundamen)o(tal)g(observ)m(ation)g(that)f(\(under)h(some) 224 1699 y(conditions,)h(to)d(b)q(e)i(sp)q(eci\014ed)h(b)q(elo)o(w\),)f (it)g(is)f(su\016cien)o(t)h(to)f(condition)h(the)f(up)q(date)h(of)f(a) 224 1756 y(giv)o(en)h(n)o(uclear)h(family)f(on)g(all)g(of)g(its)g (descendan)o(t)g(n)o(uclear)g(families.)21 b(When)13 b(arriving)224 1812 y(at)h(a)g(new)g(n)o(uclear)h(family)g(the)f (probabilities)j(of)d(the)g(paren)o(t)g(that)f(connects)i(up)f(the)224 1868 y(tree)d(are)g(up)q(dated)h(conditional)h(on)e(the)g(sp)q(ouse,)h (the)f(c)o(hildren,)j(and)d Fc(\022)q Ff(.)19 b(The)12 b(c)o(hildren)224 1925 y(already)k(are)f(conditioned)h(on)g(an)o(y)e (descendan)o(ts)i(further)f(do)o(wn)g(in)h(the)g(tree.)295 1981 y(Suc)o(h)g(an)f(up)o(w)o(ard)f(tra)o(v)o(ersal)h(sequence)h(will) h(w)o(ork)d(if:)280 2067 y(1.)22 b(There)15 b(is)h(exactly)g(one)f(n)o (uclear)h(family)g Fc(T)21 b Ff(at)14 b(the)i(top)e(generation.)280 2158 y(2.)22 b(Ev)o(ery)g(other)f(n)o(uclear)i(family)g(has)f(exactly)h (one)f(paren)o(t)g(who)g(is)h(a)f(direct)338 2215 y(descendan)o(t)15 b(of)f(the)h(t)o(w)o(o)e(paren)o(ts)h(in)h(family)g Fc(T)21 b Ff(and)14 b(one)h(paren)o(t)f(who)g(has)h(no)338 2271 y(ancestors)f(in)i(the)g(p)q(edigree)g(\(suc)o(h)g(a)e(p)q(erson)i(is)g (called)h(a)d Fe(founder)p Ff(\).)280 2362 y(3.)22 b(There)15 b(are)g(no)g(m)o(ultiple)i(marriages.)280 2452 y(4.)22 b(One)16 b(of)f(the)g(paren)o(ts)g(in)h Fc(T)21 b Ff(is)15 b(treated)g(as)g(the)g(proband.)960 2577 y(2)p eop %%Page: 3 3 3 2 bop 295 307 a Ff(It)11 b(is)g(useful)h(to)e(observ)o(e)h(that)f (for)g(p)q(edigrees)i(that)f(satisfy)f(these)h(four)g(conditions,)224 364 y(there)17 b(ma)o(y)g(b)q(e)h(man)o(y)e(tra)o(v)o(ersal)g (sequences)i(whic)o(h)g(are)f(v)m(alid.)27 b(F)l(or)17 b(example,)h(an)o(y)224 420 y(sequence,)d(whic)o(h)h(up)q(dates)e(all)h (n)o(uclear)g(families)h(in)f(the)g(b)q(ottom)e(generation,)h(then)224 477 y(all)e(n)o(uclear)g(families)h(in)f(the)g(next-to-b)q(ottom)e (generation,)i(and)f(so)g(on)h(up)f(the)h(tree)f(is)224 533 y(v)m(alid.)20 b(Within)12 b(eac)o(h)f(generation)g(an)o(y)f(order) g(of)h(visits)g(to)f(n)o(uclear)h(families)i(preserv)o(es)224 589 y(v)m(alidit)o(y)l(.)224 711 y Fd(Nuclear)18 b(F)-5 b(amily)17 b(Graph)224 797 y Ff(The)c(description)h(in)f(Ott's)f(b)q(o) q(ok)h(suggests)f(that)f(the)i(p)q(edigree)h(tra)o(v)o(ersal)e (algorithm)224 853 y(in)17 b(LINKA)o(GE)f(is)h(a)e(minor)h(mo)q (di\014cation)h(of)f(the)g(Elston-Stew)o(art)f(b)q(ottom-up)g(ap-)224 910 y(proac)o(h.)30 b(I)19 b(can)g(see)g(ho)o(w)f(this)h(claim)h(is)f (plausible)j(from)c(a)g(genetics)h(or)g(statistics)224 966 y(p)q(oin)o(t)d(of)f(view.)21 b(Ho)o(w)o(ev)o(er,)14 b(as)h(an)h(algorithmicist,)g(I)g(\014nd)g(the)f(suggestion)h(that)e (the)224 1023 y(Elston-Stew)o(art)h(and)g(LINKA)o(GE)h(algorithms)f (are)g(similar)h(to)f(b)q(e)h(misleading.)295 1079 y(It)f(is)h(true)f (that)g(for)f(p)q(edigrees)j(that)e(satisfy)g(the)g(4)g(conditions)i (ab)q(o)o(v)o(e,)d(the)i(t)o(w)o(o)224 1136 y(probabilit)o(y)23 b(up)q(date)g(algorithms)f(can)g(visit)h(the)f(n)o(uclear)h(families)h (in)f(the)f(same)224 1192 y(order.)38 b(Ho)o(w)o(ev)o(er,)21 b(this)g(is)h(far)e(from)h(ob)o(vious)g(if)h(one)f(stares)f(at)h(the)g (LINKA)o(GE)224 1249 y(tra)o(v)o(ersal)15 b(co)q(de.)24 b(I)16 b(use)g(the)h(w)o(ord)e(\\can")h(rather)f(than)h(\\do")g(in)h (the)f(\014rst)g(sen)o(tence)224 1305 y(b)q(ecause)21 b(b)q(oth)f(the)f(Elston-Stew)o(art)g(algorithm)h(and)g(the)f(LINKA)o (GE)i(algorithm)224 1362 y(allo)o(w)d(for)f(some)g(arbitrary)f (orderings)i(in)g(the)g(n)o(uclear)g(family)g(visits.)27 b(It)18 b(is)g(p)q(ossi-)224 1418 y(ble)d(to)d(correctly)i(implemen)o (t)g(the)g(Elston-Stew)o(art)e(algorithm)i(to)e(visit)i(the)g(n)o (uclear)224 1474 y(families)i(in)g(orders)e(whic)o(h)h(are)f (absolutely)i(imp)q(ossible)h(with)e(LINKA)o(GE,)g(no)f(mat-)224 1531 y(ter)i(ho)o(w)g(LINKA)o(GE)h(mak)o(es)e(its)i(free)f(c)o(hoices.) 24 b(F)l(or)16 b(example,)g(in)i(a)d(p)q(edigree)j(that)224 1587 y(satis\014es)12 b(the)f(4)g(conditions)h(ab)q(o)o(v)o(e)f(and)h (has)f(m)o(ultiple)i(n)o(uclear)f(families)g(at)f(eac)o(h)g(gen-)224 1644 y(eration)19 b(but)g(the)g(topmost,)f(the)g(generation-b)o (y-generation)i(tra)o(v)o(ersal)d(sequences)224 1700 y(prop)q(osed)c(ab)q(o)o(v)o(e)e(as)h(p)q(ossible)i(for)d(the)i (Elston-Stew)o(art)e(algorithm)h(are)g Fe(not)g Ff(p)q(ossible)224 1757 y(in)k(LINKA)o(GE.)g(This)f(will)i(b)q(e)f(illustrated)h(with)e (an)g(example)h(b)q(elo)o(w.)295 1813 y(Since)g(I)e(am)g(trained)h(in)g (graph)f(algorithms,)g(I)h(prefer)f(to)g(think)h(of)f(the)g(p)q (edigree)224 1870 y(with)20 b(the)g(follo)o(wing)g(auxiliary)h(graph,)f (whic)o(h)g(I)g(call)h(the)f Fe(nucle)n(ar)f(family)h(gr)n(aph)p Ff(.)224 1926 y(First)c(let's)g(assume)g(that)f(there)h(are)g(no)g(m)o (ultiple)i(marriages.)k(In)16 b(this)h(graph)e(eac)o(h)224 1983 y(n)o(uclear)21 b(family)g(b)q(ecomes)g(a)f(v)o(ertex)g(and)h(t)o (w)o(o)e(v)o(ertices)h(are)g(adjacen)o(t)g(\(i.e.,)h(con-)224 2039 y(nected)d(b)o(y)g(an)f(undirected)i(edge\))e(if)h(their)g(n)o (uclear)g(families)h(share)e(an)g(individual)224 2095 y(whic)o(h)f(is)g(a)f(paren)o(t)g(in)h(one)f(family)h(and)f(a)g(c)o (hild)i(in)f(the)f(other.)295 2152 y(The)21 b(case)g(of)f(m)o(ultiple)j (marriages)d(is)i(subtle.)38 b(W)l(e)21 b(call)h(a)f(n)o(uclear)g (family)h(a)224 2208 y(\\m)o(ultiple)f(marriage")d(if)i(one)f(of)g(its) g(paren)o(ts)g(paren)o(ted)g(o\013spring)g(with)h(m)o(ultiple)224 2265 y(distinct)d(mates)d(b)q(oth)i(of)e(whom)h(are)g(in)h(the)g(p)q (edigree.)21 b(W)l(e)15 b(distinguish)j(t)o(w)o(o)c(t)o(yp)q(es)224 2321 y(of)d(m)o(ultiple)j(marriages.)k(A)12 b(f-m)o(ultiple)i(marriage) d(\(n)o(uclear)h(family\))g(is)g(one)g(in)h(whic)o(h)224 2378 y(the)18 b(m)o(ultiply)i(married)e(sp)q(ouse)h(is)g(a)e(founder.) 29 b(A)18 b(n-m)o(ultiple)j(marriage)c(\(n)o(uclear)224 2434 y(family\))f(is)g(one)g(in)g(whic)o(h)g(the)g(m)o(ultiply)h (married)f(p)q(erson)g(is)g(not)f(a)g(founder)h(in)g(the)960 2577 y(3)p eop %%Page: 4 4 4 3 bop 224 307 a Ff(p)q(edigree.)35 b(Eac)o(h)20 b(m)o(ultiple)h (marriage)e(corresp)q(onds)h(to)f(a)h(distinct)h(v)o(ertex)e(in)h(the) 224 364 y(n)o(uclear)15 b(family)g(graph.)k(There)14 b(is)g(an)g(edge)h(b)q(et)o(w)o(een)f(an)g(n-m)o(ultiple)i(marriage)d (and)224 420 y(the)18 b(paren)o(t)f(n)o(uclear)h(family)g(in)h(whic)o (h)f(the)f(m)o(ultiply)j(married)d(p)q(erson)h(is)g(a)f(c)o(hild.)224 477 y(Among)11 b(all)i(f-m)o(ultiple)h(marriages)d(in)o(v)o(olving)i (some)e(individual)k Fc(A)p Ff(,)d(one)g(suc)o(h)g(family)224 533 y(is)j(designated)h(as)e(the)g(\014rst.)20 b(There)14 b(is)h(an)g(edge)g(b)q(et)o(w)o(een)g(that)e(\014rst)i(family)g(and)g (all)224 589 y(the)g(other)g(m)o(ultiple)i(marriages)e(in)h(whic)o(h)g Fc(A)f Ff(is)h(a)f(paren)o(t.)224 711 y Fd(Edge)j(Lab)r(els)224 797 y Ff(In)g(the)g(n)o(uclear)g(family)g(graph,)f(the)g(edge)h Fc(x)11 b Fb(\000)h Fc(y)19 b Ff(is)f(called)h(a)e(\\do)o(wn")g(edge)g (w.r.t.)224 853 y Fc(x)j Ff(and)g(an)g(\\up")g(edge)h(w.r.t)d Fc(y)k Ff(if)f(the)f(shared)g(individual)j(is)e(a)e(c)o(hild)j(in)f(n)o (uclear)224 910 y(family)15 b Fc(x)e Ff(and)h(a)g(paren)o(t)f(in)i(n)o (uclear)f(family)h Fc(y)r Ff(.)k(In)c(our)e(dra)o(wings)h(w)o(e)f(sho)o (w)g(suc)o(h)i(an)224 966 y(edge)j(with)g Fc(x)f Ff(at)g(a)g(higher)h (v)o(ertical)g(p)q(osition)h(than)e Fc(y)r Ff(.)27 b(The)17 b(edge)h Fc(x)12 b Fb(\000)g Fc(y)19 b Ff(is)f(called)224 1023 y(an)g(\\up")g(edge)g(w.r.t.)27 b Fc(x)18 b Ff(and)g(a)f(\\do)o (wn")g(edge)i(w.r.t)d Fc(y)k Ff(if)e(the)g(shared)g(individual)224 1079 y(is)f(a)f(paren)o(t)g(in)h(n)o(uclear)g(family)f Fc(x)h Ff(and)f(a)g(c)o(hild)i(in)f(n)o(uclear)g(family)g Fc(y)r Ff(.)22 b(In)17 b(the)f(case)224 1136 y(of)g(f-m)o(ultiple)j (marriages,)c(the)i(edges)g(b)q(et)o(w)o(een)g(them)f(are)g(do)o(wn)g (edges)h(w.r.t.)22 b(the)224 1192 y(\014rst)13 b(f-m)o(ultiple)j (marriage)d(for)g(a)g(giv)o(en)h(individual)j(and)d(up)g(edges)g (w.r.t.)k(to)13 b(all)h(the)224 1249 y(other)h(f-m)o(ultiple)i (marriages)e(w.r.t)e(that)i(same)g(individual.)295 1305 y(F)l(or)h(eac)o(h)h(v)o(ertex)g(divide)i(its)f(list)g(of)e(adjacen)o (t)h(edges)h(in)o(to)f(t)o(w)o(o)f(separate)g(lists,)224 1362 y(one)f(is)g(the)g(up)g(list)g(and)g(the)g(other)f(is)i(the)e(do)o (wn)h(list)g(with)g(resp)q(ect)g(to)f(that)g(v)o(ertex.)224 1418 y(There)e(can)g(b)q(e)h(at)e(most)g(one)h(up)h(edge)f(p)q(er)g(v)o (ertex.)19 b(T)l(o)11 b(the)h(exten)o(t)g(that)f(w)o(e)h(describ)q(e) 224 1474 y(matters,)17 b(the)h(order)f(of)g(edges)h(on)f(the)h(do)o(wn) g(list)g(is)g(not)f(signi\014can)o(t.)28 b(It)18 b(dep)q(ends)224 1531 y(on)d(the)h(ordering)f(of)g(siblings)i(in)f(the)f(input,)h(whic)o (h)g(is)g(somewhat)e(arbitrary)l(.)224 1653 y Fd(T)-5 b(ra)n(v)n(ersal)19 b(Order)224 1738 y Ff(Since)14 b(the)f(p)q(edigree) h(has)e(no)h(lo)q(ops,)g(it)g(turns)f(out)h(that)e(the)i(n)o(uclear)g (family)h(graph)e(is)224 1795 y(alw)o(a)o(ys)j(connected)h(and)f(has)h (no)f(cycles)h(\(i.e.,)f(it)h(is)f(what)g(computer)g(scien)o(tists)h (call)224 1851 y(an)h(unro)q(oted)g(tree\).)23 b(The)17 b(tric)o(ky)g(rules)h(ab)q(out)e(m)o(ultiple)j(marriages)d(are)g (designed)224 1908 y(with)d(the)g(goal)f(that)g(the)h(n)o(uclear)g (family)h(graph)e(should)i(alw)o(a)o(ys)d(b)q(e)j(connected,)f(but)224 1964 y(ha)o(v)o(e)k(no)g(cycles.)28 b(Mathematically)18 b(inclined)i(readers)d(ma)o(y)g(\014nd)h(it)g(instructiv)o(e)g(to)224 2021 y(pro)o(v)o(e)d(this)g(b)o(y)h(induction)h(on)e(the)g(n)o(um)o(b)q (er)g(of)g(n)o(uclear)h(families.)295 2077 y(The)f(tra)o(v)o(ersal)f (order)h(uses)h(the)f(follo)o(wing)h(rules:)280 2183 y(1.)22 b(If)17 b(w)o(e)g(\014rst)f(arriv)o(e)h(at)f(n)o(uclear)i (family)f Fc(x)g Ff(via)g(an)g(edge)g(from)f(n)o(uclear)i(family)338 2240 y Fc(y)r Ff(,)f(then)h Fc(x)g Ff(is)g(up)q(dated)g(only)g(after)f (all)h(its)g(neigh)o(b)q(ors,)g(except)g Fc(y)h Ff(ha)o(v)o(e)e(b)q (een)338 2296 y(up)q(dated.)280 2390 y(2.)22 b(If)17 b(n)o(uclear)g(family)h Fc(x)f Ff(is)g(the)g(\014rst)f(n)o(uclear)i (family)l(,)f(w)o(e)g(up)q(date)g Fc(x)g Ff(only)g(after)338 2447 y(all)f(its)f(neigh)o(b)q(or)h(n)o(uclear)g(families)h(ha)o(v)o(e) e(b)q(een)h(up)q(dated.)960 2577 y(4)p eop %%Page: 5 5 5 4 bop 280 307 a Ff(3.)22 b(Up)h(edges)g(are)g(alw)o(a)o(ys)f(c)o (hosen)i(b)q(efore)f(do)o(wn)g(edges,)i(in)f(deciding)h(whic)o(h)338 364 y(neigh)o(b)q(or)16 b(to)e(visit.)295 442 y(What)h(this)i(means)f (is)h(that)f(w)o(e)g(can)g(think)h(of)f(the)h(tra)o(v)o(ersal)e (routine)i(with)f(the)224 499 y(follo)o(wing)c(pseudo)q(co)q(de.)20 b(Caution:)f(this)11 b(is)i(v)o(ery)e(di\013eren)o(t)g(from)g(the)h(co) q(de)g(in)g(LINK-)224 555 y(A)o(GE/F)-5 b(ASTLINK)16 b(but)f(yields)i(the)e(same)g(b)q(eha)o(vior:)295 611 y(Visit\()p Fc(w)q Ff(\))386 668 y(While)h Fc(w)g Ff(has)f(an)g(un)o (visited)i(neigh)o(b)q(or)f Fc(x)f Ff(reac)o(hable)h(via)g(an)f(up)g (edge:)477 724 y(Visit\()p Fc(x)p Ff(\);)386 781 y(While)h Fc(w)g Ff(has)f(an)g(un)o(visited)i(neigh)o(b)q(or)f Fc(y)h Ff(reac)o(hable)f(via)f(a)g(do)o(wn)g(edge:)477 837 y(Visit\()p Fc(y)r Ff(\))386 894 y(Up)q(date)g Fc(w)295 950 y Ff(W)l(e)j(start)e(b)o(y)i(visiting)i(a)d(n)o(uclear)i(family)f (con)o(taining)h(the)f(proband.)28 b(If)18 b(there)224 1007 y(is)e(a)g(n)o(uclear)g(family)h(in)f(whic)o(h)h(the)f(proband)g (is)g(a)f(c)o(hild,)j(w)o(e)d(start)g(with)h(that)f(one;)224 1063 y(otherwise,)f(w)o(e)g(start)f(with)h(the)g(\014rst)g(n)o(uclear)h (family)g(\(dep)q(enden)o(t)g(on)f(input)h(order\))224 1120 y(in)h(whic)o(h)g(the)g(proband)f(is)h(a)f(paren)o(t.)295 1176 y(The)k(w)o(a)o(y)f(w)o(e)h(up)q(date)h Fc(w)g Ff(dep)q(ends)g(on) f(ho)o(w)g(it)g(w)o(as)g(\014rst)g(reac)o(hed.)32 b(If)19 b(it)g(w)o(as)224 1232 y(reac)o(hed)h(via)g(a)g(do)o(wn)f(edge)h(from)f Fc(z)j Ff(w)o(e)d(up)q(date)i(the)e(paren)o(t)h(in)g Fc(w)h Ff(that)e(n)o(uclear)224 1289 y(families)f Fc(z)g Ff(and)e Fc(w)h Ff(share.)22 b(This)16 b(is)h(done)f(with)h(a)e(call)i (to)f(to)f(the)h(pro)q(cedure)h Fa(segup)224 1345 y Ff(\()p Fa(segsexup)e Ff(for)h(sexlink)o(ed)j(data\).)k(In)17 b(LINKA)o(GE)g(there)g(w)o(ere)f(some)g(alternativ)o(es)224 1402 y(to)11 b Fa(segup)g Ff(for)g(sp)q(ecial)i(places)g(in)f(the)g(p)q (edigree;)i(these)e(are)f(not)g(used)h(in)h(F)-5 b(ASTLINK.)295 1458 y(If)15 b(w)o(e)g(reac)o(hed)h Fc(w)g Ff(via)f(an)g(up)h(edge)g (from)e Fc(z)k Ff(then)d(w)o(e)g(up)q(date)h(the)f(c)o(hild)i(that)e Fc(w)224 1515 y Ff(and)h Fc(z)h Ff(share)e(using)h(the)f(pro)q(cedure)h Fa(segdown)e Ff(\()p Fa(segsexdown)g Ff(for)g(sexlink)o(ed)j(data\).) 295 1571 y(F)l(or)k(the)h(proband's)g(n)o(uclear)h(family)l(,)h(w)o(e)e (use)g(whic)o(hev)o(er)h(pro)q(cedure)g(w)o(ould)224 1628 y(up)q(date)16 b(the)f(proband's)g(conditional)i(probabilities)h (in)e(that)e(n)o(uclear)i(family)l(.)295 1684 y(By)d(staring)h(at)f (the)h(co)q(de)g(one)g(w)o(ould)g(get)f(the)g(impression)i(that)e(the)h (in)o(teresting)224 1741 y(tra)o(v)o(ersal)j(w)o(ork)f(is)i(done)g(in)h (the)e(pro)q(cedures)i Fa(collapsedon)d Ff(and)i Fa(collapseup)p Ff(.)25 b(I)224 1797 y(do)e(not)f(agree)g(with)h(this)g(view.)42 b(The)23 b(action)g(is)g(in)g Fa(segdown)f Ff(and)h Fa(segup)e Ff(and)224 1853 y(arguably)e(in)g Fa(seg)p Ff(,)f(whic)o(h)h(sets)f(up) h(the)g(calls)g(to)f Fa(segdown)f Ff(and)i Fa(segup)p Ff(.)29 b(Roughly)224 1910 y(sp)q(eaking,)20 b Fa(collapsedown)c Ff(tra)o(v)o(erses)h(an)h(up)g(edge)h(in)g(the)f(n)o(uclear)h(family)g (graph)224 1966 y(and)i Fa(collapseup)f Ff(tra)o(v)o(erses)f(a)i(do)o (wn)g(edge)g(in)g(the)g(n)o(uclear)h(family)g(graph,)f(but)224 2023 y(man)o(y)15 b(recursiv)o(e)h(calls)g(to)f(these)h(pro)q(cedures)g (do)f(not)g(actually)h(result)g(in)g(a)f(n)o(uclear)224 2079 y(family)20 b(up)q(date.)31 b(F)l(urthermore,)19 b Fa(collapsedown)e Ff(and)i Fa(collapseup)f Ff(w)o(ork)g(in)h(the)224 2136 y(p)q(edigree)e(directly)f(rather)f(than)g(in)h(the)f(n)o(uclear)h (family)g(graph.)224 2254 y Fd(Examples)224 2340 y Ff(In)21 b(this)f(section)g(w)o(e)g(sho)o(w)f(four)g(sample)i(p)q(edigrees.)35 b(In)20 b(eac)o(h)g(case,)h(w)o(e)e(selected)224 2396 y(the)d(proband)h(to)e(b)q(e)i(the)f(leftmost)g(individual)j(at)d(the)g (topmost)f(generation.)23 b(This)224 2452 y(w)o(ould)16 b(b)q(e)g(the)f(t)o(ypical)h(c)o(hoice)g(that)e(most)h(users)g(mak)o (e.)960 2577 y(5)p eop %%Page: 6 6 6 5 bop 295 307 a Ff(F)l(or)14 b(eac)o(h)h(p)q(edigree,)h(w)o(e)f(sho)o (w)f(a)g(picture)i(of)f(the)g(p)q(edigree,)h(the)f(corresp)q(onding)224 364 y(n)o(uclear)21 b(family)g(graph,)g(and)f(a)g(transcript)g(of)g(ho) o(w)g(the)g(tra)o(v)o(ersal)f(go)q(es.)35 b(In)20 b(the)224 420 y(n)o(uclear)d(family)f(graph,)g(eac)o(h)g(n)o(uclear)g(family)h (is)f(lab)q(eled)i(with)f(the)f(n)o(um)o(b)q(er)g(of)f(its)224 477 y(leftmost)g(c)o(hild.)295 533 y(The)i(\014rst)g(p)q(edigree)i(sho) o(ws)e(the)g(simple)i(case,)f(where)f(all)i(the)e(up)q(dates)h(go)f (up-)224 589 y(w)o(ard.)295 646 y(Here)e(is)h(a)f(partial)g(transcript) g(of)g(the)h(tra)o(v)o(ersal)e(on)h(p)q(edigree)h(1.)295 702 y(Start)e(at)h(n)o(uclear)h(family)f(205)295 759 y(Visit)h(n)o(uclear)g(family)g(304)295 815 y(Up)q(date)f(p)q(erson)h (205)e(conditioned)j(on)e(204)g(and)g(304)f(going)i(up)295 872 y(Bac)o(kup)f(to)g(n)o(uclear)h(family)g(205)295 928 y(Visit)g(n)o(uclear)g(family)g(302)295 985 y(Up)q(date)f(p)q (erson)h(202)e(conditioned)j(on)e(203,)f(302,)g(and)i(303)e(going)h(up) 295 1041 y(Bac)o(kup)g(to)g(n)o(uclear)h(family)g(205)295 1098 y(Visit)g(n)o(uclear)g(family)g(300)295 1154 y(Visit)g(n)o(uclear) g(family)g(400)295 1210 y(Up)q(date)f(p)q(erson)h(300)e(conditioned)j (on)e(301)g(and)g(400)f(going)i(up)295 1267 y(Bac)o(k)f(up)g(to)g(300) 295 1323 y(Up)q(date)g(p)q(erson)h(200)e(conditioned)j(on)e(201)g(and)g (300)f(going)i(up)295 1380 y(Bac)o(kup)f(to)g(n)o(uclear)h(family)g (205)295 1436 y(Up)q(date)f(p)q(erson)h(100)e(conditioned)j(on)e(101)g (and)g(205,)f(202,)g(and)h(200)g(going)g(up)960 2577 y(6)p eop %%Page: 7 7 7 6 bop -229 266 a 37890294 33154007 1184071 9472573 39074365 42626580 startTexFig -229 266 a %%BeginDocument: rped1.ps % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 gt { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 gt { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 gt { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 gt { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-RunlengthEncodedCompression or 1-NoCompression. % hex color packets. % gsave currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse grestore showpage } bind def DisplayImage 18 144 576 504 692 605 1 0 2 ffffff 000000 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00d8011d005d010500ff00ff00310100001b0100005901030005 010300ff00ff002d0100001b010000570102000c010100ff00ff002b0100001b01000056 0101000f010100ff00ff002a0100001b0100005501010012010000ff00ff00290100001b 0100005401010014010000ff0040010100e50100001b0100005401000015010100ff003f 010100e50100001b0100005301000017010000ff003f010100e50100001b010000520101 0018010000ff003e010100e50100001b0100005201000019010000ff003e010100e50100 001b0100005201000019010000ff003e010100e50100001b010000510100001b010000ff 003d010100e50100001b010000510100001b010000ff003d010100e50100001b01000051 0100001b010000ff003d010100e50100001b010000510100001b010000ff003d010100e5 0100001b010000510100001b010000ff003d010100e50100001b010000510100001a0100 00ff003e010100e50100001b0100005201000019010000ff00ff00260100001b01000052 01000019010000ff00ff00260100001b0100005201010017010100ff00ff00260100001b 0100005301010016010000ff00ff00270100001b0100005401000015010100ff00ff0027 0100001b0100005401010013010100ff00ff00280100001b0100005501010011010100ff 00ff00290100001b010000560102000e010100ff00ff002a0100001b010000580101000b 010100ff00ff002c0100001b0100005901040004010300ff00ff002d011d005e010400ff 00ff003f0101006e010100ff00ff00400101006e010100ff00ff00400101006e010100ff 00ff00400101006e010100ff00ff00400101006e010100ff00ff00400101006e010100ff 00ff00400101006e010100ff00ff00400101006e010100ff00ff00400101006e010100ff 00ff00400101006e010100ff00ff00400101006e010100ff00ff00400101006e010100ff 00ff00400101006e010100ff00ff00400101006e010100ff00ff0040017200ff00ff0040 017200ff00ff0079010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff 00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff006f0100000601030005 0103002c0100002b0100000601030007010000ff00ff002c010200050100000301000003 010000030100002b01000029010200050100000301000004010200ff00ff002e01000005 0100000301000003010000030100002b0100002b010000050100000301000006010000ff 00ff002e010000050100000301000003010000030100002b0100002b0100000501000003 01000006010000ff00ff002e010000050100000301000003010000030100002b0100002b 010000050100000301000006010000ff00ff002e01000005010000030100000301000003 0100002b0100002b010000050100000301000006010000ff00ff002e0100000501000003 01000003010000030100002b0100002b010000050100000301000006010000ff00ff002e 010000050100000301000003010000030100002b0100002b010000050100000301000006 010000ff00ff002e010000050100000301000003010000030100002b0100002b01000005 0100000301000006010000ff00ff002e010000050100000301000003010000030100002b 0100002b010000050100000301000006010000ff00ff002e01000006010300050103002c 0100002b0100000601030007010000ff00ff0071010000ff00ff00b2010000ff00ff00b2 010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff 00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2 010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff 00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2 010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff 00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2 010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff 00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2 010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff 00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2 010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff 00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2010000ff00ff00b2 010000ff00ff004101ff011a00ff009801ff011a00ff0098010100a60101006d010100ff 0098010100a60101006d010100ff0098010100a60101006d010100ff0098010100a60101 006d010100ff0098010100a60101006d010100ff0098010100a60101006d010100ff0098 010100a60101006d010100ff0098010100a60101006d010100ff0098010100a60101006d 010100ff0098010100a60101006d010100ff0098010100a60101006d010100ff00980101 00a60101006d010100ff0098010100a60101006d010100ff0098010100a60101006d0101 00ff0019011d005d01050026011d005d0105005e011d005d010500a70100001b01000059 01030005010400210100001b01000059010300050103005a0100001b0100005901030005 010300a30100001b010000580101000c010100200100001b010000570102000c01010058 0100001b010000580101000c010100a10100001b010000560101000f0102001e0100001b 010000560101000f010100570100001b010000560101000f0102009f0100001b01000055 010100120101001d0100001b0100005501010012010000560100001b0100005501010012 0100009f0100001b01000054010100140100001d0100001b010000540101001401000055 0100001b01000054010100140100005801010007010100390100001b0100005401000015 0101001c0100001b0100005401000015010100540100001b010000540100001501010057 01010007010100390100001b01000053010100160101001b0100001b0100005301000017 010000540100001b01000053010000170101005601010007010100390100001b01000053 010000180100001b0100001b0100005201010018010000530100001b0100005201010018 0100005601010007010100390100001b01000053010000180100001b0100001b01000052 01000019010000530100001b01000052010000190100005601010007010100390100001b 01000052010000190100001b0100001b0100005201000019010000530100001b01000052 010000190100005601010007010100390100001b010000520100001a0100001a0100001b 010000510100001b010000520100001b010000510100001b010000550101000701010039 0100001b010000510100001b0100001a0100001b010000510100001b010000520100001b 010000510100001b0100005501010007010100390100001b010000510100001b0100001a 0100001b010000510100001b010000520100001b010000510100001b0100005501010007 010100390100001b010000510100001b0100001a0100001b010000510100001b01000052 0100001b010000510100001b0100005501010007010100390100001b010000520100001a 0100001a0100001b010000510100001b010000520100001b010000510100001b01000055 01010007010100390100001b01000052010000190100001b0100001b010000510100001a 010000530100001b010000510100001a0100005601010007010100390100001b01000052 010000190100001b0100001b0100005201000019010000530100001b0100005201000019 0100009c0100001b01000053010000180100001b0100001b010000520100001901000053 0100001b01000052010000190100009c0100001b01000053010000180100001b0100001b 0100005201010017010100530100001b01000052010100180100009c0100001b01000053 010100160100001c0100001b0100005301010016010000540100001b0100005301010016 0100009d0100001b01000054010000150101001c0100001b010000540100001501010054 0100001b01000054010000150101009d0100001b01000055010000140100001d0100001b 0100005401010013010100550100001b01000055010000130101009e0100001b01000055 010100120100001e0100001b0100005501010011010100560100001b0100005501010011 0101009f0100001b010000560102000e0101001f0100001b010000560102000e01010057 0100001b010000560102000e010100a00100001b010000580101000b010200200100001b 010000580101000b010100590100001b010000580101000b010200a10100001b0100005a 01030004010300220100001b01000059010400040103005a0100001b0100005901040004 010300a3011d005e01040026011d005e0104005e011d005e010400b60100006e01010035 0101006e0101006d0101006e010100b70100006e010100350101006e0101006d0101006e 010100b70100006e010100350101006e0101006d0101006e010100b70100006e01010035 0101006e0101006d0101006e010100b70100006e010100350101006e0101006d0101006e 010100b70100006e010100350101006e0101006d0101006e010100b70100006e01010035 0101006e0101006d0101006e010100b70100006e010100350101006e0101006d0101006e 010100b70100006e010100350101006e0101006d0101006e010100b70100006e01010035 0101006e0101006d0101006e010100b70100006e010100350101006e0101006d0101006e 010100b70100006e010100350101006e0101006d0101006e010100b70100006e01010035 0101006e0101006d0101006e010100b70100006e010100350101006e0101006d0101006e 010100b7017100350172006d017200b7017100350172006d017200ef010100c1010100c3 010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff00280101 00c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c30100 00ff0028010100c1010100c3010000e301030005010300080101002b0101002801030005 010300040105001f0103000501030005010300470101000d010300050103000501030058 01030005010300050103002c010000290103000501030007010000a10100000301000003 0100000301000006010000000100002b0101002701000003010000030100000301000003 010000230100000301000003010000030100000301000003010000460101000c01000003 010000030100000301000003010000030100005601000003010000030100000301000003 010000030100002b0100002801000003010000030100000301000004010200a101000003 010000030100000301000005010000010100002b01010027010000030100000301000003 01000003010000230100000301000003010000030100000301000003010000460101000c 010000030100000301000003010000030100000301000056010000030100000301000003 01000003010000030100002b0100002801000003010000030100000301000006010000a5 010000040100000301000005010000010100002b0101002b010000040100000301000003 010000270100000401000003010000080100004601010010010000040100000301000007 0100005b010000040100000301000003010000030100002b0100002c0100000401000003 01000006010000a4010000050100000301000004010000020100002b0101002a01000005 010000030100000301040022010000050100000301000005010200470101000f01000005 01000003010000060100005b010000050100000301000003010000030100002b0100002b 010000050100000301000006010000ab01000003010000080100002b0101003101000003 01000032010000030100005001010016010000030100006a010000030100000301000003 0100002b010000320100000301000006010000a301000006010000030100000301000003 0100002b0101002901000006010000030100000801000020010000060100000301000008 010000460101000e0100000601000003010000050100005b010000060100000301000003 010000030100002b0100002a010000060100000301000006010000a20100000701000003 010000030106002a010100280100000701000003010000080100001f0100000701000003 01000008010000460101000d0100000701000003010000040100005b0100000701000003 01000003010000030100002b01000029010000070100000301000006010000a101000008 01000003010000080100002b01010027010000080100000301000003010000030100001e 01000008010000030100000301000003010000460101000c010000080100000301000003 0100005b010000080100000301000003010000030100002b010000280100000801000003 01000006010000a10100000801000003010000080100002b010100270100000801000003 01000003010000030100001e01000008010000030100000301000003010000460101000c 0100000801000003010000030100005b010000080100000301000003010000030100002b 01000028010000080100000301000006010000a101050004010300090100002b01010027 01050004010300050103001f0105000401030005010300470101000c0105000401030004 0105005601050004010300050103002c010000280105000401030007010000e7010100c1 010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff 0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c10101 00c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028 010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3 010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff00280101 00c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c30100 00ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1 010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff 0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c10101 00c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028 010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3 010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff00280101 00c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c30100 00ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1 010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff 0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c10101 00c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028 010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3 010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff00280101 00c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c30100 00ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff0028010100c1 010100c3010000ff0028010100c1010100c3010000ff0028010100c1010100c3010000ff 0028010100a6013900a6010000ff0028010100a6013900a6010000ff0028010100a60100 0036010100a6010000ff0028010100a601000036010100a6010000ff0028010100a60100 0036010100a6010000ff0028010100a601000036010100a6010000ff0028010100a60100 0036010100a6010000ff0028010100a601000036010100a6010000ff0028010100a60100 0036010100a6010000ff0028010100a601000036010100a6010000ff0028010100a60100 0036010100a6010000ff0028010100a601000036010100a6010000ff0028010100a60100 0036010100a6010000ff0028010100a601000036010100a6010000ff0028010100a60100 0036010100a6010000ff0028010100a601000036010100a6010000ff002501050096011d 002501050026011c005e010400ff002001030005010300920100001b0100002101030005 010300220100001a0100005a01030004010400ff00190102000c010100900100001b0100 001f0102000c010100200100001a010000580101000c010200ff00160101000f0101008f 0100001b0100001e0101000f0101001f0100001a010000570101000f010100ff00140100 00130100008e0100001b0100001d010100120100001e0100001a01000056010000130100 00ff0012010100130101008d0100001b0100001c010100140100001d0100001a01000055 0101001301010088010100060101000601010074010000150101008c0100001b0100001c 010000150101001c0100001a010000540101001501010087010100060101000601010073 010000170100008c0100001b0100001b010000170100001c0100001a0100005401000017 01000087010100060101000601010072010100180100008b0100001b0100001a01010018 0100001b0100001a01000053010000180101008601010006010100060101007201000019 0100008b0100001b0100001a010000190100001b0100001a010000530100001901000086 010100060101000601010072010000190100008b0100001b0100001a010000190100001b 0100001a0100005301000019010000860101000601010006010100710100001b0100008a 0100001b010000190100001b0100001a0100001a010000520100001b0100008501010006 01010006010100710100001b0100008a0100001b010000190100001b0100001a0100001a 010000520100001b010000850101000601010006010100710100001b0100008a0100001b 010000190100001b0100001a0100001a010000520100001b010000850101000601010006 010100710100001b0100008a0100001b010000190100001b0100001a0100001a01000052 0100001b010000850101000601010006010100710100001b0100008a0100001b01000019 0100001b0100001a0100001a010000520100001b01000085010100060101000601010071 0100001a0100008b0100001b010000190100001a0100001b0100001a010000520100001a 01000086010100060101000601010072010000190100008b0100001b0100001a01000019 0100001b0100001a0100005301000019010000ff000d010000190100008b0100001b0100 001a010000190100001b0100001a0100005301000019010000ff000d010100170101008b 0100001b0100001a010100170101001b0100001a0100005301010017010100ff000e0100 00170100008c0100001b0100001b010100160100001c0100001a01000054010000170100 00ff0010010000150100008d0100001b0100001c010000150101001c0100001a01000055 01000015010000ff0011010100130101008d0100001b0100001c010100130101001d0100 001a0100005501010013010100ff0012010100110101008e0100001b0100001d01010011 0101001e0100001a0100005601010011010100ff00140101000f0101008f0100001b0100 001e0102000e0101001f0100001a010000570101000f010100ff00170101000b01010091 0100001b010000200101000b010100210100001a010000590101000b010100ff001a0104 0004010300920100001b0100002101040004010300220100001a0100005a010300050103 00ff002001040096011d002601040026011c005e010500ff00ff003f0101006e010000ff 00ff00410101006e010000ff00ff00410101006e010000ff00ff00410101006e010000ff 00ff00410101006e010000ff00ff00410101006e010000ff00ff00410101006e010000ff 00ff00410101006e010000ff00ff00410101006e010000ff00ff00410101006e010000ff 00ff00410101006e010000ff00ff00410101006e010000ff00ff00410101006e010000ff 00ff00410101006e010000ff00ff0041017100ff00ff0041017100ff00ff0079010100ff 00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1 010100ff00ff00b1010100ff005301030005010300080101008f01030005010300050103 001f01030005010300050103001f01030005010300070100002d01010029010300050103 0005010300ff001001000003010000030100000301000006010000000100008e01000003 010000030100000301000003010000030100001d01000003010000030100000301000003 010000030100001d010000030100000301000003010000040102002d0101002801000003 01000003010000030100000301000003010000ff000f0100000301000003010000030100 0005010000010100008e01000003010000030100000301000003010000030100001d0100 0003010000030100000301000003010000030100001d0100000301000003010000030100 00060100002d010100280100000301000003010000030100000301000003010000ff0014 010000030100000301000005010000010100009301000003010000030100000701000023 010000030100000301000008010000220100000301000003010000060100002d0101002d 01000003010000030100000301000003010000ff00110102000401000003010000040100 000201000090010200040100000301000006010000210102000401000003010000050102 00200102000401000003010000060100002d0101002a0102000401000003010000030100 0003010000ff001901000003010000080100009801000003010000310100000301000031 01000003010000060100002d01010032010000030100000301000003010000ff00140100 000301000003010000030100000301000093010000030100000301000005010000250100 00030100000301000008010000220100000301000003010000060100002d0101002d0100 0003010000030100000301000003010000ff001401000003010000030100000301060092 010000030100000301000004010000260100000301000003010000080100002201000003 01000003010000060100002d0101002d01000003010000030100000301000003010000ff 000f010000030100000301000003010000080100008e0100000301000003010000030100 00030100002201000003010000030100000301000003010000030100001d010000030100 000301000003010000060100002d01010028010000030100000301000003010000030100 0003010000ff000f010000030100000301000003010000080100008e0100000301000003 01000003010000030100002201000003010000030100000301000003010000030100001d 010000030100000301000003010000060100002d01010028010000030100000301000003 0100000301000003010000ff001001030005010300090100008f01030005010300040105 001e01030005010300050103001f01030005010300070100002d01010029010300050103 0005010300ff00ff006f010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b10101 00ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff00b1010100ff00ff 00b1010100ff00ff00b1010100ff00ff00af010400ff00ff00aa01030004010400ff00ff 00a30101000c010100ff00ff00a00102000f010100ff00ff009e01000012010100ff00ff 009c01000014010100c30101000501010006010100ff00c301010015010000c301010005 01010006010100ff00c201010016010100c20101000601010004010100ff00c301000018 010000c20101000601010004010100ff00c301000018010000c201010006010200020102 00ff00c301000019010000c10101000701010002010100ff00c30100001a010000c10101 000701010002010100ff00c30100001b010000c00101000701020000010200ff00c30100 001b010000c001010008010400ff00c40100001b010000c001010008010400ff00c40100 001a010000c101010009010200ff00c50100001a010000c101010009010200ff00c60100 0019010000ff00ff009701000018010000ff00ff009801000018010000ff00ff00990100 0016010100ff00ff009901010015010000ff00ff009b01010013010000ff00ff009d0100 0012010100ff00ff009e0101000e010200ff00ff00a00102000b010100ff00ff00a40103 0005010200ff00ff00aa010500ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00d20101 000401030005010300ff00ff009d01000000010000030100000301000003010000030100 00ff00ff009b0100000101000003010000030100000301000003010000ff00ff009b0100 000101000003010000030100000301000003010000ff00ff009a01000002010000030100 00030100000301000003010000ff00ff009e010000030100000301000003010000030100 00ff00ff00990100000301000003010000030100000301000003010000ff00ff00990106 0002010000030100000301000003010000ff00ff009e0100000301000003010000030100 0003010000ff00ff009e01000003010000030100000301000003010000ff00ff009e0100 000401030005010300ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00e7 %%EndDocument endTexFig 769 2464 a Ff(Figure)15 b(1:)20 b(P)o(edigree)15 b(1)960 2577 y(7)p eop %%Page: 8 8 8 7 bop 371 266 a 18945146 13261598 15524495 29131452 26285996 36673331 startTexFig 371 266 a %%BeginDocument: nfg1.ps %This is figure 3.1 for broadcasting paper %It shows a cube tree on 12 vertices /inch {72 mul} def /unit {1.5 mul} def %/unit {1.0 mul} def 1 inch 0 inch translate /arrowdict 16 dict def arrowdict begin /mtrx matrix def end /arrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /halfthickness exch 2 div def /tipy exch def /tipx exch def /taily exch def /tailx exch def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate 0 halfthickness neg moveto base halfthickness neg lineto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto base halfthickness lineto 0 halfthickness lineto closepath savematrix setmatrix end } def /dasharrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /thickness exch def /tipy exch def /tipx exch def /taily exch def /tailx exch def % /halfthickness thickness 2 div def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate % 0 halfthickness neg moveto % 0 thickness neg moveto 0 0 moveto [3 3] 0 setdash % base halfthickness neg lineto % base thickness neg lineto base 0 lineto stroke newpath [] 0 setdash % base halfthickness neg moveto base thickness neg moveto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto % base halfthickness lineto base thickness lineto closepath fill stroke % 0 halfthickness lineto savematrix setmatrix end } def /edge { newpath moveto lineto stroke } def /dirarc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 1 6 12 arrow fill stroke } def /dasharc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 2 4 8 dasharrow % stroke } def /dot { newpath /y exch %defines x to be pop def /x exch def x y moveto x y 0.040 inch 0 360 arc fill } def /subscript { gsave 0 -4 rmoveto .7 .7 scale show grestore 10 0 rmoveto } def /v1x 160 unit def /v1y 360 unit def v1x v1y dot /v2x 120 unit def /v2y 330 unit def v2x v2y dot /v3x v1x def /v3y v2y def v3x v3y dot /v4x 200 unit def /v4y v2y def v4x v4y dot /v5x v4x def /v5y 300 unit def v5x v5y dot v1x v1y v2x v2y edge v1x v1y v3x v3y edge v1x v1y v4x v4y edge v4x v4y v5x v5y edge /Times-Italic findfont 15 scalefont setfont %sz1 sz2 moveto %-2 -10 rmoveto %(s) show %(0) subscript v1x v1y moveto 5 4 rmoveto (205) show v2x v2y moveto -16 4 rmoveto (304) show v3x v3y moveto 5 4 rmoveto (302) show v4x v4y moveto 8 4 rmoveto (300) show v5x v5y moveto 8 -4 rmoveto (400) show showpage %%EndDocument endTexFig 516 1204 a Ff(Figure)15 b(2:)20 b(Nuclear)c(family)g(graph)f(for)f(P)o (edigree)i(1)295 1337 y(Here)f(is)h(the)g(second)f(sample)h(p)q (edigree.)22 b(It)15 b(illustrates)i(going)e(do)o(wn)g(instead)h(of)224 1393 y(going)f(up.)295 1450 y(Start)f(at)h(n)o(uclear)h(family)f(201) 295 1506 y(Visit)h(n)o(uclear)g(family)g(304)295 1563 y(Visit)g(n)o(uclear)g(family)g(203)295 1619 y(Up)q(date)f(p)q(erson)h (203)e(conditioned)j(on)e(102)g(and)g(103,)f(going)h(do)o(wn)295 1676 y(Bac)o(k)g(to)f(n)o(uclear)i(family)g(304)295 1732 y(Visit)g(n)o(uclear)g(family)g(404)295 1789 y(Up)q(date)f(p)q(erson)h (304)e(conditioned)j(on)e(305,)f(404,)g(and)i(405,)e(going)h(up)295 1845 y(Bac)o(kup)g(to)g(n)o(uclear)h(family)g(304)295 1902 y(Visit)g(n)o(uclear)g(family)g(403)295 1958 y(Up)q(date)f(p)q (erson)h(302,)e(conditioned)j(on)e(303)f(and)i(403,)e(going)h(up)295 2014 y(Bac)o(kup)g(to)g(n)o(uclear)h(family)g(304)295 2071 y(Visit)g(n)o(uclear)g(family)g(400)295 2127 y(Up)q(date)f(p)q (erson)h(300,)e(conditioned)j(on)e(301,)f(400,)g(401,)g(and)h(402,)f (going)h(up)295 2184 y(Bac)o(kup)g(to)g(n)o(uclear)h(family)g(304)295 2240 y(Up)q(date)f(p)q(erson)h(202)e(conditioned)j(on)e(203,)f(304,)g (302,)g(and)i(300,)e(going)h(up)295 2297 y(Bac)o(kup)g(to)g(n)o(uclear) h(family)g(201)295 2353 y(Up)q(date)f(p)q(erson)h(100,)e(conditioned)j (on)e(101,)f(201,)g(and)h(202,)f(going)h(up)960 2577 y(8)p eop %%Page: 9 9 9 8 bop -229 293 a 37890294 31969935 1184071 10064609 39074365 42034544 startTexFig -229 293 a %%BeginDocument: rped2.ps % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 gt { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 gt { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 gt { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 gt { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-RunlengthEncodedCompression or 1-NoCompression. % hex color packets. % gsave currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse grestore showpage } bind def DisplayImage 18 153 576 486 670 565 1 0 2 ffffff 000000 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0057011d005e0104005e 011d005e010400ff003a0100001b0100005901040004010400590100001b0100005a0103 0004010400ff00350100001b010000580101000c010100580100001b010000580101000c 010100ff00340100001b010000560102000f010100560100001b010000560102000f0101 00ff00320100001b0100005501010012010100550100001b0100005601000012010100ff 00310100001b0100005501000014010000550100001b0100005501000014010100b90101 00740100001b0100005401010015010000540100001b0100005401010015010000b90101 00740100001b0100005301010016010100530100001b0100005301010016010100b80101 00740100001b0100005301000018010000530100001b0100005301000018010000b80101 00740100001b0100005301000018010000530100001b0100005301000018010000b80101 00740100001b0100005301000019010000520100001b0100005301000019010000b70101 00740100001b010000520100001a010000520100001b010000520100001a010000b70101 00740100001b010000520100001b010000510100001b010000520100001b010000b60101 00740100001b010000520100001b010000510100001b010000520100001b010000b60101 00740100001b010000520100001b010000510100001b010000520100001b010000b60101 00740100001b010000520100001a010000520100001b010000520100001a010000b70101 00740100001b010000520100001a010000520100001b010000520100001a010000b70101 00740100001b0100005301000019010000520100001b0100005301000019010000ff002e 0100001b0100005301000018010000530100001b0100005301000018010000ff002f0100 001b0100005301000018010000530100001b0100005301000018010000ff002f0100001b 0100005401000016010100530100001b0100005401000016010100ff002f0100001b0100 005401010015010000540100001b0100005401010015010000ff00300100001b01000055 01000014010000550100001b0100005501010013010000ff00310100001b010000560100 0012010100550100001b0100005601000012010100ff00310100001b010000570101000e 010200560100001b010000570101000e010200ff00320100001b010000580102000b0101 00580100001b010000580102000b010100ff00340100001b0100005a010300050102005a 0100001b0100005a01030005010200ff0036011d005e0105005d011d005e010500ff0048 0101006d0101006e0101006d010100ff004a0101006d0101006e0101006d010100ff004a 0101006d0101006e0101006d010100ff004a0101006d0101006e0101006d010100ff004a 0101006d0101006e0101006d010100ff004a0101006d0101006e0101006d010100ff004a 0101006d0101006e0101006d010100ff004a0101006d0101006e0101006d010100ff004a 0101006d0101006e0101006d010100ff004a0101006d0101006e0101006d010100ff004a 0101006d0101006e0101006d010100ff004a0101006d0101006e0101006d010100ff004a 0101006d0101006e0101006d010100ff004a0101006d0101006e0101006d010100ff004a 0171006e017100ff004a0171006e017100ff0082010100de010100ff00ba010100de0101 00ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba0101 00de010100ff00ba010100de010100ff007701000006010300050103002c0101002b0100 0006010300070100005a01000006010300050103002c0101002b01000006010300050103 00ff0033010200050100000301000003010000030100002b010100290102000501000003 0100000401020058010200050100000301000003010000030100002b0101002901020005 010000030100000301000003010000ff0034010000050100000301000003010000030100 002b0101002b0100000501000003010000060100005a0100000501000003010000030100 00030100002b0101002b01000005010000030100000301000003010000ff003401000005 0100000301000003010000030100002b0101002b0100000501000003010000060100005a 0100000501000003010000070100002c0101002b010000050100000301000008010000ff 0034010000050100000301000003010000030100002b0101002b01000005010000030100 00060100005a0100000501000003010000060100002d0101002b01000005010000030100 0005010200ff0035010000050100000301000003010000030100002b0101002b01000005 01000003010000060100005a0100000501000003010000350101002b0100000501000003 010000ff003e010000050100000301000003010000030100002b0101002b010000050100 0003010000060100005a0100000501000003010000050100002e0101002b010000050100 000301000008010000ff0034010000050100000301000003010000030100002b0101002b 0100000501000003010000060100005a0100000501000003010000040100002f0101002b 010000050100000301000008010000ff0034010000050100000301000003010000030100 002b0101002b0100000501000003010000060100005a0100000501000003010000030100 00300101002b01000005010000030100000301000003010000ff00340100000501000003 01000003010000030100002b0101002b0100000501000003010000060100005a01000005 0100000301000003010000300101002b01000005010000030100000301000003010000ff 003401000006010300050103002c0101002b01000006010300070100005a010000060103 00040105002b0101002b0100000601030005010300ff0078010100de010100ff00ba0101 00de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff 00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de 010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba 010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de0101 00ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba0101 00de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff 00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de 010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba 010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de0101 00ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba0101 00de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff 00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de 010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba 010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba010100de0101 00ff00ba010100de010100ff00ba010100de010100ff00ba010100de010100ff00ba0101 00de010100ff00ba010100de010100ff004a01e1006e010100ff004a01e1006e010100ff 004a010000df0100006e010100ff004a010000df0100006e010100ff004a010000df0100 006e010100ff004a010000df0100006e010100ff004a010000df0100006e010100ff004a 010000df0100006e010100ff004a010000df0100006e010100ff004a010000df0100006e 010100ff004a010000df0100006e010100ff004a010000df0100006e010100ff004a0100 00df0100006e010100ff004a010000df0100006e010100ff004a010000df0100006e0101 00ff004a010000df0100006e010100ff003b011d00c2011d005d010500ff003a0100001b 010000c20100001b0100005901030005010400ff00350100001b010000c20100001b0100 00580101000c010100ff00340100001b010000c20100001b010000560101000f010200ff 00320100001b010000c20100001b0100005501010012010100ff00310100001b010000c2 0100001b0100005501000014010000eb01010007010100390100001b010000c20100001b 0100005401000016010000ea01010007010100390100001b010000c20100001b01000053 01010016010100e901010007010100390100001b010000c20100001b0100005301000018 010000e901010007010100390100001b010000c20100001b0100005301000018010000e9 01010007010100390100001b010000c20100001b0100005301000018010000e901010007 010100390100001b010000c20100001b010000520100001a010000e80101000701010039 0100001b010000c20100001b010000520100001a010000e801010007010100390100001b 010000c20100001b010000520100001a010000e801010007010100390100001b010000c2 0100001b010000520100001a010000e801010007010100390100001b010000c20100001b 010000520100001a010000e801010007010100390100001b010000c20100001b01000052 01000019010000e901010007010100390100001b010000c20100001b0100005301000018 010000ff002f0100001b010000c20100001b0100005301000018010000ff002f0100001b 010000c20100001b0100005301000018010000ff002f0100001b010000c20100001b0100 005301010016010100ff002f0100001b010000c20100001b0100005401010014010100ff 00300100001b010000c20100001b0100005501000014010000ff00310100001b010000c2 0100001b0100005501010012010000ff00320100001b010000c20100001b010000570101 000e010100ff00330100001b010000c20100001b010000580101000c010100ff00340100 001b010000c20100001b0100005a01030005010200ff0036011d00c2011d005e010500ff 00ff00290100006e010100ff00ff002b0100006e010100ff00ff002b0100006e010100ff 00ff002b0100006e010100ff00ff002b0100006e010100ff00ff002b0100006e010100ff 00ff002b0100006e010100ff00ff002b0100006e010100ff00ff002b0100006e010100ff 00ff002b0100006e010100ff00ff002b0100006e010100ff00ff002b0100006e010100ff 00ff002b0100006e010100ff00ff002b0100006e010100ff00ff002b017100ff00ff002b 017100ff00ff0063010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff 00ff009b010100ff00ff009b010100ff00ff009b010100ff007501030005010300070100 00c901030005010300050103002c010100280103000501030005010300ff003301000003 010000030100000301000004010200c80100000301000003010000030100000301000003 0100002b010100270100000301000003010000030100000301000003010000ff00320100 0003010000030100000301000006010000c8010000030100000301000003010000030100 00030100002b010100270100000301000003010000030100000301000003010000ff0036 010000040100000301000006010000cc0100000401000003010000070100002c0101002b 010000040100000301000008010000ff0035010000050100000301000006010000cb0100 000501000003010000060100002d0101002a010000050100000301000005010200ff003d 0100000301000006010000d201000003010000350101003101000003010000ff003e0100 00060100000301000006010000ca0100000601000003010000050100002e010100290100 00060100000301000008010000ff0033010000070100000301000006010000c901000007 01000003010000040100002f01010028010000070100000301000008010000ff00320100 00080100000301000006010000c801000008010000030100000301000030010100270100 0008010000030100000301000003010000ff0032010000080100000301000006010000c8 010000080100000301000003010000300101002701000008010000030100000301000003 010000ff00320105000401030007010000c801050004010300040105002b010100270105 000401030005010300ff00ff005a010100ff00ff009b010100ff00ff009b010100ff00ff 009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b0101 00ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff 009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b0101 00ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff 009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b0101 00ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff 009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b0101 00ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff 009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b0101 00ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff 009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b0101 00ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff009b010100ff00ff 002a01e200ff00ba01e200ff00ba010100a601010035010100ff00ba010100a601010035 010100ff00ba010100a601010035010100ff00ba010100a601010035010100ff00ba0101 00a601010035010100ff00ba010100a601010035010100ff00ba010100a6010100350101 00ff00ba010100a601010035010100ff00ba010100a601010035010100ff00ba010100a6 01010035010100ff00ba010100a601010035010100ff00ba010100a601010035010100ff 00ba010100a601010035010100ff00ba010100a601010035010100ff003b011d005e0104 0026011d005d01050026011d005d010500c90100001b0100005901040004010400210100 001b0100005901030005010400210100001b0100005901030005010300c50100001b0100 00580101000c010100200100001b010000580101000c010100200100001b010000580101 000c010100c30100001b010000560102000f0101001e0100001b010000560101000f0102 001e0100001b010000560101000f010200c10100001b01000055010100120101001d0100 001b01000055010100120101001d0100001b0100005501010012010000c10100001b0100 0055010000140100001d0100001b01000055010000140100001d0100001b010000540101 00140100003a0101000601010006010100710100001b01000054010100150100001c0100 001b01000054010000160100001c0100001b010000540100001501010039010100060101 0006010100710100001b01000053010100160101001b0100001b01000053010100160101 001b0100001b0100005301000017010100380101000601010006010100710100001b0100 0053010000180100001b0100001b01000053010000180100001b0100001b010000520101 0018010000380101000601010006010100710100001b01000053010000180100001b0100 001b01000053010000180100001b0100001b010000520100001901000038010100060101 0006010100710100001b01000053010000190100001a0100001b01000053010000180100 001b0100001b0100005201000019010000380101000601010006010100710100001b0100 00520100001a0100001a0100001b010000520100001a0100001a0100001b010000510100 001b010000370101000601010006010100710100001b010000520100001b010000190100 001b010000520100001a0100001a0100001b010000510100001b01000037010100060101 0006010100710100001b010000520100001b010000190100001b010000520100001a0100 001a0100001b010000510100001b010000370101000601010006010100710100001b0100 00520100001b010000190100001b010000520100001a0100001a0100001b010000510100 001b010000370101000601010006010100710100001b010000520100001a0100001a0100 001b010000520100001a0100001a0100001b010000510100001b01000037010100060101 0006010100710100001b010000520100001a0100001a0100001b01000052010000190100 001b0100001b010000510100001a010000380101000601010006010100710100001b0100 0053010000190100001a0100001b01000053010000180100001b0100001b010000520100 0019010000be0100001b01000053010000180100001b0100001b01000053010000180100 001b0100001b0100005201000019010000be0100001b01000053010000180100001b0100 001b01000053010000180100001b0100001b0100005201010018010000be0100001b0100 0054010000160101001b0100001b01000053010100160101001b0100001b010000530101 0016010000bf0100001b01000054010100150100001c0100001b01000054010100140101 001c0100001b0100005401000015010100bf0100001b01000055010000140100001d0100 001b01000055010000140100001d0100001b0100005501000013010100c00100001b0100 0056010000120101001d0100001b01000055010100120100001e0100001b010000550101 0011010100c10100001b010000570101000e0102001e0100001b010000570101000e0101 001f0100001b010000560102000e010100c20100001b010000580102000b010100200100 001b010000580101000c010100200100001b010000580101000b010200c30100001b0100 005a01030005010200220100001b0100005a01030005010200220100001b010000590104 0004010300c5011d005e01050025011d005e01050025011d005e010400d80101006d0101 00360100006e010100350101006e010100d90101006d010100360100006e010100350101 006e010100d90101006d010100360100006e010100350101006e010100d90101006d0101 00360100006e010100350101006e010100d90101006d010100360100006e010100350101 006e010100d90101006d010100360100006e010100350101006e010100d90101006d0101 00360100006e010100350101006e010100d90101006d010100360100006e010100350101 006e010100d90101006d010100360100006e010100350101006e010100d90101006d0101 00360100006e010100350101006e010100d90101006d010100360100006e010100350101 006e010100d90101006d010100360100006e010100350101006e010100d90101006d0101 00360100006e010100350101006e010100d90101006d010100360100006e010100350101 006e010100d90171003601710035017200d90171003601710035017200ff002d0100008b 010100a6010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff 00660100008b010100a6010000ff00660100008b010100a6010000ff00660100008b0101 00a6010000ff00660100008b010100a6010000ff00050103000501030004010500470100 000e01030005010300080101001e01030005010300050103002c01010028010300050103 00050103002001030005010300050103002c010000290103000501030007010000c30100 00030100000301000003010000030100004c0100000d0100000301000003010000030100 0006010000000100001d01000003010000030100000301000003010000030100002b0101 002701000003010000030100000301000003010000030100001e01000003010000030100 000301000003010000030100002b01000028010000030100000301000003010000040102 00c3010000030100000301000003010000030100004c0100000d01000003010000030100 000301000005010000010100001d01000003010000030100000301000003010000030100 002b0101002701000003010000030100000301000003010000030100001e010000030100 00030100000301000003010000030100002b010000280100000301000003010000030100 0006010000c80100000301000003010000030100004c0100001201000003010000030100 000501000001010000220100000301000003010000080100002b0101002c010000030100 00030100000701000024010000030100000301000003010000030100002b0100002d0100 00030100000301000006010000c5010200040100000301000003010400480100000f0102 00040100000301000004010000020100001f0102000401000003010000050102002c0101 002901020004010000030100000601000022010200040100000301000003010000030100 002b0100002a010200040100000301000006010000cd0100000301000051010000170100 000301000008010000270100000301000035010100310100000301000032010000030100 0003010000030100002b010000320100000301000006010000c801000003010000030100 000801000047010000120100000301000003010000030100000301000022010000030100 0003010000080100002b0101002c01000003010000030100000501000026010000030100 000301000003010000030100002b0100002d010000030100000301000006010000c80100 000301000003010000080100004701000012010000030100000301000003010600210100 000301000003010000080100002b0101002c010000030100000301000004010000270100 00030100000301000003010000030100002b0100002d0100000301000003010000060100 00c30100000301000003010000030100000301000003010000470100000d010000030100 000301000003010000080100001d01000003010000030100000301000003010000030100 002b01010027010000030100000301000003010000030100002301000003010000030100 000301000003010000030100002b01000028010000030100000301000003010000060100 00c30100000301000003010000030100000301000003010000470100000d010000030100 000301000003010000080100001d01000003010000030100000301000003010000030100 002b01010027010000030100000301000003010000030100002301000003010000030100 000301000003010000030100002b01000028010000030100000301000003010000060100 00c40103000501030005010300480100000e01030005010300090100001e010300050103 00050103002c0101002801030005010300040105001f01030005010300050103002c0100 00290103000501030007010000ff00250100008b010100a6010000ff00660100008b0101 00a6010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff0066 0100008b010100a6010000ff00660100008b010100a6010000ff00660100008b010100a6 010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff00660100 008b010100a6010000ff00660100008b010100a6010000ff00660100008b010100a60100 00ff00660100008b010100a6010000ff00660100008b010100a6010000ff00660100008b 010100a6010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff 00660100008b010100a6010000ff00660100008b010100a6010000ff00660100008b0101 00a6010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff0066 0100008b010100a6010000ff00660100008b010100a6010000ff00660100008b010100a6 010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff00660100 008b010100a6010000ff00660100008b010100a6010000ff00660100008b010100a60100 00ff00660100008b010100a6010000ff00660100008b010100a6010000ff00660100008b 010100a6010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff 00660100008b010100a6010000ff00660100008b010100a6010000ff00660100008b0101 00a6010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff0066 0100008b010100a6010000ff00660100008b010100a6010000ff00660100008b010100a6 010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff00660100 008b010100a6010000ff00660100008b010100a6010000ff00660100008b010100a60100 00ff00660100008b010100a6010000ff00660100008b010100a6010000ff00660100008b 010100a6010000ff00660100008b010100a6010000ff00660100008b010100a6010000ff 00660100008b010100a6010000ff00660100008b010100a6010000ff00660100008b0101 00a6010000ff00660100008b010100a6010000ff004a0139006e0101006d017200ff0011 0139006e0101006d017200ff0011010100350101006e0101006d01010036010000360101 00ff0011010100350101006e0101006d0101003601000036010100ff0011010100350101 006e0101006d0101003601000036010100ff0011010100350101006e0101006d01010036 01000036010100ff0011010100350101006e0101006d0101003601000036010100ff0011 010100350101006e0101006d0101003601000036010100ff0011010100350101006e0101 006d0101003601000036010100ff0011010100350101006e0101006d0101003601000036 010100ff0011010100350101006e0101006d0101003601000036010100ff001101010035 0101006e0101006d0101003601000036010100ff0011010100350101006e0101006d0101 003601000036010100ff0011010100350101006e0101006d0101003601000036010100ff 0011010100350101006e0101006d0101003601000036010100ff0011010100350101006e 0101006d0101003601000036010100ff000e01050026011d0051011d0052011d00250104 0032010500ff000901030005010400210100001b010000510100001b010000520100001b 01000021010300040104002901030005010300ff00040101000c010100200100001b0100 00510100001b010000520100001b0100001f0101000c010200260101000c010100ff0000 0101000f0102001e0100001b010000510100001b010000520100001b0100001e0101000f 010100230101000f010200fd010100120101001d0100001b010000510100001b01000052 0100001b0100001d010000130100002101010012010000fc010100140100001d0100001b 010000510100001b010000520100001b0100001c010100130101001f010100140100003d 0101000501010006010100aa010000150101001c0100001b010000510100001b01000052 0100001b0100001b010100150101001e010000150101003c0101000501010006010100a9 010100160101001b0100001b010000510100001b010000520100001b0100001b01000017 0100001d010000170101003b0101000601010004010100aa010000180100001b0100001b 010000510100001b010000520100001b0100001a010000180101001b010100180100003b 0101000601010004010100aa010000180100001b0100001b010000510100001b01000052 0100001b0100001a010000190100001b010000190100003b0101000601020002010200a9 010000190100001b0100001b010000510100001b010000520100001b0100001a01000019 0100001b010000190100003b0101000701010002010100aa0100001a0100001a0100001b 010000510100001b010000520100001b010000190100001b010000190100001b0100003a 0101000701010002010100a90100001b0100001a0100001b010000510100001b01000052 0100001b010000190100001b010000190100001b0100003a0101000701020000010200a9 0100001b0100001a0100001b010000510100001b010000520100001b010000190100001b 010000190100001b0100003a01010008010400aa0100001b0100001a0100001b01000051 0100001b010000520100001b010000190100001b010000190100001b0100003a01010008 010400ab0100001a0100001a0100001b010000510100001b010000520100001b01000019 0100001b010000190100001b0100003a01010009010200ac010000190100001b0100001b 010000510100001b010000520100001b010000190100001a0100001a0100001a0100003b 01010009010200ac010000190100001b0100001b010000510100001b010000520100001b 0100001a010000190100001b01000019010000f8010000180100001b0100001b01000051 0100001b010000520100001b0100001a010000190100001b01000019010000f801000018 0100001b0100001b010000510100001b010000520100001b0100001a010100170101001b 01010018010000f8010100160100001c0100001b010000510100001b010000520100001b 0100001b010000170100001d01010016010000fa010000150101001c0100001b01000051 0100001b010000520100001b0100001c010000150100001f01000015010100fb01000014 0100001d0100001b010000510100001b010000520100001b0100001c0101001301010020 01000013010100fc010100120100001e0100001b010000510100001b010000520100001b 0100001d010100110101002101010011010100fe0102000e0101001f0100001b01000051 0100001b010000520100001b0100001e0101000f010100230102000e010100ff00010101 000b010200200100001b010000510100001b010000520100001b010000200101000b0101 00270101000b010200ff000401030004010300220100001b010000510100001b01000052 0100001b01000021010300050103002901040004010300ff000a01040026011d0051011d 0052011d002501050032010400ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00380101000401030008 0101002201010004010300040105005901010004010300050103005b0101000401030005 010300220101000401030007010000230101000401030005010300fd0100000001000003 01000003010000060100000001000021010000000100000301000003010000030100005d 010000000100000301000003010000030100000301000059010000000100000301000003 010000030100000301000020010000000100000301000003010000040102002201000000 01000003010000030100000301000003010000fb01000001010000030100000301000005 0100000101000020010000010100000301000003010000030100005c0100000101000003 010000030100000301000003010000580100000101000003010000030100000301000003 0100001f0100000101000003010000030100000601000021010000010100000301000003 0100000301000003010000fb010000010100000301000003010000050100000101000020 010000010100000301000003010000030100005c01000001010000030100000301000008 0100005801000001010000030100000301000003010000030100001f0100000101000003 01000003010000060100002101000001010000030100000301000007010000fb01000002 010000030100000301000004010000020100001f01000002010000030100000301000003 010400570100000201000003010000030100000501020058010000020100000301000003 01000003010000030100001e010000020100000301000003010000060100002001000002 010000030100000301000006010000ff0000010000030100000301000008010000230100 000301000003010000640100000301000003010000650100000301000003010000030100 000301000022010000030100000301000006010000240100000301000003010000ff0003 01000003010000030100000301000003010000030100001e010000030100000301000003 010000080100005501000003010000030100000301000008010000560100000301000003 0100000301000003010000030100001d010000030100000301000003010000060100001f 01000003010000030100000301000005010000fc0106000201000003010000030106001d 010600020100000301000008010000550106000201000003010000080100005601060002 0100000301000003010000030100001d0106000201000003010000060100001f01060002 0100000301000004010000ff000201000003010000030100000801000023010000030100 000301000003010000030100005a010000030100000301000003010000030100005b0100 000301000003010000030100000301000022010000030100000301000006010000240100 00030100000301000003010000ff00030100000301000003010000080100002301000003 0100000301000003010000030100005a010000030100000301000003010000030100005b 010000030100000301000003010000030100002201000003010000030100000601000024 010000030100000301000003010000ff0003010000040103000901000023010000040103 00050103005b01000004010300050103005c010000040103000501030023010000040103 0007010000240100000401030004010500ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00e4 %%EndDocument endTexFig 769 2416 a Ff(Figure)15 b(3:)20 b(P)o(edigree)15 b(2)960 2577 y(9)p eop %%Page: 10 10 10 9 bop 371 266 a 18945146 12503790 15392931 32372519 26285996 39633510 startTexFig 371 266 a %%BeginDocument: nfg2.ps %This is figure 2 for traversal doc /inch {72 mul} def /unit {1.5 mul} def %/unit {1.0 mul} def 1 inch 0 inch translate /arrowdict 16 dict def arrowdict begin /mtrx matrix def end /arrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /halfthickness exch 2 div def /tipy exch def /tipx exch def /taily exch def /tailx exch def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate 0 halfthickness neg moveto base halfthickness neg lineto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto base halfthickness lineto 0 halfthickness lineto closepath savematrix setmatrix end } def /dasharrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /thickness exch def /tipy exch def /tipx exch def /taily exch def /tailx exch def % /halfthickness thickness 2 div def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate % 0 halfthickness neg moveto % 0 thickness neg moveto 0 0 moveto [3 3] 0 setdash % base halfthickness neg lineto % base thickness neg lineto base 0 lineto stroke newpath [] 0 setdash % base halfthickness neg moveto base thickness neg moveto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto % base halfthickness lineto base thickness lineto closepath fill stroke % 0 halfthickness lineto savematrix setmatrix end } def /edge { newpath moveto lineto stroke } def /dirarc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 1 6 12 arrow fill stroke } def /dasharc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 2 4 8 dasharrow % stroke } def /dot { newpath /y exch %defines x to be pop def /x exch def x y moveto x y 0.040 inch 0 360 arc fill } def /subscript { gsave 0 -4 rmoveto .7 .7 scale show grestore 10 0 rmoveto } def /v1x 120 unit def /v1y 390 unit def v1x v1y dot /v2x 200 unit def /v2y v1y def v2x v2y dot /v3x 160 unit def /v3y 360 unit def v3x v3y dot /v4x 120 unit def /v4y 330 unit def v4x v4y dot /v5x v3x def /v5y v4y def v5x v5y dot /v6x v2x def /v6y v4y def v6x v6y dot v1x v1y v3x v3y edge v2x v2y v3x v3y edge v3x v3y v4x v4y edge v3x v3y v5x v5y edge v3x v3y v6x v6y edge /Times-Italic findfont 15 scalefont setfont %sz1 sz2 moveto %-2 -10 rmoveto %(s) show %(0) subscript v1x v1y moveto -18 4 rmoveto (201) show v2x v2y moveto -18 4 rmoveto (203) show v3x v3y moveto 9 -3 rmoveto (304) show v4x v4y moveto -16 4 rmoveto (404) show v5x v5y moveto -23 4 rmoveto (403) show v6x v6y moveto 8 4 rmoveto (400) show showpage %%EndDocument endTexFig 508 1156 a Ff(Figure)16 b(4:)j(Nuclear)d(family)g(graph)f(for)g(P)o (edigree)h(2)295 1289 y(Here)g(is)h(a)f(third)h(sample)g(p)q(edigree.) 24 b(It)16 b(illustrates)i(n-m)o(ultiple)g(marriages)e(\(in-)224 1345 y(dividual)f(205\).)j(It)13 b(can)g(also)f(b)q(e)h(used)h(to)e (illustrate)i(ho)o(w)e(LINKA)o(GE)h(deviates)g(from)224 1402 y(the)18 b(Elston-Stew)o(art)e(algorithm)i(in)g(an)g (algorithmically)h(fundamen)o(tal)f(w)o(a)o(y)l(.)26 b(The)224 1458 y(Elston-Stew)o(art)12 b(algorithm)i(w)o(ould)f(allo)o (w)h(a)e(tra)o(v)o(ersal)h(order)f(in)i(whic)o(h)g(the)g(n)o(uclear)224 1515 y(families)22 b(are)d(up)q(dated)i(in)g(the)f(order)g(402,)g(403,) g(404,)g(406,)h(307,)f(314,)g(310,)g(316.)224 1571 y(LINKA)o(GE)f(w)o (ould)g(nev)o(er)f(use)h(this)g(order)f(no)g(matter)g(ho)o(w)f(the)i (siblings)h(in)f(eac)o(h)224 1628 y(n)o(uclear)d(family)g(are)f (arranged.)295 1684 y(Here)g(is)h(the)f(transcript)g(for)g(the)g(third) h(p)q(edigree:)295 1741 y(Start)e(at)h(n)o(uclear)h(family)f(202)295 1797 y(Visit)h(n)o(uclear)g(family)g(307)295 1854 y(Visit)g(n)o(uclear) g(family)g(402)295 1910 y(Up)q(date)f(p)q(erson)h(307,)e(conditioned)j (on)e(306)f(and)i(402,)e(going)h(up)295 1966 y(Bac)o(kup)g(to)g(307)295 2023 y(Visit)h(n)o(uclear)g(family)g(403)295 2079 y(Up)q(date)f(p)q (erson)h(308,)e(conditioned)j(on)e(309)f(and)i(403,)e(going)h(up)295 2136 y(Bac)o(kup)g(to)g(307)295 2192 y(Up)q(date)g(p)q(erson)h(202,)e (conditioned)j(on)e(203,)f(307,)g(and)h(308,)f(going)h(up)295 2249 y(Bac)o(kup)g(to)g(202)295 2305 y(Visit)h(n)o(uclear)g(family)g (314)295 2362 y(Up)q(date)f(p)q(erson)h(205,)e(conditioned)j(on)e(206)f (and)i(314,)e(going)h(up)295 2418 y(Bac)o(kup)g(to)g(202)949 2577 y(10)p eop %%Page: 11 11 11 10 bop -229 374 a 37890294 29404447 1184071 11314462 39074365 40718909 startTexFig -229 374 a %%BeginDocument: rped3.ps % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 gt { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 gt { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 gt { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 gt { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-RunlengthEncodedCompression or 1-NoCompression. % hex color packets. % gsave currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse grestore showpage } bind def DisplayImage 18 172 576 447 658 511 1 0 2 ffffff 000000 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00cf011a002c010400ff00ff0044010000180100 002801030004010300ff00ff004001000018010000270101000a010100ff00ff003f0100 0018010000250101000e010100ff00ff003d010000180100002401010010010100ff00ff 003c010000180100002401000012010000ff0043010100f6010000180100002301000014 010000ff0042010100f6010000180100002201010014010100ff0041010100f601000018 0100002201000016010000ff0041010100f6010000180100002201000016010000ff0041 010100f6010000180100002201000017010000ff0040010100f601000018010000210100 0018010000ff0040010100f6010000180100002101000018010000ff0040010100f60100 00180100002101000018010000ff0040010100f6010000180100002101000018010000ff 0040010100f6010000180100002201000016010000ff0041010100f60100001801000022 01000016010000ff00ff003a010000180100002201000016010000ff00ff003a01000018 0100002201010014010000ff00ff003b010000180100002301010012010100ff00ff003b 010000180100002401000012010000ff00ff003c010000180100002401010010010000ff 00ff003d01000018010000260101000c010100ff00ff003e010000180100002701010009 010200ff00ff003f0100000b0101000a010000290102000101010000010200ff00ff0041 011a002c010400ff00ff00510101003a010100ff00ff00520101003a010100ff00ff0052 0101003a010100ff00ff00520101003a010100ff00ff00520101003a010100ff00ff0052 0101003a010100ff00ff00520101003a010100ff00ff00520101003a010100ff00ff0052 0101003a010100ff00ff00520101003a010100ff00ff00520101003a010100ff00ff0052 0101003a010100ff00ff0052013e00ff00ff0052013e00ff00ff0071010000ff00ff0090 010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff 00ff0068010000060103000701000012010000130100000601030004010300ff00ff003d 010200050100000301000004010200120100001101020005010000030100000201000003 010000ff00ff003e01000005010000030100000601000012010000130100000501000003 0100000201000003010000ff00ff003e0100000501000003010000060100001201000013 010000050100000301000006010000ff00ff003f01000005010000030100000601000012 01000013010000050100000301000005010000ff00ff0040010000050100000301000006 0100001201000013010000050100000301000004010000ff00ff00410100000501000003 010000060100001201000013010000050100000301000003010000ff00ff004201000005 01000003010000060100001201000013010000050100000301000002010000ff00ff0043 0100000501000003010000060100001201000013010000050100000301000002010000ff 00ff0043010000060103000701000012010000130100000601030003010500ff00ff0066 010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff 00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090 010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff 00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090 010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff 00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090 010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff 00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090 010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff 00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090 010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff00ff0090010000ff 00ff0090010000ff00ff0090010000ff00f801ff014f00ff004101000096010000b40101 00ff004101000096010000b4010100ff004101000096010000b4010100ff004101000096 010000b4010100ff004101000096010000b4010100ff004101000096010000b4010100ff 004101000096010000b4010100ff004101000096010000b4010100ff0041010000960100 00b4010100ff004101000096010000b4010100ff004101000096010000b4010100ff0041 01000096010000b4010100f7011a002c0104004a011a002b0105000d011a00870104002c 011a00ae0100001801000029010200010100000101020047010000180100002801020002 010000010102000a010000180100008401020001010100000102002901000018010000ae 010000180100002701010009010100460100001801000027010100090101000901000018 01000082010100090101002801000018010000ae01000018010000260101000b01020044 01000018010000250102000b0102000701000018010000810101000c0101002601000018 010000ae01000018010000240101000f0101004301000018010000240101000f01010006 010000180100007f0101000f0101002501000018010000ae010000180100002401000011 0101004201000018010000230101001101010005010000180100007f0100001101010024 0100001801000065010100060101003d0100001801000023010000130100004201000018 010000230100001301000005010000180100007e01010012010100230100001801000065 010100060101003d01000018010000220101001401000041010000180100002201010013 01010004010000180100007d01010014010000230100001801000065010100060101003d 010000180100002201000015010100400100001801000022010000150100000401000018 0100007d01000016010000220100001801000065010100060101003d0100001801000022 010000160100004001000018010000220100001501000004010000180100007d01000016 010000220100001801000065010100060101003d01000018010000220100001601000040 01000018010000220100001501000004010000180100007d010000160100002201000018 01000065010100060101003d0100001801000021010000180100003f0100001801000021 0100001701000003010000180100007c0100001801000021010000180100006501010006 0101003d0100001801000021010000180100003f01000018010000210100001701000003 010000180100007c01000018010000210100001801000065010100060101003d01000018 01000021010000180100003f01000018010000210100001701000003010000180100007c 01000018010000210100001801000065010100060101003d010000180100002101000018 0100003f01000018010000210100001701000003010000180100007c0100001801000021 0100001801000065010100060101003d0100001801000021010000180100003f01000018 010000210100001701000003010000180100007c01000018010000210100001801000065 010100060101003d01000018010000220100001601000040010000180100002201000015 01000004010000180100007d010000160100002201000018010000ae0100001801000022 010000160100004001000018010000220100001501000004010000180100007d01000016 0100002201000018010000ae010000180100002201000015010100400100001801000022 0100001501000004010000180100007d010000150101002201000018010000ae01000018 01000022010100130101004101000018010000220101001301010004010000180100007e 010000140100002301000018010000ae0100001801000023010100120100004201000018 010000230100001301000005010000180100007e010100120100002401000018010000ae 010000180100002401000011010000430100001801000024010000110100000601000018 0100007f010100100101002401000018010000ae01000018010000250101000d01020043 01000018010000240102000d0102000601000018010000800101000e0101002501000018 010000ae01000018010000260101000b0101004501000018010000260101000b01010008 01000018010000810101000b0101002701000018010000ae010000180100002801030004 010300460100001801000028010300040102000a01000018010000830103000401030028 01000018010000ae011a002c0104004a011a002c0104000d011a00870104002c011a00bb 0101003a010000590101003a0100001c010100950101003a010000c80101003a01000059 0101003a0100001c010100950101003a010000c80101003a010000590101003a0100001c 010100950101003a010000c80101003a010000590101003a0100001c010100950101003a 010000c80101003a010000590101003a0100001c010100950101003a010000c80101003a 010000590101003a0100001c010100950101003a010000c80101003a010000590101003a 0100001c010100950101003a010000c80101003a010000590101003a0100001c01010095 0101003a010000c80101003a010000590101003a0100001c010100950101003a010000c8 0101003a010000590101003a0100001c010100950101003a010000c80101003a01000059 0101003a0100001c010100950101003a010000c80101003a010000590101003a0100001c 010100950101003a010000c8013d0059015c0095013d00c8013d0059015c0095013d00f5 010100860101003a010100b3010100ff0013010100860101003a010100b3010100ff0013 010100860101003a010100b3010100ff0013010100860101003a010100b3010100ff0013 010100860101003a010100b3010100ff0013010100860101003a010100b3010100ff0013 010100860101003a010100b3010100db0103000501030004010300200101000201030004 010300050103004301030005010300040103001101010011010300040103000401050005 01030005010300070101007f010300050103000301050010010100110103000401030005 010300b101000003010000030100000301000002010000030100001f0101000101000003 010000020100000301000003010000030100004101000003010000030100000301000002 010000030100001001010010010000030100000201000003010000030100000901000003 01000003010000000101000001000005010000000100007e010000030100000301000003 0100000701000010010100100100000301000002010000030100000301000003010000b0 01000003010000030100000301000002010000030100001f010100010100000301000002 010000030100000301000003010000410100000301000003010000030100000201000015 010100100100000301000002010000030100000301000009010000030100000301000000 0101000001000004010000010100007e0100000301000003010000030100000601000011 010100100100000301000002010000030100000301000003010000b40100000401000003 010000070100001f01010005010000030100000301000007010000460100000401000003 0100000201000015010100140100000301000003010000030100000d0100000401000000 010100000100000401000001010000820100000401000003010000060100001101010014 01000003010000030100000301000003010000b301000005010000030100000401020020 010100040100000401000003010000060100004601000005010000030100000201000000 010200110101001301000004010000030100000301040008010000050100000001010000 010000030100000201000081010000050100000301000005010000120101001301000004 0100000301000004010300b30100000601000003010000070100001f0101000301000005 010000030100000501000046010000060100000301000002010100020100001001010012 010000050100000301000008010000060100000601000000010100000100000201000003 010000800100000601000003010000050100001201010012010000050100000301000003 01000003010000b10100000701000003010000070100001f010100020100000601000003 010000040100004601000007010000030100000201000003010000100101001101000006 010000030100000801000005010000070100000001010000010000020106007e01000007 0100000301000004010000130101001101000006010000030100000301000003010000b0 010000080100000301000002010000030100001f01010001010000070100000301000003 010000460100000801000003010000020100000301000010010100100100000701000003 010000030100000301000004010000080100000001010000010000070100007e01000008 0100000301000004010000130101001001000007010000030100000301000003010000b0 010000080100000301000002010000030100001f01010001010000070100000301000003 010000460100000801000003010000020100000301000010010100100100000701000003 010000030100000301000004010000080100000001010000010000070100007e01000008 0100000301000003010000140101001001000007010000030100000301000003010000b0 010500040103000401030020010100010105000301030004010500410105000401030004 010300110101001001050003010300050103000501050004010300080100007e01050004 0103000401000014010100100105000301030005010300ea010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0013010100860101003a010100b3010100ff0013010100860101003a010100b3 010100ff0004011f00770101003a013e0076010100ff0004011f00770101003a013e0076 010100ff00040101001c010000770101003a0101001c0100001c01010076010100ff0004 0101001c010000770101003a0101001c0100001c01010076010100ff00040101001c0100 00770101003a0101001c0100001c01010076010100ff00040101001c010000770101003a 0101001c0100001c01010076010100ff00040101001c010000770101003a0101001c0100 001c01010076010100ff00040101001c010000770101003a0101001c0100001c01010076 010100ff00040101001c010000770101003a0101001c0100001c01010076010100ff0004 0101001c010000770101003a0101001c0100001c01010076010100ff00040101001c0100 00770101003a0101001c0100001c01010076010100ff00040101001c010000770101003a 0101001c0100001c01010076010100ff00040101001c010000770101003a0101001c0100 001c01010076010100ff00040101001c010000770101003a0101001c0100001c01010076 010100ba011a002c0104000e011a002b010400370104002c011a000d0104000e011a002b 010400370104002c011a00710100001801000028010300040103000a0100001801000028 010200040103002f0103000401030028010000180100000a010200040103000a01000018 01000028010200040103002f010300040103002801000018010000710100001801000027 0101000a0101000901000018010000260101000a0102002c0101000a0101002701000018 010000080101000a0102000801000018010000260101000b0101002c0101000a01020026 010000180100007101000018010000250102000d0101000701000018010000250101000d 010100290101000e0101002501000018010000060102000d010100070100001801000025 0101000d010100290102000d010100250100001801000071010000180100002501000010 010100060100001801000024010000110100002701010010010100240100001801000006 010000110100000601000018010000240100001101000028010000100101002401000018 010000710100001801000024010000120101000501000018010000230100001201010026 010000120101002301000018010000050100001201010005010000180100002301010011 010100260100001201010023010000180100004001010005010100050101001e01000018 010000230101001301000005010000180100002201010013010000250100001401000023 010000180100000401010013010000050100001801000022010100130101002401010013 01000023010000180100004001010005010100050101001e010000180100002201010015 010000040100001801000022010000150100002301010014010100220100001801000003 010100150100000401000018010000220100001501000023010100150100002201000018 0100004001010005010100050101001e0100001801000022010000160100000401000018 010000210100001601000023010000160100002201000018010000030100001601000004 010000180100002201000015010000230100001601000022010000180100004001010005 010100050101001e01000018010000220100001601000004010000180100002101000016 010000230100001601000022010000180100000301000016010000040100001801000022 01000015010000230100001601000022010000180100004001010005010100050101001e 010000180100002201000017010000030100001801000021010000170100002201000017 010000210100001801000003010000170100000301000018010000210100001701000022 0100001701000021010000180100004001010005010100050101001e0100001801000021 010000180100000301000018010000200100001801000021010000180100002101000018 010000020100001801000003010000180100002101000017010000210100001801000021 010000180100004001010005010100050101001e01000018010000210100001801000003 010000180100002001000018010000210100001801000021010000180100000201000018 010000030100001801000020010000180100002101000018010000210100001801000040 01010005010100050101001e010000180100002101000018010000030100001801000020 010000180100002101000018010000210100001801000002010000180100000301000018 010000200100001801000021010000180100002101000018010000400101000501010005 0101001e0100001801000021010000180100000301000018010000200100001801000021 010000180100002101000018010000020100001801000003010000180100002101000017 010000210100001801000021010000180100004001010005010100050101001e01000018 010000220100001601000004010000180100002101000016010000230100001601000022 010000180100000301000016010000040100001801000021010000160100002301000016 01000022010000180100004001010005010100050101001e010000180100002201000016 010000040100001801000021010000160100002301000016010000220100001801000003 010000160100000401000018010000220100001501000023010000160100002201000018 010000710100001801000022010000160100000401000018010000210101001501000023 010000160100002201000018010000030100001601000004010000180100002201000015 010000230100001601000022010000180100007101000018010000230100001401010004 010000180100002201000014010100240100001401010022010000180100000401000014 010100040100001801000022010000150100002401000014010100220100001801000071 010000180100002301010013010000050100001801000023010000130100002501010013 010000230100001801000004010100130100000501000018010000230100001301000025 010100130100002301000018010000710100001801000024010100110100000601000018 010000230101001101000027010000120100002401000018010000050101001101000006 010000180100002301010011010100260101001101000024010000180100007101000018 010000250101000f0101000601000018010000240101000f010100280100001001010024 01000018010000060101000f0101000601000018010000240101000f010100280101000f 01010024010000180100007101000018010000260101000c010100080100001801000025 0101000c0102002a0101000c0101002601000018010000070101000c0102000701000018 010000250101000d0101002a0101000c0102002501000018010000710100001801000027 01020009010100090100001801000027010100090101002d010200090101002701000018 0100000901010009010100090100001801000027010100090101002d0102000901010027 01000018010000710100000c0100000a0100002901020001010100000102000b0100000b 0100000b010000280102000201000000010300300102000401020029010000180100000a 010200040102000b0100000b0101000a0100002801020002010000000103003001020001 01010000010200290100000b0101000a01000071011a002c0104000e011a002b01040037 0104002c011a000d0104000e011a002b010400370104002c011a007f0100003a0101001c 0100003b010000b40101003a0100003a0101003a0101008b0100003a0101001c0100003b 010000b40101003a0100003a0101003a0101008b0100003a0101001c0100003b010000b4 0101003a0100003a0101003a0101008b0100003a0101001c0100003b010000b40101003a 0100003a0101003a0101008b0100003a0101001c0100003b010000b40101003a0100003a 0101003a0101008b0100003a0101001c0100003b010000b40101003a0100003a0101003a 0101008b0100003a0101001c0100003b010000b40101003a0100003a0101003a0101008b 0100003a0101001c0100003b010000b40101003a0100003a0101003a0101008b0100003a 0101001c0100003b010000b40101003a0100003a0101003a0101008b0100003a0101001c 0100003b010000b40101003a0100003a0101003a0101008b0100003a0101001c0100003b 010000b40101003a0100003a0101003a0101008b0100003a0101001c0100003b010000b4 0101003a0100003a0101003a0101008b013d001c013d00b4013d003a013e008b013d001c 013d00b4013d003a013e00a901010058010100f001010067010100d701010058010100f0 01010067010100d701010058010100f001010067010100d701010058010100f001010067 010100d701010058010100f001010067010100d701010058010100f001010067010100ad 010300050103000501030011010100100103000501030004010500050103000401030005 010300110101001001030005010300050103002401030007010000090101002301030007 010000050103000601030007010000080100000701030006010000060103001101010010 010300070100000601030024010300070100000601030001010100200103000701000005 010500720100000301000003010000030100000301000003010000100101000f01000003 010000030100000301000008010000040100000301000002010000030100000301000003 010000100101000f01000003010000030100000301000003010000030100002201000003 010000040102000801000000010000220100000301000004010200040100000301000004 010000030100000401020006010200060100000301000003010200050100000301000010 0101000f0100000301000004010200050100000301000022010000030100000401020005 01000003010000000101001f010000030100000401020005010000770100000301000003 0100000301000003010000150101000f0100000301000003010000030100000701000005 0100000301000002010000030100000301000003010000100101000f0100000301000003 010000030100000301000003010000220100000301000006010000070100000101000022 010000030100000601000004010000030100000401000003010000060100000801000006 01000003010000050100000501000003010000100101000f010000030100000601000005 0100000301000022010000030100000601000005010000050101001f0100000301000006 010000050100007c01000003010000030100000301000015010100140100000301000003 010000070100000a01000002010000030100000301000003010000100101001401000003 010000030100000301000003010000270100000601000007010000010100002701000006 01000004010000030100000901000006010000080100000b010000050100000901000011 01010014010000060100000a010000270100000601000005010000050101002401000006 010000050100007901020004010000030100000301000000010200110101001101020004 010000030100000601000008010200030100000301000004010300110101001101020004 010000030100000301000003010000240102000701000006010000020100002401020007 010000040100000301000006010200070100000801000008010200060100000801000012 010100110102000701000007010200250102000701000005010000000102000101010021 010200070100000501040078010000030100000301000003010100020100001001010014 0100000301000003010000060100000b0100000201000003010000030100000301000010 010100140100000301000003010000040104002701000006010000050100000301000027 0100000601000004010000030100000901000006010000080100000b0100000501000007 0100001301010014010000060100000a0100002701000006010000050101000201000000 01010024010000060100000a010000770100000301000003010000030100000301000010 010100140100000301000003010000050100000c01000002010000030100000301000003 010000100101001401000003010000030100000801000027010000060100000501060026 0100000601000004010000030100000901000006010000080100000b0100000501000006 0100001401010014010000060100000a0100002701000006010000050100000301000000 01010024010000060100000a010000720100000301000003010000030100000301000003 010000100101000f01000003010000030100000301000005010000070100000301000002 010000030100000301000003010000100101000f01000003010000030100000301000003 010000030100002201000003010000060100000a01000022010000030100000601000004 010000030100000401000003010000060100000801000006010000030100000501000005 010000150101000f01000003010000060100000501000003010000220100000301000006 0100000501000003010000000101001f0100000301000006010000050100000301000072 0100000301000003010000030100000301000003010000100101000f0100000301000003 010000030100000401000008010000030100000201000003010000030100000301000010 0101000f0100000301000003010000030100000301000003010000220100000301000006 0100000a0100002201000003010000060100000401000003010000040100000301000006 0100000801000006010000030100000501000005010000150101000f0100000301000006 01000005010000030100002201000003010000060100000501000003010000000101001f 010000030100000601000005010000030100007301030005010300050103001101010010 010300050103000501000009010300040103000501030011010100100103000501030005 01030024010300070100000a010000230103000701000005010300060103000701000008 010000070103000601000005010500100101001001030007010000060103002401030007 01000006010300010101002001030007010000060103009e01010058010100f001010067 010100d701010058010100f001010067010100d701010058010100f001010067010100d7 01010058010100f001010067010100d701010058010100f001010067010100d701010058 010100f001010067010100d701010058010100f001010067010100d701010058010100f0 01010067010100d701010058010100f001010067010100d701010058010100f001010067 010100d701010058010100f001010067010100d701010058010100f001010067010100d7 01010058010100f001010067010100d701010058010100f001010067010100d701010058 010100f001010067010100d701010058010100f001010067010100d701010058010100f0 01010067010100d701010058010100f001010067010100d701010058010100f001010067 010100d701010058010100f001010067010100d701010058010100f001010067010100d7 01010058010100f001010067010100d701010058010100f001010067010100d701010058 010100f001010067010100d701010058010100f001010067010100d701010058010100f0 01010067010100d701010058010100f001010067010100d701010058010100f001010067 010100d701010058010100f001010067010100d701010058010100f001010067010100d7 01010058010100f001010067010100d701010058010100f001010067010100d701010058 010100f001010067010100d701010058010100f001010067010100d701010058010100f0 01010067010100d701010058010100f001010067010100d701010058010100f001010067 010100d701010058010100f001010067010100d701010058010100f001010067010100d7 01010058010100f001010067010100d701010058010100f001010067010100d701010058 010100f001010067010100d701010058010100f001010067010100d701010058010100f0 01010067010100d701010058010100f001010067010100d701010058010100f001010067 010100d701010058010100f001010067010100d701010058010100f001010067010100d7 01010058010100f001010067010100d701010058010100f001010067010100d701010058 010100f001010067010100d701010058010100f001010067010100d701010058010100f0 01010058011f00c801010058010100f0010100580101001c010000c801010058010100f0 010100580101001c010000c801010058010100f0010100580101001c010000c801010058 010100f0010100580101001c010000c801010058010100f0010100580101001c010000c8 01010058010100f0010100580101001c010000c801010058010100f0010100580101001c 010000c801010058010100f0010100580101001c010000c801010058010100f001010058 0101001c010000c801010058010100f0010100580101001c010000c801010058010100f0 010100580101001c010000c801010058010100f0010100580101001c010000bb011a004a 010400e2011a003f011a000e010400b9010000180100004701020004010200df01000018 0100003f0100000b0101000a0100000b0102000101000001010200b60100001801000045 01020008010100de010000180100003f010000180100000901010009010100b501000018 010000440101000c010100dc010000180100003f01000018010000080101000c010100b3 01000018010000430101000e010100db010000180100003f01000018010000060101000f 010100b2010000180100004201000012010000da010000180100003f0100001801000006 010000110101006301010005010100050101003b010000180100004101010012010100d9 010000180100003f0100001801000005010000130100006301010005010100050101003b 010000180100004101000014010000d9010000180100003f010000180100000401010014 0100006201010006010100030101003c010000180100004001000016010000d801000018 0100003f0100001801000004010000150101006101010006010100030101003c01000018 0100004001000016010000d8010000180100003f01000018010000040100001601000061 01010006010200010102003c010000180100004001000016010000d8010000180100003f 0100001801000004010000160100006101010007010100010101003d010000180100003f 01000018010000d7010000180100003f0100001801000003010000180100006001010007 010100010101003d010000180100003f01000018010000d7010000180100003f01000018 010000030100001801000060010100080103003e010000180100003f01000018010000d7 010000180100003f01000018010000030100001801000060010100080103003e01000018 0100003f01000018010000d7010000180100003f01000018010000030100001801000060 010100090101003f010000180100003f01000018010000d7010000180100003f01000018 010000030100001801000060010100090101003f010000180100004001000016010000d8 010000180100003f010000180100000401000016010000af010000180100004001000016 010000d8010000180100003f010000180100000401000016010000af0100001801000040 01010014010100d8010000180100003f010000180100000401000015010100af01000018 0100004101000014010000d9010000180100003f010000180100000401010013010100b0 010000180100004101010012010000da010000180100003f010000180100000501010012 010000b1010000180100004201010010010100da010000180100003f0100001801000006 01000011010000b201000018010000430101000e010100db010000180100003f01000018 010000070101000e010100b201000018010000440102000a010100dd010000180100003f 01000018010000080101000b010100b4010000180100004601030004010300de01000018 0100003f010000180100000a01030004010300b5011a004a010400e2011a003f011a000e 010400ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00b80101000401030004010300460101000401030005010300dd0101000401030008 010100440101000401030005010300090101000301030004010500b30100000001000003 010000030100000201000003010000440100000001000003010000030100000301000003 010000db0100000001000003010000030100000601000000010000430100000001000003 0100000301000003010000030100000701000000010000020100000301000003010000b7 010000010100000301000003010000020100000301000043010000010100000301000003 0100000301000003010000da010000010100000301000003010000050100000101000042 010000010100000301000003010000030100000b01000001010000020100000301000003 010000b70100000101000003010000030100000601000044010000010100000301000003 01000008010000da01000001010000030100000301000005010000010100004201000001 0100000301000003010000030100000b01000001010000020100000301000003010000b6 010000020100000301000003010000050100004401000002010000030100000301000005 010200da0100000201000003010000030100000401000002010000410100000201000003 0100000301000003010000000102000601000002010000020100000301000003010400b1 010000030100000301000003010000040100004401000003010000030100000301000008 010000d80100000301000003010000030100000301000003010000400100000301000003 0100000301000003010100020100000401000003010000020100000301000008010000b0 01060002010000030100000301000045010600020100000301000008010000d801060002 01000003010000030106003f010600020100000301000003010000030100000401060001 0100000301000008010000b50100000301000003010000020100004b0100000301000003 0100000301000003010000dd010000030100000301000008010000450100000301000003 01000003010000030100000901000002010000030100000301000003010000b501000003 01000003010000020100004b01000003010000030100000301000003010000dd01000003 010000030100000801000045010000030100000301000003010000030100000901000002 010000030100000301000003010000b50100000401030003010500460100000401030005 010300de01000004010300090100004501000004010300050103000a0100000301030005 010300ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff 00ff00ff00ff00ff00ff00ff00ff00ff00ea %%EndDocument endTexFig 769 2335 a Ff(Figure)15 b(5:)20 b(P)o(edigree)15 b(3)949 2577 y(11)p eop %%Page: 12 12 12 11 bop 371 266 a 18945146 8146409 8946319 32091632 26285996 39633510 startTexFig 371 266 a %%BeginDocument: nfg3.ps %This is figure 2 for traversal doc /inch {72 mul} def /unit {1.5 mul} def %/unit {1.0 mul} def 1 inch 0 inch translate /arrowdict 16 dict def arrowdict begin /mtrx matrix def end /arrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /halfthickness exch 2 div def /tipy exch def /tipx exch def /taily exch def /tailx exch def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate 0 halfthickness neg moveto base halfthickness neg lineto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto base halfthickness lineto 0 halfthickness lineto closepath savematrix setmatrix end } def /dasharrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /thickness exch def /tipy exch def /tipx exch def /taily exch def /tailx exch def % /halfthickness thickness 2 div def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate % 0 halfthickness neg moveto % 0 thickness neg moveto 0 0 moveto [3 3] 0 setdash % base halfthickness neg lineto % base thickness neg lineto base 0 lineto stroke newpath [] 0 setdash % base halfthickness neg moveto base thickness neg moveto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto % base halfthickness lineto base thickness lineto closepath fill stroke % 0 halfthickness lineto savematrix setmatrix end } def /edge { newpath moveto lineto stroke } def /dirarc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 1 6 12 arrow fill stroke } def /dasharc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 2 4 8 dasharrow % stroke } def /dot { newpath /y exch %defines x to be pop def /x exch def x y moveto x y 0.040 inch 0 360 arc fill } def /subscript { gsave 0 -4 rmoveto .7 .7 scale show grestore 10 0 rmoveto } def /v1x 120 unit def /v1y 390 unit def v1x v1y dot /v2x 80 unit def /v2y 360 unit def v2x v2y dot /v3x v1x def /v3y v2y def v3x v3y dot /v4x 160 unit def /v4y v2y def v4x v4y dot /v5x 200 unit def /v5y v2y def v5x v5y dot /v6x 60 unit def /v6y 330 unit def v6x v6y dot /v7x 100 unit def /v7y v6y def v7x v7y dot /v8x v4x def /v8y v6y def v8x v8y dot /v9x v5x def /v9y v6y def v9x v9y dot v1x v1y v2x v2y edge v1x v1y v3x v3y edge v1x v1y v4x v4y edge v1x v1y v5x v5y edge v2x v2y v6x v6y edge v2x v2y v7x v7y edge v4x v4y v8x v8y edge v5x v5y v9x v9y edge /Times-Italic findfont 15 scalefont setfont %sz1 sz2 moveto %-2 -10 rmoveto %(s) show %(0) subscript v1x v1y moveto -18 4 rmoveto (202) show v2x v2y moveto -18 4 rmoveto (307) show v3x v3y moveto 8 -3 rmoveto (314) show v4x v4y moveto 8 -3 rmoveto (310) show v5x v5y moveto 8 -3 rmoveto (316) show v6x v6y moveto -26 -4 rmoveto (402) show v7x v7y moveto -26 -4 rmoveto (403) show v8x v8y moveto -26 -4 rmoveto (404) show v9x v9y moveto -26 -4 rmoveto (406) show showpage %%EndDocument endTexFig 517 880 a Ff(Figure)16 b(6:)j(Nuclear)d(family)g(graph)f(for)g(p)q (edigree)i(3)295 1013 y(Visit)f(n)o(uclear)g(family)g(310)295 1069 y(Visit)g(n)o(uclear)g(family)g(404)295 1126 y(Up)q(date)f(p)q (erson)h(312,)e(conditioned)j(on)e(313)f(and)i(404,)e(going)h(up)295 1182 y(Bac)o(kup)g(to)g(310)295 1239 y(Up)q(date)g(p)q(erson)h(205,)e (conditioned)j(on)e(204,)f(310,)g(311,)g(and)h(312,)f(going)h(up)295 1295 y(Bac)o(kup)g(to)g(202)295 1352 y(Visit)h(n)o(uclear)g(family)g (316)295 1408 y(Visit)g(n)o(uclear)g(family)g(406)295 1465 y(Up)q(date)f(p)q(erson)h(316,)e(conditioned)j(on)e(315,)f(406,)g (and)h(405,)f(going)h(up)295 1521 y(Bac)o(kup)g(to)g(316)295 1578 y(Up)q(date)g(p)q(erson)h(207,)e(conditioned)j(on)e(208)f(and)i (316,)e(going)h(up)295 1634 y(Bac)o(kup)g(to)g(202)295 1690 y(Up)q(date)g(p)q(erson)h(101,)e(conditioned)j(on)e(102,)f(202,)g (205,)g(and)h(207,)f(going)h(up)949 2577 y(12)p eop %%Page: 13 13 13 12 bop 371 266 a 18945146 18945146 2368143 8288501 37890293 43810652 startTexFig 371 266 a %%BeginDocument: thompson.ps % Start of Prolog /M /moveto load def /L /lineto load def /R /rlineto load def /C /closepath load def /N /newpath load def /GR /grestore load def /SGF {setgray fill} bind def /GSC {gsave clip} bind def /tex { gsave newpath moveto dup stringwidth pop neg 2 div 0 rmoveto false charpath flattenpath gsave 1 setgray 34 setlinewidth 1 setlinejoin stroke grestore 0 setgray fill grestore } bind def /dot { gsave newpath 25 0 360 arc 0 setgray fill grestore } bind def /cir { newpath 67 0 360 arc } bind def /squ { newpath moveto 0 120 rlineto 120 0 rlineto 0 -120 rlineto -120 0 rlineto closepath } bind def /dia { newpath moveto -84 84 rlineto 84 84 rlineto 84 -84 rlineto -84 -84 rlineto closepath } bind def /ful { gsave setgray fill grestore } bind def 0.1 0.1 scale % this version uses integer coordinates at 1/10's of a point 1 setlinecap 1 setlinejoin /Helvetica findfont 120 scalefont setfont 5 setlinewidth N 360 1260 M 360 6660 L 5760 6660 L 5760 1260 L 360 1260 L C stroke 5291 5442 M 5291 5442 dot 4985 6184 L 5291 5442 M 5511 6184 L 5291 5442 M 5488 4701 L 5291 5442 M 5094 4701 L stroke 3629 5442 M 3629 5442 dot 4115 6184 L 3629 5442 M 3286 6184 L 3629 5442 M 3629 4701 L stroke 2943 5442 M 2943 5442 dot 2544 6184 L 2943 5442 M 3286 6184 L 2943 5442 M 2939 4701 L stroke 1571 5442 M 1571 5442 dot 1399 6184 L 1571 5442 M 1742 6184 L 1571 5442 M 1228 4701 L 1571 5442 M 1914 4701 L stroke 4867 3960 M 4867 3960 dot 4648 4701 L 4867 3960 M 5094 4701 L 4867 3960 M 4867 3218 L stroke 3947 3960 M 3947 3960 dot 3629 4701 L 3947 3960 M 4137 4701 L 3947 3960 M 3947 3218 L stroke 2384 3960 M 2384 3960 dot 2939 4701 L 2384 3960 M 1914 4701 L 2384 3960 M 2384 3218 L 2384 3960 M 1463 3218 L stroke 885 3960 M 885 3960 dot 1228 4701 L 885 3960 M 609 4701 L 885 3960 M 885 3218 L stroke 4451 2477 M 4451 2477 dot 3947 3218 L 4451 2477 M 4867 3218 L 4451 2477 M 4736 1736 L 4451 2477 M 4144 1736 L stroke 2661 2477 M 2661 2477 dot 2943 3218 L 2661 2477 M 2384 3218 L 2661 2477 M 2661 1736 L stroke 2085 2477 M 2085 2477 dot 1887 3218 L 2085 2477 M 2384 3218 L 2085 2477 M 2085 1736 L 2085 2477 M 2085 1736 L stroke 4925 6124 squ 1 ful stroke 5511 6184 cir 1 ful stroke 4055 6124 squ 1 ful stroke 3286 6184 cir 1 ful stroke 2484 6124 squ 1 ful stroke 1742 6184 cir 1 ful stroke 1339 6124 squ 1 ful stroke 5094 4701 cir 1 ful stroke 5488 4616 dia 1 ful stroke 3569 4641 squ 1 ful stroke 2879 4641 squ 1 ful stroke 1914 4701 cir 1 ful stroke 1168 4641 squ 1 ful stroke 4588 4641 squ 1 ful stroke 4137 4701 cir 1 ful stroke 609 4701 cir 1 ful stroke 4867 3218 cir 1 ful stroke 3887 3158 squ 1 ful stroke 1463 3133 dia 1 ful stroke 2384 3218 cir 1 ful stroke 885 3133 dia 1 ful stroke 2883 3158 squ 1 ful stroke 1827 3158 squ 1 ful stroke 4144 1651 dia 1 ful stroke 4736 1651 dia 1 ful stroke 2661 1651 dia 1 ful stroke 2085 1651 dia 1 ful stroke 2085 1651 dia 1 ful stroke (1) 4985 6299 tex (2) 5511 6299 tex (3) 4115 6299 tex (4) 3286 6299 tex (5) 2544 6299 tex (6) 1742 6299 tex (7) 1399 6299 tex (8) 5094 4817 tex (9) 5488 4834 tex (10) 3629 4817 tex (11) 2939 4817 tex (12) 1914 4817 tex (13) 1228 4817 tex (14) 4648 4817 tex (15) 4137 4817 tex (16) 609 4817 tex (17) 4867 3334 tex (18) 3947 3334 tex (19) 1463 3351 tex (20) 2384 3334 tex (21) 885 3351 tex (22) 2943 3334 tex (23) 1887 3334 tex (24) 4144 1868 tex (25) 4736 1868 tex (26) 2661 1868 tex (27) 2085 1868 tex (28) 2085 1868 tex showpage %%EndDocument endTexFig 529 1564 a Ff(Figure)15 b(7:)20 b(P)o(edigree)c(4,)e(marriage)h(graph) g(format)295 1697 y(The)j(fourth)f(p)q(edigree)j(illustrates)f(the)f (distinction)i(b)q(et)o(w)o(een)e(f-m)o(ultiple)i(mar-)224 1753 y(riages)f(\(individual)j(4\))c(and)h(n-m)o(ultiple)i(marriages)d (\(individual)k(20\).)30 b(It)19 b(has)f(the)224 1810 y(adv)m(an)o(tage)c(of)h(b)q(eing)h(in)g(marriage)e(graph)g(format,)g (whic)o(h)h(is)h(m)o(uc)o(h)f(closer)g(to)f(what)224 1866 y(the)f(n)o(uclear)g(family)g(graph)g(lo)q(oks)g(lik)o(e.)20 b(In)13 b(particular)g(there)g(is)g(a)f(one-to-one)h(corre-)224 1923 y(sp)q(ondence)j(b)q(et)o(w)o(een)f(the)g(\014lled)h(in)g(dots)e (in)i(the)e(marriage)g(graph)h(and)f(the)h(v)o(ertices)224 1979 y(in)h(the)f(n)o(uclear)h(family)g(graph.)295 2036 y(Here)f(is)h(the)f(tra)o(v)o(ersal)f(transcript)h(for)g(p)q(edigree)i (4:)295 2092 y(Start)d(at)h(n)o(uclear)h(family)f(13)295 2149 y(Visit)h(n)o(uclear)g(family)g(21)295 2205 y(Up)q(date)f(p)q (erson)h(13,)e(conditioned)j(on)e(16)g(and)g(21,)f(going)i(up)295 2262 y(Bac)o(kup)f(to)g(13)295 2318 y(Visit)h(n)o(uclear)g(family)g(19) 295 2374 y(Visit)g(n)o(uclear)g(family)g(11)295 2431 y(Visit)g(n)o(uclear)g(family)g(10)949 2577 y(13)p eop %%Page: 14 14 14 13 bop 371 266 a 18945146 12314339 7013650 29131452 22959873 39633510 startTexFig 371 266 a %%BeginDocument: nfg4.ps %This is figure 2 for traversal doc /inch {72 mul} def /unit {1.5 mul} def %/unit {1.0 mul} def 1 inch 0 inch translate /arrowdict 16 dict def arrowdict begin /mtrx matrix def end /arrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /halfthickness exch 2 div def /tipy exch def /tipx exch def /taily exch def /tailx exch def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate 0 halfthickness neg moveto base halfthickness neg lineto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto base halfthickness lineto 0 halfthickness lineto closepath savematrix setmatrix end } def /dasharrow { arrowdict begin /headlength exch def /halfheadthickness exch 2 div def /thickness exch def /tipy exch def /tipx exch def /taily exch def /tailx exch def % /halfthickness thickness 2 div def /dx tipx tailx sub def /dy tipy taily sub def /arrowlength dx dx mul dy dy mul add sqrt def /angle dy dx atan def /base arrowlength headlength sub def /savematrix mtrx currentmatrix def tailx taily translate angle rotate % 0 halfthickness neg moveto % 0 thickness neg moveto 0 0 moveto [3 3] 0 setdash % base halfthickness neg lineto % base thickness neg lineto base 0 lineto stroke newpath [] 0 setdash % base halfthickness neg moveto base thickness neg moveto base halfheadthickness neg lineto arrowlength 0 lineto base halfheadthickness lineto % base halfthickness lineto base thickness lineto closepath fill stroke % 0 halfthickness lineto savematrix setmatrix end } def /edge { newpath moveto lineto stroke } def /dirarc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 1 6 12 arrow fill stroke } def /dasharc { newpath /taily exch def /tailx exch def tailx taily moveto /heady exch def /headx exch def headx heady tailx taily 2 4 8 dasharrow % stroke } def /dot { newpath /y exch %defines x to be pop def /x exch def x y moveto x y 0.040 inch 0 360 arc fill } def /subscript { gsave 0 -4 rmoveto .7 .7 scale show grestore 10 0 rmoveto } def /v1x 50 unit def /v1y 390 unit def v1x v1y dot /v2x 100 unit def /v2y v1y def v2x v2y dot /v3x 125 unit def /v3y v1y def v3x v3y dot /v4x 175 unit def /v4y v1y def v4x v4y dot /v5x 25 unit def /v5y 360 unit def v5x v5y dot /v6x 75 unit def /v6y v5y def v6x v6y dot /v7x v3x def /v7y v5y def v7x v7y dot /v8x v4x def /v8y v5y def v8x v8y dot /v9x v1x def /v9y 300 unit def v9x v9y dot /v10x v2x def /v10y v9y def v10x v10y dot /v11x 150 unit def /v11y v9y def v11x v11y dot v1x v1y v5x v5y edge v1x v1y v6x v6y edge v2x v2y v3x v3y edge v2x v2y v6x v6y edge v3x v3y v7x v7y edge v4x v4y v8x v8y edge v6x v6y v9x v9y edge v6x v6y v10x v10y edge v7x v7y v11x v11y edge v8x v8y v11x v11y edge /Times-Italic findfont 15 scalefont setfont %sz1 sz2 moveto %-2 -10 rmoveto %(s) show %(0) subscript v1x v1y moveto -18 4 rmoveto (13) show v2x v2y moveto -18 4 rmoveto (11) show v3x v3y moveto 8 -3 rmoveto (10) show v4x v4y moveto 8 -3 rmoveto (8) show v5x v5y moveto 8 -3 rmoveto (21) show v6x v6y moveto -23 -4 rmoveto (19) show v7x v7y moveto -23 -4 rmoveto (18) show v8x v8y moveto -23 -4 rmoveto (17) show v9x v9y moveto -25 -4 rmoveto (28) show v10x v10y moveto -25 -4 rmoveto (26) show v11x v11y moveto -25 -4 rmoveto (24) show showpage %%EndDocument endTexFig 517 1144 a Ff(Figure)16 b(8:)j(Nuclear)d(family)g(graph)f(for)g(p)q (edigree)i(4)295 1277 y(Visit)f(n)o(uclear)g(family)g(18)295 1333 y(Visit)g(n)o(uclear)g(family)g(24)295 1390 y(Visit)g(n)o(uclear)g (family)g(17)295 1446 y(Visit)g(n)o(uclear)g(family)g(8)295 1503 y(Up)q(date)f(p)q(erson)h(8,)e(conditioned)j(on)f(1,2,)d(and)j(9,) e(going)h(do)o(wn)295 1559 y(Bac)o(k)g(to)f(n)o(uclear)i(family)g(17) 295 1616 y(Up)q(date)f(p)q(erson)h(17,)e(conditioned)j(on)e(8)g(and)h (14,)e(going)h(do)o(wn)295 1672 y(Bac)o(k)g(to)f(n)o(uclear)i(family)g (24)295 1729 y(Up)q(date)f(p)q(erson)h(18,)e(conditioned)j(on)e(17.)20 b(24,)14 b(and)h(25)g(going)g(up)295 1785 y(Bac)o(kup)g(to)g(n)o (uclear)h(family)g(18)295 1842 y(Up)q(date)f(p)q(erson)h(10)f (conditioned)h(on)g(15,)e(and)h(18,)f(going)i(up)295 1898 y(Bac)o(kup)f(to)g(n)o(uclear)h(family)g(10)295 1954 y(Up)q(date)f(p)q(erson)h(4,)e(conditioned)j(on)f(3)e(and)i(10,)e (going)h(up)295 2011 y(Bac)o(kup)g(to)g(n)o(uclear)h(family)g(11)295 2067 y(Up)q(date)f(p)q(erson)h(11)f(conditioned)h(on)g(4)e(and)i(5,)e (going)i(do)o(wn)295 2124 y(Bac)o(k)f(to)f(n)o(uclear)i(family)g(19)295 2180 y(Visit)g(n)o(uclear)g(family)g(28)295 2237 y(Up)q(date)f(p)q (erson)h(20,)e(conditioned)j(on)e(23)g(and)g(28,)f(going)i(up)295 2293 y(Bac)o(kup)f(to)g(n)o(uclear)h(family)g(19)295 2350 y(Visit)g(n)o(uclear)g(family)g(26)295 2406 y(Up)q(date)f(p)q (erson)h(20,)e(conditioned)j(on)e(22)g(and)g(26,)f(going)i(up)949 2577 y(14)p eop %%Page: 15 15 15 14 bop 295 307 a Ff(Bac)o(kup)15 b(to)g(n)o(uclear)h(family)g(19)295 364 y(Up)q(date)f(p)q(erson)h(12,)e(conditioned)j(on)e(11,)f(19,)h(and) g(20,)f(going)i(up)295 420 y(Bac)o(kup)f(to)g(n)o(uclear)h(family)g(13) 295 477 y(Up)q(date)f(p)q(erson)h(7,)e(conditioned)j(on)f(6,)e(13,)g (and)i(12,)e(going)h(up)949 2577 y(15)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.checkpoint0000644000265600020320000004264206737457627016444 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: February 9, 1996 Checkpointing in FASTLINK by K. Shriram and A. A. Schaffer Rice University/NIH This README file is meant to accompany version 2.3P and beyond of FASTLINK. See the top-level README file for a roadmap to all the documentation. This file describes in detail the checkpointing scheme that was implemented by K. Shriram and A. A. Schaffer. Checkpointing means periodically saving the state of a computation. The purpose of checkpointing is to be able to recover from a crash of the underlying computer that causes one of the FASTLINK programs to stop for a reason that has nothing to do with its computation. Two common causes for such crashes are power failures and lightning hits. Right now checkpointing works only for the sequential versions of FASTLINK on UNIX, and for MLINK and LINKMAP on VMS. A more cursory but more scholarly description of how the checkpointing works can be found in one section of: A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham Jr., Avoiding Recomputation in Genetic Linkage Analysis, Human Heredity 44(1994), pp. 225-237. This paper can be found in paper2.ps that comes with the FASTLINK distribution. At the time the paper was written, the checkpointing scheme had been implemented only in LODSCORE and ILINK; these are the two difficult cases for checkpointing and the programs where it is most needed. After seeing the checkpointing scheme in LODSCORE and ILINK for versions 2.0 and 2.1, several users who had suffered machine crashes during LINKMAP runs clamored for extending the scheme to the other two programs. As of version 2.2, all four programs have checkpointing and crash-recovery. Through version 1.1, FASTLINK provided the same level of functionality as LINKAGE 5.1. Checkpointing adds new functionality, so we decided to write more detailed documentation about the checkpointing facility. Any questions, comments, or complaints should be directed to Alejandro Schaffer (schaffer@nchgr.nih.gov). [This README file has been organized with each section starting with the string "|*|". To browse the sections, you can thus use your file viewer to search for this unique string, thus getting from one section to the other without having to read the intervening material.] Frequent LINKAGE users almost certainly have had the computer crash during a long run, only to have to start the computation again. We have now included a "checkpointing" package in the code that occasionally saves the state of the computation, so that a crashed program can be restarted without much computation lost. The folklore wisdom seems to be that this form of augmentation to programs is the proper mechanism for recovering from crashes. This file briefly the checkpointing process and explains the files connected with our implementation. There are standard packages that do checkpointing of programs for specific operating systems, but we wanted our code to be somewhat portable because LINKAGE is used on a variety of operating systems. Unless otherwise specified, the descriptions that follow apply equally to all of ILINK,LODSCORE, LINKMAP, and MLINK. In particular, to distinguish the two, we use the names of the programs in the filenames. We shall annotate this by the string "<>", which should be replaced by the program name in question. Thus, for instance, the filename `checkpoint<>.bak' would denote `checkpointILINK.bak' or `checkpointLODSCORE.bak', depending upon context. Before getting into details, there are three VERY IMPORTANT cautions in using the FASTLINK crash-recovery scheme. 1. After a crash occurs, if you run the program in the same directory where it was running before, the program will assume that you want to *restart* the crashed run. The only way to have the program start a different run is to delete all the files created by the checkpointing scheme. The files created during checkpointing will have names with one of the following prefixes: checkpoint, script, outf, main. To remove these files, you can use the command: rm checkpoint* script* outf* main* Note: extreme care should be taken when removing these files that you don't have other meaningful files in the same directory with any of these prefixes. If "rm" doesn't normally prompt you for each file before removing it, it is probably wiser to delete these files by hand. 2. The time to save the state to a file is not zero. Therefore, if a crash occurs while the state is being saved, the program may be a little confused on restart. In particular, it may unnecessarily redo one or two likelihood function evaluations. When this happens with LINKMAP or MLINK, it means that duplicate data will show up in the output file because they write out their output after each likelihood function evaluation. 3. The checkpointing scheme has been extensively tested with simulated crashes, but we do not induce a crash of the whole system in testing. Furthermore, system-wide crashes can have bizarre and unimaginable side-effects. Therefore, user feedback based on what happened during real crashes and real runs will be invaluable in making the checkpointing system more robust. |*| The Process ----------- Most of the discussion below focuses on the programs ILINK and LODSCORE. At the end we explain the much simpler method of checkpointing used in LINKMAP and MLINK. The programs ILINK and LODSCORE perform checkpointing at two distinct types of locations. A checkpoint is created at the start of each iteration (in the function iterate()); it is also made at the beginning of the functions initialize(), outf(), firststep(), decreaset() and increaset(), and at the beginning of the loops in gforward() and gcentral(). We distinguish between these two types by the terms "iteration-" and "function-checkpoint", respectively; the latter term is used since the program proceeds to make one or more calls to the routine fun() shortly after the location of checkpointing. In the case of LINKMAP a simple checkpoint is taken after each likelihood function evaluation. MLINK is the same except we do not checkpoint on the first function evaluation where the moving marker is unlinked to the others. The files final.dat and stream.dat (if requested) primarily contain the output, so a checkpointing mechanism must take care to ensure the contents of these files are not altered in any way by the process. In ILINK and LODSCORE All output to these files takes place in the routine outf() (and from the routines it calls); hence, these files are checkpointed before entry into outf(). More details on this follow under the discussion of the actual files created. In MLINK and LINKMAP these files are updates after each function evaluation, so they have to checkpointed as well. |*| The Files --------- The following is a list of the files created for the purposes of checkpointing. All of these files are placed in the working directory of the current run of the program. It is important to ensure that none of these files are present at the start of a fresh run; however, do not delete any of these after a run has begun, and especially when trying to recover from a previous run. NOTE: Please note that the file protections set by the program may not be what you desire. These can be changed by altering the value of the variable CopyAppendPerms in the file checkpointdefs.h, where the value specified should be as given to the chmod(1) command. (The additional leading `0' is essential; it makes the value that follows to be treated as a constant in octal, as required by chmod(1).) checkpoint.<> text, binary For ILINK and LODSCORE: This file is written at two types of places, namely an iteration- and a function-checkpoint. Only three parts of this file are in text mode; they are: - The date/time stamp on the first line; - The two type information fields on the second line; and, - The string "END_OF_DATA" on the last line of the file. The date/time stamp marks when the current checkpoint was begun. (This is not necessarily the same time as that the system shows for the file.) Of the two type information fields, the first tells us whether this is an iteration- or function-checkpoint (distinguished by the values "0" and "1", respectively); the second stores additional information about location that varies depending upon the type of checkpoint. Following these are the bytes that constitute the actual values being stored; these are in an architecture-dependent binary format. Finally, the end-marker provides us with a means of partially checking for the integrity of the data written in the checkpoint. For LINKMAP and MLINK only some counters indicating how many function evaluations are complete need to be stored in this file. checkpoint.<>.bak text, binary When a checkpoint is to be written and a checkpoint file is already found, the existing file is moved to this backup name and the new one is written in its place. The main purpose of doing this is to increase security against crashes: should the crash have damaged the checkpoint file but have left the backup untarnished, the backup may be copied into the checkpoint and computation can be resumed, even if from a slightly earlier stage in the run. The format of this file is the same as that of the checkpoint file, which is copied into the backup without modification. outf.LODSCORE.stream.dat text outf.ILINK.stream.dat text main.LINKMAP.stream.dat text main.MLINK.stream.dat text outf.ILINK.final.dat text main.LINKMAP.final.dat text main.MLINK.final.dat text outf.LODSCORE.recfile.dat text These files are created by the subroutine outf() or main(). Their purpose is to maintain copies of the files stream.dat and final.dat (for ILINK, LINKMAP, or MLINK) or recfile.dat (for LODSCORE), respectively, so that if recovery needs to take place after these files have been written to, the two files can be restored to the state they had. script.<>.final.out text script.<>.stream.out text Since the standard scripts being used delete the files final.out and stream.out at the start of execution, the program makes a copy of the current state of these files into the names listed. Thus, when recovering in the midst of a script, the files can be restored to their state when the programs were last entered. main.LODSCORE.stream.dat text main.LODSCORE.recfile.dat text Since a crash can occur in the middle of an iteration in LODSCORE and the output of the previous call to outf() would then be lost, these files are created at the start of the loop in main() so as to preserve the old output (which hasn't yet been appended to final.out and stream.out). When the checkpoint cannot be recovered accurately, the program checks to see whether the backup exists. Depending upon its presence (but not upon its integrity), one of two message is displayed. In either case, the user is advised of the circumstance, of a possible cause for it, and of what corrective action might be taken to repair the situation as best as possible. |*| Modifying Scripts and Checkpointing ----------------------------------- Our experience shows that some users request multiple runs of a FASTLINK program with one shell script. As a consequence a crash may occur after some (but not all) of the requested runs are complete. When this happens, it would be nice not to lose the results of the completed runs. A user who restarts the crashed script would not like the runs that were completed previously to be redone. We have made a primitive facility to do this type of checkpointing, which we call "script-level checkpointing". However, for users who want to be safe we recommend doing only one run per shell script. This section applies if you use script-level checkpointing, and wish to modify the scripts in the region surrounding the calls to ILINK, LODSCORE, MLINK, or LINKMAP, or wish to affect operations done to the files final.out and stream.out. We presume that the user is using shell scripts made with auxiliary program lcp that comes with LINKAGE. It would be impossible to make a script-level checkpointing scheme that could handle arbitrary scripts. We also assume that the user puts output in final.out and stream.out, using the default options of lcp. The "standard" scripts for which we support script-level checkpointing affect final.out (and stream.out) on each run as follows for each ILINK run (and similarly for LODSCORE, MLINK, and LINKMAP): lsp [...] if [ $? = '0' -o $? = '1' ] then cat lsp.log >> final.out cat lsp.stm >> stream.out unknown if [ $? = '0' ] then ilink if [ $? = '0' ] then cat final.dat >> final.out cat stream.dat >> stream.out fi fi fi To ensure that final.out is in the same state after our program has finished execution as it would be after this piece of script code has run, we have the following code toward the end of ILINK: copyFile ( "final.out" , ScriptILINKFinalOut ) ; appendFile ( "final.dat" , ScriptILINKFinalOut ) ; if ( dostream ) { copyFile ( "stream.out" , ScriptILINKStreamOut ) ; appendFile ( "stream.dat" , ScriptILINKStreamOut ) ; } which simulates the operation of the script. This is necessary since, at the stage where this code is run, the script-level checkpoint routine assumes that the run of ILINK has completed successfully, so that this entire invocation of ILINK will be ignored, and the next invocation will copy final.out and stream.out from the files named by the #define'd names above. Hence, modifying the scripts in the light of script-level checkpointing requires for one to carefully study the operation of the main programs, the scripts and of the program ckpt. In general, it is necessary to mimic in the program that which would be done in the script, so that during recovery it will be indiscernible whether or not the script was stopped or not in the first place. However, these mime operations must be carefully placed, for if they are placed before the script-level checkpoint file is written to, then the operations would be performed one extra time, which is undesirable. |*| Using the Script-Level Checkpointing Facility --------------------------------------------- The program ckpt implements the script-level checkpointing facility (with cooperation from ilink and lodscore, as appropriate). It's primary task is to accept the name of a script to be run, and a specification of whether the script is for ILINK or for LODSCORE. A typical invocation might look like this (we use `%' to denote the user's prompt): % ckpt lodscore aLodscoreScript or % ckpt ilink anIlinkScript itsArgument or % ckpt linkmap aLinkmapScript itsArgument or % ckpt mlink anMlinkScript itsArgument where the first parameter to ckpt tells it what kind of script it is going to run. The second parameter is the name of the actual script. If there are additional parameters for the script itself, these can be specified after the name of the script, as in the second example (where "itsArgument" is provided). The second run would, hence, be equivalent to running % anIlinkScript itsArgument but with the script-level checkpointing facility in action. The code for ckpt is in the file ckpt.c. to make an executable version run the command: make ckpt |*| Important Caution on Breaking a ckpt Run --------------------------- The ckpt program executes a system(3) call to invoke a shell in which to run the named script (with it's arguments, if any). Hence, if the user decides to abort execution and breaks execution by hitting, say, Control-C (^C), this will certainly stop the invoked shell, but will not necessarily abort the calling process (ie, ckpt). This has the following deleterious effect: when control returns to ckpt, if it is indistinguishable that the invoked shell was halted prematurely, then ckpt erases its data file, so the next time it is run, it will assume that the previous run exited normally. This is clearly not the desired effect. Unfortunately, being able to detect premature halting of the invoked shell is dependent upon the value returned by the system() call. This may not work on all operating systems and architectures as desired, making this an unreliable way of stopping execution, should this be desired. It is recommended that, instead, the user do the following: 1) Suspend the executing process(es), typically by hitting a key like Control-Z (^Z). 2) Kill the suspended process, usually by typing a command such as "kill %+". Again, this is not guaranteed to succeed, but should work on most systems. Note, of course, that it requires the shell to support job control and also that the shell was compiled with this feature installed. fastlink-4.1P-fix95/paper1.ps0000644000265600020320000034766406506236517015171 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvips 5.471 Copyright 1986-92 Radical Eye Software %%Title: top.dvi %%Pages: 32 1 %%BoundingBox: 0 0 612 792 %%DocumentFonts: Times-Roman Times-Oblique Times-Bold Courier-Bold %%+ Times-Italic %%EndComments %%BeginProcSet: tex.pro /TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch load def /X{S N}B /TR /translate load N /isls false N /vsize 11 N /@rigin{ isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale Resolution VResolution vsize neg 1 add mul TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@landscape{ /isls true N /vsize 0 N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E {pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{ ]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto}N /eop{ SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 72.27 65536 mul div /vsize X 72.27 65536 mul div /hsize X}N /p /show load N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V} B /V statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval(Display)eq}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /a{ moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{ S p tail}B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w }B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro TeXDict begin /rf{655360 div mul Resolution mul 7227 div /PixPerEm X findfont dup length 1 add dict /nn X{1 index /FID ne{nn 3 1 roll put}{pop pop}ifelse} forall nn /Encoding get 1 0 1 255{2 index exch get /.notdef ne{1 add}if}for dict begin 0 1 255{255 exch sub 2 copy get 3 index 2 index get 1000 mul PixPerEm div def pop}for pop pop nn /Metrics currentdict put end{/foo setfont} 2 array copy cvx dup 0 nn dup definefont[PixPerEm 0 0 PixPerEm neg 0 0] makefont put N}N /ObliqueSlant{dup sin S cos div neg}B /SlantFont{/foo X[1 0 foo 1 0 0]TransFont}N /ExtendFont{/foo X 3 2 roll[S{foo div}forall]3 1 roll[ foo 0 0 1 0 0]TransFont}N /TransFont{S findfont S makefont dup length dict /nn X{1 index /FID ne{nn 3 1 roll put}{pop pop}ifelse}forall dup nn definefont pop }N end %%EndProcSet TeXDict begin 40258431 52099146 1000 400 400 @start /Fa 6 122 df<07FE00001FFF80003FFFE0003FFFF0003E01F8001C00F80000007C0000003C0000003C0000 07FC0000FFFC0007FFFC001FFFFC003FF83C007F003C007C003C00F0003C00F0003C00F0003C00 F0003C0078007C007E03FC003FFFFFF01FFFFFF00FFF9FF003FC07F01C1A7D9920>97 D<007E0001FFC007FFE00FFFF01F81F83E00783C003C7C003C78001EF8001EFFFFFEFFFFFEFFFF FEFFFFFEF00000F000007800007800007C001E3E001E3F003E1FE07C0FFFF807FFF001FFE0003F 00171A7C9920>101 D<007C0FC001FF3FE007FFFFF00FFFFFF00F83F0E01F01F0001E00F0003C 0078003C0078003C0078003C0078003C0078003C0078001E00F0001F01F0000F83E0001FFFE000 1FFFC0001FFF00001C7C00001C0000001C0000001FC000000FFFF0001FFFFC003FFFFF007C000F 80780003C0F00001C0E00000E0E00000E0E00000E0E00000E0700001C07C0007C03F803F801FFF FF000FFFFE0003FFF800007FC0001C287E9920>103 D110 D114 D<7FF03FF0FFF07FF8FFF07FF87FF03FF00700070003800700 03800E0003C00E0001C00E0001C01C0000E01C0000E01C0000F038000070380000703800003870 000038700000387000001CE000001CE000001CE000000EC000000FC0000007C000000780000007 8000000780000007000000070000000F0000000E0000000E00001C1E00003E3C00003E7C00003F F800003FF000001FE00000078000001D277F9920>121 D E /Fb 2 114 df<0F0E0011B18011C18011C1C02381C00381C00381C00381C00703800703800703000706000F 8C000E70000E00000E00001C00001C00001C0000FF80001214808D15>112 D<07881C58383870387070E070E070E070C0E0C0E0C0E0C1E063C03DC001C001C0038003800380 1FF00D147D8D13>I E /Fc 2 89 df80 D88 D E /Fd [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 15 18 22 22 37 34 15 15 15 22 25 11 15 11 12 22 22 22 22 22 22 22 22 22 22 12 12 25 25 25 20 41 32 30 30 32 27 25 32 32 15 17 32 27 39 32 32 25 32 30 25 27 32 32 42 32 32 27 15 12 15 21 22 15 20 22 20 22 20 15 22 22 12 12 22 12 34 22 22 22 22 15 17 12 22 22 32 22 22 20 21 9 21 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 22 22 7 22 22 22 22 8 20 22 15 15 25 25 0 22 22 22 11 0 20 15 15 20 20 22 44 44 0 20 0 15 15 15 15 15 15 15 15 0 15 15 0 15 15 15 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 0 12 0 0 0 0 27 32 39 14 0 0 0 0 0 30 0 0 0 12 0 0 12 22 32 22 0 0 0 0 ] /Times-Roman 1000 524288 rf /Fe [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 22 37 33 33 66 55 22 22 22 33 38 17 22 17 18 33 33 33 33 33 33 33 33 33 33 22 22 38 38 38 33 62 48 44 48 48 44 41 52 52 26 33 52 44 63 48 52 41 52 48 37 44 48 48 66 48 48 44 22 18 22 39 33 22 33 37 29 37 29 22 33 37 18 22 37 18 55 37 33 37 37 29 26 22 37 33 48 33 33 29 26 15 26 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 33 33 11 33 33 33 33 18 33 33 22 22 37 37 0 33 33 33 17 0 36 23 22 33 33 33 66 66 0 33 0 22 22 22 22 22 22 22 22 0 22 22 0 22 22 22 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 66 0 20 0 0 0 0 44 52 66 22 0 0 0 0 0 48 0 0 0 18 0 0 18 33 48 37 0 0 0 0 ] /Times-Bold 1000 786432 rf /Ff [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 20 26 30 30 51 47 20 20 20 30 41 15 20 15 17 30 30 30 30 30 30 30 30 30 30 20 20 41 41 41 30 56 37 37 41 44 37 37 44 44 20 27 41 34 51 41 44 37 44 37 30 34 44 37 51 37 34 34 24 17 24 26 30 20 30 30 27 30 27 17 30 30 17 17 27 17 44 30 30 30 30 24 24 17 30 27 41 27 27 24 24 17 24 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 30 30 10 30 30 30 30 13 34 30 20 20 30 30 0 30 30 30 15 0 32 21 20 34 34 30 54 61 0 30 0 20 20 20 20 20 20 20 20 0 20 20 0 20 20 20 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 0 17 0 0 0 0 34 44 57 19 0 0 0 0 0 41 0 0 0 17 0 0 17 30 41 30 0 0 0 0 ] /Times-Italic 1000 720896 rf /Fg [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 37 37 37 37 37 37 37 37 37 37 37 37 0 0 0 37 37 37 37 0 37 37 37 37 37 37 37 0 0 37 0 37 37 37 37 37 37 37 37 0 37 37 0 37 37 37 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 0 0 0 0 37 37 0 37 0 0 0 0 0 0 0 0 0 37 0 0 37 37 0 37 0 0 0 0 ] /Courier-Bold 1000 720896 rf /Fh 6 94 df<0004000800100020004000C001800300030006000E000E001C001C001C00380038 00380078007000700070007000F000F000F000F000F000F000F000F000F000F000F000F000F000 700070007000700078003800380038001C001C001C000E000E00060003000300018000C0004000 200010000800040E3B7AAC18>40 D<800040002000100008000C00060003000300018001C001C0 00E000E000E000700070007000780038003800380038003C003C003C003C003C003C003C003C00 3C003C003C003C003C0038003800380038007800700070007000E000E000E001C001C001800300 030006000C00080010002000400080000E3B7DAC18>I<00001C000000001C000000001C000000 001C000000001C000000001C000000001C000000001C000000001C000000001C000000001C0000 00001C000000001C000000001C000000001C000000001C000000001C000000001C0000FFFFFFFF FFFFFFFFFFFFFFFFFFFFFF00001C000000001C000000001C000000001C000000001C000000001C 000000001C000000001C000000001C000000001C000000001C000000001C000000001C00000000 1C000000001C000000001C000000001C000000001C000028277DA22F>43 D61 D91 D93 D E /Fi 5 108 df<60000030E0000070700000F0780001E03C0003C01E0007800F000F0007801E0003C0 3C0001E0780000F0F0000079E000003FC000001F8000000F0000001F8000003FC0000079E00000 F0F00001E0780003C03C0007801E000F000F001E0007803C0003C0780001E0700000F0E0000070 600000301C1D779D2F>2 D<00FE0003FF800FFFE01FFFF03FFFF83FFFF87FFFFC7FFFFCFFFFFE FFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFE7FFFFC7FFFFC3FFFF83FFFF81FFFF00FFFE003FF80 00FE0017177D9A1E>15 D<000000180000001C00000038000000380000007000000070000000E0 000000E0000001C0000001C00000038000000380000007000000070000000E0000000E0000001C 0000001C00000038000000380000007000000070000000E0000000E0000001C0000001C0000003 80000007800000070000000E0000000E0000001C0000001C000000380000003800000070000000 70000000E0000000E0000001C0000001C00000038000000380000007000000070000000E000000 0E0000001C0000001C00000038000000380000007000000070000000E0000000600000001E3778 AA00>54 D106 DI E /Fj 8 115 df<00007F0080000380C100000E0023000038001700007000 0F0001C0000E000380000600078000060007000006000E000004001E000004001C000004003C00 0000003800000000780000000078000000007800000000F000000000F0003FFE00F00000F000F0 0000F000F00001E000700001E000700001E000700001E000380003C000380003C0001C0003C000 0C0005C000070019800001C0608000007F80000021207E9E25>71 D<00007800018E00039E0003 1E00070C000700000700000700000E00000E00000E00000E0001FFF0001C00001C00001C00001C 00001C00001C0000380000380000380000380000380000700000700000700000700000700000E0 0000E00000E00000E00000C00001C00031C000798000F100006200003C000017287E9E17>102 D<00C001E001E000C000000000000000000000000000001E002300238043804380870087000700 0E000E001C001C001C00384038403840388019000E000B1E7E9D10>105 D<0FE00001C00001C00001C00001C0000380000380000380000380000700000700000700000701 E00E02100E0C380E10780E20781C40701C80001F00001FC00038F0003838003838003838007038 20703820703820701840E01CC0600700151F7E9E18>107 D<1C07E03E00271830C30043203903 8043C03A038043C03C038087803C03808700380380070038038007003803800E007007000E0070 07000E007007000E00700E001C00E00E101C00E01C101C00E01C101C00E01C203801C00C401800 C0078024137E922A>109 D<0381F004E218086C0C08700E08700E10E00F10E00F00E00F00E00F 01C01E01C01E01C01E01C01C03803C03803803807003C0E00721C0071F000700000700000E0000 0E00000E00000E00001C00001C0000FFC000181C819218>112 D<00F8200384400702C00E03C0 1C01C03C0380380380780380780380F00700F00700F00700F00700F00E00F00E00701E00302E00 385C000F9C00001C00001C0000380000380000380000380000700000700007FF00131C7E9215> I<1C0F002730804341C04383C04383C08703808700000700000700000E00000E00000E00000E00 001C00001C00001C00001C000038000018000012137E9215>I E /Fk 23 121 df<0003E0000630001C1800381C00701C00700E00E00E01E00E03C00E03C00E07801E0780 1F0F801F0F001E1F001E1F001E1E003E3E003E3E003E3E003E7FFFFC7FFFFC7C007C7C007C7800 F8F800F8F800F8F800F0F801F0F001E0F001E0F003C0F003C0F00780F00700700F00700E00701C 0030180038300018E0000F8000182A7DA91C>18 D<78FCFCFCFC7806067B8511>58 D<78FCFCFEFE7A02020202040404081010204007127B8511>I<00000600000E00000E00001C00 001C00001C0000380000380000380000700000700000E00000E00000E00001C00001C00001C000 0380000380000380000700000700000700000E00000E00000E00001C00001C00001C0000380000 380000700000700000700000E00000E00000E00001C00001C00001C00003800003800003800007 00000700000700000E00000E00000E00001C00001C000038000038000038000070000070000070 0000E00000E00000C00000173C7DAC1E>61 DI<000000070000000007000000000F000000001F000000001F00000000 3F000000003F000000007F00000000FF00000000DF000000019F800000019F800000030F800000 070F800000060F8000000C0F8000000C0F800000180F800000180F800000300F800000600F8000 00600F800000C00FC00000C007C000018007C000038007C000030007C00007FFFFC00007FFFFC0 000C0007C0001C0007C000180007C000300007C000300007E000600003E000600003E000C00003 E001C00003E003C00003E00FE00007E0FFFC00FFFFFFF800FFFF282A7EA92D>65 D<003FFFFFE000003FFFFFFC000001F8007E000001F0001F000001F0001F800001F0000F800001 F0000FC00003E0000FC00003E0000FC00003E0000FC00003E0000FC00007C0000F800007C0001F 800007C0001F000007C0003E00000F80007E00000F8000F800000F8001F000000F8007C000001F FFFF0000001F0007E000001F0001F000001F0000F800003E00007C00003E00007C00003E00007E 00003E00007E00007C00007E00007C00007E00007C00007E00007C00007E0000F80000FC0000F8 0000FC0000F80001F80000F80001F00001F00003F00001F0000FE00001F0001F800003F0007F00 00FFFFFFFC0000FFFFFFE000002A297DA82E>I<000001FE002000001FFFC06000007F00E0E000 01F80031E00003E0001BC0000F80000FC0001F00000FC0003E000007C0007C0000078000F80000 078001F00000038003E00000038007E00000030007C0000003000FC0000003001F80000003001F 80000000001F00000000003F00000000003F00000000007E00000000007E00000000007E000000 00007E00000000007E00000000007C00007FFF80FC0000FFFF80FC000001F8007C000001F0007C 000001F0007C000001F0007C000001F0007E000003E0003E000003E0003E000003E0001F000003 E0000F000007C0000F80000FC00007C0001FC00003F00039C00000FE01E18000003FFF80800000 07FC0000002B2B7EA930>71 D<003FFFE1FFFF003FFFE1FFFF0001F8000FC00001F0000F800001 F0000F800001F0000F800001F0000F800003E0001F000003E0001F000003E0001F000003E0001F 000007C0003E000007C0003E000007C0003E000007C0003E00000F80007C00000F80007C00000F 80007C00000F80007C00001FFFFFF800001FFFFFF800001F0000F800001F0000F800003E0001F0 00003E0001F000003E0001F000003E0001F000007C0003E000007C0003E000007C0003E000007C 0003E00000F80007C00000F80007C00000F80007C00000F80007C00001F0000F800001F0000F80 0001F0000F800003F0001F8000FFFFC7FFFE00FFFF87FFFC0030297DA832>I<003FFFFFC00000 3FFFFFF8000001F800FE000001F0003F000001F0001F000001F0000F800001F0000F800003E000 0FC00003E0000FC00003E0000FC00003E0000FC00007C0001F800007C0001F800007C0001F0000 07C0003F00000F80003E00000F80007C00000F8000F800000F8003E000001F000FC000001FFFFE 0000001F00000000001F00000000003E00000000003E00000000003E00000000003E0000000000 7C00000000007C00000000007C00000000007C0000000000F80000000000F80000000000F80000 000000F80000000001F00000000001F00000000001F00000000003F000000000FFFFC0000000FF FF800000002A297DA827>80 D<001FFFE01FFF80001FFFE01FFF800000FF0007F80000007E0003 C00000007E0003800000003E0007000000003F000E000000001F001C000000001F803800000000 1F8030000000000F8060000000000FC0C00000000007C1800000000007E3000000000007E60000 00000003EE000000000003FC000000000001F8000000000001F8000000000001F8000000000000 F8000000000001FC0000000000037C0000000000067E00000000000C7E00000000001C3E000000 0000383F0000000000701F0000000000E01F8000000000C01F8000000001800F8000000003000F C0000000060007C00000000C0007C0000000180007E0000000380003E0000000700003F0000000 F00001F0000007F80007F800007FFE003FFFC000FFFE003FFFC00031297FA832>88 D<7FFF8003FFF0FFFF8003FFE003F800007E0003F00000780001F00000700001F80000E00001F8 0000C00000FC0001800000FC00030000007C00070000007E000E0000007E001C0000003E001800 00003F00300000003F00600000001F00E00000001F81C00000000F83800000000FC3000000000F C60000000007CC0000000007FC0000000007F80000000003F00000000003E00000000003E00000 000003C00000000007C00000000007C00000000007C0000000000780000000000F80000000000F 80000000000F80000000000F00000000001F00000000001F00000000001F00000000003F000000 000FFFF80000000FFFF80000002C297FA823>I<001F000000708C0001C05E0003807E0007007C 000F003C001E003C001E003C003E0078003C0078007C0078007C007800F800F000F800F000F800 F000F800F000F001E000F001E0C0F001E0C0F001E0C0F003C1807007C180700DC1803819C3001C 30E20007C03C001A1A7D9920>97 D<003C000007FC000007FC0000007C00000078000000780000 007800000078000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E000 0003C1F80003C60E0003D80F0003F0070007E0070007C0078007C00780078007800F000F000F00 0F000F000F000F000F001E001E001E001E001E001E001E003C003C003C003C003C183C0078183C 007810780070307800F0307800706078007040F000318060001F001D2A7DA923>104 D<000E001F001F001E000C000000000000000000000000000000000000000003C00C7018701078 30786078607860F0C0F000F001E001E003C003C003C00780078007830F030F020E061E060E0C0E 08063003E010297FA815>I<0000070000000F8000000F8000000F0000000E0000000000000000 0000000000000000000000000000000000000000000000000000000000000000000003E000000C 30000018380000303C0000603C0000603C0000C03C0000C03C0001807800000078000000780000 0078000000F0000000F0000000F0000000F0000001E0000001E0000001E0000001E0000003C000 0003C0000003C0000003C00000078000000780000007800000078000000F0000000F0000000F00 00001E0000701E0000F83C0000F8380000F0700000E1E000003F000000193581A819>I<003C00 0007FC000007FC0000007C00000078000000780000007800000078000000F0000000F0000000F0 000000F0000001E0000001E0000001E0000001E0000003C00F8003C030C003C041C003C083C007 8107C0078207C007840380078800000F1000000F2000000FC000000FF000001E3E00001E0F0000 1E0780001E03C0003C03C0003C03C0C03C03C0C03C03C0C0780381807803818078038300780182 00F001C400600078001A2A7DA920>I<07803F801FC00018C0C1C060E00010E100E080700030F2 007100380020F4007200380060F8007C003C0060F8007C003C0060F00078003C00C1F000F80078 0001E000F000780001E000F000780001E000F000780003C001E000F00003C001E000F00003C001 E000F00003C001E001E000078003C001E000078003C001E0C0078003C003C0C0078003C003C080 0F0007800381800F0007800781800F0007800383000F0007800382001E000F00018C000C000600 00F800321A7F9935>109 D<07803F800018C0C1C00010E100E00030F200700020F400700060F8 00780060F800780060F0007800C1F000F00001E000F00001E000F00001E000F00003C001E00003 C001E00003C001E00003C003C000078003C000078003C180078007818007800781000F00070300 0F000F03000F000706000F000704001E000318000C0001F000211A7F9924>I<007807C0018C18 60010E2030030F4038020F803C060F803C060F003C060F003E0C1E003E001E003E001E003E001E 003E003C007C003C007C003C007C003C0078007800F8007800F0007800F0007801E000F801C000 F803C000F8078000FC0E0001E61C0001E1F00001E0000001E0000003C0000003C0000003C00000 03C000000780000007800000078000000F8000007FF80000FFF800001F2683991F>112 D<001F0200708601C04E03807E07007C0F003C1E003C1E003C3E00783C00787C00787C0078F800 F0F800F0F800F0F800F0F001E0F001E0F001E0F001E0F003C07007C0700FC0381BC01C378007C7 80000780000780000F00000F00000F00000F00001E00001E00001E00003E0007FFE007FFE01726 7D991B>I<0780F818C38410E60E30FC1E20F83E60F83E60F01C60F000C1E00001E00001E00001 E00003C00003C00003C00003C0000780000780000780000780000F00000F00000F00000F00001E 00000C0000171A7F991B>I<00FC07C003861860060330700C03E0F01803E1F01803C1F03003C0 E03003C00060078000000780000007800000078000000F0000000F0000000F0000000F0000001E 0000001E0060001E0060301E00C0783E00C0F83E0180F86E0100F04E020061870C001F01F0001C 1A7E9923>120 D E /Fl [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 26 43 39 39 77 65 26 26 26 39 44 19 26 19 22 39 39 39 39 39 39 39 39 39 39 26 26 44 44 44 39 72 56 52 56 56 52 47 60 60 30 39 60 52 73 56 60 47 60 56 43 52 56 56 77 56 56 52 26 22 26 45 39 26 39 43 34 43 34 26 39 43 22 26 43 22 65 43 39 43 43 34 30 26 43 39 56 39 39 34 31 17 31 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 39 39 13 39 39 39 39 22 39 39 26 26 43 43 0 39 39 39 19 0 42 27 26 39 39 39 77 77 0 39 0 26 26 26 26 26 26 26 26 0 26 26 0 26 26 26 77 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 0 23 0 0 0 0 52 60 77 26 0 0 0 0 0 56 0 0 0 22 0 0 22 39 56 43 0 0 0 0 ] /Times-Bold 1000 917504 rf /Fm [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 17 20 25 25 41 39 17 17 17 25 28 12 17 12 14 25 25 25 25 25 25 25 25 25 25 14 14 28 28 28 22 46 36 33 33 36 30 28 36 36 17 19 36 30 44 36 36 28 36 33 28 30 36 36 47 36 36 30 17 14 17 23 25 17 22 25 22 25 22 17 25 25 14 14 25 14 39 25 25 25 25 17 19 14 25 25 36 25 25 22 24 10 24 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 25 25 8 25 25 25 25 9 22 25 17 17 28 28 0 25 25 25 12 0 23 17 17 22 22 25 50 50 0 22 0 17 17 17 17 17 17 17 17 0 17 17 0 17 17 17 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 0 14 0 0 0 0 30 36 44 15 0 0 0 0 0 33 0 0 0 14 0 0 14 25 36 25 0 0 0 0 ] /Times-Roman 1000 589824 rf /Fn 3 123 df<030003000300C30CF33C3B700FC00F C03B70F33CC30C0300030003000E0E7D8E15>3 D<020007000700070007000700020002007270 FFF872700200070007000700070007000700070007000700070007000700070002000200020002 000D1D7D9614>121 D<020007000700070002004210FFF8FFF802000200070007000700020000 00020007000700070002000200FFF8FFF84210020007000700070002000D1D7D9614>I E /Fo [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 20 25 30 30 51 47 20 20 20 30 34 15 20 15 17 30 30 30 30 30 30 30 30 30 30 17 17 34 34 34 27 56 44 41 41 44 37 34 44 44 20 24 44 37 54 44 44 34 44 41 34 37 44 44 57 44 44 37 20 17 20 29 30 20 27 30 27 30 27 20 30 30 17 17 30 17 47 30 30 30 30 20 24 17 30 30 44 30 30 27 29 12 29 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 30 30 10 30 30 30 30 11 27 30 20 20 34 34 0 30 30 30 15 0 28 21 20 27 27 30 61 61 0 27 0 20 20 20 20 20 20 20 20 0 20 20 0 20 20 20 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 0 17 0 0 0 0 37 44 54 19 0 0 0 0 0 41 0 0 0 17 0 0 17 30 44 30 0 0 0 0 ] /Times-Roman 1000 720896 rf /Fp [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 20 34 30 30 61 51 20 20 20 30 35 15 20 15 17 30 30 30 30 30 30 30 30 30 30 20 20 35 35 35 30 57 44 41 44 44 41 37 47 47 24 30 47 41 57 44 47 37 47 44 34 41 44 44 61 44 44 41 20 17 20 35 30 20 30 34 27 34 27 20 30 34 17 20 34 17 51 34 30 34 34 27 24 20 34 30 44 30 30 27 24 13 24 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 30 30 10 30 30 30 30 17 30 30 20 20 34 34 0 30 30 30 15 0 33 21 20 30 30 30 61 61 0 30 0 20 20 20 20 20 20 20 20 0 20 20 0 20 20 20 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 0 18 0 0 0 0 41 47 61 20 0 0 0 0 0 44 0 0 0 17 0 0 17 30 44 34 0 0 0 0 ] /Times-Bold 1000 720896 rf /Fq [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 22 27 33 33 55 52 22 22 22 33 37 17 22 17 18 33 33 33 33 33 33 33 33 33 33 18 18 37 37 37 29 61 48 44 44 48 41 37 48 48 22 26 48 41 59 48 48 37 48 44 37 41 48 48 63 48 48 41 22 18 22 31 33 22 29 33 29 33 29 22 33 33 18 18 33 18 52 33 33 33 33 22 26 18 33 33 48 33 33 29 32 13 32 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 33 33 11 33 33 33 33 12 29 33 22 22 37 37 0 33 33 33 17 0 30 23 22 29 29 33 66 66 0 29 0 22 22 22 22 22 22 22 22 0 22 22 0 22 22 22 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 0 18 0 0 0 0 41 48 59 21 0 0 0 0 0 44 0 0 0 18 0 0 18 33 48 33 0 0 0 0 ] /Times-Roman 1000 786432 rf /Fr 5 123 df0 D<008000008000008000008000C08180E0838078 8F001C9C0007F00001C00007F0001C9C00788F00E08380C0818000800000800000800000800011 137D9418>3 D<038007C007C007C00F800F800F800F001F001E001E001C003C003C0038003800 7000700070006000E000C000C0000A177F980D>48 D<0100038003800380038003800380010001 0001000100793CFFFE793C01000100038003800380038003800380038003800380038003800380 03800380038003800380038003800100010001000100010001000F297D9E16>121 D<010003800380038003800380010001004104FFFEFFFE01000100010003800380038003800380 0100000001000380038003800380038001000100791CFFFE793C01000100038003800380038003 8001000F287D9E16>I E /Fs [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 22 27 33 33 55 52 22 22 22 33 37 17 22 17 18 33 33 33 33 33 33 33 33 33 33 18 18 37 37 37 29 61 48 44 44 48 41 37 48 48 22 26 48 41 59 48 48 37 48 44 37 41 48 48 63 48 48 41 22 18 22 31 33 22 29 33 29 33 29 22 33 33 18 18 33 18 52 33 33 33 33 22 26 18 33 33 48 33 33 29 32 13 32 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 33 33 11 33 33 33 33 12 29 33 22 22 37 37 0 33 33 33 17 0 30 23 22 29 29 33 66 66 0 29 0 22 22 22 22 22 22 22 22 0 22 22 0 22 22 22 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 0 18 0 0 0 0 41 48 59 21 0 0 0 0 0 44 0 0 0 18 0 0 18 33 48 33 0 0 0 0 ] /Times-Oblique /Times-Roman .167 SlantFont 1000 786432 rf /Ft [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 31 38 47 47 78 73 31 31 31 47 53 24 31 24 26 47 47 47 47 47 47 47 47 47 47 26 26 53 53 53 42 87 68 63 63 68 57 52 68 68 31 37 68 57 84 68 68 52 68 63 52 57 68 68 89 68 68 57 31 26 31 44 47 31 42 47 42 47 42 31 47 47 26 26 47 26 73 47 47 47 47 31 37 26 47 47 68 47 47 42 45 19 45 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 47 47 16 47 47 47 47 17 42 47 31 31 52 52 0 47 47 47 24 0 43 33 31 42 42 47 94 94 0 42 0 31 31 31 31 31 31 31 31 0 31 31 0 31 31 31 94 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 0 26 0 0 0 0 57 68 84 29 0 0 0 0 0 63 0 0 0 26 0 0 26 47 68 47 0 0 0 0 ] /Times-Roman 1000 1114112 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 400 TeXDict begin %%PaperSize: Letter %%EndSetup %%Page: 1 1 bop 375 504 a Ft(Faster)23 b(Sequential)h(Genetic)f(Linkage)h(Computations) 423 750 y Fs(Robert)18 b(W)-6 b(.)16 b(Cottingham)j(Jr)l(.)1125 726 y Fr(\003)402 827 y Fq(Department)g(of)e(Cell)h(Biology)402 905 y(Baylor)g(College)i(of)d(Medicine)661 982 y(Houston)1509 751 y Fs(Ramana)h(M.)f(Idury)1996 726 y Fr(y)1307 828 y Fq(Department)i(of)e (Computer)h(Science)1543 906 y(Rice)g(University)1640 983 y(Houston)998 1172 y Fs(Alejandro)h(A.)e(Sch)1465 1173 y(\310)1461 1172 y(af)o(fer)1602 1148 y Fr(z)855 1249 y Fq(Department)i(of)e(Computer)h(Science)1091 1327 y(Rice)g(University)1187 1404 y(Houston)1033 1939 y(September)h(30,)e (1992)957 2061 y(Revised)h(February)h(9,)d(1993)200 3047 y Fp(Addr)o(ess)11 b(for)j(corr)o(espondence:)21 b Fo(Robert)13 b(W)-6 b(.)13 b(Cottingham,)i(Department)f(of)f(Cell)f(Biology)l(,)i(Baylor) 200 3169 y(College)i(of)g(Medicine,)g(One)g(Baylor)g(Plaza,)f(Houston,)i(TX)e (77030.)p 200 3223 880 3 v 266 3259 a Fn(\003)290 3280 y Fm(bwc@bcm.tmc.edu) 268 3321 y Fn(y)290 3342 y Fm(idury@cs.rice.edu)268 3384 y Fn(z)290 3405 y Fm(schaf)o(fer@cs.rice.edu)p eop %%Page: 2 2 bop 200 260 a Fl(Abstract)200 504 y Fo(Linkage)27 b(analysis)e(using)h (maximum)h(likelihood)g(estimation)e(is)g(a)g(powerful)i(tool)f(for)g (locating)200 625 y(genes.)d(As)14 b(available)h(data)g(sets)e(have)j(grown,) g(the)f(computation)i(required)f(for)f(analysis)g(has)f(grown)200 747 y(exponentially)l(,)23 b(and)d(become)h(a)e(signi\256cant)h(impediment.) 36 b(Others)20 b(have)g(previously)h(shown)g(that)200 869 y(parallel)i (computation)i(is)d(applicable)h(to)g(linkage)h(analysis)f(and)g(can)g(yield) g(order)h(of)f(magnitude)200 991 y(improvements)d(in)e(speed.)30 b(In)19 b(this)f(paper)n(,)h(we)f(demonstrate)h(that)f(algorithmic)h (modi\256cations)g(can)200 1112 y(also)c(yield)h(order)h(of)f(magnitude)h (improvements,)h(and)e(sometimes)g(much)g(more.)294 1234 y(Using)g(the)f (software)h(package)h(LINKAGE,)e(we)h(describe)g(a)f(variety)h(of)g (algorithmic)h(improve-)200 1356 y(ments)k(we)f(have)i(implemented,)i (demonstrating)f(how)e(these)g(techniques)h(are)f(applied,)i(and)e(their)200 1478 y(power)m(.)29 b(Experiments)19 b(show)e(that)h(these)f(improvements)j (speed)d(up)h(the)g(programs)h(by)f(an)g(order)g(of)200 1600 y(magnitude)23 b(on)g(problems)g(of)f(moderate)h(and)f(lar)o(ge)g(size.)40 b(All)21 b(improvements)j(were)e(made)g(only)200 1721 y(in)d(the)g (combinatorial)i(part)f(of)f(the)g(code,)i(without)f(resorting)g(to)f (parallel)h(computers.)34 b(These)19 b(im-)200 1843 y(provements)13 b(synthesize)e(biological)h(principles)f(with)g(computer)h(science)f (techniques)h(to)f(ef)o(fectively)200 1965 y(restructure)17 b(the)e(time-consuming)j(computations)f(in)f(genetic)g(linkage)h(analysis.) 1285 3571 y(2)p eop %%Page: 3 3 bop 200 260 a Fl(Intr)o(oduction)200 445 y Fo(W)n(ith)20 b(the)g(advent)h(of) f(index)h(maps)f(of)h(the)f(human)h(genome)g(\(NCHGR)e(article)h(1991\),)j (maximum)200 566 y(likelihood)17 b(linkage)g(analysis)f(is)f(becoming)j(a)d (powerful)i(tool)g(for)f(rapidly)h(locating)g(disease)e(genes.)200 688 y(However)n(,)22 b(as)d(ef)o(fort)i(has)f(been)h(expended)h(to)f(collect) f(more)h(data,)g(the)g(computational)h(ef)o(fort)f(has)200 810 y(increased)k(exponentially)h(and)e(thereby)i(signi\256cantly)e (increased)h(the)f(time)g(to)g(getting)h(a)e(result.)200 932 y(Factors)14 b(which)h(contribute)h(to)f(increased)g(computational)h(ef)o (fort)f(include)h(increases)e(in)g(the)h(number)200 1053 y(of)i(genetic)g (markers)g(being)h(considered)f(simultaneously)l(,)i(the)d(number)j(of)d (alleles)g(per)h(marker)n(,)h(the)200 1175 y(number)f(of)f(unknown)i (individuals)e(in)g(a)f(pedigree,)i(pedigree)g(size,)e(and)h(the)f(degree)i (of)e(inbreeding.)200 1297 y(Of)f(course,)h(each)e(of)i(these)e(factors)h (provides)h(additional)g(information)h(and)e(is)f(therefore)i(of)g(interest.) 200 1419 y(As)22 b(the)h(genetic)h(map)f(is)f(further)j(improved)g(and)e (automated)h(genotyping)i(becomes)e(commonly)200 1541 y(available,)14 b(computational)i(ef)o(fort)e(will)f(further)i(increase)e(to)g(the)h(point)g (of)g(becoming)h(the)e(bottleneck)200 1662 y(in)j(obtaining)h(results)e (given)i(the)e(current)i(tools.)294 1784 y(LINKAGE)24 b(\(Lathrop)i(et)d(al.) 47 b(1984;)30 b(Lathrop)25 b(and)f(Lalouel)h(1984;)k(Lathrop)c(et)f(al.)47 b(1986\))200 1906 y(is)23 b(one)i(of)g(the)f(most)g(popular)i(collections)e (of)h(genetic)f(linkage)h(analysis)f(programs,)29 b(especially)200 2028 y(in)17 b(the)g(study)g(of)g(human)h(disease)e(genes,)i(and)f(is)f (representative)i(of)f(current)h(maximum)g(likelihood)200 2149 y(linkage)12 b(analysis)g(packages)g(based)f(on)h(the)g(Elston-Stewart)g (algorithm)h(\(Elston)f(and)g(Stewart)f(1971\).)200 2271 y(Therefore,)i(we)d (chose)g(to)g(demonstrate)g(our)g(concepts)g(by)g(mod)q(ifyin)q(g)g(the)g(pr) q(og)q(rams)g(in)g(this)g(packag)q(e.)294 2393 y(Given)k(the)f(goal)h(of)g (signi\256cantly)g(increasing)g(the)g(speed)f(of)h(the)g(programs,)h(one)f (method)h(would)200 2515 y(be)h(to)g(implement)h(the)f(programs)i(on)f(a)e (parallel)i(computer)g(system.)24 b(However)n(,)17 b(before)g(doing)g(so)f (it)200 2636 y(is)i(good)i(practice)f(to)f(\256rst)g(improve)i(the)f (sequential)g(speed)f(of)h(any)g(algorithm)h(since)f(failure)g(to)f(do)200 2758 y(so)d(will)g(multiply)i(the)f(inef)o(\256ciencies)f(in)h(the)f (parallel)h(environment.)294 2880 y(W)-5 b(e)12 b(describe)g(and)h(validate)f (a)f(collection)i(of)f(improvements)i(to)e(the)f(sequential)i(implementation) 200 3002 y(of)22 b(the)h(central,)h(time-consuming,)i(probability)e (calculations)e(in)g(LINKAGE)h(that)f(speed)g(up)h(the)200 3123 y(programs)13 b(substantially)l(.)21 b(W)-5 b(e)12 b(begin)g(in)f(the)h (next)f(section)h(by)f(describing)i(the)e(aspects)g(of)g(LINKAGE)200 3245 y(that)j(are)g(relevant)h(to)f(our)h(improvements.)24 b(The)14 b(Methods)h(section)f(gives)h(a)e(brief)i(description)g(of)g(the)200 3367 y(software)j(and)g(hardware)h(tools)e(used.)29 b(Then)18 b(we)f(describe)h(the)g(biological)h(and)f(computer)h(science)1285 3571 y(3)p eop %%Page: 4 4 bop 200 260 a Fo(basis)12 b(of)i(our)f(algorithmic)i(improvements.)23 b(Finally)13 b(the)g(experimental)i(results)d(are)h(given,)i(showing)200 382 y(how)j(much)g(the)f(algorithmic)i(modi\256cations)f(improved)i(the)d (speed)g(of)h(the)f(LINKAGE)h(programs,)200 504 y(on)e(some)g(sample)g(data)f (sets.)22 b(And)16 b(we)f(conclude)i(with)e(a)h(short)g(discussion)g (section.)200 699 y Fl(Summary)j(of)f(the)i(LINKAGE)f(package)200 883 y Fo(The)j(computationally)i(intensive)d(programs)i(in)f(LINKAGE)42 b(\(LODSCORE,)21 b(ILINK,)h(MLINK,)200 1005 y(LINKMAP\))10 b(are)g(structured)g(to)g(solve)g(a)g(variety)g(of)g(g)q(enetic)g(link)q(age) g(p)q(rob)q(lems.)24 b(The)10 b(algorithms)g(we)200 1127 y(have)16 b(improved)h(are)e(used)g(in)g(all)f(four)i(programs.)24 b(T)l(o)15 b(simplify)h(our)g(description,)g(we)f(focus)h(almost)200 1249 y(exclusively)26 b(on)g(LODSCORE,)e(which)i(does)f(two-point)i(analyses,)h (but)d(later)g(we)g(also)g(present)200 1370 y(timing)14 b(data)f(on)g(our)h (new)f(version)h(of)g(ILINK.)f(The)h(improvements)h(are)e(more)h(important)g (in)f(ILINK,)200 1492 y(which)22 b(does)g(multipoint)h(analysis,)g(because)f (the)g(running)i(time)d(of)h(multipoint)h(analyses)f(can)g(be)200 1614 y(prohibitive.)i(However)n(,)17 b(they)f(are)f(easier)g(to)h(explain)g (in)g(the)g(two-point)h(context)f(of)g(LODSCORE.)294 1736 y(The)22 b(primary)i(input)f(to)f(LODSCORE)f(is)g(a)h(list)f(of)h(family)h(pedigrees)g (and)f(phenotype)i(data.)200 1857 y(T)l(o)17 b(whatever)h(extent)f(it)f(is)g (known,)j(the)e(phenotype)i(of)f(each)f(individual)h(is)e(listed)h(for)g(a)g (number)h(of)200 1979 y(loci.)38 b(In)22 b(any)f(given)h(run,)h(a)e(set)f(of) h(loci)g(is)f(speci\256ed)h(and)g(LODSCORE)f(computes)i(an)f(estimate)200 2101 y(of)d(the)g(recombination)i(fraction)f Fk(\022)g Fo(for)g(each)f(pair)g (of)g(loci)g(in)f(the)h(set.)29 b(For)18 b(simplicity)l(,)g(we)g(assume)200 2223 y(in)i(this)h(description)g(that)g(only)g(one)g(pair)g(of)f(loci)h(is)f (speci\256ed.)37 b(LODSCORE)19 b(can)i(analyze)g(both)200 2344 y(autosomal)f(and)f(sex-linked)h(markers)g(and)g(there)f(are)g(various)h (allowable)f(input)h(formats,)g(such)f(as)200 2466 y(binary)14 b(factors)g(and)f(numbered)i(alleles.)21 b(Again)14 b(to)f(simplify)h(our)g (discussion,)g(suppose)g(that)f(the)g(two)200 2588 y(loci)j(are)f(autosomal)i (and)f(that)f(the)h(genetic)g(data)g(is)e(encoded)k(by)e(numbered)h(alleles.) 294 2710 y(If)22 b(we)g(had)g(perfect)h(information,)i(then)e(at)e(each)h (locus)g Fk(i)p Fo(,)i(where)e(there)g(are)g Fk(n)2054 2719 y Fj(i)2095 2710 y Fo(alleles,)g(each)200 2832 y(individual)14 b(would)g(be)e(encoded)i(with)f(an)f(allele)h(number)h(for)f(each)g(of)g(the) f(two)h(chromosome)i(strands)200 2953 y(with)g(phase)h(known.)24 b(For)15 b(example,)i(if)e(the)h(\256rst)e(locus)i(has)f(5)h(alleles)e(and)i (the)f(second)i(locus)e(has)g(8)h(,)200 3075 y(we)f(could)i(have)f(an)g (encoding)h(that)f(looks)g(like:)1285 3571 y(4)p eop %%Page: 5 5 bop 1415 260 a Fo(2)51 b(4)p 1431 402 4 80 v 1510 402 V 1415 504 a(3)g(7)200 747 y(where)18 b(2)g(and)g(4)g(are)f(allele)g(numbers)i(for)g (locus)f(1,)g(while)g(3)f(and)h(7)g(are)g(for)g(locus)g(2.)29 b(The)18 b(values)g(2)200 869 y(and)e(3)g(come)g(from)g(the)g(same)f (chromosome)j(strand,)e(as)f(do)h(4)g(and)g(7.)294 991 y(In)e(practice,)h (perfect)f(information)i(is)c(not)i(known.)24 b(T)l(ypically)l(,)15 b(we)e(have)h(genotype)i(information)200 1112 y(but)i(do)f(not)h(know)g(the)f (phase)h(\(i.e.,)g(we)f(don')o(t)h(know)g(which)g(alleles)e(are)i(on)f(which) h(chromosome\).)200 1234 y(W)-5 b(e)19 b(may)g(have)g(only)g(phenotype)i (information)g(\(i.e.,)f(various)f(genotypes)h(are)f(possible,)g(but)g(some) 200 1356 y(are)13 b(excluded\),)i(or)f(we)e(may)i(have)f(no)h(information)h (at)d(all.)22 b(Any)13 b(uncertainty)i(in)e(genotypes)h(or)f(phase)200 1478 y(is)j(accounted)i(for)f(by)g(assigning)g(nonzero)h(\(conditional\))h (probabilities)f(to)e(several)h(genotypes)h(that)200 1600 y(any)e(individual) h(might)g(have.)294 1721 y(The)e(program)i(combines)f(the)f(two)g(values)g (on)g(a)f(chromosome)k(into)d(a)f(joint)h(haplotype)i(number)200 1843 y(and)i(then)g(combines)h(the)f(two)f(joint)h(haplotypes)h(into)f(a)g (joint)g(genotype.)33 b(In)19 b(the)g(example)g(above,)200 1965 y(there)26 b(would)g(be)f(5)20 b Fi(\002)f Fo(8)31 b Fh(=)f Fo(40)c(possible)f(joint)h(haplotypes)h(and)f(40)20 b Fi(\002)f Fo(41)p Fk(=)p Fo(2)32 b Fh(=)e Fo(820)c(possible)200 2087 y(joint)17 b(genotypes)h(\(joint)f(genotypes)h(that)f(dif)o(fer)g(only)g(by)g (\257ipping)h(the)f(role)g(of)f(two)h(strands)g(are)f(not)200 2208 y(distinguishable\).)294 2330 y(The)24 b(basic)g(structure)g(of)g(the)g (computation)h(is)e(outlined)i(in)f(the)g(section)g(on)g(Numerical)g(and)200 2452 y(Computerized)e(Methods)f(in)g(Ott')m(s)e(book)j(\(Ott)e(1991\).)39 b(The)21 b(programs)h(have)f(an)f(outer)h(loop)h(that)200 2574 y(iteratively)12 b(updates)f(the)g(estimate)g(of)g Fk(\022)i Fo(using)e(Lalouel')m(s)h(GEMINI)f(optimization)i(package)f(\(Lalouel)200 2695 y(1979\))k(to)f(search)f(for)h(an)g(optimal)g(value)1100 2681 y(\303)1090 2695 y Fk(\022)h Fo(that)e(maximizes)h(the)g(likelihood.)23 b(Inside)15 b(the)g(main)g(loop,)200 2817 y(LODSCORE)i(traverses)h(the)g (pedigrees)h(updating)h(the)e(probabilities)h(of)g(each)f(joint)g(genotype)i (for)200 2939 y(each)g(individual.)37 b(Associated)20 b(with)f(each)h (individual)i(is)d(an)h(array)g Fg(genarray)c Fo(indexed)21 b(by)g(the)200 3061 y(joint)j(genotype)j(numbers.)49 b(The)25 b(entry)g Fg(genarray[)o Fk(j)s Fg(])20 b Fo(initially)25 b(stores)e(the)i (probability)h(that)200 3183 y(the)c(individual)i(has)f(the)f(phenotype)j (associated)d(with)g(genotype)i Fk(j)i Fo(given)d(the)g(joint)f(genotype)j Fk(j)200 3304 y Fo(\(normally)19 b(this)e(will)g(be)g(1)h(or)f(0,)i(except)e (in)h(cases)e(of)i(variable)g(penetrance\).)30 b(After)17 b(traversing)i(the) 1285 3571 y(5)p eop %%Page: 6 6 bop 200 260 a Fo(part)22 b(of)g(the)g(pedigree)g(including)i(the)d (individual,)k Fg(genarray[)p Fk(j)s Fg(])17 b Fo(stores)22 b(the)f(probability)j(that)200 382 y(the)18 b(individual)i(has)d(genotype)j Fk(j)h Fo(and)e(its)e(associated)h(phenotype,)j(conditioned)f(on)e(the)g (genotypes)200 504 y(of)k(the)f(individual')m(s)i(relatives)e(and)h(the)f (recombination)j(fraction.)41 b(For)22 b(example,)i(to)d(update)i(the)200 625 y(probability)d Fg(genarray[)p Fk(j)s Fg(])13 b Fo(for)19 b(a)f(child,)h(we)f(multiply)h(the)f(old)h Fg(genarray[)p Fk(j)s Fg(])13 b Fo(value)19 b(by)g(the)200 747 y(probability)c(that)f(the)f(child)h (inherits)f(genotype)j Fk(j)g Fo(conditioned)g(on)e(the)f(probabilities)h(of) g(parents)g(and)200 869 y(siblings.)23 b(Using)15 b(the)h(notation)h(of)f (\(Lathrop)h(and)f(Lalouel)g(1988\),)i(this)d(can)h(be)f(expressed)i(as:)778 1041 y Fk(P)8 b Fh(\()p Fk(X)q(;)i(G)17 b Fi(j)f Fk(Y)s(;)10 b(\022)r Fh(\))33 b(=)f Fk(P)8 b Fh(\()p Fk(X)22 b Fi(j)16 b Fk(G)p Fh(\))30 b Fk(P)8 b Fh(\()p Fk(G)16 b Fi(j)h Fk(Y)s(;)10 b(\022)r Fh(\))200 1213 y Fo(where)18 b Fk(X)23 b Fo(is)17 b(the)h(joint)g(phenotype)i(of)e(the)g(child,)h Fk(G)f Fo(is)f(the)h(joint)g (genotype)i(and)e Fk(Y)31 b Fo(represents)19 b(the)200 1335 y(collective)13 b(joint)h(phenotypes)h(of)e(the)g(relatives)g(of)g Fk(X)18 b Fo(that)13 b(have)g(already)h(been)g(traversed.)22 b(A)13 b(similar)200 1457 y(expression)19 b(can)f(be)g(written)g(for)h (updating)g(a)f(parent)h(in)e(terms)h(of)h(its)e(children.)30 b(The)19 b(probabilities)200 1578 y(are)14 b(generally)h(very)g(small,)f(so)f (they)i(are)f(scaled)f(up)i(by)f(a)g(multiplicative)g(factor)h(to)f(avoid)h (numerical)200 1700 y(\257oating)h(point)h(errors.)294 1822 y(Elston)h(and)g(Stewart)f(\(Elston)h(and)g(Stewart)f(1971\))i(devised)f(a)f (clever)h(bottom-up)i(strategy)e(for)200 1944 y(traversing)h(certain)g (simple)f(pedigrees)h(to)f(rapidly)h(compute)h(the)e(conditional)i (probabilities.)31 b(This)200 2065 y(bottom-up)14 b(strategy)f(was)e(later)h (generalized)i(by)e(Ott,)h(Lange,)g(and)g(Elston)f(among)i(others)e(\(Ott)g (1974;)200 2187 y(Lange)j(and)f(Elston)g(1975\))i(to)d(more)i(general)g (pedigrees.)22 b(As)14 b(explained)h(on)f(pages)g(170\261171)j(of)d(\(Ott)200 2309 y(1991\),)19 b(the)d(LINKAGE)h(programs)h(implement)f(a)f(variation)i (of)e(the)h(strategy)g(described)g(in)g(\(Lange)200 2431 y(and)h(Elston)g (1975\))i(where)e(the)f(traversal)h(algorithm)h(can)f(either)g(traverse)g(in) g(an)g(upward)h(direction)200 2552 y(or)g(in)g(a)g(downward)h(direction.)34 b(The)19 b(freedom)h(to)f(go)g(in)g(either)h(direction)f(allows)g(the)g (program)i(to)200 2674 y Ff(peel)16 b Fo(a)f(contiguous)i(subtree)f(of)g (pedigree)h(consecutively)l(.)294 2796 y(Depending)j(on)f(the)f(direction)h (of)f(the)g(traversal)h(taken)f(to)g(reach)h(a)f(particular)h(individual,)h (one)200 2918 y(of)d(two)g(fundamental)i(routines)f(is)e(used)h(to)g(update)h (the)e(values)i(in)e Fg(genarray)p Fo(.)23 b(In)17 b(one)g(direction,)200 3039 y Fg(segdown)f Fo(updates)k(the)f(probabilities)h(for)g(a)f(child)h (based)g(on)g(probabilities)g(for)g(the)f(parents)h(and)200 3161 y(other)g(children.)36 b(In)20 b(the)f(other)h(direction,)i Fg(segup)17 b Fo(updates)j(the)g(probabilities)g(for)g(parents)g(based)200 3283 y(on)j(the)f(probabilities)i(for)f(their)f(children.)44 b(Both)23 b(routines)g(use)f(an)g(important)i(auxiliary)g(routine)200 3405 y Fg(segfun)13 b Fo(in)k(the)f(inner)i(loop)f(of)g(the)f(computation)j (when)e(there)g(are)f(multiple)h(children.)27 b(There)17 b(are)1285 3571 y(6)p eop %%Page: 7 7 bop 200 260 a Fo(several)20 b(variants)h(of)g Fg(segdown)p Fo(,)d Fg(segup)p Fo(,)h(and)i Fg(segfun)c Fo(that)j(are)g(used)h(in)f(dif)o (ferent)i(situations)200 382 y(depending)j(on)e(autosomal/sex-linked,)k (input)d(format,)h(or)e(special)g(places)f(in)h(the)f(pedigree,)k(but)200 504 y(most)16 b(of)g(our)g(improvements)i(are)d(applicable)i(equally)f(well)f (to)h(those)f(routines.)294 625 y(In)26 b(the)f(original)h Fg(segup)c Fo(and)k Fg(segdown)21 b Fo(most)k(of)h(the)f(computation)i(is)d (done)j(inside)e(two)200 747 y(outer)18 b(nested)f(loops)h(that)f(each)g (iterate)g(over)h(all)e(joint)i(genotypes.)28 b(Each)18 b(loop)g(corresponds) h(to)e(the)200 869 y(genotype)g(assigned)f(to)g(one)g(parent)g(in)g(the)g (family)l(.)294 991 y(T)l(o)25 b(achieve)h(our)h(improvements,)j(we)25 b(completely)h(rewrote)g Fg(segup)d Fo(and)j Fg(segdown)p Fo(,)e(and)200 1112 y(added)16 b(some)g(new)f(auxiliary)i(routines,)f(which)g(replace)g Fg(segfun)p Fo(.)j(As)c(useful)h(and)g(intricate)f(as)g(our)200 1234 y(changes)k(are,)g(it)f(is)g(also)g(important)i(to)e(summarize)i(what)e (has)g(not)h(changed.)33 b(The)18 b(GEMINI)h(code)200 1356 y(and)c(its)f(use)g(has)g(not)h(changed)h(\320)e(the)h(iterations)f(and)h (the)g(sequence)g(of)g(estimates)f(to)2082 1341 y(\303)2072 1356 y Fk(\022)i Fo(is)e(the)h(same.)200 1478 y(The)20 b(higher)h(level)f (routines)h(that)e(decide)i(in)f(what)f(order)i(to)f(visit)f(the)h(pedigrees) h(and)f(individuals)200 1600 y(have)c(not)g(changed.)24 b(The)16 b(new)g(programs)h(are)f(input)g(and)g(output)h(identical)f(to)f(the)h (original.)200 1795 y Fl(Methods)200 1979 y Fo(Our)g(improvements)i(were)d (carried)h(out)h(starting)e(with)h(the)g(P)-6 b(ASCAL)15 b(source)h(code)g (for)g(LINKAGE)200 2101 y(version)21 b(5.1a.)37 b(W)-5 b(e)20 b(began)h(by)g(converting)h(the)e(P)-6 b(ASCAL)20 b(programs)i(to)e(C)f (using)i(the)f(translation)200 2223 y(program)j Fg(p2c)p Fo(,)d(available)i (as)e(a)g(UNIX)h(utility)g(\(UNIX)g(is)f(a)g(trademark)j(of)e(A)-7 b(T&T\).)22 b(It)e(has)h(been)200 2344 y(reported)g(several)e(times)g(on)h (various)g(computer)h(bulletin)f(boards)g(that)f(the)h(LINKAGE)f(programs)200 2466 y(could)e(be)f(translated)h(from)g(P)-6 b(ASCAL)16 b(to)g(C)f(in)h(this) g(way)l(,)h(and)g(that)f(the)g(resulting)h(C)e(versions)i(work)200 2588 y(properly)l(.)294 2710 y(There)g(are)e(two)h(reasons)g(for)h (converting)h(from)f(P)-6 b(ASCAL)15 b(to)h(C.)f(The)i(\256rst)e(reason)h(is) f(that)h(there)200 2832 y(are)c(a)f(wide)h(variety)g(of)g(good)i(software)e (development)h(tools)f(available)g(with)g(UNIX)f(for)i(C)e(programs,)200 2953 y(while)21 b(P)-6 b(ASCAL)20 b(is)g(minimally)i(supported.)40 b(The)21 b(second)g(reason)h(is)e(that)g(the)h(best)g(C)f(compilers)200 3075 y(available)13 b(to)g(us)f(produce)i(much)g(better)f(assembly)g(code)g (than)g(the)g(best)f(P)-6 b(ASCAL)12 b(compilers.)22 b(Some)200 3197 y(small)16 b(experiments)i(we)e(did)g(suggest)h(that)f(unmodi\256ed)j(C) c(code)i(obtained)h(directly)f(from)g(p2c)g(runs)200 3319 y(about)e(25\045)g (faster)f(than)h(the)g(original)g(P)-6 b(ASCAL,)14 b(despite)h(the)f(fact)h (that)f Fg(p2c)f Fo(is)g(quite)i(conservative)1285 3571 y(7)p eop %%Page: 8 8 bop 200 260 a Fo(in)18 b(its)g(translation.)32 b(Our)18 b(speedup)i(results)e (compare)i(only)f(the)f(unmodi\256ed)j(C)c(programs)j(with)f(the)200 382 y(modi\256ed)d(C)d(programs,)k(and)e Ff(do)g(not)g Fo(incorporate)h(the)e (additional)i(speedup)g(obtained)f(by)g(switching)200 504 y(from)i(P)-6 b(ASCAL)15 b(to)g(C.)294 625 y(In)j(addition)h(to)e(standard)i(editors)f(and) g(debuggers,)i(we)d(used)h(two)f(UNIX)h(tools)f(to)h(understand)200 747 y(the)h(behavior)h(of)g(the)f(LINKAGE)g(programs.)34 b(The)19 b(\256rst)f(tool)h(is)f(a)h(function-level)i(pro\256ler)f(called)200 869 y Fg(gprof)p Fo(.)31 b(When)21 b(a)e(C)f(program)j(is)e(compiled)i(with)e (the)g(appropriate)j Fg(gprof)16 b Fo(\257ags,)k(the)g(program)200 991 y(records)f(how)g(many)h(calls)e(are)g(made)h(to)g(each)f(subroutine)j (and)e(very)g(roughly)i(how)e(much)g(time)f(is)200 1112 y(spent)12 b(in)f(each)h(subroutine.)23 b(The)12 b(second)g(useful)g(UNIX)g(tool)g(is)e (called)i Fg(tcov)p Fo(.)19 b(It)11 b(records)i(how)f(often)200 1234 y(each)j(basic)f(block)i(of)f(code)g(is)f(executed)i(in)e(a)h (particular)g(execution.)24 b(The)15 b(UNIX)f(implementations)200 1356 y(we)h(are)h(familiar)g(with)f(have)h(several)g(tools)g(similar)f(to)h Fg(gprof)c Fo(and)17 b Fg(tcov)p Fo(.)294 1478 y(The)26 b(timing)g (experiments)h(were)f(run)g(on)h(various)f(Sun)g(SP)-6 b(ARCstation)25 b(2)h(computers)h(with)200 1600 y(32Mbytes)16 b(of)e(RAM.)g(These)h(machines) g(run)g(the)g(operating)h(system)e(SunOS,)h(version)g(4.1.2,)h(which)200 1721 y(is)j(an)h(implementation)i(of)f(UNIX.)f(For)g(each)g(test,)h(we)f(ran) g(both)h(the)f(old)h(and)f(new)g(programs)i(on)200 1843 y(the)17 b(same)g(machine)h(to)g(avoid)g(any)f(inter)o(-machine)i(variation.)29 b(T)l(o)17 b(compile)h(both)g(the)f(old)h(and)g(new)200 1965 y(versions)e(of)h(the)f(LINKAGE)g(programs)h(we)f(used)g(the)g Fg(gcc)e Fo(\(short)j(for)f(gnu)h(cc\))f(compiler)n(,)h(version)200 2087 y(2.2.2)g(with)e(the)h(optimization)h(\257ag)f(-O)f(\(Stallman)h (1992\).)200 2282 y Fl(Algorithmic)i(Impr)o(ovements)200 2466 y Fo(This)23 b(section)g(reviews)g(the)g(ideas)g(behind)h(our)g(improvements) h(to)e(LINKAGE)h(and)f(gives)g(some)200 2588 y(examples)12 b(of)f(how)h(those)f(ideas)g(are)g(applied.)22 b(W)-5 b(e)12 b(\256rst)e(summarize)i(two)g(basic)f(biological)h(principles)200 2710 y(and)24 b(four)g(basic)f(computer)i(science)e(techniques)i(that)e(are)g (crucial)h(to)f(our)i(improvements.)47 b(The)200 2832 y(general)22 b(paradigm)h(for)e(our)h(more)g(interesting)g(improvements)h(is)e(that)g(one) g(biological)i(principle)200 2953 y(exposes)f(a)g(part)h(of)f(the)g (computation)i(that)e(can)g(be)g(sped)h(up,)h(and)f(then)f(one)h(or)f(more)h (computer)200 3075 y(science)g(techniques)i(are)e(used)h(to)f(speed)h(up)g (that)g(part.)46 b(Our)24 b(key)g(point)g(is)f(that)h(a)f Ff(synthesis)g(of) 200 3197 y(ideas)f(fr)n(om)e(the)i(two)f(disciplines)g(is)g(essential)g Fo(to)h(the)f(improvements)i(we)e(have)h(obtained)h(in)f(the)200 3319 y(LINKAGE)16 b(programs.)1285 3571 y(8)p eop %%Page: 9 9 bop 200 260 a Fe(Biological)20 b(Principles)200 423 y Fp(Sparsity)p Fo(.)j(An)16 b(array)g(or)h(matrix)f(is)f Ff(sparse)g Fo(if)h(a)f (signi\256cant)h(fraction)h(of)f(the)g(entries)g(are)f(0.)23 b(In)17 b(most)200 545 y(cases)d(the)i(array)f Fg(genarray)d Fo(\(containing)17 b(the)e(probabilities)h(for)g(each)f(joint)h(genotype\))h (is)e(sparse.)200 666 y(It)e(is)g(always)g(sparse)g(when)g(the)h(complete)g (genotype)h(is)d(known,)j(and)f(will)f(usually)h(be)f(sparse)g(even)h(if)200 788 y(some)g(partial)g(phenotype)i(information)g(is)d(known.)23 b(The)14 b(reason)h(is)e(simple)h(from)g(a)g(biological)h(point)200 910 y(of)h(view:)22 b(knowledge)c(of)e(the)f(phenotype)j(severely)e (restricts)f(the)h(possible)g(genotypes,)h(although)g(it)200 1032 y(may)f(not)g(determine)h(the)e(genotype)j(completely)l(.)294 1153 y Fp(Isozygotes)p Fo(.)58 b(The)27 b(biological)i(theory)f(of)f(linkage) h(and)g(recombination,)33 b(as)26 b(described)i(by)200 1275 y(Ott)15 b(\(Ott)h(1991\),)i(for)e(example,)i(suggests)e(that)f(inheritance)i (events)g(which)f(dif)o(fer)h(only)f(by)h(whether)200 1397 y(or)i(not)g(recombination)h(has)f(occurred,)h(can)f(be)g(treated)f (similarly)l(.)31 b(W)-5 b(e)19 b(make)g(more)g(precise)g(what)200 1519 y(we)c(mean)h(by)g(\252similar)r(\272)g(with)g(a)f(generic)h(example)h (of)f(two-locus)g(inheritance.)294 1640 y(W)-5 b(e)15 b(call)f(two)h(joint)g (genotypes)i Ff(isozygotes)d Fo(if)h(they)g(can)g(pass)f(on)i(to)e(a)h(child) g(precisely)g(the)g(same)200 1762 y(set)c(of)i(haplotypes.)23 b(W)-5 b(e)12 b(use)g(the)g(notation)i Fk(H)1174 1771 y Fd(1)1199 1762 y Fi(k)p Fk(H)1279 1771 y Fd(2)1317 1762 y Fo(to)e(mean)g(the)h Ff(or)n(der)n(ed)f Fo(joint)g(genotype)i(where)f Fk(H)2375 1771 y Fd(1)200 1884 y Fo(is)j(on)h(the)f(left)g(strand)h(and)g Fk(H)840 1893 y Fd(2)881 1884 y Fo(is)f(on)h(the)f(right)h(strand.)26 b(For)16 b(example,)i(if)e Fk(A)1861 1893 y Fd(1)1905 1884 y Fi(6)p Fh(=)i Fk(A)2015 1893 y Fd(2)2056 1884 y Fo(and)f Fk(B)2206 1893 y Fd(1)2249 1884 y Fi(6)p Fh(=)h Fk(B)2360 1893 y Fd(2)2385 1884 y Fo(,)200 2006 y(then)e(the)g(ordered,)h(phase)f(known)h (joint)f(genotypes)775 2249 y Fk(A)820 2258 y Fd(1)p 861 2361 4 160 v 880 2361 V 899 2249 a Fk(A)944 2258 y Fd(2)1160 2249 y Fk(A)1205 2258 y Fd(2)p 1246 2361 V 1265 2361 V 1284 2249 a Fk(A)1329 2258 y Fd(1)1545 2249 y Fk(A)1590 2258 y Fd(1)p 1630 2361 V 1650 2361 V 1669 2249 a Fk(A)1714 2258 y Fd(2)1930 2249 y Fk(A)1975 2258 y Fd(2)p 2015 2361 V 2034 2361 V 2054 2249 a Fk(A)2099 2258 y Fd(1)775 2328 y Fk(B)821 2337 y Fd(1)900 2328 y Fk(B)946 2337 y Fd(2)1161 2328 y Fk(B)1207 2337 y Fd(2)1286 2328 y Fk(B)1332 2337 y Fd(1)1547 2328 y Fk(B)1593 2337 y Fd(2)1671 2328 y Fk(B)1717 2337 y Fd(1)1933 2328 y Fk(B)1979 2337 y Fd(1)2057 2328 y Fk(B)2103 2337 y Fd(2)200 2572 y Fo(are)g(isozygotes)g(because)g(they) g(can)g(all)f(pass)g(on)h(the)f(haplotypes)793 2707 y Fk(A)838 2716 y Fd(1)1108 2707 y Fk(A)1153 2716 y Fd(1)1422 2707 y Fk(A)1467 2716 y Fd(2)1736 2707 y Fk(A)1781 2716 y Fd(2)793 2782 y Fk(B)839 2791 y Fd(1)1107 2782 y Fk(B)1153 2791 y Fd(2)1422 2782 y Fk(B)1468 2791 y Fd(1)1736 2782 y Fk(B)1782 2791 y Fd(2)294 2918 y Fo(There)23 b(is)e(an)i(obvious)h(symmetry)f(between)g(the)f(\256rst)g(and)h(second)g (genotypes)g(and)g(between)200 3039 y(the)18 b(third)g(and)h(fourth)g (obtained)h(by)e(just)f(swapping)i(the)f(two)g(strands.)30 b(This)18 b(symmetry)h(is)e(already)200 3161 y(exploited)h(in)e(the)h (original)g(LINKAGE)g(code)g(and)g(is)f(the)h(reason)g(for)g(the)g(2)f(in)h (the)f(denominator)j(of)200 3283 y(the)h(number)h(of)e(joint)h(genotypes.)36 b(Thus)20 b(from)g(the)g(point)g(of)g(view)f(of)h(LINKAGE)g(there)g(are)f (just)200 3405 y(two)d(isozygotes)g(in)f(this)h(example,)g(the)g(\256rst)f (and)h(third)g(genotypes.)1285 3571 y(9)p eop %%Page: 10 10 bop 294 260 a Fo(Suppose)17 b(a)e(child)h(of)g(the)f(above)i(parent)f (inherits)g(the)g(joint)g(haplotype)1265 395 y Fk(A)1310 404 y Fd(1)1265 470 y Fk(B)1311 479 y Fd(1)200 604 y Fo(Then)g(with)g(the)f (\256rst)g(genotype)i(no)f(recombination)i(has)d(occurred,)i(while)f(with)f (the)h(third)g(genotype)200 726 y(a)f(recombination)k(has)c(occurred.)25 b(Otherwise,)16 b(there)g(is)f(no)h(dif)o(ference.)25 b(Similar)15 b(facts)h(hold)g(for)h(the)200 848 y(other)f(three)g(joint)g(haplotypes.)294 969 y(The)f(set)g(of)g(all)f(joint)i(genotypes)g(can)f(be)h(partitioned)g (into)f(equivalence)i(classes)c(of)j(isozygotes.)200 1091 y(By)k Ff(partition)i Fo(we)e(mean)i(that)f(each)f(joint)i(genotype)g(belongs)g(to)f (exactly)g(one)g(equivalence)i(class)200 1213 y(of)g Ff(isozygotes)p Fo(;)j(this)d(is)f(the)h(mathematically)h(precise)e(notion)j(of)e (\252similarity\272)g(we)f(sought.)45 b(The)200 1335 y(principle)22 b(that)e(isozygotes)h(are)g(similar)f(is)g(useful)h(computationally)i (because)e(it)f(reveals)g(that)h(the)200 1457 y(most)12 b(we)g(need)g(to)g (know)h(about)g(a)f(genotype)i(is)d(which)h(haplotypes)i(can)e(be)g(passed)g (on)h(to)f(a)f(child)i(and,)200 1578 y(thus,)j(some)g(pieces)f(of)h(the)g (computation)h(on)f(dif)o(ferent)h(isozygote)g(genotypes)g(can)e(be)h (combined.)294 1700 y(The)d(de\256nition)g(of)g(isozygotes)g(can)g(be)g (extended)h(naturally)f(to)g(any)g(number)h(of)f(loci;)g(in)f(fact,)i(the)200 1822 y(concept)g(becomes)g(more)g(important)h(computationally)g(as)e(the)g (number)i(of)e(loci)h(increases.)21 b(The)14 b Ff(size)200 1944 y Fo(of)19 b(an)f(isozygote)i(class)d(is)h(the)g(number)i(of)f(joint)g (genotypes)h(in)e(the)h(class)e(that)i(are)f(not)h(symmetric)200 2065 y(by)i(switching)g(strands.)37 b(For)21 b(the)f(case)g(of)h(two)f(loci,) i(each)f(doubly)h(heterozygous)h(genotype)f(will)200 2187 y(be)c(in)f(a)g (class)g(of)h(size)e(2,)j(while)e(singly)h(heterozygous)i(and)e(doubly)h (homozygous)h(genotypes)f(will)200 2309 y(be)f(in)g(classes)e(of)i(size)f(1.) 29 b(This)18 b(is)f(shown)h(by)h(\256xing)f(the)g(position)h(of)f(the)f(two)h (alleles)f(for)h(the)g(\256rst)200 2431 y(locus)e(and)h(then)g(alternating)g (\(switching)g(strands)f(of\))h(the)f(two)h(alleles)e(for)i(the)f(second)h (locus.)25 b(This)200 2552 y(alternation)15 b(produces)h(2)e(dif)o(ferent)h (joint)g(genotypes)g(if)f(and)h(only)g(if)f(they)g(are)g(doubly)i (heterozygous)200 2674 y(at)f(both)i(loci.)22 b(So)16 b(the)f(size)g(of)h (the)g(equivalence)h(class)d(in)i(a)f(particular)i(instance)f(can)f(be)h (determined)200 2796 y(by)h(conducting)h(this)e(analysis.)23 b(In)17 b(a)e(3-locus)i(case,)f(for)h(example,)g(triply)g(heterozygous)h (genotypes)200 2918 y(form)i(isozygote)g(classes)e(of)h(size)f(4.)33 b(This)19 b(is)f(because)h(we)g(again)h(\256x)e(the)h(left-right)i(choice)e (at)g(the)200 3039 y(\256rst)j(locus)i(and)f(then)h(\257ip)f(the)g(alleles)f (at)h(the)g(other)h(two)f(loci)g(one)g(at)g(a)g(time.)45 b(In)23 b(general,)j(if)d(a)200 3161 y(genotype)17 b(is)d(heterozygous)j(at)e Fk(k)j(>)f Fo(0)e(loci,)g(it)g(belongs)h(to)f(an)g(isozygote)h(class)e(of)h (size)g(2)2144 3139 y Fj(k)q Fr(\000)p Fd(1)2231 3161 y Fo(.)22 b(What)200 3283 y(distinguishes)17 b(the)f(dif)o(ferent)h(elements)f(of)g(an) g(isozygote)h(class)e(is)h(recombination)i(if)e(it)f(exists.)23 b(The)200 3405 y(size)14 b(of)h(the)g(class)f(in)h(relation)g(to)g(the)g (number)h(of)f(possible)g(joint)g(genotypes)i(is)d(an)h(indication)g(of)h (the)1270 3571 y(10)p eop %%Page: 11 11 bop 200 260 a Fo(potential)16 b(performance)i(improvement.)294 382 y(The)i(notion)i(of)e(isozygotes)h(can)f(be)g(further)i(extended)f(to)f (two)g(parents)h(in)f(a)g(straightforward)200 504 y(way)l(.)38 b(The)21 b(ordered)h(pairs)e Fh(\()p Fk(G)881 513 y Fd(1)906 504 y Fk(;)10 b(G)981 513 y Fd(2)1005 504 y Fh(\))20 b Fo(and)h Fh(\()p Fk(G)1229 513 y Fd(3)1253 504 y Fk(;)10 b(G)1328 513 y Fd(4)1353 504 y Fh(\))19 b Fo(are)i(isozygotes)g(if)g Fk(G)1874 513 y Fd(1)1898 504 y Fk(;)10 b(G)1973 513 y Fd(3)2018 504 y Fo(are)21 b(in)f(the)h(same)200 625 y(isozygote)j(class)d(for)i(one)h (parent)f(and)g Fk(G)1132 634 y Fd(2)1157 625 y Fk(;)10 b(G)1232 634 y Fd(4)1279 625 y Fo(are)22 b(in)h(the)f(same)h(isozygote)g(class)f(for)h (the)g(other)200 747 y(parent.)294 869 y(The)c(symmetry)g(that)f(isozygotes)h (share)f(is)f(quite)i(dif)o(ferent)g(from)g(the)f(symmetry)i(of)e(recombi-) 200 991 y(nation)i(classes)e(described)i(in)g(\(Lathrop)h(and)e(Lalouel)h (1988\))h(that)f(was)e(previously)j(implemented)200 1112 y(in)15 b(LINKAGE,)h(which)g(we)f(still)f(use.)22 b(In)16 b(recombination)i(classes,) c(the)h(elements)h(in)f(the)h(same)f(class)200 1234 y(share)e(the)h(same)f Ff(r)n(ecombination)h(pattern)g Fo(but)g(have)g(dif)o(ferent)g(alleles)f(and) g(haplotypes)i(\(left)e(or)h(right)200 1356 y(haplotype)j(of)f(each)g (parent\).)24 b(In)16 b(isozygote)h(classes,)e(the)g(elements)h(have)g(dif)o (ferent)h(recombination)200 1478 y(patterns)j(and)h(dif)o(ferent)g (haplotypes,)h(but)e(use)g(the)g(same)f(alleles)g(and)i(can)f(pass)f(on)h(a)g (\256xed)g(set)f(of)200 1600 y(haplotype)g(combinations)f(to)f(a)f(child.)27 b(Another)18 b(way)f(of)g(viewing)h(this)e(distinction)i(is)e(that)h(recom-) 200 1721 y(bination)j(classes)e(exploit)h(a)g(symmetry)h(of)f(child)h (genotypes,)h(while)e(isozygote)h(classes)d(exploit)j(a)200 1843 y(symmetry)d(of)f(the)f(parental)i(genotypes.)200 2005 y Fe(Computer)h(Science)h(T)-6 b(echniques)200 2168 y Fp(Common)16 b(Subexpr)o(ession)f(Elimination)p Fo(.)24 b(Our)17 b(\256rst)e(computer)j (science)e(technique)i(is)d(the)i(elimi-)200 2289 y(nation)c(of)f(common)h (subexpressions.)23 b(A)11 b(traditional)i(example)f(is)f(the)h(evaluation)h (of)f(the)g(expression)953 2447 y Fk(a)985 2456 y Fd(1)1010 2447 y Fk(a)1042 2456 y Fd(3)1080 2447 y Fh(+)i Fk(a)1173 2456 y Fd(2)1198 2447 y Fk(a)1230 2456 y Fd(3)1268 2447 y Fh(+)g Fk(a)1361 2456 y Fd(1)1386 2447 y Fk(a)1418 2456 y Fd(4)1456 2447 y Fh(+)g Fk(a)1549 2456 y Fd(2)1574 2447 y Fk(a)1606 2456 y Fd(4)1630 2447 y Fk(:)200 2604 y Fo(W)-5 b(e)16 b(can)g(replace)g(this)f (by)h(the)f(equivalent)i(expression)1028 2761 y Fh(\()p Fk(a)1084 2770 y Fd(1)1122 2761 y Fh(+)c Fk(a)1214 2770 y Fd(2)1239 2761 y Fh(\))g Fi(\002)h Fh(\()p Fk(a)1393 2770 y Fd(3)1431 2761 y Fh(+)g Fk(a)1524 2770 y Fd(4)1549 2761 y Fh(\))200 2918 y Fo(which)i(replaces)g(an)f(expression)i(that)f(has)f(3)h(additions)g(and)g(4) g(multiplications)g(with)g(an)g(expression)200 3039 y(that)k(has)f(2)h (additions)h(and)g(1)e(multiplication.)37 b(The)20 b(key)h(idea)f(is)f(to)h (\256rst)f(determine)i(the)f Ff(common)200 3161 y(subexpr)n(essions)c Fh(\()p Fk(a)638 3170 y Fd(1)676 3161 y Fh(+)d Fk(a)768 3170 y Fd(2)793 3161 y Fh(\))i Fo(and)h Fh(\()p Fk(a)991 3170 y Fd(3)1029 3161 y Fh(+)e Fk(a)1122 3170 y Fd(4)1147 3161 y Fh(\))p Fo(.)294 3283 y(In)25 b(fact,)j(we)c(use)h(a)f(generalized)j(version)e(of)h (precisely)f(this)f(substitution)i(to)f(speed)g(up)h(the)200 3405 y(computation)18 b(of)e(how)g(haplotypes)h(are)f(transmitted.)23 b(Using)16 b(the)g(notation)h(of)f Fg(segdown)p Fo(,)c(suppose)1270 3571 y(11)p eop %%Page: 12 12 bop 200 260 a Fo(the)17 b(parents)h(are)g Fk(p;)10 b(q)18 b Fo(and)g(their)g(only)g(child)g(is)e Fk(r)r Fo(.)28 b(Suppose)18 b(that)f(their)h(genotypes)h(are)e Fk(G)2169 269 y Fj(p)2195 260 y Fk(;)10 b(G)2270 269 y Fj(q)2312 260 y Fo(and)200 382 y Fk(G)248 391 y Fj(r)273 382 y Fo(,)18 b(and)g Fk(G)459 391 y Fj(r)501 382 y Fo(consists)f(of)h(haplotypes)h Fk(H)1110 391 y Fj(r)q Fd(1)1176 382 y Fo(and)f Fk(H)1331 391 y Fj(r)q Fd(2)1379 382 y Fo(.)28 b(In)18 b(the)f(original)i(version)g(of)f Fg(segdown)c Fo(the)200 504 y(probability)j(that)f Fk(r)h Fo(gets)f(genotype) h Fk(G)1033 513 y Fj(r)1073 504 y Fo(is)e(computed)i(as)451 606 y Fc(P)509 664 y Fj(G)546 670 y Fb(p)583 606 y Fc(P)641 664 y Fj(G)678 670 y Fb(q)764 649 y Fh(\()p Fk(P)8 b Fh(\()p Fk(p)15 b Fo(passes)f(on)i Fk(H)1201 658 y Fj(r)q Fd(1)1266 649 y Fi(j)h Fk(G)1348 658 y Fj(p)1374 649 y Fh(\))c Fi(\002)g Fk(P)8 b Fh(\()p Fk(q)18 b Fo(passes)d(on)h Fk(H)1884 658 y Fj(r)q Fd(2)1948 649 y Fi(j)h Fk(G)2030 658 y Fj(q)2055 649 y Fh(\)\)+)788 724 y(\()p Fk(P)8 b Fh(\()p Fk(p)14 b Fo(passes)h(on)h Fk(H)1225 733 y Fj(r)q Fd(2)1290 724 y Fi(j)g Fk(G)1371 733 y Fj(p)1397 724 y Fh(\))d Fi(\002)h Fk(P)8 b Fh(\()p Fk(q)17 b Fo(passes)e(on)h Fk(H)1907 733 y Fj(r)q Fd(1)1972 724 y Fi(j)h Fk(G)2054 733 y Fj(q)2079 724 y Fh(\)\))200 869 y Fo(This)i(can)g(be)g(sped)h (up)f(by)h(\256rst)e(computing)k(separately)d(the)g(probability)i(that)e (each)h(parent)f(passes)200 991 y(on)d(each)g(haplotype.)546 1173 y Fk(P)8 b Fh(\()p Fk(p)15 b Fo(passes)f(on)j Fk(H)960 1182 y Fj(r)q Fd(1)1007 1173 y Fh(\))g(=)1112 1119 y Fc(X)1121 1242 y Fj(G)1158 1248 y Fb(p)1202 1173 y Fk(P)8 b Fh(\()p Fk(p)14 b Fo(passes)h(on)h Fk(H)1615 1182 y Fj(r)q Fd(1)1680 1173 y Fi(j)h Fk(G)1762 1182 y Fj(p)1788 1173 y Fh(\))c Fi(\002)g Fk(P)8 b Fh(\()p Fk(G)2004 1182 y Fj(p)2030 1173 y Fh(\))200 1367 y Fo(Then)16 b(we)g(compute)g(the)g(probability)i(that)d Fk(r)i Fo(gets)f(genotype)h Fk(G)1574 1376 y Fj(r)1614 1367 y Fo(as)200 1550 y Fh(\()p Fk(P)8 b Fh(\()p Fk(p)k Fo(passes)i(on)g Fk(H)632 1559 y Fj(r)q Fd(1)680 1550 y Fh(\))8 b Fi(\002)g Fk(P)g Fh(\()p Fk(q)14 b Fo(passes)h(on)f Fk(H)1174 1559 y Fj(r)q Fd(2)1221 1550 y Fh(\)\))8 b(+)g(\()p Fk(P)g Fh(\()p Fk(p)j Fo(passes)k(on)f Fk(H)1764 1559 y Fj(r)q Fd(2)1811 1550 y Fh(\))8 b Fi(\002)g Fk(P)g Fh(\()p Fk(q)15 b Fo(passes)f(on)g Fk(H)2305 1559 y Fj(r)q Fd(1)2353 1550 y Fh(\)\))200 1733 y Fo(Thus)21 b(instead)g(of)f(a)h(long)g(double)h(sum)f(over)g(pairs)g(of)g (joint)f(genotypes)i(for)g(each)e(recombination)200 1854 y(class,)11 b(we)f(do)h(four)h(short)f(single)g(sums)f(for)i(each)f(haplotype)h(and)f (then)g(just)g(two)f(more)i(multiplications)200 1976 y(and)k(one)g(addition)h (for)f(each)g(recombination)i(class.)294 2098 y(W)-5 b(e)23 b(will)f(show)h(later)g(that)g(this)f(simpli\256cation)h(can)g(be)g(further)h (improved)h(by)e(applying)i(the)200 2220 y(principle)17 b(of)f(sparsity)l(.) 294 2341 y Fp(Caching)p Fo(.)46 b(Storing)24 b(expressions)g(that)f(are)g (frequently)i(recomputed)h(is)c(our)i(next)g(computer)200 2463 y(science)19 b(technique.)34 b(This)19 b(is)f(sometimes)h(called)g Ff(caching)p Fo(,)i(similar)e(to)g(the)g(term)g Ff(cache)p Fo(,)i(which)e(is)200 2585 y(used)g(to)g(described)h(the)g(fast)e(internal)i (memory)h(of)e(a)g(computer)m(.)34 b(A)19 b(good)h(memory)h(management)200 2707 y(strategy)10 b(tries)g(to)g(put)g(frequently)g(accessed)g(variables)g (in)g(the)g(cache.)24 b(In)10 b(our)g(context,)j(caching)d(means)200 2829 y(simply)22 b(de\256ning)g(extra)f(variables)h(or)f(arrays)h(to)f(store) g(intermediate)h(results)f(that)g(are)g(frequently)200 2950 y(needed.)294 3072 y Fp(Replacing)h(T)-6 b(op-Down)22 b(Computation)g(with)f (Bottom)h(Up)p Fo(.)40 b(Our)22 b(third)g(computer)h(science)200 3194 y(technique)18 b(is)e(replacing)i(top-down)h(computation)g(with)d (bottom-up.)29 b(This)16 b(is)g(a)h(general)g(technique)200 3316 y(that)h(can)g(be)g(used)g(to)g(traverse)g(trees)g(or)g(evaluate)g (recursive)h(functions.)31 b(The)18 b(general)h(idea)f(is)f(that)1270 3571 y(12)p eop %%Page: 13 13 bop 200 260 a Fo(one)18 b(should)g(do)g(a)f(bottom-up)j(traversal)e(when)g (starting)f(at)g(the)h(bottom)g(of)g(the)f(tree)h(will)e(eliminate)200 382 y(or)g(combine)g(many)h(of)e(the)h(options)g(that)g(would)g(be)f (separately)h(explored)h(if)e(one)h(started)g(at)f(the)g(top.)294 504 y(One)h(of)h(the)f(important)i(ideas)d(in)i(the)f(Elston-Stewart)g (algorithm)i(is)d(that)h(one)h(should)g(compute)200 625 y(the)h(conditional)h (probabilities)g(traversing)g(the)f(pedigrees)h(from)f(children)h(to)f (parents.)30 b(While)18 b(this)200 747 y(is)13 b(possible)g(in)h(simple)f (pedigrees)h(\(and)h(is)d(done)j(in)e(LINKAGE\),)h(there)g(are)f(complicated) i(pedigrees)200 869 y(that)g(arise)g(in)h(practice)g(where)g(it)f(is)f (necessary)i(to)g(update)g(some)g(children')m(s)g(probabilities)g(based)g(on) 200 991 y(their)g(parents.)294 1112 y(It)k(is)g(very)i(interesting)f(that)f (Elston)h(and)g(Stewart)g(independently)i(discovered)f(the)e(bene\256t)h(of) 200 1234 y(replacing)26 b(top-down)h(with)e(bottom-up)i(in)e(the)g(context)g (of)h(linkage)f(analysis.)51 b(W)-5 b(e)25 b(extend)h(the)200 1356 y(application)h(of)f(this)f(principle)h(beyond)i(the)d(order)i(of)f (pedigree)g(traversal)g(to)f(the)h(sequence)g(of)200 1478 y(computations)17 b(for)g(a)e(particular)h(nuclear)h(family)l(.)294 1600 y Fp(Reduction)k(in)g (Operator)i(Str)o(ength)p Fo(.)40 b(Our)21 b(fourth)i(computer)g(science)e (technique)i(is)e(called)200 1721 y Ff(str)n(ength)14 b(r)n(eduction)g Fo(or)g(more)h(formally)g Ff(r)n(eduction)f(in)g(operator)g(str)n(ength)p Fo(.)22 b(The)14 b(idea)g(is)f(to)h(replace)g(a)200 1843 y(slower)d (primitive)g(operation)h(with)f(a)f(faster)g(one,)j(especially)d(inside)h (frequently)i(executed)e(loops.)22 b(An)200 1965 y(important)16 b(example,)h(relevant)e(to)g(LINKAGE,)h(is)e(that)h(\257oating)g(point)h (multiplication)g(is)e(generally)200 2087 y(considerably)j(slower)f(than)g (other)g(operations)h(such)f(as)f(addition)i(or)f(boolean)h(comparisons.)294 2208 y(Good)25 b(optimizing)g(compilers)f(apply)h(all)e(four)i(of)f(these)f (techniques)i(to)f(some)g(extent)g(in)g(an)200 2330 y(ef)o(fort)18 b(to)g(make)g(the)g(assembly)g(code)g(run)g(faster)m(.)28 b(However)n(,)19 b(in)f(our)g(experience)h(with)e(LINKAGE)200 2452 y(we)22 b(found)j(many)e (cases)f(where)h(these)g(techniques)g(apply)h(that)f(even)g(state-of-the-art) h(compilers)200 2574 y(cannot)17 b(detect.)22 b(Sometimes,)16 b(the)g(reason)g(is)f(that)g(the)h(logic)g(needed)h(to)e(apply)i(the)e (technique)i(is)e(just)200 2695 y(too)e(complicated\320for)i(example,)f(when) f(it)f(requires)h(restructuring)h(code)f(across)g(several)f(nontrivial)200 2817 y(loops)h(or)f(across)g(procedure)i(boundaries.)23 b(Other)13 b(times,)f(the)g(compiler)i(cannot)f(detect)f(that)g(applying)200 2939 y(the)17 b(technique)i(is)e(advantageous)i(because)f(this)f(requires)h (knowledge)h(of)f(the)f(underlying)j(biology)l(,)200 3061 y(in)c(particular)g (the)g(principles)g(of)g(sparsity)g(and)g(isozygotes.)1270 3571 y(13)p eop %%Page: 14 14 bop 200 260 a Fe(Synthesis)17 b(-)g(Putting)g(All)g(the)h(Ideas)f(T)-6 b(ogether)200 423 y Fo(W)h(e)21 b(now)h(brie\257y)f(describe)h(seven)f (improvements)i(we)d(have)i(made)f(in)g(the)g(probability)i(updating)200 545 y(algorithms)12 b(of)g Fg(segup)p Fo(,)d Fg(segdown)p Fo(,)g(and)i Fg(segfun)p Fo(.)18 b(The)11 b(reader)h(who)g(is)e(not)i(at)e(all)h (algorithmically)200 666 y(inclined)16 b(may)g(\256nd)g(this)g(subsection)g (overly)h(technical)f(and)g(may)g(prefer)g(to)g(skip)g(ahead)g(to)g(the)f (next)200 788 y(section.)294 910 y Fp(List)23 b(of)h(genotypes)g(that)g(have) g(nonzer)o(o)f(pr)o(obability)p Fo(.)47 b(For)24 b(each)g(individual)h(we)e (keep)h(a)200 1032 y(list)c(of)i(genotypes)g(that)f(are)g(possible;)j(a)d (genotype)i(is)d(possible)i(if)f(the)g(corresponding)j Ff(genarray)200 1153 y Fo(entry)16 b(is)f(not)g(0.0.)24 b(A)15 b(similar)g(list)f(is)h (constructed)h(in)g(MENDEL)f(using)h(more)g(complicated)h(logic)f(to)200 1275 y(determine)k(what)g(is)e(possible)i(\(Lange)g(and)g(Goradia)g(1987\).) 35 b(This)20 b(is)e(an)i(example)g(of)g(combining)200 1397 y(the)c(principle)g(of)g(sparsity)g(with)f(the)h(technique)h(of)f(caching.) 294 1519 y(Instead)g(of)g(iterating)h(over)f(all)g(genotypes,)h(we)e(can)h (iterate)g(over)g(just)g(the)f(possible)h(ones.)24 b(Here)200 1640 y(is)17 b(one)i(simple)f(example)h(of)f(how)h(this)f(speeds)g(up)g(the)g (computation.)32 b(Expressed)19 b(in)f(pseudocode,)200 1762 y(the)e(original)g(two)g(outer)g(loops)g(in)g Fg(segdown)c Fo(and)k Fg(segup)d Fo(look)j(like:)200 1984 y Fg(For)35 b(father's)e (genotype)g(=)j(1)g(to)f(number)f(of)i(joint)e(genotypes)e(do)237 2105 y(if)j(this)g(genotype)e(is)i(possible)e(for)i(the)g(father)f(then)273 2227 y(for)h(mother's)e(genotype)g(=)j(1)g(to)f(number)f(of)i(joint)e (genotypes)e(do)310 2349 y(if)j(this)g(genotype)e(is)i(possible)e(for)i(the)g (mother)f(then)687 2537 y Fk(:)10 b(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)f(:)h(:)g (:)g(:)g(:)g(:)294 2692 y Fo(Notice)23 b(that)h(this)f(code)h(does)g(test)e (for)i(sparsity\320if)g(a)f(joint)h(genotype)h(is)e(not)h(possible,)i(the)200 2814 y(computation)c(in)f(that)f(loop)h(iteration)g(stops.)36 b(However)n(,)22 b(the)e(tests)f(for)i(sparsity)g(on)f(the)h(mother)r(')m(s) 200 2936 y Fg(genarray)11 b Fo(are)j(very)i(excessive.)22 b(The)15 b(reason)g(is)f(that)h(the)f(set)g(of)h(joint)g(genotypes)i(for)e(the)g (mother)200 3057 y(that)20 b(are)g(possible)g(and)h(pass)e(the)h(second)h Fg(if)d Fo(test)i(is)f(the)h Ff(same)g(for)f(every)h(choice)g(of)g(the)g (father)r(')-8 b(s)200 3179 y(joint)15 b(genotype)p Fo(.)23 b(Therefore,)17 b(we)d(precompute)j(and)e(cache)f(the)h(set)f(of)h(possible)f (joint)h(genotypes)h(for)200 3301 y(the)g(mother)g(and)g(change)h(the)f(code) g(to)f(look)i(like:)1270 3571 y(14)p eop %%Page: 15 15 bop 200 260 a Fg(For)35 b(father's)e(genotype)g(=)j(1)g(to)f(number)f(of)i (joint)e(genotypes)e(do)237 382 y(if)j(this)g(genotype)e(is)i(possible)e(for) i(the)g(father)f(then)273 504 y(for)h(each)g(joint)f(genotype)f(that)h(is)i (possible)d(for)i(the)g(mother)565 692 y Fk(:)10 b(:)g(:)g(:)g(:)g(:)g(:)g(:) g(:)g(:)g(:)g(:)g(:)g(:)g(:)294 847 y Fp(Sparsity)16 b(pattern)h(of)f(the)g (child')n(s)f Fg(genarray)d Fp(at)17 b(the)f(beginning)g(of)g Fg(segdown)p Fo(.)21 b(W)-5 b(e)16 b(have)200 969 y(found)d(a)e(way)g(to)g (apply)i(the)e(basic)g(Elston-Stewart)h(bottom-up)h(principle)g(to)e Fg(segup)d Fo(and)k Fg(segdown)200 1090 y Fo(when)20 b(the)f(number)i(of)f (children)h(is)d(1)i(\(a)f(very)i(important)f(and)g(frequent)h(special)e (case\).)34 b(W)n(ith)20 b(the)200 1212 y(sparsity)11 b(modi\256cation)i (described)f(above,)h(all)e(the)g(sparsity)h(testing)f(was)g(being)h(done)g (on)g(the)f(parents')200 1334 y(joint)17 b(genotype.)26 b(But)16 b(as)g(outlined)h(in)g(the)f(summary)i(of)e(the)h(LINKAGE)f(package)h(above,) h(the)f(new)200 1456 y(value)d(of)h Fa(genarray)n Fh([)p Fk(j)s Fh(])f Fo(is)f(the)h(old)g(value)g(multiplied)h(by)g(some)f(factors)g (depending)i(on)e(the)g(parent')m(s)200 1577 y(probabilities)20 b(and)g(the)g(recombination)i(fraction.)35 b(This)19 b(means)h(that)f(if)h (the)f(old)h(child)g(probability)200 1699 y(was)14 b(0.0)g(\(genotype)j(not)d (possible\),)i(it)d(will)h(remain)h(0.0,)g(and)g(there)f(is)g(no)h(point)g (in)f(updating)i(it.)21 b(The)200 1821 y(other)h(key)g(observation)h(is)d (that)h(if)g(we)g(know)h(some)f(information)j(about)e(the)f(child')m(s)g (phenotype,)200 1943 y(then)15 b(\(in)h(most)f(cases\))f(the)h(number)h(of)g (possible)f(genotypes)h(for)g(the)f(child)g(that)g(are)g(consistent)g(with) 200 2064 y(the)e(known)h(phenotype)i(is)c(very)i(much)g(smaller)f(than)g(the) g(number)i(of)f(possible)f(joint)g(genotypes)i(that)200 2186 y(the)i(parents)g(can)f(give)h(to)g(a)f(child)h(based)g(on)g(their)f (genotypes.)27 b(T)l(o)17 b(put)g(this)f(in)h(the)f(other)h(direction,)200 2308 y(there)g(are)g(many)g(joint)g(genotypes)i Fk(j)s Fo(,)e(such)g(that)g (the)f(parents)h(could)h(potentially)g(have)f(a)g(child)g(with)200 2430 y(joint)e(genotype)i Fk(j)s Fo(,)e(but)g(the)g(one)g(child)g(cannot)h (have)f(joint)g(genotype)i Fk(j)h Fo(because)d(it)f(is)g(not)h(consistent)200 2552 y(with)g(the)h(child')m(s)g(known)h(phenotype.)294 2673 y Fp(Boolean)10 b(expr)o(essions)g(for)g(0)g(testing)p Fo(.)22 b(It)10 b(has)g(been)g(understood)g(since)g(the)g(time)g(of)g(Haldane)g(that) 200 2795 y(logical)19 b(analysis)g(of)g(the)f(genotypes)j(and)e(inheritance)h (patterns)f(can)g(be)g(used)g(to)f(derive)i(genotype)200 2917 y(information.)58 b(An)26 b(interesting)i(formal,)i(but)d(theoretical)h (treatment)f(of)g(this)f(idea)h(is)f(given)h(by)200 3039 y(W)n(ijsman)16 b(\(W)n(ijsman)g(1987\).)294 3160 y(W)-5 b(e)19 b(have)g(found)h(that)f(W)n (ijsman')m(s)f(suggestion)i(of)e(using)i(Boolean)f(logic)g(to)f(reason)h (about)h(the)200 3282 y(pedigrees)13 b(has)f(some)h(very)g(practical)f(uses.) 21 b(T)l(o)12 b(do)h(this)f(we)g(combine)h(the)g(principle)g(of)f(sparsity)h (with)200 3404 y(the)f(technique)i(of)e(strength)h(reduction,)i(and)d(in)g (some)h(cases)e(we)h(also)g(use)f(caching.)23 b(W)-5 b(e)12 b(describe)h(our)1270 3571 y(15)p eop %%Page: 16 16 bop 200 260 a Fo(most)17 b(interesting)g(use)f(of)h(boolean)h(logic)f(here.) 26 b(The)17 b(next)g(improvement)i(shows)e(another)n(,)g(simpler)200 382 y(use.)294 504 y(For)e(some)f(joint)h(genotypes)h(that)f(are)f(possible)h (for)g(two)f(parents,)i(many)f(meiotic)g(combinations)200 625 y(may)25 b(not)h(be)f(possible)g(for)h(a)e(child,)k(due)e(to)f(what)g(is)f (known)j(about)e(the)g(child)h(or)f(its)f(siblings.)200 747 y(Therefore,)c(many)f(calls)f(to)g Fg(segfun)c Fo(yield)19 b(0.0.)30 b(W)-5 b(e)18 b(want)g(to)g(avoid)h(these)f(calls)f(or)i(reduce)f (their)200 869 y(cost)f(if)f(at)h(all)f(possible.)27 b(W)-5 b(e)17 b(can)g(use)f(the)h(facts)g(that:)24 b(1\))18 b(testing)e(whether)i(a) f(bit)f(is)g(0)h(is)f(a)h(lot)g(faster)200 991 y(than)g(testing)f(whether)h (a)f(\257oating)h(point)h(number)g(is)d(0.0)i(and)g(2\))g(all)f(the)g (numbers)i(are)e(nonnegative)200 1112 y(and)g(the)g(only)g(arithmetic)g (operations)h(are)e(addition)i(and)f(multiplication,)h(so)e(we)g(cannot)h (get)g(0.0)g(by)200 1234 y(adding)h(a)e(positive)h(number)h(and)g(its)d (negative)j(complement.)294 1356 y(T)l(o)j(put)f(these)h(ideas)f(in)g (practice,)i(consider)f(a)f(real)h(number)h(expression)f(using)g(only)g (addition)200 1478 y(and)14 b(multiplication.)23 b(Replace)13 b(every)h(0.0)g(value)g(by)g(the)g(boolean)g(value)g(0)g(\(F)-5 b(ALSE\),)14 b(replace)g(every)200 1600 y(nonzero)23 b(value)f(by)f(the)g (boolean)i(value)e(1)h(\(TRUE\),)f(replace)h(every)g(+)f(by)g(the)h(boolean)g (operator)200 1721 y(OR,)13 b(and)i(replace)f(every)g Fi(\002)g Fo(by)g(the)g(boolean)h(operator)h(AND.)d(Provided)j(all)d(the)h(original)h (values)f(are)200 1843 y(nonnegative,)21 b(this)d(replacement)h(yields)f(a)f (boolean)j(expression)f(whose)f(value)g(is)g(0)g(if)f(and)i(only)g(if)200 1965 y(the)d(original)g(expression)h(has)e(value)h(0.0.)24 b(Thus)16 b(we)f(replace)h(the)f(pseudocode:)294 2103 y Fg(Compute)33 b(algebraic)g(expressio)o(n)f(E)200 2242 y Fo(by)16 b(the)g(pseudocode:)294 2380 y Fg(If)36 b(the)f(correspond)o(in)o(g)d(Boolean)h(expression)f (evaluates)h(to)i(1)294 2502 y(then)g(compute)e(algebraic)f(expression)g(E) 200 2657 y Fo(This)10 b(is)g(a)g(major)g(improvement)g(when)h(the)f(term)q(s) g(in)g(the)g(alg)q(ebraic)g(sub)q(com)q(pu)q(tations)g(are)g(r)q(epeated)q (ly)200 2778 y(reused,)i(and)d(we)g(just)g(need)g(to)g(preco)q(mp)q(ute)g(o)q (nce)h(and)g Ff(cach)q(e)f Fo(wh)q(ich)g(simp)q(le)g(term)q(s)g(are)g(0)q(.0) h(and)g(wh)q(ich)200 2900 y(simple)17 b(terms)h(are)f(positive,)i(to)e(set)g (up)h(the)f(boolean)i(expressions.)29 b(For)18 b(example,)h(we)e(augmented) 200 3022 y(the)g(routine)h Fg(segfun)c Fo(with)j(its)f(boolean)i(counterpart) h Fg(lsegfun)13 b Fo(\()p Fg(l)k Fo(stands)f(for)i(logical\),)g(so)f(that)200 3144 y(whenever)g(the)g(previous)g(program)h(called)e Fg(segfun)p Fo(,)d(we)j(call)g Fg(lsegfun)c Fo(\256rst)k(and)g(call)g Fg(segfun)200 3266 y Fo(only)i(when)g(it)f(is)g(known)i(to)e(return)h(a)f(nonzero)j(value.) 28 b(W)-5 b(e)18 b(later)f(replaced)h Fg(segfun)d Fo(with)i(a)g(more)200 3387 y(useful)f(alternative,)g(but)g(we)g(still)e(use)i Fg(lsegfun)c Fo(before)k(calling)g(that)g(alternative.)1270 3571 y(16)p eop %%Page: 17 17 bop 294 260 a Fo(The)13 b(cost)g(of)g(the)f(boolean)i(expression)g(is)e (mitigated)h(by)h(the)e(fact)h(that)g(both)g(C)f(and)h(P)-6 b(ASCAL)12 b(can)200 382 y(evaluate)17 b(the)g(logical)g(operators)g(AND)g (and)g(OR)f(conditionally)i(\(this)f(is)e(the)i(default)g(in)g(C\),)f(so)h (that)200 504 y(as)f(soon)g(as)g(we)g(\256nd)h(a)f(0)g(ar)o(gument)i(to)e (AND)g(we)f(return)j(0,)e(and)h(as)f(soon)h(as)e(we)h(\256nd)h(a)f(1)g(ar)o (gument)200 625 y(to)g(OR)e(we)i(return)g(1.)23 b(Thus)16 b(we)f(usually)h (do)g(not)g(need)g(to)g(evaluate)g(the)g(full)g(boolean)g(expression.)294 747 y Fp(Boolean)g(\257ags)f(for)h(haplotypes)p Fo(.)23 b(This)15 b(idea)g(combines)h(the)g(common)h(subexpression)f(simpli-)200 869 y(\256cation)h(for)g(haplotypes)g(with)f(the)h(idea)f(of)h(using)g (boolean)g(logic)g(to)f(apply)i(the)e(sparsity)g(principle.)200 991 y(W)-5 b(e)13 b(keep)h(an)f(array)h(of)f(boolean)h(\257ags)f(that)g (indicates)g(for)h(each)f(haplotype)h Fk(H)k Fo(whether)c(the)f(child)g(can) 200 1112 y(have)18 b(any)f(genotype)i(that)e(includes)h Fk(H)j Fo(as)c(one)g(haplotype.)29 b(For)17 b(all)g(the)g(haplotypes)h(that)f(the)g (child)200 1234 y(cannot)d(have,)g(we)e(need)i(not)f(compute)h(the)f (probability)h(that)f(each)g(parent)h(passes)e(on)h(that)g(haplotype.)200 1356 y(When)18 b(signi\256cant)g(phenotype)h(information)h(is)c(known,)j(the) f(vast)f(majority)h(of)f(haplotypes)i(can)f(be)200 1478 y(ruled)e(out,)h(so)e (we)g(compound)j(the)e(ef)o(fect)g(of)g(extracting)g(common)i (subexpressions.)294 1600 y Fp(Caching)24 b(haplotypes)h(that)f(can)g(be)g (passed)f(on)h(for)h(each)f(genotype)p Fo(.)49 b(The)24 b(principle)h(of)200 1721 y(isozygotes)g(tells)e(us)g(that)h(from)h(a)f(computational)i(point)e (of)h(view)e(what)h(matters)g(most)g(about)h(a)200 1843 y(parent')m(s)9 b(genotype)g(is)g(what)g(haplo)q(typ)q(es)g(can)g(b)q(e)g(passed)g(o)q(n)g (to)h(the)f(ch)q(ild.)24 b(Therefore)9 b(we)g(precomp)q(ute)200 1965 y(this)20 b(set)g(for)h(all)f(joint)h(genotypes.)38 b(In)21 b(the)g(previous)g(code)g(this)f(set)g(was)g(repeatedly)i(recomputed)200 2087 y(inside)d(multiple)g(loops)g(using)g(two)g(levels)f(of)h(indirection)h (\(two)f(array)h(accesses\).)30 b(In)19 b(our)h(version)200 2208 y(we)15 b(need)h(just)g(one)g(level)f(of)h(indirection)h(to)f(retrieve)g (the)g(set.)294 2330 y(This)21 b(use)h(of)f(caching)i(trades)e(of)o(f)h (substantial)g(memory)h(usage)f(to)f(gain)h(speed.)41 b(In)21 b(complex)200 2452 y(linkage)e(analysis)f(speed)h(is)e(a)h(problem,)j(so)d (this)g(is)f(a)h(trade)h(of)o(f)g(we)f(willingly)h(make.)31 b(In)18 b(this)g(case)200 2574 y(the)c(cache)g(contains)g(space)f(for)h(3)9 b Fi(\002)g Fo(2)1013 2552 y Fj(k)q Fr(\000)p Fd(1)1111 2574 y Fi(\002)g Fh(\()p Fk(maxhap)g Fh(+)g Fo(1)p Fh(\))g Fi(\002)g Fk(maxhap=)p Fo(2)k(integer)i(values,)f(where)200 2695 y(k)h(is)f(the)h (number)h(of)g(loci,)f(and)g(maxhap)h(is)e(the)h(product)i(of)e(the)g(number) h(of)f(alleles.)22 b(For)15 b(3)g(loci)g(with)200 2817 y(6)j(alleles)f(each,) h(maxhap)h(is)e(216)i(and)f(the)g(cache)g(has)g(281,232)i(total)d(locations.) 30 b(In)18 b(exchange,)i(we)200 2939 y(avoid)d(recomputing)g(these)f (haplotypes)h(repeatedly)g(inside)e(a)h(double)h(loop.)294 3061 y Fp(Remove)10 b(pr)o(obability)g(multiplications)g(fr)o(om)g Fg(segfun)p Fo(.)18 b(W)-5 b(e)10 b(reor)o(ganized)g(the)g(computations)200 3183 y(in)i Fg(segfun)p Fo(,)e(so)i(that)g(some)g(of)h(them)f(are)h(now)f (done)h(in)f Fg(segdown)d Fo(and)k Fg(segup)p Fo(.)18 b(The)13 b(rest)f(are)g(done)200 3304 y(in)d(a)g(new)g(routine)g(called)g Fg(segsum)p Fo(.)21 b(The)9 b(essence)g(of)g(the)g(compu)q(tation)h(within)f (th)q(e)g(ro)q(utin)q(e)g Fg(segfun)1270 3571 y Fo(17)p eop %%Page: 18 18 bop 200 260 a Fo(can)13 b(be)f(described)h(in)g(two)f(stages.)21 b(In)13 b(the)f(\256rst)g(stage,)h(we)f(determine)h(which)g(recombination)i (classes)200 382 y(can)e(be)h(produced)h(by)f(a)f(given)h(pair)g(of)f (parents,)i(and)f(sum)f(up)h(the)f(probabilities)i(of)e(each)h(child)f(under) 200 504 y(each)18 b(recombination)i(class.)28 b(In)18 b(the)g(second)h (stage,)f(we)f(take)h(a)g(weighted)g(average)h(of)f(these)g(sums)200 625 y(based)10 b(on)g(the)g(recombination)g(p)q(rob)q(abilities)g(for)g(each) h(class.)23 b(The)10 b(principle)g(of)g(isozygotes)g(rev)q(ealed)200 747 y(that)16 b(among)h(the)f(children)h(the)f(\256rst)g(stage)f(was)h(being) h(repeated)f(for)h(each)f(isozygote)h(because)f(each)200 869 y(isozygote)23 b(produces)h(that)e(recombination)i(class)d(with)h(a)g(dif)o (ferent)h(probability)l(.)44 b(Since)22 b(the)g(\256rst)200 991 y(stage)17 b(is)f(the)h(same)f(for)i(all)e(parent)i(pairs)f(in)f(the)h (same)g(isozygote)h(class,)e(we)h(compute)h(it)e(only)i(once)200 1112 y(for)26 b(each)f(isozygote)g(class)f(in)h(the)g(routine)h Fg(segsum)c Fo(and)j(save)g(these)g(sums)f(in)h(a)g(cache.)50 b(For)200 1234 y(the)19 b(second)g(stage,)g(we)f(multiply)i(the)e(values)h (in)g(the)f(cache)h(with)f(the)h(appropriate)h(recombination)200 1356 y(probabilities)d(and)f(take)f(the)h(weighted)g(average)h(in)f Fg(segup)c Fo(or)k Fg(segdown)c Fo(itself.)294 1478 y Fp(One)20 b(call)h(to)f Fg(lsegfun)d Fp(for)k(each)f(combined)g(par)o(ent')n(s)g (isozygote)h(class)p Fo(.)36 b(Recall)20 b(that)g(by)200 1600 y(incorporating)h(Boolean)e(\257ags)f(we)g(guarded)j(our)e(calls)f(to)g Fg(segsum)d Fo(\(replacement)20 b(for)g Fg(segfun)p Fo(\))200 1721 y(with)i(a)f(preliminary)i(call)f(to)f(the)h(logical)g(routine)h Fg(lsegfun)p Fo(,)d(so)h(that)h(if)f Fg(lsegfun)e Fo(can)i(prove)200 1843 y(that)i Fg(segsum)d Fo(will)j(return)h(all)f(zeroes,)j(we)d(avoid)h (the)f(call)g(to)h Fg(segsum)p Fo(.)42 b(Now)23 b(we)g(apply)i(the)200 1965 y(principle)i(of)f(isozygotes)h(to)f Fg(lsegfun)p Fo(.)50 b(Our)26 b(criterion)h(for)g(returning)g(0.0)g(is)e(precisely)i(that)200 2087 y(at)21 b(least)f(one)h(child)h(is)e(not)i(genetically)f(compatible)i (with)d(the)i(proposed)g(joint)g(genotypes)g(of)g(the)200 2208 y(parents.)35 b(More)21 b(speci\256cally)e(this)h(means)g(that)f(for)i(the)e (parental)i(genotypes)g Fh(\()p Fk(G)2004 2218 y Fj(f)2033 2208 y Fk(;)10 b(G)2108 2217 y Fj(m)2152 2208 y Fh(\))p Fo(,)21 b(none)f(of)200 2330 y(the)j(haplotype)h(combinations)g(that)e(these)h (parental)g(genotypes)h(can)e(pass)g(on)h(to)g(a)f(child)h(can)g(be)200 2452 y(a)h(genotype)i(for)f(the)f(child.)49 b(Now)25 b(suppose)g Fh(\()p Fk(G)1311 2430 y Fr(0)1311 2470 y Fj(f)1340 2452 y Fk(;)10 b(G)1415 2430 y Fr(0)1415 2467 y Fj(m)1459 2452 y Fh(\))24 b Fo(is)f(an)i(isozygote)g(of)f Fh(\()p Fk(G)2056 2462 y Fj(f)2086 2452 y Fk(;)10 b(G)2161 2461 y Fj(m)2205 2452 y Fh(\))p Fo(.)48 b(This)200 2574 y(means)21 b(that)g(the)h(set)e(of)h(haplotypes)i(that)e(can) g(be)h(passed)f(on)g(by)h Fh(\()p Fk(G)1742 2552 y Fr(0)1742 2591 y Fj(f)1771 2574 y Fk(;)10 b(G)1846 2552 y Fr(0)1846 2589 y Fj(m)1890 2574 y Fh(\))21 b Fo(is)f(the)h(same)g(as)g(that)200 2695 y(for)16 b Fh(\()p Fk(G)358 2705 y Fj(f)387 2695 y Fk(;)10 b(G)462 2704 y Fj(m)506 2695 y Fh(\))p Fo(.)22 b(Therefore,)17 b(if)e(a)g(child)h(is)e(incompatible)j(with)e(parental)h(genotypes)g Fh(\()p Fk(G)2123 2705 y Fj(f)2153 2695 y Fk(;)10 b(G)2228 2704 y Fj(m)2272 2695 y Fh(\))p Fo(,)15 b(the)200 2817 y(child)h(must)g(also) f(be)h(incompatible)h(with)f(parental)g(genotypes)h Fh(\()p Fk(G)1659 2795 y Fr(0)1659 2835 y Fj(f)1689 2817 y Fk(;)10 b(G)1764 2795 y Fr(0)1764 2832 y Fj(m)1808 2817 y Fh(\))p Fo(.)22 b(Thus)16 b(we)f(can)h(just)f(pick)200 2939 y(one)21 b(representative)g(of)f (the)g(isozygote)h(class)e(to)h(test)f Fg(lsegfun)d Fo(and)21 b(the)f(same)g(answer)g(\(0)g(or)g(1\))200 3061 y(applies)f(to)f(all)g(the)g (other)h(members)h(of)e(the)h(class.)30 b(This)18 b(is)g(an)g(example)i(of)e (an)h(improvement)i(that)200 3183 y(is)e(much)h(more)g(powerful)h(as)d(the)i (number)h(of)e(loci)g(increases.)34 b(W)n(ith)19 b(three)h(loci,)g(for)g (example,)i(in)200 3304 y(the)15 b(case)g(where)g(both)h(parent)g(genotypes)g (are)f(triply)h(heterozygous,)h(each)f(single)f(parent)h(isozygote)1270 3571 y(18)p eop %%Page: 19 19 bop 200 260 a Fo(class)15 b(is)g(of)i(size)e(4)h(as)f(explained)j(above,)f (so)f(the)g(combined)i(classes)c(are)i(of)h(size)e(4)f Fi(\002)g Fo(4)k Fh(=)f Fo(16.)25 b(This)200 382 y(means)15 b(that)f(we)g(cut)h(down)g (on)g(the)f(number)i(of)f(calls)f(to)g Fg(lsegfun)d Fo(by)k(a)f(factor)h(of)g (16)g(in)f(this)g(case.)200 577 y Fl(V)-7 b(alidation)17 b(of)i(Speedup)200 761 y Fo(T)l(o)13 b(validate)g(our)h(improvements,)i(we)d(report)h(the)f (running)i(times)d(of)i(the)f(old)g(programs)i(and)f(the)f(new)200 883 y(programs)k(on)f(three)g(sample)g(data)g(sets.)294 1005 y(The)g(data)g(sets)e(are:)291 1177 y Fi(\017)31 b Fo(CEPH:)15 b(data)i(from)h(the)f(CEPH)e(Database)i(for)g(chromosome)i(6)e(on)g(the)g (the)f(standard)i(family)352 1298 y(panel)e(of)g(65)g(three)g(generation)h (families)e(\(Dausset)g(et)h(al.)22 b(1990\).)291 1470 y Fi(\017)31 b Fo(RP01:)c(data)18 b(on)h(a)f(lar)o(ge)g(family)l(,)i(UCLA-RP01,)f(with)f (autosomal)h(dominant)h(retinitis)e(pig-)352 1592 y(mentosa)k(\(RP1\))g(from) h(the)f(laboratory)i(of)e(Dr)m(.)41 b(Stephen)23 b(P)-7 b(.)22 b(Daiger)g(at)g(the)g(University)g(of)352 1713 y(T)l(exas)17 b(Health)h(Science)f(Center)h(at)f(Houston.)30 b(This)17 b(pedigree)i(has)e (7)h(generations)h(with)f(192)352 1835 y(individuals)d(containing)h(2)e (marriage)h(loops)g(\(Blanton)g(et)f(al.)22 b(1991\).)h(As)14 b(shown)h(in)f(\(Blanton)352 1957 y(et)k(al.)30 b(1991\),)21 b(this)d(pedigree)i(had)f(to)g(be)f(split)g(into)h(three)g(pieces)f(because)h (computation)h(on)352 2079 y(the)d(whole)h(family)h(together)g(was)e (prohibitively)i(long.)30 b(In)18 b(the)g(T)l(ables)f(of)i(Results,)e(RP01-3) 352 2201 y(denotes)h(analysis)g(with)g(the)g(family)g(split)g(in)g(three)g (pieces.)30 b(RP01)18 b(denotes)g(analysis)g(of)h(the)352 2322 y(whole)d(family)g(as)f(a)g(single)h(pedigree)g(\(\256g.)23 b(1\).)291 2494 y Fi(\017)31 b Fo(BAD:)22 b(data)i(on)g(a)g(portion)h(of)f (the)g(Old)f(Order)i(Amish)e(pedigree)i(110)g(\(OOA)f(110\),)j(with)352 2616 y(bipolar)d(af)o(fective)h(disorder)g(\(BAD\))e(from)i(the)f(laboratory) i(of)e(Drs.)47 b(David)24 b(R.)f(Cox)h(and)352 2737 y(Richard)c(M.)g(Myers)g (at)g(the)g(University)h(of)g(California)f(at)g(San)g(Francisco.)36 b(This)20 b(pedigree)352 2859 y(spans)i(5)g(generations)i(with)e(96)h (individuals)g(and)g(contains)g(1)f(marriage)h(loop)h(\(Law)e(et)g(al.)352 2981 y(1992\).)294 3153 y(The)16 b(CEPH)e(and)i(RP01)f(data)g(sets)f(are)i (two)f(extremely)h(dif)o(ferent)g(kinds)g(of)g(pedigree)g(structures)200 3274 y(and)i(are)f(representative)i(of)f(the)f(range)h(of)g(pedigree)h (situations)e(found)j(in)d(genetic)h(disease)f(linkage)200 3396 y(studies.)55 b(These)26 b(two)g(data)g(sets)g(contain)h(many)g(loci,)i (so)d(we)g(chose)h(various)g(subsets)f(for)h(our)1270 3571 y(19)p eop %%Page: 20 20 bop 200 260 a Fo(experiments.)24 b(In)16 b(the)g(case)f(of)h(RP01,)g(the)g (locus)g(with)g(2)g(alleles)f(is)g(always)g(the)h(disease)f(locus.)23 b(The)200 382 y(BAD)15 b(data)g(set)g(represents)g(a)g(lar)o(ge)h(single)g (family)g(with)f(a)g(disease,)g(like)g(RP01.)23 b(However)n(,)16 b(it)f(is)f(not)200 504 y(as)h(deep)h(and)g(we)f(only)i(have)f(data)g(for)g (3)g(loci.)294 625 y(All)g(these)g(data)g(sets)f(represent)i(autosomal)g (inheritance,)h(but)f(we)e(have)i(also)f(implemented)i(our)200 747 y(improvements)g(for)f(the)f(sex-linked)i(analogues)f(of)g Fg(segup)p Fo(,)c Fg(segdown)p Fo(,)g(and)k Fg(segfun)p Fo(,)c(and)k(they)200 869 y(work)22 b(there)g(too.)42 b(The)22 b(problem)h(of)f(long)g(runs)h(is)d (not)j(as)e(serious)g(for)i(sex-linked)g(data)e(because)200 991 y(updating)d(the)f(probabilities)h(for)f(a)f(male)h(child)g(is)f (relatively)h(easy)g(as)f(compared)i(to)f(the)g(autosomal)200 1112 y(case,)e(and)h(there)g(is)f(no)h(recombination)i(in)e(the)f(sex)h (chromosomes)h(of)f(a)f(father)m(.)294 1234 y(The)d(times)f(recorded)i(are)e (the)g(\252user)r(\272)h(times)f(reported)i(by)e(the)h Fg(time)d Fo(command)k(on)f(our)g(systems.)200 1356 y(W)-5 b(e)23 b(have)g(rounded)i (the)d(times)g(to)h(the)g(nearest)f(second)h(or)g(minute)h(to)e(simplify)h (the)g(data)g(and)g(to)200 1478 y(acknowledge)g(that)e(times)f(will)g(vary)l (.)40 b(In)21 b(fact,)i(we)d(observed)j(variations)e(in)g(running)i(time)e (of)g(as)200 1600 y(much)26 b(as)f(10\045)h(on)g(the)f(same)g(run)i(because)e (of)h(inherent)h(variations)f(in)f(the)h(load)g(of)f(the)h(other)200 1721 y(processes)d(running)h(simultaneously)g(on)f(the)g(computer)m(.)45 b(W)-5 b(e)23 b(have)g(also)f(rounded)j(the)d(speedup)200 1843 y(quotients)16 b(to)g(the)g(nearest)f(integer)i(for)f(simplicity)l(.)294 1965 y(T)l(able)24 b(1)h(shows)f(sample)h(performance)h(improvements)h(on)e (2-point)g(analyses)g(using)g(LOD-)200 2087 y(SCORE,)14 b(and)h(T)l(able)g(2) g(shows)f(sample)h(improvements)i(on)e(3-point)h(analyses)f(using)g(ILINK.)h (T)l(able)200 2208 y(3)g(shows)f(a)g(few)h(sample)g(improvements)h(on)f (4-point)h(analyses)f(using)g(ILINK.)294 2330 y(In)c(some)g(of)g(the)g(test)f (cases)g(the)h(computation)i(is)d(so)h(long)g(that)g(we)g(ran)g(the)g(old,)h (slow)e(program)j(for)200 2452 y(just)f(one)g(function)i(evaluation)f(of)g (each)f(order)h(tried.)22 b(In)13 b(these)g(cases,)g(we)g(ran)g(the)g(fast)g (new)g(program)200 2574 y(to)f(completion)i(and)e(then)h(divided)g(its)e (running)j(time)e(by)h(the)f(number)h(of)g(function)g(evaluations.)23 b(This)200 2695 y(is)c(reasonable)h(because)g(our)h(changes)f(should)h(have)f (roughly)h(the)f(same)f(ef)o(fect)h(on)g(each)g(function)200 2817 y(evaluation)14 b(of)f(a)g(given)h(order)m(.)22 b(W)-5 b(e)14 b(found)g(in)f(practice)g(that)g(comparing)i(one)f(function)g (evaluation)g(of)200 2939 y(the)h(old)h(program)h(with)e(the)g(average)h(on)g (the)f(new)g(program)i Ff(under)n(estimates)f Fo(the)f(speedup)h(slightly)l (,)200 3061 y(because)e(the)g(old)g(program)h(modi\256ed)g(for)f(one)g (function)i(evaluation,)f(avoids)f(some)g(overhead)h(at)f(the)200 3183 y(end)i(of)f(the)g(run.)23 b(In)15 b(the)h(two)e(3-point)j(runs)f(for)f (the)g(full)g(RP01)g(we)g(report)h(here)f(the)h(speedups)f(based)200 3304 y(one)h(function)i(evaluation)f(of)f(each)g(program.)26 b(In)16 b(the)g(three)g(4-point)i(tests)c(on)j(RP01-3)f(and)h(the)f(two)1270 3571 y(20)p eop %%Page: 21 21 bop 200 260 a Fo(3-point)15 b(tests)d(on)i(the)g(full)f(RP01,)h(we)f(tried)h (only)g(one)g(order)m(.)23 b(The)14 b(four)g(runs)g(withs)f(2)c Fi(\002)g Fo(6)g Fi(\002)g Fo(9)k(alleles)200 382 y(represent)j(two)g(dif)o (ferent)h(choices)e(each)h(for)g(the)g(6-allele)g(and)g(for)g(the)g(9-allele) g(locus.)294 504 y(The)c(speedup)h(numbers)g(in)f(the)g(rightmost)g(column)i (are)d(substantial)h(in)g(all)f(but)h(the)g(shortest)g(runs.)200 625 y(In)19 b(the)g(short)h(runs,)g(such)f(as)g(the)g(2)d Fi(\002)f Fo(3)h Fi(\002)f Fo(3)k(allele)g(run,)i(the)e(overhead)h(of)g(various)f (initializations)200 747 y(and)d(procedure)h(calls)e(is)g(not)h(negligible,)g (and)g(the)g(part)f(of)h(the)g(code)g(we)f(have)h(speeded)g(up)g(is)e(not)i (as)200 869 y(dominant)h(as)e(it)g(becomes)h(in)g(longer)h(runs.)294 991 y(The)12 b(numbers)h(suggest)g(that)e(as)h(the)f(amount)j(of)e (computation)i(increases)d(above)i(some)f(pedigree-)200 1112 y(dependent)17 b(threshold,)g(our)g(improvements)g(become)g(more)f(ef)o (fective.)23 b(This)16 b(is)e(important)j(because)200 1234 y(we)e(are)h(primarily)h(concerned)h(with)e(longer)h(runs,)f(since)g(these)g (are)f(where)i(the)e(most)h(absolute)h(time)200 1356 y(can)22 b(be)h(saved)f(using)h(our)g(faster)f(programs.)44 b(In)23 b(practice,)i(the)d(user)g(must)h(do)f(some)h(amount)g(of)200 1478 y(thinking)c(and)f(hypothesis)g(formulation)i(before)e(running)h(the)f (LINKAGE)f(programs.)29 b(If)18 b(the)f(slow)200 1600 y(version)g(already)g (takes)f(substantially)h(less)e(time)h(than)h(the)f(user)g(needs)g(to)h (think)g(up)f(the)h(hypothesis)200 1721 y(and)c(set)f(up)i(the)e(program,)k (then)d(LINKAGE)g(is)f(not)h(the)g(bottleneck.)23 b(W)-5 b(e)12 b(are)h(concerned)i(with)d(cases,)200 1843 y(such)18 b(as)f(the)h(longer)h (runs)g(on)f(the)g(RP01)g(data)g(set,)f(where)i(the)f(slow)f(speed)h(of)g (the)g(old)g(LINKAGE)200 1965 y(programs)f(is)e(the)h(bottleneck)g(in)g(the)g (user)r(')m(s)f(work.)294 2087 y(The)g(reader)g(may)g(be)g(curious)g(as)f(to) h(why)g(the)f(CEPH)g(run)i(with)e(7)e Fi(\002)f Fo(9)k(alleles)e(exhibits)i (so)g(much)200 2208 y(more)22 b(speedup)h(than)f(the)f(other)i(two)e(CEPH)g (examples.)41 b(The)22 b(reason)g(is)f(there)g(are)h(many)g(fewer)200 2330 y(unknowns)d(for)f(the)f(6-allele)g(locus)h(than)f(for)h(the)f(other)h (two)g(loci.)27 b(W)-5 b(e)17 b(can)h(quantify)g(this)f(partially)200 2452 y(as)c(follows.)22 b(There)15 b(are)e(137)i(individuals)g(whose)f (6-allele)f(gene)i(is)e(known,)i(but)f(whose)g(7-allele)g(and)200 2574 y(9-allele)k(genes)h(are)f(not)h(known.)32 b(The)18 b(are)g(only)i(17)e (individuals)i(whose)e(7-allele)h(gene)g(is)e(known,)200 2695 y(but)i(whose)f(6-allele)g(and)h(9-allele)f(genes)h(are)f(not)g(known.)32 b(There)19 b(are)f(only)h(5)f(individuals)h(whose)200 2817 y(9-allele)e(gene)g(is)f(known,)j(but)e(whose)g(6-allele)g(and)g(7-allele)g (genes)g(are)g(unknown.)28 b(Most)17 b(of)g(these)200 2939 y(unknowns)d(are)d(grandparents.)23 b(This)12 b(results)f(in)h(many)g(more)h (grandparental)h(genotype)f(possibilities)200 3061 y(and)20 b(a)f(signi\256cantly)h(longer)g(run.)35 b(However)n(,)21 b(by)e(doing)i(the) e(sparsity)h(analysis)f(bottom-up)i(in)f(the)200 3183 y(new)14 b(program,)i(we)d(take)h(tremendous)h(advantage)g(of)f(what)g(is)f(known)i (about)f(the)g(parent)g(to)g(simplify)200 3304 y(the)i(update)g(for)g(the)g (grandparent.)1270 3571 y(21)p eop %%Page: 22 22 bop 294 260 a Fo(The)20 b(reader)h(may)g(also)e(be)h(curious)h(as)f(to)g(why) g(we)g(got)g(so)g(much)h(more)g(speedup)g(on)f(the)g(full)200 382 y(RP01)14 b(than)h(on)h(the)e(split)g(RP01-3.)23 b(The)15 b(answer)f(is)g(that)h(from)g(the)g(perspective)g(of)g(the)g(computation)200 504 y(these)21 b(two)g(pedigrees)h(are)f(quite)g Ff(differ)n(ent)p Fo(.)39 b(Using)21 b Fg(gprof)d Fo(we)j(observed)h(that)f(at)g(least)f (80\045)h(of)200 625 y(the)f(computation)i(time)e(is)f(spent)h(updating)i (the)e(probabilities)h(in)f(the)g(top)g(two)g(generations.)37 b(The)200 747 y(split)23 b(considerably)j(simpli\256es)d(the)h(top)h (generations)g(by)f(reducing)i(the)e(number)h(of)g(children)g(in)200 869 y(several)16 b(nuclear)g(families)g(and)g(removing)i(one)e(loop)h (\(involving)h(a)d(child)h(of)g(parents)g(in)g(the)g(second)200 991 y(generation\).)37 b(The)19 b(fact)h(that)g(the)f(lower)h(generations)h (of)f(RP01)g(and)g(RP01-3)g(are)g(very)g(similar)f(is)200 1112 y(insigni\256cant)d(computationally)l(.)294 1234 y(The)g(previous)h(two)e (paragraphs)j(give)e(some)g(indication)g(of)g(the)g(dif)o(\256culty)g(of)g (predicting)h(speed)200 1356 y(ef)o(fects.)k(There)13 b(is)e(some)h (discussion)g(about)h(running)g(time)f(in)g(\(Lange)h(and)f(Elston)g(1975\),) j(but)d(it)f(does)200 1478 y(not)16 b(take)g(sparsity)g(into)g(account.)24 b(As)16 b(we)f(mentioned)i(above,)h(even)e(the)g(old)g(LINKAGE)g(programs)200 1600 y(took)k(some)f(advantage)h(of)f(sparsity)l(.)33 b(There)19 b(are)g(many)h(variables)f(that)g(can)g(af)o(fect)g(the)g(amount)h(of)200 1721 y(sparsity)l(,)h(e.g.,)h(graph)f(structure)f(of)g(the)g(pedigree,)j (number)e(of)f(loci,)h(number)h(of)e(alleles,)g(number)200 1843 y(of)e(unknows)g(for)g(those)g(alleles,)f(and)h(pedigree)g(traversal)g (order)m(.)29 b(Of)17 b(course,)h(their)g(ef)o(fects)f(are)g(not)200 1965 y(independent.)294 2087 y(Another)29 b(important)f(variable)g(factor)g (in)g(total)f(running)i(time)e(is)g(the)g(number)i(of)f(function)200 2208 y(evaluations.)57 b(In)28 b(the)f(runs)g(reported)h(above,)j(the)c (programs)i(took)f(anywhere)g(from)g(15)f(to)g(55)200 2330 y(function)19 b(evaluations)f(to)f(conver)o(ge)i(for)f(a)f(single)g(order)m (.)29 b(As)16 b(mentioned)j(previously)l(,)h(the)d(number)200 2452 y(of)i(function)i(evaluations)f(is)e(the)h(same)g(for)g(the)g(old)h(and) f(new)g(programs.)35 b(W)-5 b(e)19 b(do)g(not)h(see)e(a)h(clear)200 2574 y(pattern)d(that)g(could)g(help)g(predict)h(how)f(many)g(evaluations)h (would)f(be)g(required)h(for)f(a)f(given)i(run.)294 2695 y(Similarly)l(,)g (it)e(is)g(very)i(hard)g(to)f(quantify)h(the)f(separate)g(ef)o(fects)g(of)g (the)g(changes)h(we)e(made.)24 b(Like)200 2817 y(the)17 b(basic)g(factors)h (af)o(fecting)g(running)h(time,)f(the)f(changes)h(interact)f(in)g (complicated)i(ways,)e(but)h(we)200 2939 y(give)e(some)g(anecdotal)g (evidence.)294 3061 y(For)f(pedigrees)g(like)f(CEPH,)g(the)g(most)h(useful)f (changes)h(are)g(sparsity-based,)g(and)g(the)g(switch)f(to)200 3183 y(bottom-up)21 b(computation)g(in)d Fg(segup)e Fo(and)j Fg(segdown)c Fo(is)j(the)g(most)h(useful.)32 b(The)19 b(reason)g(appears)200 3304 y(to)26 b(be)g(that)h(the)f(pedigrees)h(have)g(two)f(or)g(three)h (generations)g(with)g(most)f(of)g(the)h(unknowns)h(in)1270 3571 y(22)p eop %%Page: 23 23 bop 200 260 a Fo(the)20 b(top)h(generation)h(of)f(the)f(three-generation)j (pedigrees.)38 b(Switching)21 b(to)g(bottom-up)h(evaluation)200 382 y(eliminates)13 b(most)f(of)h(the)g(candidate)g(genotypes)i(in)d(the)h (grandparent)i(generation.)23 b(W)-5 b(e)13 b(implemented)200 504 y(the)18 b(sparsity-based)h(changes)g(\256rst)f(and)h(we)e(observed)j (most)e(of)h(the)f(speedup)h(reported)h(in)e(T)l(able)h(1)200 625 y(then,)d(before)h(the)f(isozygote-based)h(changes)f(were)g(implemented.) 294 747 y(For)25 b(the)f(disease)g(pedigrees,)j(both)e(the)f(sparsity-based)i (changes)f(and)f(the)h(isozygote-based)200 869 y(changes)g(contribute)g (signi\256cantly)l(.)49 b(Intuitively)l(,)28 b(the)c(sparsity-based)h (changes)g(work)g(as)e(in)i(the)200 991 y(CEPH)19 b(pedigree)i(to)f (drastically)g(reduce)h(the)f(computation)i(caused)e(by)h(the)f(youngest)h (generation)200 1112 y(or)f(two)f(with)g(unknowns.)35 b(If)19 b(there)h(are)f(more)h(generations)g(with)f(unknowns,)k(their)c Fg(genarray)p Fo(s)200 1234 y(may)c(not)f(be)g(very)h(sparse.)22 b(For)14 b(example,)i(using)f(a)e(debugger)k(and/or)e Fg(tcov)d Fo(we)i(can)g(check)h(that)f(the)200 1356 y Fg(genarray)9 b Fo(for)14 b(the)f(top)h(male)f(and)h(female)g(in)f(RP01-3)h(for)g(the)f(2)8 b Fi(\002)g Fo(9)g Fi(\002)g Fo(9)16 b(run)e(are)f(not)h(very)g(sparse.)200 1478 y(Most)i(of)g(the)g(genotypes)h(that)f(are)g(consistent)f(with)h(their)g (disease)g(status)f(and)h(the)g(disease)f(status)g(of)200 1600 y(their)e(of)o(fspring)h(cannot)g(be)f(ruled)g(out.)22 b(The)13 b(rearrangement)i(of)e(the)g(probability)i(summations)e(based)200 1721 y(on)18 b(isozygotes)g(signi\256cantly)g(cut)g(the)f(computation)i(time) f(of)g(updating)h(the)e(probability)i(arrays)f(by)200 1843 y(at)d(least)g(a)g(factor)h(of)g(2.)294 1965 y(These)k(performance)i (improvement)h(results)c(compare)j(the)e(new)g(C)f(program)j(with)e(the)g (old)g(C)200 2087 y(program)j(generated)f(by)g Fg(p2c)p Fo(.)37 b(Therefore)23 b(these)d(are)h(valid)h(comparisons)g(of)g(the)f(results)f(of) i(our)200 2208 y(work.)h(However)n(,)15 b(to)f(summarize,)h(and)f(put)h(the)f (total)f(results)h(in)g(perspective,)h(we)f(ran)g(the)g(2)c Fi(\002)g Fo(9)g Fi(\002)g Fo(9)200 2330 y(ILINK)15 b(run)g(on)h(the)e(RP01)h (data)g(with)f(the)h(new)f(ILINK)h(and)h(the)e(original)i(Pascal)e(version)h (of)g(ILINK)200 2452 y(compiled)j(with)e(\257ag)h(-O4.)25 b(Because)16 b(this)g(run)i(would)f(take)g(so)f(long)h(we)g(ran)f(just)h(the)f(\256rst)g (function)200 2574 y(evaluation)j(for)g(each)f(program)i(to)e(compare)h(the)f (speed.)30 b(W)-5 b(e)18 b(found)i(that)e(the)g(new)g(program)i(is)d(40)200 2695 y(times)g(faster)f(on)i(this)e(problem.)29 b(Then)17 b(the)g(new)g (program)i(was)d(rerun)i(to)f(completion,)i(which)f(took)200 2817 y(6)e(days)g(on)g(a)f(Sun)h(SP)-6 b(ARCstation)15 b(2.)23 b(So)16 b(the)g(comparable)h(run)g(under)g(Pascal)e(would)h(have)g(taken)h(8) 200 2939 y(months!)1270 3571 y(23)p eop %%Page: 24 24 bop 200 260 a Fl(Discussion)200 445 y Fo(The)27 b(combinatorial)i(complexity) g(of)e(genetic)g(linkage)h(computations)h(and)e(the)g(slow)g(speed)g(of)200 566 y(linkage)12 b(programs)h(are)f(rapidly)g(becoming)h(a)f(bottleneck)g(in) g(genetic)g(linkage)g(analysis.)21 b(Rather)11 b(than)200 688 y(trying)16 b(to)e(throw)i(more)f(and)g(better)g(computer)i(hardware)e(at)g (the)f(problem,)j(we)d(have)i(systematically)200 810 y(improved)i(the)d (basic)h(algorithms)g(used)g(in)g(the)f(LINKAGE)h(package.)294 932 y(The)22 b(algorithmic)h(approach)g(to)e(speeding)i(up)f(the)g(programs)h (is)d(sequential)i(and)g(completely)200 1053 y(dif)o(ferent)k(from)g(the)g (complementary)h(approach)g(of)f(using)f(more)h(hardware)g(such)g(as)e (vector)i(or)200 1175 y(parallel)21 b(computers,)i(which)d(has)g(been)h (shown)g(to)g(be)f(successful)g(\(Miller)h(et)f(al.)36 b(1991;)24 b(Goradia)200 1297 y(et)18 b(al.)30 b(1992\).)j(According)20 b(to)e(these)g(papers,)i(one)f(can)f(achieve)h(a)f(speedup)i(of)e(roughly)j (one)e(order)200 1419 y(of)d(magnitude)i(if)e(enough)i(processors)f(are)f (available.)24 b(As)15 b(shown)i(by)f(our)h(results,)f(the)g(algorithmic)200 1541 y(improvements)g(described)g(also)e(achieve)h(a)f(speedup)i(of)f(one)g (order)g(of)g(magnitude,)i(and)e(sometimes)200 1662 y(more,)g(but)f(without)g (using)g(any)f(extra)h(computer)h(hardware.)23 b(Both)13 b(types)h(of)g (improvements)h(make)f(a)200 1784 y(qualitative)j(change)f(in)g(the)g (complexity)i(of)e(useful)g(genetic)g(linkage)h(problems)g(that)f(can)g(be)g (solved)200 1906 y(in)k(a)g(reasonable)h(amount)g(of)g(time.)36 b(It)19 b(will)h(be)g(interesting)h(to)f(combine)h(our)g(approach)h(of)e (better)200 2028 y(algorithms)27 b(and)f(the)g(approach)h(of)g(using)f (parallel)g(computation)i(to)d(try)h(and)h(achieve)f(a)f(speed)200 2149 y(improvement)18 b(of)e(two)f(or)h(more)h(orders)f(of)g(magnitude.)294 2271 y(The)g(data)h(in)f(the)g(previous)h(section)f(show)g(that)g(the)h (improvements)h(are)e(practical,)g(substantial,)200 2393 y(and)e (qualitative.)23 b(W)n(ith)13 b(our)h(improved)i(algorithms)e(we)g(can)f (reach)h(solutions)g(in)g(a)f(week)g(that)h(would)200 2515 y(have)k(taken)f(almost)h(a)e(year)n(,)i(and)g(therefore)h(were)e (impossible.)28 b(Nevertheless,)17 b(we)g(recognize)i(that)200 2636 y(no)d(matter)f(what)g(algorithmic)i(improvements)g(we)d(achieve,)i (geneticists)f(will)g(want)g(to)g(solve)g(lar)o(ger)200 2758 y(and)24 b(more)h(dif)o(\256cult)f(linkage)h(problems.)48 b(Therefore,)28 b(the)c(complementary)i(approach)g(of)e(using)200 2880 y(better)d(hardware,)j (including)e(parallel)f(computers,)j(should)e(be)f(combined)i(with)e(our)g (algorithmic)200 3002 y(approach)c(to)f(speed)g(up)g(linkage)g(computations.) 294 3123 y(On)h(a)g(more)g(abstract)g(level)g(our)h(work)g(is)e(one)i(more)f (demonstration)i(that)e(the)g(study)h(of)f(human)200 3245 y(genetics)h(is)f (becoming)j(more)e(computational.)31 b(Much)19 b(more)f(synthesis)g(of)g (biological)h(theory)g(and)200 3367 y(computer)g(science)e(techniques)i(is)e (needed)h(to)g(produce)h(programs)g(than)f(can)g(ef)o(\256ciently)g(carry)g (out)1270 3571 y(24)p eop %%Page: 25 25 bop 200 260 a Fo(the)16 b(increasingly)g(complex)h(computations)h(that)d (geneticists)g(want)h(to)g(do.)200 455 y Fl(Acknowledgments)200 640 y Fo(W)-5 b(e)26 b(thank)g(Dr)m(.)51 b(Stephen)26 b(P)-7 b(.)26 b(Daiger)f(and)h(Dr)m(.)52 b(Lori)25 b(A.)h(Sadler)f(for)h (contributing)i(the)d(disease)200 761 y(family)d(data)f(for)h(our)g (experiments)h(and)f(generously)h(allowing)f(us)f(to)g(present)h(the)g (pedigree)g(and)200 883 y(results.)39 b(Development)23 b(of)e(these)g(data)g (was)g(supported)i(by)e(grants)h(from)g(the)f(National)h(Retinitis)200 1005 y(Pigmentosa)d(Foundation)i(and)e(the)f(Geor)o(ge)h(Gund)g(Foundation.) 33 b(Also)18 b(thanks)h(to)g(Drs.)30 b(David)19 b(R.)200 1127 y(Cox)c(and)h(Richard)g(M.)f(Myers)h(and)g(their)f(colleagues)h(for)g(their)g (contribution)i(of)d(the)h(Amish)f(family)200 1249 y(data)22 b(developed)i(with)e(the)g(support)h(of)f(a)g(grant)g(from)h(the)f(National)g (Institutes)g(of)h(Health.)41 b(And)200 1370 y(thanks)19 b(to)f(Professor)g (Alan)h(Cox)f(for)h(help)f(with)g(details)g(regarding)i(the)e(SP)-6 b(ARC)17 b(architecture)i(and)200 1492 y Fg(gcc)35 b Fo(.)c(Special)19 b(thanks)g(to)f(Professors)h(Ken)g(Kennedy)h(\(Rice\))e(and)h(Charlie)g (Lawrence)g(\(Baylor\))200 1614 y(for)g(helping)h(us)e(get)h(our)g (collaboration)i(started.)31 b(This)19 b(work)g(was)f(supported)i(by)f (grants)g(from)h(the)200 1736 y(Human)25 b(Genome)f(Program)h(of)f(the)g (National)g(Institutes)g(of)g(Health)f(\(R)m(WC\),)h(the)f(W)-6 b(.)25 b(M.)f(Keck)200 1857 y(Foundation)18 b(\(R)m(WC)c(and)j(RMI\),)e(and)h (from)h(the)f(National)g(Science)f(Foundation)j(\(AAS\).)200 2086 y Fl(Refer)o(ences)200 2270 y Fo([1])31 b(Blanton)22 b(SH,)g (Heckenlively)g(JR,)f(Cottingham)i(A)-5 b(W)f(,)22 b(Friedman)h(J,)e(Sadler)h (LA,)g(W)-5 b(agner)23 b(M,)271 2392 y(Friedman)12 b(LH,)f(et)g(al.)g (\(1991\))17 b(Linkage)c(mapping)g(of)e(autosomal)h(dominant)h(retinitis)e (pigmentosa)271 2514 y(\(rp1\))17 b(to)e(the)h(pericentric)h(region)f(of)g (human)h(chromosome)h(8.)23 b(Genomics)16 b(11:857\261869)200 2685 y([2])31 b(Dausset)d(J,)f(Cann)h(H,)g(Cohen)h(D,)e(Lathrop)j(M,)e (Lalouel)g(J-M,)g(White)g(R)g(\(1990\))57 b(Centre)271 2807 y(d'Etude)10 b(du)g(Polymorh)q(isme)g(Humain)h(\(CEPH\):)f(Collabo)q(rative)g (g)q(enetic)g(ma)q(ppin)q(g)g(o)q(f)g(the)g(h)q(um)q(an)271 2929 y(genome.)24 b(Genomics)16 b(6:575\261577)200 3100 y([3])31 b(Elston)18 b(RC,)f(Stewart)g(J)f(\(1971\))30 b(A)17 b(general)h(model)g(for) g(the)g(analysis)f(of)h(pedigree)h(data.)27 b(Hum)271 3222 y(Hered)16 b(21:523\261542)1270 3571 y(25)p eop %%Page: 26 26 bop 200 260 a Fo([4])31 b(Goradia)20 b(TM,)f(Lange)h(K,)f(Miller)g(PL,)g (Nadkarni)h(PM)f(\(1992\))33 b(Fast)19 b(computation)i(of)e(genetic)271 382 y(likelihoods)e(on)f(human)h(pedigree)g(data.)22 b(Hum)16 b(Hered)g(42:42\26162)200 553 y([5])31 b(Lalouel)15 b(J-M)e(\(1979\))21 b(GEMINI)14 b(-)f(a)h(computer)h(program)g(for)g(optimization)g(of)f(general) g(nonlin-)271 675 y(ear)c(functions.)k(T)l(echnical)c(report)g(no)g(14,)k (Department)c(of)g(Medical)g(Biophysics)g(and)g(Computing,)271 797 y(University)16 b(of)g(Utah,)g(Salt)f(Lake)h(City)200 969 y([6])31 b(Lange)17 b(K,)f(Elston)h(RC)e(\(1975\))26 b(Extensions)17 b(to)g(pedigree)g(analysis.)f(I.)h(Likelihood)h(calculation)271 1090 y(for)e(simple)g(and)g(complex)h(pedigrees.)23 b(Hum)16 b(Hered)g(25:95\261105)200 1262 y([7])31 b(Lange)16 b(K,)e(Goradia)i(TM)e (\(1987\))23 b(An)15 b(algorithm)h(for)g(automatic)f(genotype)i(elimination.) 22 b(Am)14 b(J)271 1384 y(Hum)i(Genet)f(40:250\261256)200 1555 y([8])31 b(Lathrop)17 b(GM,)e(Lalouel,)i(J-M)e(\(1984\))24 b(Easy)15 b(calculations)h(of)f(lod)h(scores)f(and)h(genetic)g(risks)f(on)271 1677 y(small)g(computers.)24 b(Am)15 b(J)g(Hum)h(Genet)g(36:460\261465)200 1849 y([9])31 b(Lathrop)13 b(GM,)e(Lalouel)i(J-M)e(\(1988\))17 b(Ef)o(\256cient)12 b(computations)h(in)e(multilocus)h(linkage)h(analysis.) 271 1970 y(Am)i(J)g(Hum)h(Genet)g(42:498\261505)200 2142 y([10])32 b(Lathrop)22 b(GM,)f(Lalouel)g(J-M,)g(Julier)g(C,)f(Ott)g(J)g(\(1984\))38 b(Strategies)21 b(for)g(multilocus)h(linkage)271 2264 y(analysis)15 b(in)h(humans.)23 b(Proc)16 b(Natl)f(Acad)h(Sci)f(USA)g(81:3443\2613446)200 2435 y([11])32 b(Lathrop)18 b(GM,)e(Lalouel)i(J-M,)e(White)h(RL)g(\(1986\))27 b(Construction)18 b(of)f(human)h(genetic)f(linkage)271 2557 y(maps:)j(likelihood)13 b(calculations)f(for)g(multilocus)g(linkage)h (analysis.)i(Genet)d(Epidemiol,)h(3:39\26152)200 2729 y([12])32 b(Law)12 b(A,)h(Richard)g(CW)g(III,)g(Cottingham)h(R)m(W)f(Jr)n(,)f(Lathrop)i (GM,)f(Cox)g(DR,)f(Myers)h(RM)g(\(1992\))271 2850 y(Genetic)k(linkage)i (analysis)e(of)g(bipolar)i(af)o(fective)f(disorder)g(in)g(an)f(Old)h(Order)g (Amish)f(pedigree.)271 2972 y(Human)f(Genetics,)g(88:562\261568)200 3144 y([13])32 b(Miller)19 b(PL,)h(Nadkarni)h(P)-7 b(,)20 b(Gelernter)g(JE,)f (Carriero)h(N,)g(Pakstis)f(AJ,)g(Kidd)h(KK)g(\(1991\))35 b(Par)o(-)271 3266 y(allelizing)21 b(genetic)g(linkage)g(analysis:)33 b(A)20 b(case)g(study)h(for)h(applying)g(parallel)f(computation)i(in)271 3387 y(molecular)17 b(biology)l(.)24 b(Comp)16 b(Biomed)g(Res)e (24:234\261248)1270 3571 y(26)p eop %%Page: 27 27 bop 200 260 a Fo([14])32 b(NCHGR)26 b(article)i(\(1991\))56 b(NCHGR)26 b(begins)i(uni\256ed)h(framework)g(map)f(ef)o(fort.)56 b(Human)271 382 y(Genome)16 b(News)f(3\(2\):1)200 553 y([15])32 b(Ott)17 b(J)g(\(1974\))29 b(Estimation)18 b(of)g(the)g(recombination)i (fraction)e(in)g(human)h(pedigrees\261)g(ef)o(\256cient)271 675 y(computation)e(of)e(the)g(likelihood)h(for)f(human)i(linkage)e(studies.) 21 b(Am)15 b(J)f(Hum)h(Genet)g(26:588\261597)200 847 y([16])32 b(Ott)12 b(J)g(\(1991\))19 b(Analysis)12 b(of)h(Human)h(Genetic)f(Linkage,)h (revised)f(edition.)19 b(The)13 b(Johns)g(Hopkins)271 969 y(University)j (Press,)f(Baltimore)h(and)g(London,)i(1991)200 1140 y([17])32 b(Stallman)12 b(RM)f(\(1992\))18 b(Using)12 b(and)h(porting)g(gnu)g(cc.)j (Manual)d(provided)h(by)e(the)g(Free)g(Software)271 1262 y(Foundation)17 b(to)f(document)h Fg(gcc)200 1434 y Fo([18])32 b(W)n(ijsman,)18 b(EM)f(\(1987\))28 b(A)17 b(deductive)h(method)h(of)e(haplotype)i(analysis)e (in)h(pedigrees.)27 b(Am)17 b(J)271 1555 y(Hum)f(Genet)f(41:356\261373)1270 3571 y(27)p eop %%Page: 28 28 bop 200 207 2143 3 v 199 282 3 76 v 233 260 a Fo(Data)15 b(Set)p 473 282 V 67 w(Number)h(of)g(Alleles)p 993 282 V 66 w(New)f(Program)i(T)n (ime)p 1541 282 V 67 w(Old)f(Program)g(T)n(ime)p 2065 282 V 67 w(Speedup)p 2341 282 V 200 284 2143 3 v 199 360 3 76 v 473 360 V 993 360 V 1541 360 V 2065 360 V 2341 360 V 199 435 V 233 412 a(CEPH)p 473 435 V 437 w(6)e Fi(\002)f Fo(7)p 993 435 V 410 w(17sec)p 1541 435 V 356 w(105sec)p 2065 435 V 220 w(6)p 2341 435 V 199 510 V 473 510 V 993 510 V 1541 510 V 2065 510 V 2341 510 V 199 586 V 233 563 a(CEPH)p 473 586 V 437 w(6)h Fi(\002)f Fo(9)p 993 586 V 410 w(22sec)p 1541 586 V 356 w(647sec)p 2065 586 V 189 w(30)p 2341 586 V 199 661 V 473 661 V 993 661 V 1541 661 V 2065 661 V 2341 661 V 199 736 V 233 714 a(CEPH)p 473 736 V 437 w(7)h Fi(\002)f Fo(9)p 993 736 V 410 w(46sec)p 1541 736 V 295 w(17279sec)p 2065 736 V 160 w(375)p 2341 736 V 199 811 V 473 811 V 993 811 V 1541 811 V 2065 811 V 2341 811 V 199 887 V 233 864 a(RP01-3)p 473 887 V 408 w(6)h Fi(\002)f Fo(6)p 993 887 V 380 w(436sec)p 1541 887 V 325 w(4234sec)p 2065 887 V 221 w(9)p 2341 887 V 199 962 V 473 962 V 993 962 V 1541 962 V 2065 962 V 2341 962 V 199 1037 V 233 1015 a(RP01-3)p 473 1037 V 408 w(6)h Fi(\002)f Fo(9)p 993 1037 V 349 w(1357sec)p 1541 1037 V 296 w(14953sec)p 2065 1037 V 190 w(11)p 2341 1037 V 199 1112 V 473 1112 V 993 1112 V 1541 1112 V 2065 1112 V 2341 1112 V 199 1188 V 233 1165 a(RP01-3)p 473 1188 V 408 w(9)h Fi(\002)f Fo(9)p 993 1188 V 380 w(490sec)p 1541 1188 V 325 w(5452sec)p 2065 1188 V 191 w(11)2282 1143 y Fr(\003)p 2341 1188 V 200 1190 2143 3 v 200 1356 a Fo(T)l(able)25 b(1:)41 b(Some)25 b(sample)h(2-point)g(analyses)f(done)h(with)f(LODSCORE.)1876 1334 y Fr(\003)1927 1356 y Fo(means)g(that)g(the)g(old)200 1478 y(program)17 b(was)e(run)i(for)f(only)g(one)h(function)g(evaluation.) 1270 3571 y(28)p eop %%Page: 29 29 bop 200 207 2143 3 v 199 282 3 76 v 233 260 a Fo(Data)15 b(Set)p 473 282 V 67 w(Number)h(of)g(Alleles)p 993 282 V 66 w(New)f(Program)i(T)n (ime)p 1541 282 V 67 w(Old)f(Program)g(T)n(ime)p 2065 282 V 67 w(Speedup)p 2341 282 V 200 284 2143 3 v 199 360 3 76 v 473 360 V 993 360 V 1541 360 V 2065 360 V 2341 360 V 199 435 V 233 412 a(RP01-3)p 473 435 V 303 w(2)e Fi(\002)g Fo(3)g Fi(\002)f Fo(3)p 993 435 V 410 w(60sec)p 1541 435 V 356 w(320sec)p 2065 435 V 220 w(5)p 2341 435 V 199 510 V 473 510 V 993 510 V 1541 510 V 2065 510 V 2341 510 V 199 586 V 233 563 a(RP01-3)p 473 586 V 303 w(2)h Fi(\002)g Fo(6)g Fi(\002)f Fo(6)p 993 586 V 393 w(61min)p 1541 586 V 340 w(586min)p 2065 586 V 221 w(9)p 2341 586 V 199 661 V 473 661 V 993 661 V 1541 661 V 2065 661 V 2341 661 V 199 736 V 233 714 a(RP01-3)p 473 736 V 303 w(2)h Fi(\002)g Fo(6)g Fi(\002)f Fo(9)p 993 736 V 380 w(190sec)p 1541 736 V 325 w(1602sec)p 2065 736 V 221 w(8)2282 692 y Fr(\003)p 2341 736 V 199 811 V 473 811 V 993 811 V 1541 811 V 2065 811 V 2341 811 V 199 887 V 233 864 a Fo(RP01-3)p 473 887 V 303 w(2)h Fi(\002)g Fo(6)g Fi(\002)f Fo(9)p 993 887 V 380 w(200sec)p 1541 887 V 325 w(1694sec)p 2065 887 V 221 w(8)2282 842 y Fr(\003)p 2341 887 V 199 962 V 473 962 V 993 962 V 1541 962 V 2065 962 V 2341 962 V 199 1037 V 233 1015 a Fo(RP01-3)p 473 1037 V 303 w(2)h Fi(\002)g Fo(6)g Fi(\002)f Fo(9)p 993 1037 V 380 w(183sec)p 1541 1037 V 325 w(1682sec)p 2065 1037 V 221 w(9)2282 993 y Fr(\003)p 2341 1037 V 199 1112 V 473 1112 V 993 1112 V 1541 1112 V 2065 1112 V 2341 1112 V 199 1188 V 233 1165 a Fo(RP01-3)p 473 1188 V 303 w(2)h Fi(\002)g Fo(6)g Fi(\002)f Fo(9)p 993 1188 V 380 w(200sec)p 1541 1188 V 325 w(1771sec)p 2065 1188 V 221 w(9)2282 1143 y Fr(\003)p 2341 1188 V 199 1263 V 473 1263 V 993 1263 V 1541 1263 V 2065 1263 V 2341 1263 V 199 1338 V 233 1316 a Fo(RP01-3)p 473 1338 V 303 w(2)h Fi(\002)g Fo(9)g Fi(\002)f Fo(9)p 993 1338 V 393 w(15min)p 1541 1338 V 340 w(130min)p 2065 1338 V 221 w(9)2282 1294 y Fr(\003)p 2341 1338 V 199 1414 V 473 1414 V 993 1414 V 1541 1414 V 2065 1414 V 2341 1414 V 199 1489 V 233 1466 a Fo(RP01)p 473 1489 V 353 w(2)h Fi(\002)g Fo(6)g Fi(\002)f Fo(6)p 993 1489 V 380 w(299sec)p 1541 1489 V 325 w(5541sec)p 2065 1489 V 193 w(19)2284 1444 y Fr(y)p 2341 1489 V 199 1564 V 473 1564 V 993 1564 V 1541 1564 V 2065 1564 V 2341 1564 V 199 1640 V 233 1617 a Fo(RP01)p 473 1640 V 353 w(2)h Fi(\002)g Fo(9)g Fi(\002)f Fo(9)p 993 1640 V 393 w(99min)p 1541 1640 V 309 w(3013min)p 2065 1640 V 194 w(31)2284 1595 y Fr(y)p 2341 1640 V 199 1715 V 473 1715 V 993 1715 V 1541 1715 V 2065 1715 V 2341 1715 V 199 1790 V 233 1767 a Fo(BAD)p 473 1790 V 359 w(2)h Fi(\002)g Fo(4)g Fi(\002)f Fo(4)p 993 1790 V 410 w(48sec)p 1541 1790 V 356 w(691sec)p 2065 1790 V 190 w(14)2282 1745 y Fr(\003)p 2341 1790 V 200 1792 2143 3 v 200 1958 a Fo(T)l(able)g(2:)20 b(Some)13 b(sample)g(3-point)h(analyses)e (done)i(with)e(ILINK.)1601 1936 y Fr(\003)1639 1958 y Fo(means)h(that)f(the)h (old)g(program)h(was)200 2080 y(run)h(for)g(only)g(one)g(function)g (evaluation;)1105 2058 y Fr(y)1143 2080 y Fo(means)f(that)g(both)i(programs)f (were)f(run)h(for)g(one)g(function)200 2202 y(evaluation.)1270 3571 y(29)p eop %%Page: 30 30 bop 200 207 2143 3 v 199 282 3 76 v 233 260 a Fo(Data)15 b(Set)p 473 282 V 67 w(Number)h(of)g(Alleles)p 993 282 V 66 w(New)f(Program)i(T)n (ime)p 1541 282 V 67 w(Old)f(Program)g(T)n(ime)p 2065 282 V 67 w(Speedup)p 2341 282 V 200 284 2143 3 v 199 360 3 76 v 473 360 V 993 360 V 1541 360 V 2065 360 V 2341 360 V 199 435 V 233 412 a(RP01-3)p 473 435 V 199 w(2)e Fi(\002)f Fo(3)h Fi(\002)g Fo(3)g Fi(\002)f Fo(4)p 993 435 V 410 w(92sec)p 1541 435 V 356 w(821sec)p 2065 435 V 220 w(9)2282 390 y Fr(\003)p 2341 435 V 199 510 V 473 510 V 993 510 V 1541 510 V 2065 510 V 2341 510 V 199 586 V 233 563 a Fo(RP01-3)p 473 586 V 199 w(2)h Fi(\002)f Fo(3)h Fi(\002)g Fo(3)g Fi(\002)f Fo(6)p 993 586 V 380 w(345sec)p 1541 586 V 325 w(4131sec)p 2065 586 V 191 w(12)2282 541 y Fr(\003)p 2341 586 V 199 661 V 473 661 V 993 661 V 1541 661 V 2065 661 V 2341 661 V 199 736 V 233 714 a Fo(RP01-3)p 473 736 V 199 w(2)h Fi(\002)f Fo(3)h Fi(\002)g Fo(4)g Fi(\002)f Fo(5)p 993 736 V 380 w(587sec)p 1541 736 V 325 w(6085sec)p 2065 736 V 191 w(10)2282 692 y Fr(\003)p 2341 736 V 200 738 2143 3 v 200 904 a Fo(T)l(able)20 b(3:)30 b(Three)21 b(sample)f(4-point)h(analyses)f(done) g(with)g(ILINK.)1671 882 y Fr(\003)1717 904 y Fo(means)g(that)g(the)g(old)g (program)200 1026 y(was)15 b(run)h(for)g(only)h(one)f(function)h(evaluation.) 1270 3571 y(30)p eop %%Page: 31 31 bop 200 260 a Fp(Figur)o(e)11 b(1)22 b Fo(The)12 b(UCLA-RP01)f(pedigree)i (containing)f(192)h(individuals)f(over)g(7)f(generations.)23 b(Double)200 382 y(bars)18 b(indicate)g(the)g(two)f(marriage)i(loops.)30 b(The)18 b(dashed)g(boxes)g(show)g(how)g(the)g(pedigree)h(was)e(split)200 504 y(into)c(three)h(pieces)e(when)i(required,)h(and)f(*)f(indicates)g(the)g (individuals)h(coded)g(in)f(two)g(sub-pedigrees.)200 625 y(Shading)19 b(indicates)f(af)o(fected)g(individuals)h(\(solid:)27 b(100\045,)19 b(forward)g(slashes:)26 b(90\045,)18 b(back)h(slashes:)200 747 y(80\045)14 b(probability)i(of)f(being)g(af)o(fected\).)23 b(The)14 b(?)22 b(shows)13 b(at-risk)i(individuals)g(whose)f(disease)g (status)f(is)200 869 y(unknown.)1270 3571 y(31)p eop %%Page: 32 32 bop 200 260 a Fp(Keywords:)200 504 y Fo(genetic)16 b(linkage)h(analysis)200 625 y(LINKAGE)200 747 y(algorithms)200 869 y(computer)g(science)200 991 y(recombination)200 1112 y(sparsity)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README0000644000265600020320000002445206770306667014307 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 FASTLINK, version 4.1P Each section in each README file starts with the string "|*|". To browse the sections, use your file viewer to search for this unique string. This is the top level README file. |*| INTRODUCTION ------------ As described in the papers: R. W. Cottingham Jr., R. M. Idury, and A. A. Schaffer, Faster Sequential Genetic Linkage Computations, American Journal of Human Genetics, 53(1993), pp. 252-263. and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Linkage Analysis, Human Heredity, 44(1994), pp. 225-237. and A. A. Schaffer, Faster Linkage Analysis Computations for Pedigrees with Loops or Unused Alleles, Human Heredity, 46(1996), pp. 226-235. and A. Becker, D. Geiger, and A. A. Schaffer, Automatic Selection of Loop Breakers for Genetic Linkage Analysis, Human Heredity, 48(1998), pp. 49-60, and A. Becker, R. Bar-Yehuda, D. Geiger, Random Algorithms for the Loop Cutset Problem, Proceedings of the fifteenth conference on Uncertainty in Artificial Intelligence, Sweden, 1999, pp. 49-56. This directory and its subdirectories contain version 4.1P of faster versions of the general pedigree programs of LINKAGE 5.1. Several of our users of earlier versions 1.0 and 1.1 have dubbed the new programs FASTLINK. A PostScript version of the papers can be found in the files paper1.ps, paper2.ps, paper5.ps, paper6.ps, and paper7.ps. Please cite the first two papers (so that all participants in the FASTLINK project get credit), if you use these programs in a published experiment. You should continue to cite the original papers on LINKAGE, listed below, if you use FASTLINK: G. M. Lathrop, J.-M. Lalouel, C. Julier, and J. Ott, Strategies for Multilocus Analysis in Humans, PNAS 81(1984), pp. 3443-3446. G. M. Lathrop and J.-M. Lalouel, Easy Calculations of LOD Scores and Genetic Risks on Small Computers, American Journal of Human Genetics, 36(1984), pp. 460-465. G. M. Lathrop, J.-M. Lalouel, and R. L. White, Construction of Human Genetic Linkage Maps: Likelihood Calculations for Multilocus Analysis, Genetic Epidemiology 3(1986), pp. 39-52. The FASTLINK code is available by anonymous ftp to a machines at NIH, Rice University, and EBI. For instructions see the file README.install. In addition to the two papers and this README file, the top level directory contains various other pieces of documentation. Carol Haynes (Duke) suggested that we split up the documentation into smaller pieces. This file is primarily a roadmap to the documentation for FASTLINK. README.allele --- explains the diagnostic that states that a pedigree or dataset has unused alleles. |*| Diagnostic for extra alleles |*| Extra alleles in symbols and an example |*| Extra alleles and separating pedigrees |*| FASTLINK diagnostic error message README.bugreport --- suggest how to send in a bug report |*| How to Submit a Useful Bug report README.checkpoint --- explains the checkpointing scheme for LODSCORE and ILINK |*| Introduction to checkpointing |*| The Process |*| The Files |*| Modifying Scripts and Checkpointing |*| Using the Script-Level Checkpointing Facility |*| Important Caution on Breaking a ckpt Run README.constants --- explains the mysteries of how to properly set some of the constants in FASTLINK |*| Constant Definitions - VERY IMPORTANT!! |*| Setting Constants by Editing only the Makefile |*| Checking how constants are set for a given executable README.diseq --- explains an option introduced in FASTLINK 4.1P for modeling linkage disequilibrium |*| Baiscs of using conditional allele frequencies |*| Usage Suggestions README.djgpp --- explains how to retrieve and install the djgpp C compiler for those who want source code for FASTLINK for DOS. The compiler is free. |*| File Retrieval for setting up the djgpp C compiler. |*| Installing djgpp and compiling FASTLINK README.ILINK --- |*| What does the output of ILINK and LODSCORE mean? README.install -- explains basic facts about retrieving and installing FASTLINK |*| FTP Directions |*| Source Code Organization |*| Compilation README.loopfile -- explains the syntax of the file loopfile.dat used to transmit genotype inferences from unknown to the main program when working with looped pedigrees |*| What is loopfile.dat? |*| Syntax of loopfile.dat README.lselect -- explains the new easy automatic way to select loop breakers |*| Selecting loop breakers easily and automatically README.makefile -- explains the structure of the Makefile in detail |*| Makefile, Introduction |*| Makefile, Variables |*| Makefile, Comments |*| FASTLINK, Memory Usage Options |*| Makefile, Editing |*| Makefile, Miscellaneous Variables |*| Makefile, Sequential Code Variables |*| Makefile, Parallel Code Variables |*| Makefile, Parallel Code Variables, TreadMarks specifics |*| Makefile, Parallel Code Variables, P4 specifics |*| Makefile, Parallel Code Variables, Parallel C Compiler Flags |*| Makefile, Unix Utilities on Your System |*| Makefile, Passing Extra Flags README.mapfun -- Explains how the mapping functions explained in Chapter 1 of Ott's book actually relate to what is in the code |*| Map Functions Used in LINKAGE/FASTLINK README.memory --- explains memory requirements |*| Memory Requirements README.p4 -- explains how to obtain and install the p4 package, which is needed to run parallel FASTLINK on shared-memory parallel computers |*| P4, Background |*| FTP Instructions |*| Building P4 |*| Building P4, Using SYSV_IPC |*| Building P4 for SOLARIS |*| Building P4 for IRIX |*| Building P4 for OSF |*| Hooking FASTLINK and P4 Together |*| Running P4 FASTLINK |*| Running P4 FASTLINK, Specifying number of processors |*| Running P4 FASTLINK, Specifying maxworkingset |*| Running P4 FASTLINK, Specifying memory usage |*| Running P4 FASTLINK, Analyzing memory usage |*| Parallel FASTLINK, Running times |*| P4, Troubleshooting |*| P4, Misc README.parallel -- high level overview of parallel versions of FASTLINK |*| Parallel Code, Introduction |*| Parallel FASTLINK, Operation |*| FASTLINK on shared-memory multiprocessors |*| FASTLINK on networks of workstations |*| Parallel FASTLINK, references see also paper3.ps and paper4.ps README.portability --- contains summary of portability information and refers to the following files for more information regarding specific operating systems Note: README.portability and the following system-specific files are not included in the diskette version of FASTLINK for DOS. README.AIX README.ALPHAVMS README.Digital (used to be called README.OSF) README.DOS README.IRIX README.Linux README.VAX |*| Instructions for DEC C Compiler |*| Instructions for VAX C Compiler README.VMS README.scaling --- essay on the output likelihood values from FASTLINK |*| Output values from FASTLINK are scaled |*| Scaling Alert for LINKMAP users README.time -- a short essay on estimating the running time of sequential FASTLINK runs. README.TreadMarks -- briefly describes the TreadMarks package, which is needed to run parallel FASTLINK on a network of unix workstations. |*| Introduction |*| Retrieving and Installing TreadMarks |*| Hooking TreadMarks and FASTLINK together |*| Running TreadMarks FASTLINK |*| Running TreadMarks FASTLINK, Command line flags |*| Running TreadMarks FASTLINK, Specifying number of processors |*| Running TreadMarks FASTLINK, Specifying maxworkingset |*| Running TreadMarks FASTLINK, Analyzing memory usage |*| Parallel FASTLINK, Running times README.trouble -- LINKAGE/FASTLINK Troubleshooting |*| Error Message in LINKAGE Main Programs and UNKNOWN |*| ERROR MESSAGES INTRODUCED in FASTLINK |*| Incompatibility Errors in UNKNOWN |*| LSP Error Messages |*| LRP Error Messages README.unknown -- describes modifications to the UNKNOWN preprocessor program first introduced in FASTLINK 2.3P, including improved error reporting and a bugfix. README.updates --- explains noticeable changes in different versions of FASTLINK |*| Changes Introduced in version 1.1 |*| Changes Introduced in version 2.0 |*| Changes Introduced in version 2.1 and while maintaining 2.0 |*| Changes Introduced in version 2.2 and while maintaining 2.1 |*| Changes Introduced in version 2.3P and while maintaining 2.2 |*| Changes Introduced while maintaining 2.3P |*| Changes Introduced in version 3.0P |*| Changes Introduced while maintaining 3.0P |*| Changes Introduced in version 4.0P |*| Changes Introduced while maintaining 4.0P |*| Changes Introduced in version 4.1P |*| Changes Introduced while maintaining 4.1P The following are PostScript files (traverse.ps takes a while to print) traverse.ps --- explains the pedigree traversal algorithm in great detail with examples loops.ps --- explains various aspects of loops in LINKAGE/FASTLINK. unknown.ps --- explains how the UNKNOWN preprocessor program works. Send suggestions for other FASTLINK documentation you would like to see to schaffer@helix.nih.gov. Please let us know if you have problems with the programs, including if you are unhappy with the speedup and are willing to share your data to the extent that we may be able to study the problem. Note that this does not mean you have to tell us anything about what disease you are studying. And of course we will respect any request for confidentiality. We only wish to consider studying problems to see if we can find improvements. If you read README.updates you will see that lots of the updates are suggested by users who are enthusiastic about FASTLINK, but would like to see it improve. One of the best ways to encourage us to work harder on FASTLINK is to send in your constructive suggestions. There is a mailing list of over 200 FASTLINK users. If you wish to be on this mailing list, send e-mail to schaffer@helix.nih.gov. fastlink-4.1P-fix95/README.bugreport0000644000265600020320000000501107407702107016270 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: December 17, 2001 |*| How to Submit a Useful Bug Report Any bug reports on FASTLINK should be sent to Alejandro Schaffer (schaffer@helix.nih.gov). I have been trying to investigate all bug reports as quickly as possible. The purpose of this document is to tell you what you should send me, so that I can track down any problem as quickly as possible without having to ask for more information. I am really anxious to find and fix whatever bugs remain in FASTLINK and LINKAGE. All the bug reports I've gotten so far have helped tremendously. However, I would like to speed up the process by guiding you in what I need to know to track down a bug successfully. In general, there are four categories of bugs: 1. Compilation Problems 2. Crash during a run 3. Results obviously bogus or inconsistent with LINKAGE 4. Anything else Here is what you should send me for each type of bug report: Compilation Problems: a. A script showing your compilation attempt and the errors you got. b. Some indication which version number of FASTLINK you are using c. Your Makefile d. If the compilation complains that something is not defined, send me your current versions of the files, commondefs.h, moddefs.h, and slowmoddefs.h Crash or Results obviously bogus or inconsistent with LINKAGE a. Which program and version (number, fast or slow) you are using b. Your data files (e.g., pedin.dat, datain.dat) c. Whatever shell script you are using to run the programs d. An indication of whether the results you are getting are bogus or are plausible but inconsistent with LINKAGE. Anything else a. Which program and version (number, fast or slow) you are using b. Your data files (e.g., pedin.dat, datain.dat) c. An explanation with sample scripts of how the behavior deviates from what you expected. If you run the programs directly rather than using a shell script, then instead of pedin.dat, datain.dat, and script, I would want pedfile.dat, ipedfile.dat, speedfile.dat, datafile.dat. Beyond the items above, please describe any symptoms that seem relevant to you. I'd rather too much information than too little. However, you should just report behaviors that you see, not any speculations about the causes of those unexpected behaviors. All data sent to me will be kept in complete confidence. The files you send me should contain no names of study participants and should contain no other information that would make the participants identifiable. fastlink-4.1P-fix95/loops.ps0000644000265600020320000060176406737457641015140 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software %%Title: loops.dvi %%Pages: 9 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentPaperSizes: Letter %%EndComments %DVIPSCommandLine: dvips loops.dvi -o %DVIPSParameters: dpi=600, comments removed %DVIPSSource: TeX output 1999.06.28:1030 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet TeXDict begin 40258431 52099146 1000 600 600 (loops.dvi) @start /Fa 1 106 df<000700000F80001FC0001FC0000F800007000000000000000000 0000000000000000000000000000000000000001E00007F8000E3C001C3E00383E00303E 00703E00607E00E07C00C07C00C0FC0080F80000F80001F80001F00003F00003E00003E0 0007E00007C04007C0C00FC0C00F80C00F81C01F01801F03801F07000F06000F1E0007F8 0001F000122E7EAC18>105 D E /Fb 5 117 df<000C00003C00007C0003FC00FFFC00FC 7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000 7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000 7C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0000 FE007FFFFE7FFFFE172C7AAB23>49 D<007F800001FFF0000780FC000E003F001C001F80 38000FC070000FC0600007E0F00007E0FC0007F0FE0007F0FE0003F0FE0003F0FE0003F0 7C0007F0000007F0000007F0000007E000000FE000000FC000001FC000001F8000003F00 00007E0000007C000000F8000001F0000003E0000007C000000F8000001E0000003C0000 0078000000F0003000E0003001C0003003800060070000600E0000E01FFFFFE03FFFFFE0 7FFFFFC0FFFFFFC0FFFFFFC01C2C7DAB23>I<003FC00001FFF00007C0FC000E007E001C 003F001C001F803F001FC03F001FC03F800FC03F000FC03F000FC00C001FC000001FC000 001F8000001F8000003F0000003E0000007C000000F8000003F00000FFC00000FFF00000 00FC0000003F0000001F8000001FC000000FC000000FE000000FE0000007F0000007F038 0007F07C0007F0FE0007F0FE0007F0FE0007F0FE000FE0F8000FE060000FC070001FC038 001F801E003F000780FC0001FFF000007FC0001C2D7DAB23>I<07C0000000FFC0000000 FFC00000000FC000000007C000000007C000000007C000000007C000000007C000000007 C000000007C000000007C000000007C000000007C000000007C000000007C000000007C0 FE000007C3FF800007C703E00007DE01F00007F801F00007F000F80007F000F80007E000 F80007E000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F8 0007C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F800 07C000F80007C000F80007C000F80007C000F80007C000F8000FE001FC00FFFE1FFFC0FF FE1FFFC0222E7EAD27>104 D<00600000600000600000600000E00000E00000E00001E0 0003E00003E00007E0001FE000FFFFF0FFFFF003E00003E00003E00003E00003E00003E0 0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E01803E01803E0 1803E01803E01803E01803E01803E03801F03001F07000F860003FE0000F80152A7FA81B >116 D E /Fc 11 121 df<000000FC00000003FF0000000F87C000003E03E000007C01 E00000F801F00001F801F00003F000F80007E000F8000FE000FC000FC000FC001F8000FC 003F8000FC003F0000FC007F0000FE00FE0000FE00FE0000FE01FE0000FE01FC0000FE03 FC0000FE03F80001FE07F80001FE07F80001FE07F00001FE0FF00001FC0FF00003FC1FF0 0003FC1FE00003FC1FE00003FC1FE00007FC3FE00007F83FFFFFFFF83FFFFFFFF83FFFFF FFF87FC0000FF07F80000FF07F80000FF07F80001FF07F80001FE0FF00001FE0FF00001F E0FF00003FC0FF00003FC0FE00003F80FE00007F80FE00007F00FE00007F00FE0000FE00 FE0000FE00FE0001FC00FE0001FC00FE0003F8007E0003F0007E0007F0007E0007E0007E 000FC0003E000F80003E001F80003E003F00001F007E00001F00FC00000F81F0000007C3 E0000001FF800000007E00000027417DBF2B>18 D<1E007F80FF80FFC0FFC0FFE0FFE0FF E07FE01E60006000600060006000E000C000C000C001C001800380030007000E001C0018 00380030000B1C798919>59 D<70000000000000FC000000000000FF0000000000007FC0 00000000001FF0000000000007FC000000000001FF0000000000007FC000000000001FF0 000000000007FC000000000001FF0000000000007FC000000000001FF8000000000007FE 000000000001FF8000000000007FE000000000000FF8000000000003FE000000000000FF 8000000000003FE000000000000FF8000000000003FE000000000000FF8000000000003F E000000000000FF8000000000003FE000000000000FF000000000000FF000000000003FE 00000000000FF800000000003FE00000000000FF800000000003FE00000000000FF80000 0000003FE00000000000FF800000000003FE00000000000FF800000000007FE000000000 01FF800000000007FE00000000001FF800000000007FC00000000001FF000000000007FC 00000000001FF000000000007FC00000000001FF000000000007FC00000000001FF00000 0000007FC00000000000FF000000000000FC00000000000070000000000000383679B147 >62 D<0001FFFFFFFFF800000001FFFFFFFFFF00000001FFFFFFFFFFE000000001FE0000 3FF000000001FE000007F800000001FC000003FC00000001FC000001FE00000001FC0000 01FF00000003FC000000FF00000003F8000000FF00000003F8000000FF80000003F80000 00FF80000007F80000007F80000007F0000000FF80000007F0000000FF80000007F00000 00FF8000000FF0000000FF0000000FE0000001FF0000000FE0000001FE0000000FE00000 03FE0000001FE0000003FC0000001FC0000007F80000001FC000000FF80000001FC00000 1FE00000003FC000003FC00000003F8000007F800000003F800001FE000000003F800007 F8000000007F80007FE0000000007FFFFFFF00000000007FFFFFFFE0000000007F000007 F800000000FF000001FE00000000FE000000FF00000000FE0000007F80000000FE000000 3FC0000001FE0000003FC0000001FC0000003FE0000001FC0000001FE0000001FC000000 1FE0000003FC0000001FE0000003F80000001FF0000003F80000001FF0000003F8000000 1FF0000007F80000001FE0000007F00000003FE0000007F00000003FE0000007F0000000 3FC000000FF00000007FC000000FE00000007F8000000FE0000000FF8000000FE0000001 FF0000001FE0000001FE0000001FC0000003FE0000001FC0000007FC0000003FC000001F F00000003FC000003FE00000003F800000FFC00000007F800007FF000000FFFFFFFFFFFC 000000FFFFFFFFFFF0000000FFFFFFFFFF00000000413E7DBD45>66 D<0001FFFFFFFFF000000001FFFFFFFFFF00000001FFFFFFFFFFC000000001FF00007FE0 00000001FF00000FF800000001FE000003FC00000001FE000001FC00000003FE000001FE 00000003FE000000FF00000003FC000000FF00000003FC000000FF00000007FC000000FF 00000007FC000000FF80000007F8000000FF80000007F8000000FF8000000FF8000000FF 8000000FF8000001FF0000000FF0000001FF0000000FF0000001FF0000001FF0000001FE 0000001FF0000003FE0000001FE0000003FC0000001FE0000007FC0000003FE0000007F8 0000003FE000000FF00000003FC000001FE00000003FC000003FC00000007FC000007F80 0000007FC00000FE000000007F800003FC000000007F80003FF000000000FFFFFFFFC000 000000FFFFFFFC0000000000FF0000000000000000FF0000000000000001FF0000000000 000001FF0000000000000001FE0000000000000001FE0000000000000003FE0000000000 000003FE0000000000000003FC0000000000000003FC0000000000000007FC0000000000 000007FC0000000000000007F80000000000000007F8000000000000000FF80000000000 00000FF8000000000000000FF0000000000000000FF0000000000000001FF00000000000 00001FF0000000000000001FE0000000000000001FE0000000000000003FE00000000000 00003FE0000000000000003FC0000000000000007FE0000000000000FFFFFFE000000000 00FFFFFFE00000000000FFFFFFE00000000000413E7DBD3A>80 D<00001F8000000000FF E000000003F0707000000FC039F800001F801DF800003F000FF800007E000FF00000FC00 0FF00001FC0007F00003F80007F00007F00007E00007F00007E0000FE00007E0001FE000 0FE0001FE0000FC0003FC0000FC0003FC0000FC0003FC0001FC0007FC0001F80007F8000 1F80007F80001F80007F80003F8000FF80003F0000FF00003F0000FF00003F0000FF0000 7F0000FF00007E0380FE00007E0380FE00007E0380FE0000FE0380FE0000FC07807E0001 FC07007E0003FC07007E0003FC0F003F0007FC0E003F000EFC0E001F801C7C1C000F8078 7C1C0007C1F03E380001FFC01FF000007F0007C00029297DA730>97 D<000001F8000000000FFE000000003F0787000000FC03DF800001F801DF800003F000FF 80000FE000FF80001FC0007F00001F80007F00003F80007F00007F00007F0000FF00007E 0000FE00007E0001FE0000FE0001FE0000FE0003FC0000FC0003FC0000FC0003FC0001FC 0007FC0001FC0007F80001F80007F80001F80007F80003F8000FF80003F8000FF00003F0 000FF00003F0000FF00007F0000FF00007F0000FF00007E0000FE00007E00007E0000FE0 0007E0000FE00007E0001FC00007F0003FC00003F0007FC00001F000FFC00001F801FF80 0000F803DF8000007E0F3F8000001FFC3F80000007F03F00000000003F00000000007F00 000000007F00000000007E00000000007E0000000000FE0000000000FE0000000000FC00 001C0001FC00007F0001F80000FF0003F80000FF0003F00000FF0007E00000FF000FC000 00FE001F800000F8007E0000007E01FC0000001FFFE000000003FF00000000293B7FA72B >103 D<00003C0000FE0000FE0001FE0001FE0001FE0001FC0000700000000000000000 00000000000000000000000000000000000000000000000000000000000000007E0001FF 8003C7C00703C00F03E00E03E01C03E01C07E03807E03807E0780FE0700FC0700FC0F01F C0F01F80001F80003F80003F00007F00007E00007E0000FE0000FC0000FC0001FC0001F8 0003F80E03F00E03F00E07F01E07E01C07E01C07E03C07C03807C07807C07007C0E007C1 E003E3C001FF00007C00173E7EBC1F>105 D<0001FC00000000FFFC00000000FFF80000 0000FFF80000000003F80000000003F80000000003F00000000003F00000000007F00000 000007F00000000007E00000000007E0000000000FE0000000000FE0000000000FC00000 00000FC0000000001FC0000000001FC0000000001F80000000001F80000000003F800000 00003F80000000003F00000000003F0000FC00007F0003FE00007F000F0780007E003C0F 80007E00703F8000FE00E03F8000FE01C07F8000FC03807F8000FC07007F8001FC0E007F 0001FC1C001C0001F83800000001F87000000003F8E000000003F9C000000003F3800000 0003FF0000000007FF0000000007FFF000000007E3FE00000007E07F8000000FE01FC000 000FE00FE000000FC007E000000FC007F000001FC003F000001FC003F00E001F8003F00E 001F8003F00E003F8003F01E003F8007F01C003F0007E01C003F0007E01C007F0007E038 007F0007E038007E0003E078007E0003E07000FE0001E0E000FE0001F1E000FC00007F80 003800003E000029407CBE2F>107 D<007C0000000001FF0000038003C7C0000FC00703 C0000FC00F03E0000FC00E03E0001FC01C03E0001FC01C07E0001F803807E0001F803807 E0003F80780FE0003F80700FC0003F00700FC0003F00F01FC0007F00F01F80007F00001F 80007E00003F80007E00003F0000FE00003F0000FE00007F0000FC00007E0000FC00007E 0001FC0000FE0001FC0000FC0001F80000FC0001F80000FC0003F80001FC0003F81C01F8 0003F01C01F80003F01C01F80007F01C01F80007F03C01F80007E03801F8000FE03801F8 001FE07800F8001FE07000FC003FE070007C0073E0F0007E00E3E0E0003F03C1F1C0000F FF007F800001FC001F002E297EA734>117 D<0001F8003F000007FE00FFE0001E0F83C0 F0003807C780F8007003CF03F800E003FE03F801C003FC07F803C003FC07F8038003F807 F8070003F807F0070003F801C00E0003F000000E0003F000001E0007F000001E0007F000 00000007E00000000007E0000000000FE0000000000FC0000000000FC0000000000FC000 0000001FC0000000001F80000000001F80000000001F80000000003F80000000003F0001 C000003F0001C000003F0001C000007F0003C01E007F0003803F007E0007807F80FE0007 007F80FE000F00FF81FE001E00FF01DF001C00FE03DF0038007C078F80F0003C0F07C1E0 001FFC03FF800007F0007E00002D297EA734>120 D E /Fd 32 121 df<07C01FF03FF87FFCFFFEFFFEFFFEFFFEFFFEFFFEFFFE7FFC3FF81FF007C00F0F788E 1F>46 D<000000001F8000000000000000001F8000000000000000003FC0000000000000 00003FC000000000000000007FE000000000000000007FE000000000000000007FE00000 000000000000FFF00000000000000000FFF00000000000000001FFF80000000000000001 FFF80000000000000001FFF80000000000000003FFFC0000000000000003FFFC00000000 00000007FFFE0000000000000007FFFE0000000000000007FFFE000000000000000FFFFF 000000000000000F9FFF000000000000001F9FFF800000000000001F1FFF800000000000 001F0FFF800000000000003F0FFFC00000000000003E07FFC00000000000007E07FFE000 00000000007C07FFE00000000000007C03FFE0000000000000FC03FFF0000000000000F8 01FFF0000000000001F801FFF8000000000001F001FFF8000000000001F000FFF8000000 000003F000FFFC000000000003E0007FFC000000000007E0007FFE000000000007C0007F FE000000000007C0003FFE00000000000FC0003FFF00000000000F80001FFF0000000000 1F80001FFF80000000001F00000FFF80000000001F00000FFF80000000003F00000FFFC0 000000003E000007FFC0000000007E000007FFE0000000007FFFFFFFFFE0000000007FFF FFFFFFE000000000FFFFFFFFFFF000000000FFFFFFFFFFF000000001FFFFFFFFFFF80000 0001F0000000FFF800000001F0000000FFF800000003F0000000FFFC00000003E0000000 7FFC00000007E00000007FFE00000007C00000003FFE00000007C00000003FFE0000000F 800000003FFF0000000F800000001FFF0000001F800000001FFF8000001F000000000FFF 8000003F000000000FFFC000003E000000000FFFC000007E0000000007FFC000FFFFFF00 000FFFFFFFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFFFFF0 FFFFFF00000FFFFFFFF04C457CC455>65 DI<00000000FFF00000700000 001FFFFF0000F0000001FFFFFFE001F0000007FFFFFFF803F000003FFFFFFFFE07F00000 FFFFE001FF0FF00001FFFE00003F9FF00007FFF000000FFFF0000FFFC0000007FFF0001F FF00000003FFF0003FFE00000001FFF0007FFC00000000FFF000FFF8000000007FF001FF F0000000003FF003FFE0000000001FF007FFE0000000001FF007FFC0000000000FF00FFF 80000000000FF00FFF800000000007F01FFF000000000007F01FFF000000000003F03FFF 000000000003F03FFE000000000003F03FFE000000000003F07FFE000000000001F07FFE 000000000001F07FFE000000000001F07FFC00000000000000FFFC00000000000000FFFC 00000000000000FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC 00000000000000FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC 00000000000000FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC 000000000000007FFC000000000000007FFE000000000000007FFE000000000000F07FFE 000000000000F03FFE000000000000F03FFE000000000000F03FFF000000000000F01FFF 000000000001F01FFF000000000001E00FFF800000000001E00FFF800000000003E007FF C00000000003C007FFE00000000007C003FFE00000000007C001FFF0000000000F8000FF F8000000001F00007FFC000000003F00003FFE000000007E00001FFF80000000FC00000F FFC0000001F8000007FFF0000007F0000001FFFE00001FE0000000FFFFF001FF80000000 3FFFFFFFFF0000000007FFFFFFFC0000000001FFFFFFF000000000001FFFFF8000000000 0000FFF800000044467AC451>III73 D76 DI<00000007FFC0000000000000FFFFFE000000000007 FFFFFFC0000000001FFFFFFFF0000000007FFE00FFFC00000001FFF0001FFF00000007FF 800003FFC000000FFF000001FFE000001FFC0000007FF000003FF80000003FF800007FF0 0000001FFC0000FFF00000001FFE0001FFE00000000FFF0003FFC000000007FF8003FFC0 00000007FF8007FF8000000003FFC007FF8000000003FFC00FFF0000000001FFE00FFF00 00000001FFE01FFF0000000001FFF01FFE0000000000FFF03FFE0000000000FFF83FFE00 00000000FFF83FFE0000000000FFF87FFE0000000000FFFC7FFC00000000007FFC7FFC00 000000007FFC7FFC00000000007FFC7FFC00000000007FFCFFFC00000000007FFEFFFC00 000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00 000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00 000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFE7FFC00 000000007FFC7FFE0000000000FFFC7FFE0000000000FFFC7FFE0000000000FFFC3FFE00 00000000FFF83FFE0000000000FFF83FFF0000000001FFF81FFF0000000001FFF01FFF00 00000001FFF01FFF8000000003FFF00FFF8000000003FFE00FFF8000000003FFE007FFC0 00000007FFC003FFC000000007FF8003FFE00000000FFF8001FFF00000001FFF0000FFF8 0000003FFE00007FFC0000007FFC00003FFE000000FFF800001FFF000001FFF000000FFF C00007FFE0000007FFF0001FFFC0000001FFFE00FFFF00000000FFFFFFFFFE000000003F FFFFFFF80000000007FFFFFFC00000000000FFFFFE00000000000007FFC000000047467A C454>79 DI<0001FFE0000000001FFFFE000000007FFFFF80000001FFFF FFE0000003FE007FF8000007FC001FFC000007FE000FFE00000FFF0007FF00000FFF0007 FF00000FFF0003FF80000FFF0003FF80000FFF0003FF80000FFF0001FFC00007FE0001FF C00003FC0001FFC00000F00001FFC00000000001FFC00000000001FFC00000000001FFC0 0000000001FFC000000003FFFFC0000000FFFFFFC0000007FFFFFFC000003FFFF1FFC000 00FFFC01FFC00003FFE001FFC0000FFF8001FFC0001FFE0001FFC0003FFC0001FFC0003F F80001FFC0007FF80001FFC0007FF00001FFC000FFF00001FFC000FFE00001FFC000FFE0 0001FFC000FFE00001FFC000FFE00003FFC000FFE00003FFC000FFF00007FFC0007FF800 0FFFC0007FF8001FFFF0003FFE003EFFFFC01FFF80FC7FFFC007FFFFF87FFFC003FFFFE0 1FFFC0007FFF8007FFC0000FFC00000000322F7DAD36>97 D<007FC000000000FFFFC000 000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC00000000003FFC00000 000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000 0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 FFC00000000001FFC00000000001FFC00FF8000001FFC0FFFF800001FFC3FFFFE00001FF CFFFFFF80001FFDFC03FFC0001FFFF000FFE0001FFFC0003FF0001FFF80001FF8001FFF0 0001FFC001FFE00000FFE001FFC00000FFE001FFC000007FF001FFC000007FF001FFC000 007FF801FFC000003FF801FFC000003FF801FFC000003FF801FFC000003FFC01FFC00000 3FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003F FC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC 01FFC000003FF801FFC000003FF801FFC000007FF801FFC000007FF001FFC000007FF001 FFC000007FF001FFC00000FFE001FFE00000FFC001FFF00001FFC001FFF80003FF8001FF 7C0007FF0001FE3E000FFE0001FC1FC07FFC0001F80FFFFFF00001F003FFFFC00001E000 FFFF00000000001FF0000036467DC43E>I<00003FFC00000001FFFFC000000FFFFFF000 003FFFFFFC00007FF003FE0000FFC001FF0003FF8003FF0007FF0007FF8007FE0007FF80 0FFE0007FF801FFC0007FF801FFC0007FF803FF80007FF803FF80003FF007FF80001FE00 7FF8000078007FF0000000007FF000000000FFF000000000FFF000000000FFF000000000 FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000 FFF000000000FFF000000000FFF0000000007FF8000000007FF8000000007FF800000000 3FF8000000003FFC000003C03FFC000003C01FFE000007C00FFE000007800FFF00000F80 07FF80001F0003FFC0003E0001FFF0007C00007FFC03F800003FFFFFF000000FFFFFC000 0003FFFF000000003FF800002A2F7CAD32>I<0000000003FE0000000007FFFE00000000 07FFFE0000000007FFFE0000000007FFFE0000000007FFFE00000000001FFE0000000000 0FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000F FE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE 00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00 000000000FFE0000003FE00FFE000003FFFC0FFE00000FFFFF8FFE00003FFFFFCFFE0000 FFF807FFFE0001FFC001FFFE0003FF80007FFE0007FF00003FFE000FFE00001FFE000FFC 00000FFE001FFC00000FFE003FF800000FFE003FF800000FFE003FF800000FFE007FF800 000FFE007FF000000FFE007FF000000FFE00FFF000000FFE00FFF000000FFE00FFF00000 0FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000F FE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE007FF000000FFE 007FF000000FFE007FF000000FFE007FF800000FFE003FF800000FFE003FF800000FFE00 1FFC00001FFE001FFC00001FFE000FFE00003FFE0007FE00007FFE0003FF0000FFFF0001 FFC003FFFFFC00FFF01FEFFFFC007FFFFF8FFFFC001FFFFE0FFFFC0007FFF80FFFFC0000 7FC00FF80036467CC43E>I<00003FF800000003FFFF8000000FFFFFE000003FFFFFF000 007FF83FF80000FFC007FC0001FF8003FE0003FF0001FF0007FE0000FF800FFC0000FF80 1FFC00007FC01FF800007FC03FF800003FE03FF800003FE07FF800003FE07FF000003FE0 7FF000003FF07FF000001FF0FFF000001FF0FFF000001FF0FFFFFFFFFFF0FFFFFFFFFFF0 FFFFFFFFFFF0FFFFFFFFFFF0FFF000000000FFF000000000FFF000000000FFF000000000 FFF0000000007FF0000000007FF0000000007FF8000000007FF8000000003FF800000000 3FF8000000F01FFC000000F01FFC000001F00FFE000001E007FF000003E003FF800007C0 01FFC0000F8000FFF0003F00007FFE01FE00001FFFFFFC000007FFFFF0000001FFFFC000 00001FFE00002C2F7DAD33>I<000000FF8000000FFFE000007FFFF00001FFFFF80003FF 8FFC000FFE0FFE001FFC1FFE001FF81FFE003FF81FFE007FF01FFE007FF01FFE007FF00F FC00FFE00FFC00FFE003F000FFE000C000FFE0000000FFE0000000FFE0000000FFE00000 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000FF FFFFF800FFFFFFF800FFFFFFF800FFFFFFF800FFFFFFF80000FFE0000000FFE0000000FF E0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 0000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE0000000FFE0000000FFE000007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE0007FFF FFE00027467DC522>I<0000FFE0007E00000FFFFE03FF80003FFFFF8FFF8000FFFFFFFF FFC001FFC07FFF3FC003FF001FF83FC007FE000FFC3FC00FFC0007FE1F801FFC0007FF0F 001FF80003FF00001FF80003FF00003FF80003FF80003FF80003FF80003FF80003FF8000 3FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80001F F80003FF00001FF80003FF00001FFC0007FF00000FFC0007FE000007FE000FFC000003FF 001FF8000001FFC07FF0000003FFFFFFE0000003FFFFFF800000078FFFFE0000000780FF E00000000F8000000000000F8000000000000F8000000000000F8000000000000FC00000 0000000FE000000000000FF000000000000FFFFFFFC000000FFFFFFFFC000007FFFFFFFF 800007FFFFFFFFE00003FFFFFFFFF00001FFFFFFFFFC0000FFFFFFFFFC0003FFFFFFFFFE 000FFFFFFFFFFF001FF000007FFF003FC0000007FF007F80000001FF807F80000000FF80 FF00000000FF80FF000000007F80FF000000007F80FF000000007F80FF000000007F80FF 80000000FF807F80000000FF007FC0000001FF003FE0000003FE001FF0000007FC000FFE 00003FF80007FFC001FFF00001FFFFFFFFC000007FFFFFFF0000000FFFFFF8000000007F FF00000032427DAC38>I<007FC000000000FFFFC000000000FFFFC000000000FFFFC000 000000FFFFC000000000FFFFC00000000003FFC00000000001FFC00000000001FFC00000 000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000 0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 FFC007FE000001FFC03FFF800001FFC0FFFFE00001FFC1FFFFF80001FFC7F03FFC0001FF CF801FFC0001FFDF000FFE0001FFDE000FFE0001FFFC000FFE0001FFF80007FF0001FFF0 0007FF0001FFF00007FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF 0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFF FF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE37457CC43E>I<007C00 01FF0003FF8007FFC007FFC00FFFE00FFFE00FFFE00FFFE00FFFE007FFC007FFC003FF80 01FF00007C00000000000000000000000000000000000000000000000000000000000000 007FC07FFFC07FFFC07FFFC07FFFC07FFFC003FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC001FFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18467CC520>I<007F C000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC0 0000000003FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000 00000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000 000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000 0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0007FFFE0 01FFC0007FFFE001FFC0007FFFE001FFC0007FFFE001FFC0007FFFE001FFC0000FE00001 FFC0001FC00001FFC0003F000001FFC0007E000001FFC000FC000001FFC003F8000001FF C007E0000001FFC00FC0000001FFC01F80000001FFC07F00000001FFC0FE00000001FFC1 FC00000001FFC3FE00000001FFC7FE00000001FFDFFF00000001FFFFFF80000001FFFFFF C0000001FFFFFFC0000001FFF9FFE0000001FFE1FFF0000001FFC0FFF8000001FF807FF8 000001FF803FFC000001FF803FFE000001FF801FFF000001FF800FFF000001FF8007FF80 0001FF8007FFC00001FF8003FFE00001FF8001FFE00001FF8000FFF00001FF8000FFF800 01FF80007FFC0001FF80003FFC00FFFFFF03FFFFF8FFFFFF03FFFFF8FFFFFF03FFFFF8FF FFFF03FFFFF8FFFFFF03FFFFF835457DC43B>107 D<007FC000FFFFC000FFFFC000FFFF C000FFFFC000FFFFC00003FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000FFFFFF80FFFFFF80FFFF FF80FFFFFF80FFFFFF8019457CC420>I<007F8007FE00000FFC0000FFFF803FFFC0007F FF8000FFFF80FFFFF001FFFFE000FFFF81FFFFF803FFFFF000FFFF87F01FFC0FE03FF800 FFFF8FC00FFE1F801FFC0003FF9F000FFF3E001FFE0001FF9E0007FF3C000FFE0001FFBC 0007FF78000FFE0001FFF80003FFF00007FF0001FFF80003FFF00007FF0001FFF00003FF E00007FF0001FFE00003FFC00007FF0001FFE00003FFC00007FF0001FFE00003FFC00007 FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001 FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC000 03FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF80 0007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF 0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FF C00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003 FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF8000 07FF0001FFC00003FF800007FF0001FFC00003FF800007FF00FFFFFF81FFFFFF03FFFFFE FFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF 81FFFFFF03FFFFFE572D7CAC5E>I<007F8007FE0000FFFF803FFF8000FFFF80FFFFE000 FFFF81FFFFF800FFFF87F03FFC00FFFF8F801FFC0003FF9F000FFE0001FF9E000FFE0001 FFBC000FFE0001FFF80007FF0001FFF00007FF0001FFF00007FF0001FFE00007FF0001FF E00007FF0001FFE00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF 0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 01FFC00007FF00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFF FFFF83FFFFFE372D7CAC3E>I<00001FFC0000000001FFFFC000000007FFFFF00000001F FFFFFC0000007FF80FFF000000FFC001FF800001FF8000FFC00003FE00003FE00007FE00 003FF0000FFC00001FF8000FF800000FF8001FF800000FFC001FF800000FFC003FF80000 0FFE003FF0000007FE007FF0000007FF007FF0000007FF007FF0000007FF007FF0000007 FF00FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF 80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80 7FF0000007FF007FF0000007FF007FF0000007FF007FF0000007FF003FF800000FFE003F F800000FFE001FF800000FFC001FFC00001FFC000FFC00001FF80007FE00003FF00007FE 00003FF00003FF8000FFE00001FFC001FFC000007FF80FFF0000003FFFFFFE0000000FFF FFF800000001FFFFC0000000001FFC000000312F7DAD38>I<007FC00FF80000FFFFC0FF FF8000FFFFC3FFFFE000FFFFCFFFFFF800FFFFDFC03FFC00FFFFFF001FFE0003FFFC0007 FF0001FFF80003FF8001FFF00003FFC001FFE00001FFE001FFC00001FFE001FFC00000FF F001FFC00000FFF001FFC000007FF801FFC000007FF801FFC000007FF801FFC000007FF8 01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01 FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FF C000003FFC01FFC000003FFC01FFC000007FF801FFC000007FF801FFC000007FF801FFC0 00007FF001FFC00000FFF001FFC00000FFF001FFC00001FFE001FFE00001FFC001FFF000 03FFC001FFF80007FF8001FFFC000FFF0001FFFE001FFE0001FFDFC07FFC0001FFCFFFFF F00001FFC3FFFFC00001FFC0FFFF000001FFC01FF0000001FFC00000000001FFC0000000 0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 FFC000000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFF FF8000000036407DAC3E>I<007F807F00FFFF81FFE0FFFF83FFF0FFFF8FFFF8FFFF8F8F FCFFFF9F1FFE03FFBE1FFE01FFBC1FFE01FFF81FFE01FFF81FFE01FFF01FFE01FFF00FFC 01FFE007F801FFE001E001FFE0000001FFE0000001FFE0000001FFC0000001FFC0000001 FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FF C0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0 000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC00000FFFFFFE0 00FFFFFFE000FFFFFFE000FFFFFFE000FFFFFFE000272D7DAC2E>114 D<001FFC038000FFFF878003FFFFFF800FFFFFFF801FF003FF803FC000FF803F80003F80 7F00001F807E00001F80FE00000F80FE00000F80FE00000780FF00000780FF00000780FF 80000780FFE0000000FFFE0000007FFFF000007FFFFF00003FFFFFC0003FFFFFF0001FFF FFFC000FFFFFFE0003FFFFFF0001FFFFFF80007FFFFF80000FFFFFC000003FFFC0000003 FFE0000000FFE0F000003FE0F000003FE0F800001FE0F800000FE0F800000FE0FC00000F E0FC00000FE0FE00000FC0FF00001FC0FF00001FC0FF80003F80FFE0007F00FFF803FE00 FFFFFFFC00FCFFFFF800F03FFFE000E007FE0000232F7CAD2C>I<0001E000000001E000 000001E000000001E000000001E000000003E000000003E000000003E000000003E00000 0007E000000007E00000000FE00000000FE00000001FE00000001FE00000003FE0000000 7FE0000000FFE0000003FFE000000FFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFF FFFF8000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 0000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000 00FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000 FFE001E000FFE001E000FFE003E000FFF003C0007FF003C0007FF007C0003FF80F80001F FC1F00000FFFFF000007FFFC000001FFF80000003FE00023407EBE2C>I<007FC00001FF 00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF00 03FFC0000FFF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 FF0001FFC00007FF0001FFC0000FFF0001FFC0000FFF0001FFC0001FFF0001FFC0001FFF 0001FFC0003FFF0000FFC0003FFF0000FFE0007FFF80007FE001F7FFFE007FF807E7FFFE 003FFFFFC7FFFE000FFFFF07FFFE0003FFFE07FFFE00007FF007FC00372E7CAC3E>II120 D E /Fe 34 122 df<7FFFFE7FFFFE7FFFFE FFFFFEFFFFFE1705799521>45 D<00000000001C000000000000003C000000000000007C 000000000000007C00000000000000FC00000000000000FC00000000000001FC00000000 000003FC00000000000003FC00000000000007FC00000000000007FC0000000000000FFE 0000000000000FFE0000000000001DFE0000000000001DFE00000000000039FE00000000 000079FE00000000000071FE000000000000E1FE000000000000E1FE000000000001C1FE 000000000001C1FE00000000000381FE00000000000781FE00000000000701FE00000000 000E01FE00000000000E01FE00000000001C01FF00000000001C01FF00000000003800FF 00000000003800FF00000000007000FF0000000000F000FF0000000000E000FF00000000 01C000FF0000000001C000FF00000000038000FF00000000038000FF00000000070000FF 000000000F0000FF000000000E0000FF000000001C0000FF000000001FFFFFFF00000000 3FFFFFFF800000003FFFFFFF800000007000007F800000007000007F80000000E000007F 80000001E000007F80000001C000007F800000038000007F800000038000007F80000007 0000007F800000070000007F8000000E0000007F8000001E0000007F8000001C0000007F 8000003C0000007F800000780000007F800000F80000007FC00001FC0000007FC00007FE 000001FFC000FFFFE0007FFFFF80FFFFE0007FFFFF80FFFFC0007FFFFF8039417BC044> 65 D<00000000FF8001C00000000FFFE001C00000003FFFF80380000000FF807E078000 0003FC001F0F8000000FF000071F8000001FC00007BF0000007F800003FF000000FF0000 01FF000001FE000001FF000003F8000000FE000007F0000000FE00000FF0000000FE0000 1FE00000007E00003FC00000007C00007F800000007C0000FF800000007C0000FF000000 007C0001FE00000000780003FE00000000780003FC00000000780007FC00000000780007 F80000000070000FF80000000070000FF80000000070001FF00000000070001FF0000000 0000003FE00000000000003FE00000000000003FE00000000000007FE00000000000007F C00000000000007FC00000000000007FC0000000000000FFC0000000000000FF80000000 000000FF80000000000000FF80000000000000FF80000000000000FF00000000000000FF 00000000000000FF000000000F0000FF000000000F0000FF000000000E0000FF00000000 0E0000FF000000001E0000FF000000001C0000FF000000003C0000FF00000000380000FF 000000007800007F000000007000007F80000000F000007F80000001E000003F80000001 C000003FC0000003C000001FC00000078000001FE000000F0000000FE000001E00000007 F000003C00000003F80000F800000001FC0001F000000000FE0007C0000000007FC03F80 000000001FFFFE000000000007FFF0000000000000FF80000000003A4272BF41>67 D<0001FFFFFFFFFFF00001FFFFFFFFFFF00001FFFFFFFFFFF0000003FE00003FF0000003 FE00000FF0000003FC000003F0000003FC000003F0000003FC000001E0000007FC000001 E0000007F8000001E0000007F8000001E0000007F8000001E000000FF8000001E000000F F0000001E000000FF0000001C000000FF0000001C000001FF0000001C000001FE0000001 C000001FE0007001C000001FE000F003C000003FE000E0038000003FC000E0000000003F C000E0000000003FC001E0000000007FC001C0000000007F8003C0000000007F8003C000 0000007F8007C000000000FF801F8000000000FFFFFF8000000000FFFFFF8000000000FF FFFF8000000001FF003F0000000001FE001F0000000001FE000F0000000001FE000F0000 000003FE000E0000000003FC000E0000000003FC000E0000000003FC001E0000000007FC 001C0000000007F8001C0000000007F8001C0000000007F80000000000000FF800000000 00000FF00000000000000FF00000000000000FF00000000000001FF00000000000001FE0 0000000000001FE00000000000001FE00000000000003FE00000000000003FC000000000 00003FC00000000000007FC00000000000007FC00000000000007F80000000000000FFC0 0000000000FFFFFFE000000000FFFFFFE000000000FFFFFFE0000000003C3E7BBD3B>70 D<00000000FF8000E000000007FFF000E00000003FFFFC01C0000000FFC03E03C0000003 FC000F07C000000FF000078FC000001FE00003DF8000007F800001FF800000FF000000FF 800001FE000000FF800003FC0000007F000007F80000007F00000FF00000007F00001FE0 0000003F00003FC00000003E00007F800000003E0000FF800000003E0000FF000000003E 0001FE000000003C0003FE000000003C0003FC000000003C0007FC000000003C0007F800 00000038000FF80000000038000FF80000000038001FF00000000038001FF00000000000 003FE00000000000003FE00000000000003FE00000000000007FE00000000000007FC000 00000000007FC00000000000007FC0000000000000FFC0000000000000FF800000000000 00FF80000000000000FF80000000000000FF800001FFFFFE00FF000001FFFFFE00FF0000 01FFFFFE00FF00000000FF8000FF00000000FF8000FF00000000FF0000FF00000000FF00 00FF00000001FF0000FF00000001FF0000FF00000001FE0000FF00000001FE0000FF0000 0003FE00007F00000003FE00007F80000003FC00007F80000003FC00003F80000007FC00 003FC0000007FC00001FC0000007F800001FE000000FF800000FF000001FF8000007F000 003FF8000003F800007BF0000001FE0000F1F0000000FF0003E0F00000003FE01F80F000 00001FFFFF006000000007FFF80000000000007FC0000000003B4273BF46>I<0001FFFF FF01FFFFFF0003FFFFFF03FFFFFF0003FFFFFF03FFFFFF000003FF000003FF00000003FE 000003FE00000003FC000003FC00000003FC000003FC00000003FC000007FC00000007FC 000007FC00000007F8000007F800000007F8000007F800000007F800000FF80000000FF8 00000FF80000000FF000000FF00000000FF000000FF00000000FF000001FF00000001FF0 00001FF00000001FE000001FE00000001FE000001FE00000001FE000003FE00000003FE0 00003FE00000003FC000003FC00000003FC000003FC00000003FC000007FC00000007FC0 00007FC00000007F8000007F800000007F8000007F800000007F800000FF80000000FFFF FFFFFF80000000FFFFFFFFFF00000000FFFFFFFFFF00000000FF000001FF00000001FF00 0001FF00000001FE000001FE00000001FE000001FE00000001FE000003FE00000003FE00 0003FE00000003FC000003FC00000003FC000003FC00000003FC000007FC00000007FC00 0007FC00000007F8000007F800000007F8000007F800000007F800000FF80000000FF800 000FF80000000FF000000FF00000000FF000000FF00000000FF000001FF00000001FF000 001FF00000001FE000001FE00000001FE000001FE00000001FE000003FE00000003FE000 003FE00000003FC000003FC00000003FC000003FC00000007FC000007FC00000007FC000 007FC00000007F8000007F80000000FFC00000FFC00000FFFFFF80FFFFFF8000FFFFFF80 FFFFFF8000FFFFFF80FFFFFF8000483E7BBD44>I<0001FFFFFF0003FFFFFF0003FFFFFF 000003FF00000003FE00000003FC00000003FC00000003FC00000007FC00000007F80000 0007F800000007F80000000FF80000000FF00000000FF00000000FF00000001FF0000000 1FE00000001FE00000001FE00000003FE00000003FC00000003FC00000003FC00000007F C00000007F800000007F800000007F80000000FF80000000FF00000000FF00000000FF00 000001FF00000001FE00000001FE00000001FE00000003FE00000003FC00000003FC0000 0003FC00000007FC00000007F800000007F800000007F80000000FF80000000FF0000000 0FF00000000FF00000001FF00000001FE00000001FE00000001FE00000003FE00000003F C00000003FC00000007FC00000007FC00000007F80000000FFC00000FFFFFF8000FFFFFF 8000FFFFFF8000283E7BBD23>I<0001FFFFFF0007FFFE0001FFFFFF000FFFFE0001FFFF FE000FFFFE000003FF000001FFE0000003FE000000FF00000003FC000000FC00000003FC 000001F800000003FC000001E000000007FC000003C000000007F800000F8000000007F8 00001F0000000007F800003C000000000FF8000078000000000FF00000F0000000000FF0 0001E0000000000FF00007C0000000001FF0000F00000000001FE0001E00000000001FE0 003C00000000001FE0007800000000003FE000F000000000003FC003E000000000003FC0 078000000000003FC00F0000000000007FC01F0000000000007F803F0000000000007F80 FF8000000000007F81FF800000000000FF83FF800000000000FF07FFC00000000000FF0F 7FC00000000000FF1E3FC00000000001FF7C3FE00000000001FEF83FE00000000001FFE0 1FE00000000001FFC01FF00000000003FF801FF00000000003FF000FF00000000003FE00 0FF80000000003FC000FF80000000007FC0007F80000000007F80007FC0000000007F800 07FC0000000007F80003FC000000000FF80003FE000000000FF00003FE000000000FF000 01FE000000000FF00001FF000000001FF00001FF000000001FE00000FF800000001FE000 00FF800000001FE000007F800000003FE000007FC00000003FC000007FC00000003FC000 003FC00000007FC000003FE00000007FC000003FE00000007F8000003FF0000000FFC000 007FF80000FFFFFF800FFFFFC000FFFFFF800FFFFFC000FFFFFF800FFFFF8000473E7BBD 46>75 D<0001FFFFFFC0000001FFFFFFC0000001FFFFFF8000000003FF000000000003FE 000000000003FC000000000003FC000000000003FC000000000007FC000000000007F800 0000000007F8000000000007F800000000000FF800000000000FF000000000000FF00000 0000000FF000000000001FF000000000001FE000000000001FE000000000001FE0000000 00003FE000000000003FC000000000003FC000000000003FC000000000007FC000000000 007F8000000000007F8000000000007F800000000000FF800000000000FF000000000000 FF000000000000FF000000000001FF000000000001FE000000000001FE000000000001FE 000000000003FE000000000003FC000000000003FC000000C00003FC000001E00007FC00 0001C00007F8000001C00007F8000003C00007F800000380000FF800000380000FF00000 0780000FF000000700000FF000000F00001FF000000F00001FE000001E00001FE000001E 00001FE000003E00003FE000007C00003FC00000FC00003FC00001FC00007FC00003F800 007FC00007F800007F80001FF80000FF8000FFF000FFFFFFFFFFF000FFFFFFFFFFF000FF FFFFFFFFE000333E7BBD39>I<0001FFFE00000FFFFF0003FFFF00001FFFFF0003FFFF00 001FFFFF000001FF800000FFC0000003FF8000003F00000003FF8000003E00000003FFC0 00001C00000003FFC000003C00000007BFC000003C000000073FE0000038000000071FE0 000038000000071FE00000780000000F1FF00000780000000E0FF00000700000000E0FF8 0000700000000E0FF80000F00000001E07F80000F00000001C07FC0000E00000001C07FC 0000E00000001C03FC0001E00000003C03FE0001E00000003801FE0001C00000003801FE 0001C00000003801FF0003C00000007800FF0003C00000007000FF8003800000007000FF 80038000000070007F800780000000F0007FC00780000000E0003FC00700000000E0003F C00700000000E0003FE00F00000001E0001FE00F00000001C0001FF00E00000001C0001F F00E00000001C0000FF01E00000003C0000FF81E0000000380000FF81C00000003800007 F81C00000003800007FC3C00000007800003FC3C00000007000003FC3800000007000003 FE3800000007000001FE780000000F000001FF780000000E000001FF700000000E000000 FF700000000E000000FFF00000001E000000FFF00000001C0000007FE00000001C000000 7FE00000001C0000003FE00000003C0000003FE0000000380000003FC000000038000000 1FC0000000780000001FC0000000F80000001FC0000001FC0000000F80000007FE000000 0F800000FFFFF0000007800000FFFFF0000007800000FFFFF0000007000000483E7BBD44 >78 D<0001FFFFFFFF80000001FFFFFFFFF0000001FFFFFFFFFC00000003FE0003FE0000 0003FE0000FF00000003FC00007F80000003FC00003FC0000007FC00001FC0000007FC00 001FE0000007F800001FE0000007F800001FE000000FF800001FF000000FF800001FF000 000FF000001FF000000FF000001FF000001FF000001FF000001FF000003FE000001FE000 003FE000001FE000003FE000003FE000003FC000003FE000007FC000003FC000007F8000 003FC000007F8000007FC00000FF0000007FC00000FE0000007F800001FC0000007F8000 03F8000000FF800007F0000000FF80000FE0000000FF00003FC0000000FF0001FF000000 01FFFFFFFC00000001FFFFFFE000000001FE00000000000001FE00000000000003FE0000 0000000003FE00000000000003FC00000000000003FC00000000000007FC000000000000 07FC00000000000007F800000000000007F80000000000000FF80000000000000FF80000 000000000FF00000000000000FF00000000000001FF00000000000001FF0000000000000 1FE00000000000001FE00000000000003FE00000000000003FE00000000000003FC00000 000000003FC00000000000007FC00000000000007FC00000000000007F80000000000000 FFC00000000000FFFFFF8000000000FFFFFF8000000000FFFFFF80000000003C3E7BBD3E >80 D<0000000FF001C00000007FFE01C0000001FFFF0380000007F80FC78000000FC003 EF8000001F8001FF8000003F0000FF0000007E00007F000000FC00007F000001F800007F 000003F000003E000003F000003E000007E000003E000007E000003E00000FE000003C00 000FC000003C00000FC000003C00000FC000003C00001FC000003800001FC00000380000 1FC000003800001FE000003800001FE000000000001FF000000000001FF000000000001F FC00000000000FFF00000000000FFFF0000000000FFFFE0000000007FFFFC000000003FF FFF000000001FFFFFC00000000FFFFFE000000003FFFFE000000000FFFFF0000000001FF FF80000000001FFF800000000003FF800000000000FFC000000000007FC000000000003F C000000000003FC000000000001FC000000000001FC000070000001FC0000F0000001FC0 000F0000001F80000E0000001F80000E0000001F80001E0000003F80001E0000003F0000 1E0000003F00001E0000003E00003E0000007E00003E0000007C00003F000000FC00003F 000001F800007F800001F000007F800003E000007FC00007C000007DE0001F800000F8F8 003F000000F87F00FE000000F03FFFF8000000E00FFFE0000000C000FF0000000032427A BF33>83 D<01FFFFFFFFFFFF01FFFFFFFFFFFF03FFFFFFFFFFFF03FE001FF001FF03F800 1FE0007F07E0001FE0003E07C0003FE0001E0780003FE0001E0F00003FC0001E0F00003F C0001E1E00007FC0001E1E00007FC0001E1C00007F80001C3C00007F80001C380000FF80 001C380000FF80001C780000FF00001C700000FF00001C700001FF00003CF00001FF0000 38E00001FE000038000001FE000000000003FE000000000003FE000000000003FC000000 000003FC000000000007FC000000000007FC000000000007F8000000000007F800000000 000FF800000000000FF800000000000FF000000000000FF000000000001FF00000000000 1FF000000000001FE000000000001FE000000000003FE000000000003FE000000000003F C000000000003FC000000000007FC000000000007FC000000000007F8000000000007F80 0000000000FF800000000000FF800000000000FF000000000000FF000000000001FF0000 00000001FF000000000001FE000000000001FE000000000003FE000000000003FE000000 000003FC00000000000FFE000000003FFFFFFF8000007FFFFFFF8000007FFFFFFF800000 383D71BC41>I<00007E00000001FF80000007C1C380001F80EFC0003F00FFC0007E007F C000FC007F8001F8003F8003F0003F8003F0003F8007E0003F000FE0003F000FC0003F00 1FC0007F001FC0007E003F80007E003F80007E003F8000FE007F8000FC007F0000FC007F 0000FC007F0001FC00FF0001F800FE0001F800FE0001F800FE0003F800FE0003F038FC00 03F038FC0003F038FC0007F038FC0007E078FC000FE0707C000FE0707C001FE0F07E003F E0E03E007FE0E03E00F3E1E01F01E3E1C00F8781E38003FF00FF0000FC003E00252977A7 2E>97 D<001FC0000FFFC0000FFF80000FFF8000003F8000003F8000003F0000003F0000 007F0000007F0000007E0000007E000000FE000000FE000000FC000000FC000001FC0000 01FC000001F8000001F8000003F8000003F8000003F0000003F07E0007F1FF8007F783E0 07EF01F007FE01F00FF800F80FF800F80FF000FC0FE0007C1FC0007C1FC0007E1F80007E 1F8000FE3F8000FE3F8000FE3F0000FE3F0000FE7F0001FE7F0001FC7E0001FC7E0001FC 7E0003FCFE0003F8FC0003F8FC0003F8FC0007F0FC0007F0FC0007E0F8000FE0F8000FC0 F8001FC0F8001F8078003F007C003F007C007E003C00FC003E01F8001E03E0000F07C000 07FF000001F800001F4076BE2A>I<00001FE0000000FFF8000003F03E000007C00F0000 1F800700003F000780007E001F8000FC007F8001F8007F8003F0007F8007F0007F0007E0 007F000FE0007E001FC00000001FC00000003F800000003F800000003F800000007F8000 00007F000000007F000000007F00000000FF00000000FE00000000FE00000000FE000000 00FE00000000FE00000000FE00000000FC000003007E000007007E00000F007E00001E00 3E00003C003E000078001F0000F0001F0003E0000F800F800003E07E000001FFF8000000 3FC00000212977A72A>I<000000003F800000001FFF800000001FFF000000001FFF0000 0000007F00000000007F00000000007E00000000007E0000000000FE0000000000FE0000 000000FC0000000000FC0000000001FC0000000001FC0000000001F80000000001F80000 000003F80000000003F80000000003F00000000003F00000000007F00000000007F00000 000007E00000007E07E0000001FF8FE0000007C1CFE000001F80EFC000003F00FFC00000 7E007FC00000FC007FC00001F8003F800003F0003F800003F0003F800007E0003F80000F E0003F00000FC0003F00001FC0007F00001FC0007F00003F80007E00003F80007E00003F 8000FE00007F8000FE00007F0000FC00007F0000FC00007F0001FC0000FF0001FC0000FE 0001F80000FE0001F80000FE0003F80000FE0003F83800FC0003F03800FC0003F03800FC 0007F03800FC0007F07800FC000FE070007C000FE070007C001FE0F0007E003FE0E0003E 007FE0E0003E00F3E1E0001F01E3E1C0000F8781E3800003FF00FF000000FC003E000029 4077BE2E>I<00003F800001FFE00007E0F8001F803C003E003C00FC001E01F8001E03F0 001E07F0001E0FE0003E0FC0003C1FC0003C3F80007C3F8000F83F8003F07F000FE07F00 FF80FFFFFC00FFFFC000FE000000FE000000FE000000FE000000FC000000FC000000FC00 0000FC000000FC000000FC000000FC000006FC00000EFC00001E7C00003C7C0000783E00 00F03E0001E01F0007C00F801F0007C0FC0001FFF000007F80001F2976A72A>I<000000 007C0000000001FF0000000007C7800000000F83C00000001F87C00000001F1FC0000000 3F3FC00000003F3FC00000007E3FC00000007E3FC00000007E3F800000007E0E00000000 FC0000000000FC0000000000FC0000000000FC0000000001FC0000000001F80000000001 F80000000001F80000000001F80000000003F80000000003F00000000003F00000000003 F000000003FFFFF8000003FFFFF8000003FFFFF800000007E00000000007E00000000007 E0000000000FE0000000000FC0000000000FC0000000000FC0000000000FC0000000000F C0000000001FC0000000001F80000000001F80000000001F80000000001F80000000003F 80000000003F00000000003F00000000003F00000000003F00000000007F00000000007E 00000000007E00000000007E00000000007E0000000000FE0000000000FC0000000000FC 0000000000FC0000000000FC0000000001FC0000000001F80000000001F80000000001F8 0000000001F80000000003F00000000003F00000000003F00000000003F00000000007E0 0000000007E00000000007E00000000007E0000000000FC00000001E0FC00000007F0FC0 0000007F0F80000000FF0F80000000FF1F00000000FF1F00000000FE1E00000000F83C00 000000703C000000007878000000003FE0000000000F80000000002A5383BF1C>I<0000 03F00000000FFC0000003E0E1C0000FC077E0001F003FE0003F003FE0007E001FE000FC0 01FC001F8001FC001F8001FC003F0001FC007F0001F8007E0001F800FE0003F800FE0003 F801FC0003F001FC0003F001FC0007F003FC0007F003F80007E003F80007E003F8000FE0 07F8000FE007F0000FC007F0000FC007F0001FC007F0001FC007F0001F8007E0001F8007 E0003F8003E0003F8003E0007F0003F000FF0003F000FF0001F001FF0000F003FE0000F8 0F7E00007C1EFE00001FF8FE000007E0FC00000000FC00000001FC00000001FC00000001 F800000001F800000003F800000003F800000003F0001C0007F0007F0007E000FF000FE0 00FF000FC000FF001F8000FF003F0000FE007E0000F800FC00007C03F000001FFFC00000 03FE000000273B7CA72A>I<0001FC000000FFFC000000FFF8000000FFF800000003F800 000003F800000003F000000003F000000007F000000007F000000007E000000007E00000 000FE00000000FE00000000FC00000000FC00000001FC00000001FC00000001F80000000 1F800000003F800000003F800000003F000000003F03F800007F0FFE00007F3E0F80007E 780FC0007EE007C000FFC007E000FF8007E000FF0007E000FF0007E001FE0007E001FC00 07E001FC0007E001F80007E003F8000FE003F8000FC003F0000FC003F0000FC007F0001F C007F0001F8007E0001F8007E0001F800FE0003F800FE0003F000FC0003F000FC0007F00 1FC0007E001FC000FE071F8000FC071F8000FC073F8001FC0F3F8001F80E3F0001F80E3F 0001F81E7F0001F01C7F0001F01C7E0001F0387E0001F038FE0001F070FE0000F0E0FC00 007FC03800001F0028407ABE2E>I<0000780001FC0001FC0003FC0003FC0003FC0003F8 0000E0000000000000000000000000000000000000000000000000000000000000000000 000000000000007C0001FF00038F800707800E07C01E07C01C07C03C0FC0380FC0380FC0 781FC0701F80701F80F03F80F03F00003F00007F00007E0000FE0000FC0000FC0001FC00 01F80001F80003F80003F00003F03807F03807E0380FE0780FC0700FC0700FC0F00F80E0 0F80E00F81C00F83C00F838007870003FE0000F800163E79BC1C>I<0001FC000000FFFC 000000FFF8000000FFF800000003F800000003F800000003F000000003F000000007F000 000007F000000007E000000007E00000000FE00000000FE00000000FC00000000FC00000 001FC00000001FC00000001F800000001F800000003F800000003F800000003F00000000 3F0003E0007F000FF8007F003C3C007E00707C007E00E1FC00FE01C1FC00FE0383FC00FC 0703FC00FC0E03FC01FC1C03F801FC3800E001F870000001F860000003F8E0000003F9C0 000003F780000003FE00000007FE00000007FFE0000007E7F8000007E0FE00000FE07F00 000FE03F80000FC01F80000FC00FC0001FC00FC0001FC00FC0701F800FC0701F800FC070 3F800FC0F03F801FC0E03F001F80E03F001F80E07F001F81E07F001F81C07E000F83C07E 000F8380FE000F8780FE00078F00FC0003FE00380000F80026407ABE2A>107 D<0007F003FFF003FFE003FFE0000FE0000FE0000FC0000FC0001FC0001FC0001F80001F 80003F80003F80003F00003F00007F00007F00007E00007E0000FE0000FE0000FC0000FC 0001FC0001FC0001F80001F80003F80003F80003F00003F00007F00007F00007E00007E0 000FE0000FE0000FC0000FC0001FC0001FC0001F80001F80003F80003F80003F00003F00 007F00007F07007E07007E0700FE0F00FE0E00FC0E00FC0E00FC1E00FC1C00FC1C007C38 007C78003C70001FE000078000144079BE17>I<01F0003F80007F000007FC01FFE003FF C0000F3E07C1F80F83F0000E1F0F00FC1E01F8001E1F1C007C3800F8001C1F38007E7000 FC003C1FF0007EE000FC00381FF0007FE000FC00381FE0007FC000FC00783FC0007F8000 FC00703FC0007F8000FC00703F80007F0000FC00703F00007E0000FC00F03F0000FE0001 FC00F07F0000FC0001F800007E0000FC0001F800007E0000FC0001F800007E0001FC0003 F80000FE0001FC0003F00000FC0001F80003F00000FC0001F80003F00000FC0003F80007 F00001FC0003F80007E00001F80003F00007E00001F80003F0000FE00001F80007F0000F C00003F80007F0001FC0E003F00007E0001F80E003F00007E0001F80E003F0000FE0003F 81E007F0000FE0003F01C007E0000FC0003F01C007E0000FC0003F01C007E0001FC0003E 03800FE0001FC0003E03800FC0001F80003E07000FC0001F80003E07000FC0003F80003E 0E001FC0003F80001E1C001F80003F00000FF8000700000E000003E000432979A74A>I< 01F0003F800007FC01FFE0000F3E07C1F8000E1F0F00FC001E1F1C007C001C1F38007E00 3C1FF0007E00381FF0007E00381FE0007E00783FC0007E00703FC0007E00703F80007E00 703F00007E00F03F0000FE00F07F0000FC00007E0000FC00007E0000FC00007E0001FC00 00FE0001F80000FC0001F80000FC0001F80000FC0003F80001FC0003F00001F80003F000 01F80007F00001F80007E00003F8000FE07003F0000FC07003F0000FC07003F0001FC0F0 07F0001F80E007E0001F80E007E0001F81E007E0001F01C00FE0001F01C00FC0001F0380 0FC0001F03800FC0001F07001FC0000F0E001F800007FC0007000001F0002C2979A733> I<00001FC0000000FFF8000003F07C00000FC01F00001F801F00003F000F80007E000FC0 00FC0007C001F80007E003F00007E007F00007E007E00007E00FE00007F01FC00007F01F C00007F03F800007F03F800007F03F80000FE07F80000FE07F00000FE07F00000FE07F00 001FE0FF00001FC0FE00001FC0FE00001FC0FE00003F80FE00003F80FE00007F00FE0000 7F00FC00007E007C0000FC007E0001FC007E0001F8007E0003F0003E0007E0001F000FC0 001F001F80000F803E000007C0FC000001FFF00000003F800000242977A72E>I<0003E0 01F800000FF807FE00001E7C1E0F80001C3E3C07C0003C3E7807C000383EE003E000783F E003E000703FC003F000703F8001F000F07F0001F000E07F0001F800E07E0001F800E07E 0003F801E0FE0003F801E0FE0003F80000FC0003F80000FC0003F80001FC0007F80001FC 0007F00001F80007F00001F80007F00003F8000FF00003F8000FE00003F0000FE00003F0 000FE00007F0001FC00007F0001FC00007E0001F800007E0003F80000FE0003F00000FE0 007F00000FE0007E00000FE000FC00001FE000FC00001FE001F800001FF003F000001FF0 07E000003FB80F8000003F9C1F0000003F0FFC0000003F03E00000007F00000000007F00 000000007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC00 00000001FC0000000001FC0000000001F80000000001F80000000003F80000000003F800 0000007FFFE0000000FFFFE0000000FFFFE00000002D3A80A72E>I<01F000FC0007FC07 FF800F3E0F03C00E1F1C03E01E1F380FE01C1F700FE03C1FE01FE0381FE01FE0381FC01F E0783FC01FC0703F800700703F800000703F000000F03F000000F07F000000007E000000 007E000000007E00000000FE00000000FC00000000FC00000000FC00000001FC00000001 F800000001F800000001F800000003F800000003F000000003F000000003F000000007F0 00000007E000000007E000000007E00000000FE00000000FC00000000FC00000000FC000 00001FC00000001F800000000700000000232979A726>114 D<00007F800001FFE00007 C0F8001F003C003E001C003C001E007C003E00F8007E00F800FE00F800FE01F800FC01F8 00FC01F8007001FC000001FE000001FFC00001FFFC0000FFFF0000FFFF80007FFFC0003F FFE0000FFFF00000FFF000000FF0000007F0000003F00C0003F03F0003F07F8001F07F80 03F0FF0003E0FF0003E0FF0003E0FC0007C0F0000F8070000F8078001F003C003C001F01 F80007FFE00000FF00001F297AA725>I<0001C0000003F0000007F0000007F0000007E0 000007E000000FE000000FE000000FC000000FC000001FC000001FC000001F8000001F80 00003F8000003F8000003F0000003F00007FFFFF80FFFFFF80FFFFFF00007E000000FE00 0000FE000000FC000000FC000001FC000001FC000001F8000001F8000003F8000003F800 0003F0000003F0000007F0000007F0000007E0000007E000000FE000000FE000000FC000 000FC000001FC000001FC01C001F801C001F801C003F803C003F8038003F0078003F0070 003F00F0003F00E0003F01C0001F03C0001F0780000F0F000007FC000001F00000193A78 B81E>I<007C0000000001FF00001C00038F80007E00070780007E000E07C0007E001E07 C000FE001C07C000FE003C0FC000FC00380FC000FC00380FC001FC00781FC001FC00701F 8001F800701F8001F800F03F8003F800F03F0003F800003F0003F000007F0003F000007E 0007F000007E0007F00000FE0007E00000FC0007E00000FC000FE00001FC000FE00001F8 000FC00001F8000FC00001F8001FC00003F8001FC1C003F0001F81C003F0001F81C003F0 003F81C003F0003F83C003F0003F038003F0003F038003F0007F078001F000FF070001F0 01FF070001F801DF0F0000F8079F0E00007C0F0F1C00001FFC07F8000007F001F0002A29 79A731>I<007C0001C001FF0007F0038F8007F007078007F00E07C007F81E07C007F81C 07C003F83C0FC003F8380FC001F0380FC001F0781FC000F0701F8000F0701F8000F0F03F 8000F0F03F0000E0003F0000E0007F0000E0007E0001E0007E0001C000FE0001C000FC00 01C000FC0003C001FC00038001F800038001F800038001F800070003F800070003F0000F 0003F0000E0003F0000E0003F0001C0003F0001C0003F000380003F000780001F0007000 01F800E00000F801C00000FC038000007E0F0000001FFE00000003F00000252979A72A> I<007C00000001FF000038038F8000FC07078000FC0E07C000FC1E07C001FC1C07C001F8 3C0FC001F8380FC001F8380FC003F8781FC003F0701F8003F0701F8003F0F03F8007F0F0 3F0007E0003F0007E0007F0007E0007E000FE0007E000FC000FE000FC000FC000FC000FC 001FC001FC001FC001F8001F8001F8001F8001F8003F8003F8003F0003F0003F0003F000 3F0003F0007F0003F0007E0003F0007E0003F0007E0003F000FE0003F000FC0001F001FC 0001F803FC0000F807FC00007C1FF800003FF9F8000007E1F800000003F800000003F000 000003F000000007F0000E0007E0003F8007E0007F800FC0007F800FC0007F801F8000FF 001F0000FF003E00007C007E00007000FC00007801F000003803E000001E0FC000000FFF 00000003F8000000263B79A72C>121 D E /Ff 5 104 df<600000000060F800000000F0 FC00000001F07E00000003F03F00000007E01F8000000FC00FC000001F8007E000003F00 03F000007E0001F80000FC0000FC0001F800007E0003F000003F0007E000001F800FC000 000FC01F80000007E03F00000003F07E00000001F8FC00000000FDF8000000007FF00000 00003FE0000000001FC0000000001FC0000000003FE0000000007FF000000000FDF80000 0001F8FC00000003F07E00000007E03F0000000FC01F8000001F800FC000003F0007E000 007E0003F00000FC0001F80001F80000FC0003F000007E0007E000003F000FC000001F80 1F8000000FC03F00000007E07E00000003F0FC00000001F0F800000000F0600000000060 2C2C73AC47>2 D<0003C0000003C0000003E0000003C0000003C0000003C0000003C000 0003C0000003C000F003C00FFC03C03FFE03C07FFF03C0FF3FC3C3FC0FE187F003F18FC0 00FDBF00003FFC00000FF0000003C000000FF000003FFC0000FDBF0003F18FC00FE187F0 3FC3C3FCFF03C0FFFE03C07FFC03C03FF003C00F0003C0000003C0000003C0000003C000 0003C0000003C0000003E0000003C0000003C00020277AA92D>I<000FFC0000003FFF00 0000FFFFC00003FFFFF00007FFFFF8000FFFFFFC001FFFFFFE003FFFFFFF003FFFFFFF00 7FFFFFFF807FFFFFFF807FFFFFFF80FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FF FFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC07FFFFFFF807FFF FFFF807FFFFFFF803FFFFFFF003FFFFFFF001FFFFFFE000FFFFFFC0007FFFFF80003FFFF F00000FFFFC000003FFF0000000FFC000022227BA72D>15 D<0000003F000003FF00000F E000003F8000007E000001FC000001F8000003F0000003F0000007E0000007E0000007E0 000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 000007E0000007E0000007E0000007E0000007E0000007E0000007E000000FE000000FC0 00001FC000003F8000003F000000FE000003F800007FE00000FF0000007FE0000003F800 0000FE0000003F0000003F8000001FC000000FC000000FE0000007E0000007E0000007E0 000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 000007E0000007E0000007E0000007E0000007E0000007E0000007E0000003F0000003F0 000001F8000001FC0000007E0000003F8000000FE0000003FF0000003F205B7AC32D> 102 DI E /Fg 22 120 df<7FFFFFFFF07FFFFFFFF0FFFFFFFF F8FFFFFFFFF8FFFFFFFFF87FFFFFFFF07FFFFFFFF025077B9E30>45 D<0F003FC07FE07FE0FFF0FFF0FFF0FFF07FE07FE03FC00F000C0C6E8B30>I<00007F00 00000000FF8000000000FF8000000001FFC000000001FFC000000001FFC000000001FFC0 00000003FFE000000003F7E000000003F7E000000003F7E000000003F7E000000007F7F0 00000007E3F000000007E3F000000007E3F00000000FE3F80000000FE3F80000000FE3F8 0000000FC1F80000000FC1F80000001FC1FC0000001FC1FC0000001FC1FC0000001FC1FC 0000003F80FE0000003F80FE0000003F80FE0000003F80FE0000003F80FE0000007F007F 0000007F007F0000007F007F0000007F007F000000FF007F800000FE003F800000FFFFFF 800000FFFFFF800000FFFFFF800001FFFFFFC00001FFFFFFC00001FFFFFFC00001FC001F C00003FC001FE00003F8000FE00003F8000FE00003F8000FE00003F8000FE00007F8000F F00007F00007F00007F00007F0007FFF007FFF00FFFF80FFFF80FFFF80FFFF80FFFF80FF FF80FFFF80FFFF807FFF007FFF0029397DB830>65 D<3FFFFFE000007FFFFFFC0000FFFF FFFE0000FFFFFFFF80007FFFFFFFC0003FFFFFFFE00003F8007FF00003F8001FF80003F8 000FF80003F80007FC0003F80003FE0003F80001FE0003F80000FF0003F80000FF0003F8 00007F8003F800007F8003F800003F8003F800003FC003F800001FC003F800001FC003F8 00001FC003F800001FC003F800000FE003F800000FE003F800000FE003F800000FE003F8 00000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003F8 00000FE003F800000FE003F800001FE003F800001FC003F800001FC003F800001FC003F8 00003FC003F800003F8003F800003F8003F800007F8003F800007F0003F80000FF0003F8 0001FE0003F80003FE0003F80007FC0003F8000FFC0003F8001FF80003F8007FF0003FFF FFFFE0007FFFFFFFC000FFFFFFFF8000FFFFFFFF00007FFFFFFC00003FFFFFE000002B38 7FB730>68 D<7FFFFFFFFF00FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80 7FFFFFFFFF8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F80 03F800003F8003F800003F8003F800003F8003F800001F0003F80000000003F800000000 03F80000000003F80000000003F8007C000003F800FE000003F800FE000003F800FE0000 03F800FE000003FFFFFE000003FFFFFE000003FFFFFE000003FFFFFE000003FFFFFE0000 03FFFFFE000003F800FE000003F800FE000003F800FE000003F800FE000003F8007C0000 03F80000000003F80000000003F80000000003F80000000003F80000000003F8000007C0 03F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE0 03F800000FE003F800000FE003F800000FE07FFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0 FFFFFFFFFFE0FFFFFFFFFFE07FFFFFFFFFC02B387EB730>I<3FF80000FFE07FFC0001FF F0FFFE0003FFF8FFFE0003FFF87FFE0003FFF03FFF0007FFE007FF0007FF0007EF0007BF 0007EF800FBF0007EF800FBF0007EF800FBF0007E7C01F3F0007E7C01F3F0007E7C01F3F 0007E7C01F3F0007E7E03F3F0007E3E03E3F0007E3E03E3F0007E3F07E3F0007E3F07E3F 0007E1F07C3F0007E1F07C3F0007E1F8FC3F0007E1F8FC3F0007E0F8F83F0007E0F8F83F 0007E0FDF83F0007E07DF03F0007E07DF03F0007E07DF03F0007E07FF03F0007E03FE03F 0007E03FE03F0007E03FE03F0007E01FC03F0007E01FC03F0007E007003F0007E000003F 0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F 0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F 003FFC0001FFE07FFE0003FFF0FFFF0007FFF8FFFF0007FFF87FFE0003FFF03FFC0001FF E02D387FB730>77 D<3FFFFF8000007FFFFFF00000FFFFFFFC0000FFFFFFFF00007FFFFF FF80003FFFFFFFC00003F801FFE00003F8003FF00003F8001FF00003F8000FF80003F800 07F80003F80003F80003F80003FC0003F80001FC0003F80001FC0003F80001FC0003F800 01FC0003F80001FC0003F80003FC0003F80003F80003F80007F80003F8000FF80003F800 1FF00003F8003FF00003F801FFE00003FFFFFFC00003FFFFFF800003FFFFFF000003FFFF FE000003FFFFFF000003FFFFFF800003F800FFC00003F8003FE00003F8001FE00003F800 0FE00003F8000FF00003F80007F00003F80007F00003F80007F00003F80007F00003F800 07F00003F80007F00003F80007F00003F80007F00003F80007F0F803F80007F1FC03F800 07F1FC03F80007F1FC03F80007F1FC03F80007F1FC3FFF8003FBFC7FFFC003FFF8FFFFE0 01FFF8FFFFE001FFF07FFFC000FFE03FFF80007FC0000000001F002E397FB730>82 D<003FFC00000001FFFF80000003FFFFE0000007FFFFF000000FFFFFF800001FFFFFFC00 001FF00FFE00001FE001FF00001FE000FF00001FE0007F80000FC0003F80000780003FC0 000000001FC0000000001FC0000000001FC0000000001FC0000000FFFFC000000FFFFFC0 00007FFFFFC00001FFFFFFC00007FFFFFFC0000FFFFFFFC0001FFFC01FC0003FFC001FC0 007FE0001FC0007F80001FC000FF00001FC000FE00001FC000FE00001FC000FE00001FC0 00FE00001FC000FF00003FC000FF00003FC0007F80007FC0007FC001FFC0003FF80FFFFF C01FFFFFFFFFE01FFFFFFFFFE007FFFFF7FFE003FFFFC3FFE000FFFF00FFC0003FF00000 002B2A7CA830>97 D<000001FFE000000003FFF000000007FFF000000007FFF000000003 FFF000000001FFF00000000007F00000000007F00000000007F00000000007F000000000 07F00000000007F00000000007F00000000007F00000000007F00000000007F0000003FE 07F000001FFF87F000003FFFE7F00000FFFFFFF00001FFFFFFF00003FFFFFFF00007FF03 FFF0000FFC00FFF0001FF0003FF0001FE0001FF0003FC0001FF0003FC0000FF0007F8000 07F0007F000007F0007F000007F000FF000007F000FF000007F000FE000007F000FE0000 07F000FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE0000 07F000FF000007F0007F00000FF0007F00000FF0007F80000FF0003F80001FF0003FC000 3FF0001FE0003FF0001FF0007FF0000FF801FFF00007FE07FFFFC003FFFFFFFFE001FFFF FFFFF000FFFFF7FFF0007FFFC7FFE0001FFF03FFC00007FC0000002C397DB730>100 D<0001FF00000007FFE000001FFFF800007FFFFC0000FFFFFE0001FFFFFF0003FF81FF80 07FC007FC00FF8003FC01FE0001FE01FE0000FE03FC0000FF03F800007F07F800007F07F 000007F07F000003F8FF000003F8FE000003F8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFF FFFFF8FFFFFFFFF8FFFFFFFFF0FE00000000FF000000007F000000007F000000007F8000 00003F800001F03FC00003F81FE00003F80FF00003F80FF80007F807FE001FF003FFC07F E001FFFFFFE000FFFFFFC0003FFFFF80001FFFFE000007FFF8000000FFC000252A7CA830 >I<000000FF80000007FFE000001FFFF000003FFFF000007FFFF80000FFFFF80001FF87 F80003FE07F80003FC03F00007F800C00007F000000007F000000007F000000007F00000 0007F000000007F000000007F000000007F000003FFFFFFFC07FFFFFFFE0FFFFFFFFE0FF FFFFFFE0FFFFFFFFE07FFFFFFFC00007F000000007F000000007F000000007F000000007 F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0 00000007F000000007F000000007F000000007F000000007F000000007F000000007F000 000007F000000007F000000007F000000007F000000007F000000007F000000007F00000 0007F000003FFFFFFE007FFFFFFF00FFFFFFFF80FFFFFFFF807FFFFFFF003FFFFFFE0025 397DB830>I<0000E000000003F800000003F800000007FC00000007FC00000007FC0000 0003F800000003F800000000E00000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000001FFFF800003FFFFC00007FFF FC00007FFFFC00003FFFFC00001FFFFC00000001FC00000001FC00000001FC00000001FC 00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000 0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000000 01FC00000001FC00003FFFFFFFC07FFFFFFFE0FFFFFFFFE0FFFFFFFFE07FFFFFFFE03FFF FFFFC023397AB830>105 D<7FF800000000FFFC00000000FFFC00000000FFFC00000000 FFFC000000007FFC0000000000FC0000000000FC0000000000FC0000000000FC00000000 00FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC00000000 00FC0000000000FC03FFFF8000FC07FFFFC000FC07FFFFE000FC07FFFFE000FC07FFFFC0 00FC03FFFF8000FC001FE00000FC003FC00000FC007F800000FC00FF000000FC01FE0000 00FC03FC000000FC0FF8000000FC1FF0000000FC3FE0000000FC7FC0000000FCFF800000 00FDFFC0000000FFFFE0000000FFFFF0000000FFF7F0000000FFE3F8000000FFC1FC0000 00FF81FE000000FF00FF000000FE007F000000FC003F800000FC001FC00000FC001FE000 00FC000FF00000FC0007F00000FC0003F80000FC0001FC007FFFF81FFFE0FFFFFC3FFFF0 FFFFFC3FFFF8FFFFFC3FFFF8FFFFFC3FFFF07FFFF81FFFE02D387FB730>107 D<7FFFF80000FFFFFC0000FFFFFC0000FFFFFC0000FFFFFC00007FFFFC00000001FC0000 0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000000 01FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001 FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC 00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000 0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00007F FFFFFFF0FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF87FFFFFFFF025387BB730>I< 0000FC007E00007FC3FF01FF8000FFEFFF87FFC000FFFFFFCFFFE000FFFFFFDFFFE000FF FFFFFFFFF0007FFF0FFF87F00007FE07FF03F80007FC07FE03F80007F803FC01F80007F8 03FC01F80007F003F801F80007F003F801F80007F003F801F80007E003F001F80007E003 F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F0 01F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001 F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001F8 0007E003F001F80007E003F001F80007E003F001F8007FFE0FFF07FF80FFFF1FFF8FFFC0 FFFF1FFF8FFFC0FFFF1FFF8FFFC0FFFF1FFF8FFFC07FFE0FFF07FF80322881A730>I<00 0001FE00003FFC0FFF80007FFE3FFFE000FFFEFFFFF000FFFFFFFFF8007FFFFFFFF8003F FFFE07FC0000FFF803FC0000FFE001FE0000FFC001FE0000FF8000FE0000FF8000FE0000 FF0000FE0000FF0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE003FFFF81FFFF87FFFFC3FFFFCFF FFFE3FFFFEFFFFFE3FFFFE7FFFFC3FFFFC3FFFF81FFFF82F2880A730>I<0001FF000000 0FFFE000003FFFF800007FFFFC0000FFFFFE0003FFFFFF8003FF01FF8007FC007FC00FF8 003FE01FE0000FF01FE0000FF03FC00007F83F800003F87F800003FC7F000001FC7F0000 01FC7F000001FCFE000000FEFE000000FEFE000000FEFE000000FEFE000000FEFE000000 FEFE000000FEFE000000FEFF000001FE7F000001FC7F000001FC7F800003FC3F800003F8 3FC00007F83FE0000FF81FF0001FF00FF8003FE00FFC007FE007FF01FFC003FFFFFF8001 FFFFFF00007FFFFC00003FFFF800000FFFE0000001FF0000272A7CA830>I<000003FE00 003FFC1FFF80007FFE7FFFE000FFFEFFFFF000FFFFFFFFFC007FFFFFFFFE003FFFFE07FE 0000FFF001FF0000FFE000FF8000FFC0007F8000FF80003FC000FF00001FC000FE00001F E000FE00000FE000FE00000FE000FE00000FF000FE000007F000FE000007F000FE000007 F000FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE00000F F000FE00000FF000FE00000FE000FF00000FE000FF00001FE000FF80003FC000FF80003F C000FFC0007F8000FFE000FF8000FFF003FF0000FFFC0FFE0000FFFFFFFC0000FFFFFFF8 0000FEFFFFF00000FE7FFFC00000FE1FFF000000FE03FC000000FE0000000000FE000000 0000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000000 0000FE0000000000FE0000000000FE0000000000FE0000000000FE000000003FFFF80000 007FFFFC000000FFFFFE000000FFFFFE0000007FFFFC0000003FFFF80000002C3C80A730 >I<001FFC1E0001FFFF9F0007FFFFFF000FFFFFFF001FFFFFFF003FFFFFFF007FF007FF 007F8001FF00FE0000FF00FC00007F00FC00007F00FC00007F00FC00007F00FE00003E00 7F000000007FE00000003FFF0000001FFFFC00000FFFFF800007FFFFE00001FFFFF80000 7FFFFC000003FFFE0000000FFF00000000FF807C00007F80FE00001FC0FE00001FC0FE00 000FC0FF00000FC0FF00000FC0FF80000FC0FF80001FC0FFC0003F80FFE0007F80FFFC03 FF00FFFFFFFF00FFFFFFFE00FFFFFFFC00FCFFFFF000F83FFFC000780FFE0000222A79A8 30>115 D<0007800000000FC00000001FC00000001FC00000001FC00000001FC0000000 1FC00000001FC00000001FC00000001FC00000001FC000003FFFFFFFE07FFFFFFFF0FFFF FFFFF0FFFFFFFFF0FFFFFFFFF07FFFFFFFE0001FC00000001FC00000001FC00000001FC0 0000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000 00001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000 001FC000F8001FC001FC001FC001FC001FC001FC001FC001FC001FC001FC001FE003FC00 0FE007F8000FF007F8000FFC1FF00007FFFFE00003FFFFC00003FFFF800001FFFF000000 7FFC0000001FF00026337EB130>I<3FFC003FFC007FFE007FFE00FFFE00FFFE00FFFE00 FFFE007FFE007FFE003FFE003FFE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0001FE0000FE0001FE0000FE0003FE0000FE0007FE0000FF000FFE00007FC0 7FFFF8007FFFFFFFFC003FFFFFFFFE001FFFFFFFFE000FFFFEFFFC0007FFF87FF80000FF C000002F2880A630>I<3FFFC01FFFE07FFFE03FFFF0FFFFE03FFFF8FFFFE03FFFF87FFF E03FFFF03FFFC01FFFE007E000003F0007E000003F0007F000007F0003F000007E0003F0 00007E0003F000007E0003F000007E0003F000007E0003F80000FE0001F80000FC0001F8 0F80FC0001F81FC0FC0001F83FE0FC0001F83FE0FC0001F83FE0FC0000FC7FF1F80000FC 7FF1F80000FC7DF1F80000FC7DF1F80000FCFDF9F800007CFDF9F000007CF8F9F000007C F8F9F000007CF8F9F000007EF8FBF000007EF8FBF000003FF07FE000003FF07FE000003F F07FE000003FE03FE000003FE03FE000001FE03FC000000F800F80002D277FA630>119 D E /Fh 79 128 df<000001FF000FE00000001FFFE03FFC0000007F00F8FC1E000001FC 003FF03F000007F0007FE07F80000FE000FFE0FF80001FC001FFC0FF80003F8001FF80FF 80007F8001FF80FF80007F0001FF807F00007F0001FF003E0000FE0000FF00000000FE00 007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F0000 0000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00 007F00000000FE00007F00000000FE00007F00000000FE00007F000000FFFFFFFFFFFF80 00FFFFFFFFFFFF8000FFFFFFFFFFFF800000FE00007F00000000FE00007F00000000FE00 007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F0000 0000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00 007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F0000 0000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00 007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F0000 0000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00 007F00000000FE00007F00000000FE00007F00000001FF0000FF8000007FFFFC3FFFFF80 007FFFFC3FFFFF80007FFFFC3FFFFF800039407FBF35>11 D<000001FF000000001FFFC0 0000007F01F0000001FC0078000007F0001C00000FE0003E00001FC000FF00003F8001FF 00007F8001FF00007F0001FF00007F0001FF0000FE0001FF0000FE0000FE0000FE000038 0000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000000 0000FE0000000000FE0000000000FE0000000000FE0000000000FE00007F00FFFFFFFFFF 00FFFFFFFFFF00FFFFFFFFFF0000FE0001FF0000FE0000FF0000FE00007F0000FE00007F 0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F 0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F 0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F 0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F 0000FE00007F0000FE00007F0000FE00007F0000FE00007F0001FF0000FF807FFFFC3FFF FE7FFFFC3FFFFE7FFFFC3FFFFE2F407FBF33>I<000001FF800000001FFFF70000007F00 FF000001F800FF000007F001FF00000FE001FF00001FC001FF00003F8001FF00007F8001 FF00007F0001FF00007F0000FF0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F00FFFFFFFFFF00FFFFFFFF FF00FFFFFFFFFF0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0001FF0000FF807FFFFC3FFFFE7FFFFC3F FFFE7FFFFC3FFFFE2F407FBF33>I<000001FF0000FF800000001FFFC00FFFE00000007F 01F03F80F8000001F80078FE003C000007F0003FF8000E00000FE0007FF0001F00001FC0 00FFE0007F80003F8001FFC000FF80007F8001FFC000FF80007F0001FF8000FF80007F00 01FF8000FF8000FE0001FF0000FF8000FE0000FF00007F0000FE00007F00001C0000FE00 007F0000000000FE00007F0000000000FE00007F0000000000FE00007F0000000000FE00 007F0000000000FE00007F0000000000FE00007F0000000000FE00007F0000000000FE00 007F0000000000FE00007F0000000000FE00007F00003F80FFFFFFFFFFFFFFFF80FFFFFF FFFFFFFFFF80FFFFFFFFFFFFFFFF8000FE00007F0000FF8000FE00007F00007F8000FE00 007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00 007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00 007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00 007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00 007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00 007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00 007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00 007F00003F8000FE00007F00003F8001FF0000FF80007FC07FFFFC3FFFFE1FFFFF7FFFFC 3FFFFE1FFFFF7FFFFC3FFFFE1FFFFF48407FBF4C>I<1E000F007F803FC0FF807FC0FFC0 7FE0FFC07FE0FFE07FF0FFE07FF0FFE07FF07FE03FF01E600F3000600030006000300060 00300060003000E0007000C0006000C0006000C0006001C000E0018000C0038001C00300 0180070003800E0007001C000E0018000C0038001C00300018001C1C7DBE2D>34 D<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60006000600060006000E000C000C000 C001C001800380030007000E001C001800380030000B1C79BE19>39 D<0000300000700000E00001C0000380000780000F00001E00003E00003C0000780000F8 0000F00001F00001E00003E00003E00007C00007C0000FC0000F80000F80001F80001F00 001F00003F00003F00003F00003E00007E00007E00007E00007E00007E00007E00007C00 00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00 00FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E00007E00007E00007E00 007E00003E00003F00003F00003F00001F00001F00001F80000F80000F80000FC00007C0 0007C00003E00003E00001E00001F00000F00000F800007800003C00003E00001E00000F 000007800003800001C00000E0000070000030145A77C323>II<00000006000000000000000F000000000000000F00 0000000000000F000000000000000F000000000000000F000000000000000F0000000000 00000F000000000000000F000000000000000F000000000000000F000000000000000F00 0000000000000F000000000000000F000000000000000F000000000000000F0000000000 00000F000000000000000F000000000000000F000000000000000F000000000000000F00 0000000000000F000000000000000F000000000000000F000000000000000F0000000000 00000F000000000000000F000000000000000F000000007FFFFFFFFFFFFFE0FFFFFFFFFF FFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFFFFE00000000F000000000000000F0000000000 00000F000000000000000F000000000000000F000000000000000F000000000000000F00 0000000000000F000000000000000F000000000000000F000000000000000F0000000000 00000F000000000000000F000000000000000F000000000000000F000000000000000F00 0000000000000F000000000000000F000000000000000F000000000000000F0000000000 00000F000000000000000F000000000000000F000000000000000F000000000000000F00 0000000000000F000000000000000F0000000000000006000000003C3C7BB447>43 D<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E60006000600060006000E000C000C000 C001C001800380030007000E001C001800380030000B1C798919>II<1E007F807F80FFC0FFC0FFC0FFC07F807F801E 000A0A798919>I<0001FE0000000FFFC000003F03F000007C00F80000F8007C0001F000 3E0003E0001F0007C0000F8007C0000F800FC0000FC01F800007E01F800007E01F800007 E03F800007F03F800007F03F000003F07F000003F87F000003F87F000003F87F000003F8 7F000003F87F000003F8FF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF 000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF00 0003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF0000 03FC7F000003F87F000003F87F000003F87F000003F87F000003F83F800007F03F800007 F03F800007F01F800007E01F800007E01F800007E00FC0000FC00FC0000FC007E0001F80 03E0001F0001F0003E0000F8007C00007C00F800003F03F000000FFFC0000001FE000026 3F7DBC2D>48 D<0001C0000003C0000007C000001FC000007FC00007FFC000FFFFC000FF 9FC000F81FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 1FC000001FC000001FC000001FC000001FC000007FF000FFFFFFF8FFFFFFF8FFFFFFF81D 3D78BC2D>I<0007FC0000003FFF800000FFFFE00003F01FF80007C007FC000F0001FE00 1E0000FF001C0000FF803C00007FC07800007FC07800003FE07000003FE0FF00003FE0FF 80001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF07F80001FF03F00 001FF00C00001FF00000001FE00000003FE00000003FE00000003FC00000007FC0000000 7F80000000FF80000000FF00000001FE00000001FC00000003F800000007F000000007E0 0000000FC00000001F800000003F000000007E000000007C00000000F800000001F00000 0003E000000007C00000000F800000001F000070003E000070003C000070007800007000 F00000E001E00000E003C00000E007800000E00F000001E01FFFFFFFE01FFFFFFFE03FFF FFFFE07FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0243D7CBC2D>I<0007FC000000 3FFF800000F80FE00001E003F800078001FC000F0001FE000E0000FF001E0000FF801F80 007F803FC0007FC03FE0007FC03FE0007FC03FF0007FC03FE0007FC03FE0007FC01FE000 7FC00FC0007FC00000007F80000000FF80000000FF00000000FF00000001FE00000001FE 00000003FC00000003F800000007E00000000FC00000003F0000001FFC0000001FFF8000 00000FE000000007F800000003FC00000001FE00000000FF00000000FF800000007FC000 00007FC00000007FE00000003FE00000003FE00000003FF00000003FF00C00003FF03F00 003FF07F80003FF0FFC0003FF0FFC0003FF0FFC0003FF0FFC0003FE0FFC0003FE0FF8000 7FE07F00007FC07800007FC0780000FF803C0000FF801E0001FF000F0003FE0007C007FC 0003F80FF00000FFFFE000003FFF80000007F80000243F7CBC2D>I<0000000E00000000 1E000000003E000000003E000000007E000000007E00000000FE00000001FE00000001FE 00000003FE000000077E000000067E0000000E7E0000001C7E0000001C7E000000387E00 0000707E000000707E000000E07E000001C07E000001C07E000003807E000007007E0000 07007E00000E007E00001C007E00001C007E000038007E000070007E000070007E0000E0 007E0000C0007E0001C0007E000380007E000300007E000700007E000E00007E000C0000 7E001C00007E003800007E003800007E007000007E00E000007E00FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000001FF0000 01FFFFFF0001FFFFFF0001FFFFFF283E7EBD2D>I<06000003000780001F0007F800FE00 07FFFFFE0007FFFFFC0007FFFFF80007FFFFF00007FFFFC00007FFFF000007FFFC000007 3FE000000700000000070000000007000000000700000000070000000007000000000700 000000070000000007000000000700000000070000000007000000000701FE0000070FFF 8000073E03E000077001F80007E000FC0007C0007E000780003F000700003F800600001F 800000001FC00000001FC00000001FE00000000FE00000000FE00000000FE00000000FF0 0000000FF00000000FF00C00000FF07F00000FF07F80000FF0FF80000FF0FF80000FF0FF 80000FF0FF80000FF0FF80000FE0FF00001FE0FC00001FE07000001FC07800001FC03800 003F803C00003F801E00007F001F0000FE000F8001FC0007C003F80003F80FE00000FFFF C000003FFF00000007F80000243F7CBC2D>I<00001FE0000000FFF8000003F03E00000F C00F00001F000780003E000780007E001FC000FC003FC001F8007FC003F8007FC003F000 7FC007F0007FC00FE0003F800FE0001F001FE00000001FC00000001FC00000003FC00000 003FC00000003FC00000007F800000007F800000007F80FE00007F87FF8000FF8F07E000 FF9C01F000FFB800FC00FFB0007E00FFF0007E00FFE0003F00FFE0003F80FFC0003FC0FF C0003FC0FFC0001FE0FFC0001FE0FFC0001FE0FF80001FF0FF80001FF0FF80001FF0FF80 001FF0FF80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F8000 1FF03F80001FF03FC0001FE03FC0001FE01FC0001FE01FC0003FC01FC0003FC00FE0003F 800FE0003F8007E0007F0003F0007E0001F800FC0000FC01F800007E07F000003FFFE000 000FFF80000003FC0000243F7CBC2D>I<38000000003C000000003F000000003FFFFFFF FC3FFFFFFFFC3FFFFFFFFC3FFFFFFFF87FFFFFFFF87FFFFFFFF07FFFFFFFE078000001E0 70000003C0700000078070000007007000000F00E000001E00E000001C00E000003C00E0 000078000000007000000000F000000001E000000001C000000003C00000000780000000 07000000000F000000001E000000001E000000003C000000003C000000007C0000000078 00000000F800000000F800000001F800000001F000000003F000000003F000000003F000 000007F000000007F000000007F00000000FF00000000FE00000000FE00000001FE00000 001FE00000001FE00000001FE00000001FE00000001FE00000003FE00000003FE0000000 3FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003F E00000001FC00000000700000026407BBD2D>I<0003FC0000001FFF8000007C07E00000 F001F80001E0007C0003C0003E000780001F000F00001F000F00000F801E00000F801E00 000FC03E000007C03E000007C03E000007C03E000007C03F000007C03F000007C03F8000 0F803FC0000F801FE0001F801FF0001F001FFC003E000FFE007C000FFF80780007FFC0F0 0003FFF3E00001FFFF800000FFFF0000003FFF0000001FFFC000000FFFE000003FFFF800 0078FFFC0001F07FFE0003E01FFF0007C00FFF800F8003FFC01F0001FFC03F00007FE03E 00003FE07E00001FE07C00000FF07C000007F0F8000003F0F8000003F0F8000003F0F800 0001F0F8000001F0F8000001F0F8000001F0FC000001E07C000003E07C000003E07E0000 03C03F000007C01F00000F801F80001F000FC0003E0007F0007C0001FC03F80000FFFFE0 00001FFF80000003FC0000243F7CBC2D>I<0003FC0000001FFF0000007E07C00000FC03 F00001F801F80003F000FC0007E0007C000FE0007E001FC0007F001FC0003F003FC0003F 803F80003F807F80003FC07F80003FC07F80001FC0FF80001FC0FF80001FE0FF80001FE0 FF80001FE0FF80001FE0FF80001FE0FF80001FF0FF80001FF0FF80001FF0FF80001FF0FF 80001FF07F80001FF07F80003FF07F80003FF07F80003FF03FC0003FF03FC0003FF01FC0 007FF00FC0007FF007E000FFF007F000DFF003F001DFF000F8039FF0007E0F1FF0001FFE 1FE00007F01FE00000001FE00000001FE00000003FC00000003FC00000003FC00000003F C00000003F800000007F800F80007F001FC0007F003FE000FE003FE000FE003FE001FC00 3FE001F8003FC003F0003F8007F0001E000FE0001F001FC0000FC07F000003FFFE000001 FFF80000003FC00000243F7CBC2D>I<1E007F807F80FFC0FFC0FFC0FFC07F807F801E00 000000000000000000000000000000000000000000000000000000000000000000000000 00001E007F807F80FFC0FFC0FFC0FFC07F807F801E000A2779A619>I<1E007F807F80FF C0FFC0FFC0FFC07F807F801E000000000000000000000000000000000000000000000000 0000000000000000000000000000001E007F00FF80FF80FFC0FFC0FFC0FFC07FC01EC000 C000C000C000C001C001800180018003800300070006000E000C001C003800300030000A 3979A619>I<7FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFF FFE000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000000000007FFFFFFFFFFFFFE0FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFF07FFFFFFFFFFF FFE03C167BA147>61 D<00000007000000000000000F800000000000000F800000000000 000F800000000000001FC00000000000001FC00000000000001FC00000000000003FE000 00000000003FE00000000000003FE00000000000007FF00000000000007FF00000000000 007FF0000000000000FFF8000000000000E7F8000000000000E7F8000000000001C7FC00 0000000001C3FC000000000001C3FC00000000000381FE00000000000381FE0000000000 0381FE00000000000700FF00000000000700FF00000000000700FF00000000000E007F80 000000000E007F80000000000E007F80000000001C003FC0000000001C003FC000000000 1C003FC00000000038001FE00000000038001FE00000000038001FE00000000070000FF0 0000000070000FF00000000070000FF000000000E00007F800000000E00007F800000000 E00007F800000001C00003FC00000001FFFFFFFC00000001FFFFFFFC00000003FFFFFFFE 00000003800001FE00000003800001FE00000007000000FF00000007000000FF0000000F 000000FF8000000E0000007F8000000E0000007F8000001E0000007FC000001C0000003F C000001C0000003FC000003C0000003FE00000380000001FE00000380000001FE0000078 0000001FF00000780000000FF00000FC0000000FF00003FC0000001FF8000FFF0000003F FC00FFFFF0000FFFFFF8FFFFF0000FFFFFF8FFFFF0000FFFFFF83D417DC044>65 DI<0000003FF00006000003FFFE000E00000FFFFF801E00003FF007 E03E0000FF8000F83E0003FE00007C7E0007F800001EFE000FF000000FFE003FE0000007 FE007FC0000003FE00FF80000003FE00FF00000001FE01FE00000000FE03FE00000000FE 07FC000000007E07F8000000007E0FF8000000003E0FF8000000003E1FF0000000001E1F F0000000001E3FF0000000001E3FE0000000001E3FE0000000000E7FE0000000000E7FE0 000000000E7FE0000000000E7FC00000000000FFC00000000000FFC00000000000FFC000 00000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000 000000FFC00000000000FFC00000000000FFC00000000000FFC000000000007FC0000000 00007FE000000000007FE0000000000E7FE0000000000E3FE0000000000E3FE000000000 0E3FF0000000000E1FF0000000001E1FF0000000001C0FF8000000001C0FF8000000001C 07F8000000003C07FC000000003803FE000000007801FE000000007000FF00000000F000 FF80000001E0007FC0000001C0003FE0000003C0000FF0000007800007F800001F000003 FE00003E000000FF8000F80000003FF007F00000000FFFFFC000000003FFFF0000000000 3FF0000037427BBF42>IIII<0000003FE0000C00 000003FFFE001C0000001FFFFF803C0000007FF00FC07C000000FF0001F07C000003FC00 0078FC000007F800003DFC00001FE000001FFC00003FC000000FFC00007F80000007FC00 00FF80000003FC0001FF00000003FC0001FE00000001FC0003FC00000001FC0007FC0000 0000FC0007F800000000FC000FF8000000007C000FF0000000007C001FF0000000003C00 1FF0000000003C003FE0000000003C003FE0000000003C003FE0000000001C007FE00000 00001C007FE0000000001C007FC0000000001C007FC0000000000000FFC0000000000000 FFC0000000000000FFC0000000000000FFC0000000000000FFC0000000000000FFC00000 00000000FFC0000000000000FFC0000000000000FFC0000000000000FFC0000000000000 FFC0000000000000FFC000001FFFFFF07FC000001FFFFFF07FC000001FFFFFF07FE00000 000FFE007FE000000003FC003FE000000003FC003FE000000003FC003FF000000003FC00 1FF000000003FC001FF000000003FC000FF800000003FC000FF800000003FC0007F80000 0003FC0007FC00000003FC0003FC00000003FC0001FE00000003FC0001FF00000003FC00 00FF80000003FC00007FC0000007FC00003FE0000007FC00001FF000000FFC000007F800 001EFC000003FE00003C7C000000FF8000F83C0000007FF007F01C0000001FFFFFC00C00 000003FFFF0000000000003FF00000003C427BBF47>III<001FFFFFFC001FFFFFFC00 1FFFFFFC000007FF00000003FE00000001FE00000001FE00000001FE00000001FE000000 01FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001 FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE 00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00 000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000 0001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE000000 01FE00000001FE003F0001FE007F8001FE00FFC001FE00FFC001FE00FFC001FE00FFC001 FE00FFC003FC00FF8003FC007F0003F8007C0007F800380007F0003C000FE0001E001FC0 000F003F800003E07E000000FFF80000003FC0000026407CBD2F>III< FFFFC0000000003FFFF0FFFFC0000000003FFFF0FFFFC0000000003FFFF001FFE0000000 007FF800007FE0000000007FE0000077F000000000EFE0000077F000000000EFE0000077 F000000000EFE0000073F800000001CFE0000073F800000001CFE0000071FC000000038F E0000071FC000000038FE0000071FC000000038FE0000070FE000000070FE0000070FE00 0000070FE0000070FF0000000E0FE00000707F0000000E0FE00000707F0000000E0FE000 00703F8000001C0FE00000703F8000001C0FE00000703F8000001C0FE00000701FC00000 380FE00000701FC00000380FE00000700FE00000700FE00000700FE00000700FE0000070 0FE00000700FE000007007F00000E00FE000007007F00000E00FE000007003F80001C00F E000007003F80001C00FE000007003F80001C00FE000007001FC0003800FE000007001FC 0003800FE000007001FC0003800FE000007000FE0007000FE000007000FE0007000FE000 0070007F000E000FE0000070007F000E000FE0000070007F000E000FE0000070003F801C 000FE0000070003F801C000FE0000070001FC038000FE0000070001FC038000FE0000070 001FC038000FE0000070000FE070000FE0000070000FE070000FE0000070000FE0E0000F E00000700007F0E0000FE00000700007F0E0000FE00000700003F9C0000FE00000700003 F9C0000FE00000700003F9C0000FE00000700001FF80000FE00000700001FF80000FE000 00700000FF00000FE00000700000FF00000FE00000F80000FF00000FE00001FC00007E00 000FE00007FF00007E00003FF800FFFFF8003C001FFFFFF0FFFFF8003C001FFFFFF0FFFF F8003C001FFFFFF04C3E7DBD53>II<0000007FE0000000000007FFFE00000000001FC03F80 000000007E0007E000000001FC0003F800000007F00000FE0000000FE000007F0000001F C000003F8000003F8000001FC000007F0000000FE00000FE00000007F00001FE00000007 F80001FC00000003F80003FC00000003FC0007F800000001FE0007F800000001FE000FF0 00000000FF000FF000000000FF001FF000000000FF801FE0000000007F803FE000000000 7FC03FE0000000007FC03FE0000000007FC07FE0000000007FE07FC0000000003FE07FC0 000000003FE07FC0000000003FE0FFC0000000003FF0FFC0000000003FF0FFC000000000 3FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0 000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC000000000 3FF07FC0000000003FE07FE0000000007FE07FE0000000007FE07FE0000000007FE07FE0 000000007FE03FE0000000007FC03FE0000000007FC01FF000000000FF801FF000000000 FF801FF000000000FF800FF800000001FF000FF800000001FF0007FC00000003FE0003FC 00000003FC0003FE00000007FC0001FE00000007F80000FF0000000FF000007F0000000F E000003F8000001FC000001FC000003F8000000FE000007F00000007F00000FE00000001 FC0003F8000000007F000FE0000000001FC03F800000000007FFFE0000000000007FE000 00003C427BBF47>II82 D<0007FC000C001FFF801C007FFFF03C01FC03F83C03F0007E7C07C0001FFC0F80000FFC 1F800007FC3F000003FC3E000001FC7E000000FC7E000000FC7C0000007CFC0000007CFC 0000007CFC0000003CFC0000003CFC0000003CFE0000001CFE0000001CFF0000001CFF00 00001C7F800000007FC00000007FE00000003FF80000003FFF8000001FFFF800000FFFFF 800007FFFFF00003FFFFFC0001FFFFFF0000FFFFFFC0003FFFFFE00007FFFFF000007FFF F0000007FFF80000007FFC0000000FFC00000007FE00000003FE00000001FE00000000FF 00000000FFE00000007FE00000007FE00000007FE00000003FE00000003FF00000003FF0 0000003FF00000003FF00000003EF80000003EF80000007EFC0000007CFE000000FCFF00 0000F8FF800001F8FFC00003F0FFE00007E0F9FC000FC0F07F803F80F01FFFFE00E007FF F800C0007FC00028427BBF33>I<3FFFFFFFFFFFFF803FFFFFFFFFFFFF803FFFFFFFFFFF FF803FF0007FE001FF803F80003FC0003F807F00003FC0001FC07E00003FC00007C07C00 003FC00007C07800003FC00003C07800003FC00003C07800003FC00003C07000003FC000 01C07000003FC00001C07000003FC00001C07000003FC00001C07000003FC00001C0E000 003FC00000E0E000003FC00000E0E000003FC00000E0E000003FC00000E0E000003FC000 00E00000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC000 00000000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC000 00000000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC000 00000000003FC00000000000003FC00000000000003FC00000000000003FC00000000000 003FC00000000000003FC00000000000003FC00000000000003FC00000000000007FE000 0000000000FFF00000000007FFFFFFFE00000007FFFFFFFE00000007FFFFFFFE00003B3D 7DBC42>II87 D<7FFFFFC003FFFFE07FFFFFC003FFFFE07FFFFFC003FFFFE0 00FFFE0000FFFC00003FF800003FE000001FF000001F8000000FF800001F0000000FF800 001E00000007FC00001C00000003FE00003C00000003FE00007800000001FF0000700000 0000FF8000F000000000FF8001E0000000007FC001C0000000003FC003C0000000003FE0 0780000000001FF00700000000000FF00F00000000000FF81E000000000007FC1C000000 000007FC3C000000000003FE78000000000001FF70000000000001FFF0000000000000FF E00000000000007FC00000000000007FC00000000000003FE00000000000001FF0000000 0000001FF00000000000001FF80000000000001FFC0000000000003FFC0000000000003B FE00000000000071FF000000000000F1FF000000000000E0FF800000000001C07F800000 000003C07FC00000000003803FE00000000007003FE0000000000F001FF0000000000E00 0FF8000000001C000FF8000000003C0007FC00000000380003FE00000000780003FE0000 0000F00001FF00000000E00000FF80000001E00000FF80000003C000007FC00000038000 003FE00000078000003FE000000F0000001FF000001F0000000FF800003F8000000FF800 00FFC000001FFC0007FFE000007FFF00FFFFFC0003FFFFFEFFFFFC0003FFFFFEFFFFFC00 03FFFFFE3F3E7EBD44>II< FFFCFFFCFFFCFFFCF000F000F000F000F000F000F000F000F000F000F000F000F000F000 F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000 F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000 F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000 F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000FFFCFFFCFFFC FFFC0E5B77C319>91 D<018000C0038001C003000180070003800E0007001C000E001800 0C0038001C003000180070003800600030006000300060003000E0007000C0006000C000 6000C0006000C0006000CF006780FFC07FE0FFE07FF0FFE07FF0FFE07FF07FE03FF07FE0 3FF03FE01FF03FC01FE00F0007801C1C73BE2D>II<000FF8000000 00FFFE00000003F01F800000078007E000000F8003F000000FE001F800001FF001FC0000 1FF000FE00001FF000FE00001FF000FE00001FF0007F00000FE0007F00000380007F0000 0000007F00000000007F00000000007F00000000007F000000001FFF00000003FFFF0000 001FF87F0000007F807F000001FC007F000007F8007F00000FE0007F00001FC0007F0000 3F80007F00003F80007F00007F00007F00007F00007F0380FE00007F0380FE00007F0380 FE00007F0380FE0000FF0380FE0000FF0380FE0000FF03807F0001FF03807F0003BF0380 3F80071F87001FC00E1FCF0007F03C0FFE0001FFF807FC00003FC001F000292A7DA82D> 97 D<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC00 00000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00 00000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00 00000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC03 FC000001FC1FFF800001FC7C07E00001FDE001F00001FFC000FC0001FF80007E0001FF00 003F0001FE00003F8001FC00001F8001FC00001FC001FC00000FE001FC00000FE001FC00 000FF001FC00000FF001FC000007F001FC000007F801FC000007F801FC000007F801FC00 0007F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007F801FC00 0007F801FC000007F001FC000007F001FC00000FF001FC00000FF001FC00000FE001FC00 001FE001FC00001FC001FE00001F8001FE00003F0001FF00007F0001FF8000FE0001F3C0 01F80001F1E003F00001E0780FC00001C03FFF0000000007F800002D407EBE33>I<0001 FF0000000FFFE000003F00F800007C001E0001F8001F0003F0007F0007F000FF800FE000 FF800FC000FF801FC000FF801FC000FF803F80007F003F80001C007F800000007F800000 007F00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000 FF00000000FF00000000FF00000000FF00000000FF000000007F800000007F800000007F 800000003F800001C03FC00001C01FC00003C01FC00003800FE000078007F000070003F0 000E0001F8001E0000FC007800003F01F000000FFFC0000001FE0000222A7DA828>I<00 000001FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC0000 000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000 000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000 000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000FF01FC0000 07FFE1FC00001F80F9FC00007E003DFC0000FC001FFC0003F80007FC0007F00007FC0007 E00003FC000FC00001FC001FC00001FC003FC00001FC003F800001FC007F800001FC007F 800001FC007F000001FC007F000001FC00FF000001FC00FF000001FC00FF000001FC00FF 000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF 000001FC007F000001FC007F800001FC007F800001FC003F800001FC003F800001FC001F C00001FC000FC00003FC000FE00003FC0007E00007FC0003F0000FFE0001F8001FFF0000 7C0079FFF8003F01F1FFF8000FFFC1FFF80001FE01FC002D407DBE33>I<0001FE000000 0FFFC000003F03F00000FC01F80001F800FC0003F0007E0007E0003F000FE0003F800FC0 001F801FC0001FC03F80000FC03F80000FC07F80000FC07F80000FE07F00000FE07F0000 0FE0FF00000FE0FF00000FE0FFFFFFFFE0FFFFFFFFE0FF00000000FF00000000FF000000 00FF00000000FF00000000FF000000007F000000007F000000007F800000003F80000000 3F800000E01FC00000E01FC00001E00FC00001C007E00003C007F000078003F800070000 FC001E00007E003C00001F80F8000007FFE0000000FF0000232A7EA828>I<00001FC000 007FF80001F83C0007E07E000FC0FF001FC1FF003F81FF003F01FF007F01FF007F00FE00 FE007C00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000 FE000000FE000000FE000000FE000000FE000000FE0000FFFFFF00FFFFFF00FFFFFF0000 FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000 FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000 FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000 FE000000FE000000FE000000FE000000FE000001FF00007FFFFF007FFFFF007FFFFF0020 407EBF1C>I<000000007C000003F801FF00001FFF078F80007E0FDE1F8000F803F81F80 03F001F81F8003F001F81F8007E000FC06000FE000FE00000FC0007E00001FC0007F0000 1FC0007F00001FC0007F00001FC0007F00001FC0007F00001FC0007F00001FC0007F0000 1FC0007F00000FC0007E00000FE000FE000007E000FC000003F001F8000003F001F80000 01F803E0000003FE0FC00000071FFF0000000703F80000000600000000000E0000000000 0E00000000000E00000000000F00000000000F00000000000F80000000000FC000000000 07FFFFE0000007FFFFFE000003FFFFFF800001FFFFFFE00000FFFFFFF00003FFFFFFF800 0FC0001FFC001F000001FE003E000000FE007C0000007E007C0000003F00F80000003F00 F80000001F00F80000001F00F80000001F00F80000001F00FC0000003F007C0000003E00 7E0000007E003F000000FC001F800001F8000FC00003F00003F0000FC00000FE007F0000 003FFFFC00000003FFC00000293D7EA82D>I<01FC00000000FFFC00000000FFFC000000 00FFFC0000000007FC0000000003FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC01FE000001FC07FFC00001FC1E07E00001FC7803F0 0001FCE001F80001FDC001FC0001FD8001FC0001FF8000FE0001FF0000FE0001FF0000FE 0001FE0000FE0001FE0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0003FE0001FF00FFFFF87FFFFCFFFFF87FFFFCFFFFF87FFF FC2E3F7DBE33>I<01E00007F80007F8000FFC000FFC000FFC000FFC0007F80007F80001 E00000000000000000000000000000000000000000000000000000000000000000000000 000001FC007FFC007FFC007FFC0007FC0003FC0001FC0001FC0001FC0001FC0001FC0001 FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 FC0003FE00FFFFF0FFFFF0FFFFF0143E7DBD1A>I<0000780001FE0001FE0003FF0003FF 0003FF0003FF0001FE0001FE000078000000000000000000000000000000000000000000 00000000000000000000000000000000007F007FFF007FFF007FFF0001FF0000FF00007F 00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F 00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F 00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F 00007F00007F00007F00007F3E007F7F007FFF807EFF80FEFF80FEFF80FCFF81F87F01F8 7C03F01E07C00FFF8001FC00185185BD1C>I<01FC00000000FFFC00000000FFFC000000 00FFFC0000000007FC0000000003FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC00FFFF8001FC00FFFF8001FC00FFFF 8001FC003FFC0001FC003FE00001FC003F800001FC003F000001FC003C000001FC007800 0001FC00F0000001FC01E0000001FC07C0000001FC0F80000001FC1F00000001FC3E0000 0001FC7F00000001FCFF80000001FDFF80000001FFDFC0000001FF9FE0000001FF0FE000 0001FE07F0000001FC07F8000001F803FC000001F801FC000001F801FE000001F800FF00 0001F8007F000001F8007F800001F8003FC00001F8001FC00001F8001FE00001F8000FF0 0001F8000FF00001F8000FF80003FC000FFE00FFFFF07FFFE0FFFFF07FFFE0FFFFF07FFF E02B3F7EBE30>I<01FC00FFFC00FFFC00FFFC0007FC0003FC0001FC0001FC0001FC0001 FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001 FC0001FC0003FE00FFFFF8FFFFF8FFFFF8153F7DBE1A>I<01F801FE0000FF0000FFF807 FFC003FFE000FFF81E07E00F03F000FFF87803F03C01F80007F8E001F87000FC0003F9C0 01FCE000FE0001F98001FCC000FE0001FB8000FFC0007F0001FB0000FF80007F0001FF00 00FF80007F0001FE0000FF00007F0001FE0000FF00007F0001FC0000FE00007F0001FC00 00FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC00 00FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC00 00FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC00 00FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC00 00FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC00 00FE00007F0001FC0000FE00007F0001FC0000FE00007F0003FE0001FF0000FF80FFFFF8 7FFFFC3FFFFEFFFFF87FFFFC3FFFFEFFFFF87FFFFC3FFFFE47287DA74C>I<01F801FE00 00FFF807FFC000FFF81E07E000FFF87803F00007F8E001F80003F9C001FC0001F98001FC 0001FB8000FE0001FB0000FE0001FF0000FE0001FE0000FE0001FE0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE 0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0003FE0001FF 00FFFFF87FFFFCFFFFF87FFFFCFFFFF87FFFFC2E287DA733>I<0000FF00000007FFE000 001F81F800007E007E0000F8001F0001F0000F8003E00007C007C00003E00FC00003F01F 800001F81F800001F83F800001FC3F800001FC7F000000FE7F000000FE7F000000FE7F00 0000FEFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF0000 00FFFF000000FFFF000000FF7F000000FE7F000000FE7F000000FE3F800001FC3F800001 FC3F800001FC1F800001F80FC00003F00FC00003F007E00007E003F0000FC001F8001F80 007E007E00003F81FC00000FFFF0000000FF0000282A7EA82D>I<01FC03FC0000FFFC1F FF8000FFFC7C0FE000FFFDE003F00003FFC001FC0001FF8000FE0001FF00007F0001FE00 003F8001FC00003F8001FC00001FC001FC00001FE001FC00001FE001FC00000FF001FC00 000FF001FC00000FF001FC000007F801FC000007F801FC000007F801FC000007F801FC00 0007F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007F801FC00 000FF001FC00000FF001FC00000FF001FC00000FF001FC00001FE001FC00001FE001FC00 003FC001FE00003F8001FE00007F0001FF00007F0001FF8000FE0001FFC001F80001FDE0 07F00001FC780FC00001FC3FFF000001FC07F8000001FC0000000001FC0000000001FC00 00000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00 00000001FC0000000001FC0000000001FC0000000001FC0000000003FE00000000FFFFF8 000000FFFFF8000000FFFFF80000002D3A7EA733>I<0000FF001C000007FFC03C00001F 80F03C00007F00387C0000FC001C7C0003F8000E7C0007F0000FFC0007F00007FC000FE0 0003FC001FE00003FC003FC00003FC003FC00001FC007F800001FC007F800001FC007F80 0001FC007F800001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF00 0001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC007F80 0001FC007F800001FC007F800001FC003FC00001FC003FC00001FC001FC00003FC000FE0 0003FC000FE00007FC0007F0000FFC0003F8000FFC0001FC003DFC00007E0079FC00003F 81F1FC00000FFFC1FC000001FE01FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000003FE00000000FFFFF80000 00FFFFF8000000FFFFF82D3A7DA730>I<01F807E0FFF81FF8FFF8787CFFF8E1FE07F9C1 FE03F981FE01FB81FE01FB01FE01FB00FC01FF003001FE000001FE000001FE000001FC00 0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 0001FC000001FC000001FC000001FC000003FE0000FFFFFE00FFFFFE00FFFFFE001F287E A724>I<003FC06001FFF8E007C03FE01F000FE03E0007E03C0003E07C0003E0780001E0 F80001E0F80000E0F80000E0FC0000E0FE0000E0FF0000E0FF8000007FF800007FFFC000 3FFFF8001FFFFE000FFFFF0007FFFF8001FFFFC0003FFFE00003FFF000001FF000000FF8 E00003F8E00003F8E00001F8F00001F8F00000F8F00000F8F80000F8F80000F0FC0000F0 FC0001F0FE0001E0FF0003C0FF800780F3E01F00E0FFFC00C01FE0001D2A7DA824>I<00 1C0000001C0000001C0000001C0000001C0000001C0000003C0000003C0000003C000000 3C0000007C0000007C000000FC000000FC000001FC000003FC000007FC00001FFFFFC0FF FFFFC0FFFFFFC001FC000001FC000001FC000001FC000001FC000001FC000001FC000001 FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001 FC000001FC000001FC000001FC000001FC00E001FC00E001FC00E001FC00E001FC00E001 FC00E001FC00E001FC00E001FC00E000FC00E000FE01C000FE01C0007F03C0003F038000 1F87000007FE000001F8001B397EB723>I<01FC0000FE00FFFC007FFE00FFFC007FFE00 FFFC007FFE0007FC0003FE0003FC0001FE0001FC0000FE0001FC0000FE0001FC0000FE00 01FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE00 01FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE00 01FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE00 01FC0000FE0001FC0000FE0001FC0001FE0001FC0001FE0001FC0001FE0001FC0003FE00 00FC0003FE0000FC0007FE0000FE0006FF00007E000EFF80003F001CFFFC001FC078FFFC 0007FFE0FFFC0000FF80FE002E297DA733>IIII I<1FFFFFFF801FFFFFFF801FE000FF801F8000FF001F0001FE001E0003FC001C0003FC00 1C0007F8003C000FF0003C001FF00038001FE00038003FC00038007FC00038007F800038 00FF00000001FE00000001FE00000003FC00000007F80000000FF80000000FF00000001F E00000003FC00380003FC00380007F80038000FF00038001FF00038001FE00038003FC00 078007FC00078007F80007000FF00007001FE0000F001FE0000F003FC0001F007F80007F 00FF8001FF00FFFFFFFF00FFFFFFFF0021277EA628>II<1C000E007F003F80FF807FC0FF807FC0FF807FC0FF807FC0FF807FC07F00 3F801C000E001A0977BD2D>127 D E /Fi 24 119 df<0000000000E00000000001E000 00000003C0000000000F80000000001F00000000003E00000000007C0000000000F80000 000001F00000000003E00000000007C0000000000F80000000001F00000000003F000000 00007E00000000007C0000000000F80000000001F80000000003F00000000003E0000000 0007C0000000000FC0000000001F80000000001F80000000003F00000000003E00000000 007E0000000000FC0000000000FC0000000001F80000000001F80000000003F000000000 03F00000000007E00000000007E0000000000FC0000000000FC0000000001F8000000000 1F80000000003F80000000003F00000000007F00000000007E00000000007E0000000000 FE0000000000FC0000000001FC0000000001FC0000000001F80000000003F80000000003 F80000000003F00000000007F00000000007F00000000007E00000000007E0000000000F E0000000000FE0000000000FC0000000000FC0000000001FC0000000001FC0000000001F 80000000001F80000000003F80000000003F80000000003F00000000003F00000000003F 00000000007F00000000007F00000000007E00000000007E00000000007E00000000007E 0000000000FE0000000000FE0000000000FC0000000000FC0000000000FC0000000000FC 0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC 0000000000F80000000000F80000000000F80000000000F80000000000F80000000000F8 0000000000FC0000000000FC0000000000FC0000000000FC00000000007C00000000007C 00000000007C00000000007C00000000007C00000000003E00000000003E00000000003E 00000000003E00000000001F00000000001F00000000001F00000000000F00000000000F 800000000007800000000007C00000000003C00000000003E00000000001E00000000001 F00000000000F000000000007800000000003C00000000003C000000002B796FD930>40 D<00000007000000000007800000000003C00000000001E00000000001E00000000000F0 0000000000F000000000007800000000007C00000000003C00000000003E00000000003E 00000000001E00000000001F00000000001F00000000000F00000000000F80000000000F 80000000000F80000000000F800000000007C00000000007C00000000007C00000000007 C00000000007C00000000007C00000000007E00000000007E00000000007E00000000007 E00000000007E00000000007E00000000007E00000000007E00000000007E00000000007 E00000000007E00000000007E00000000007E00000000007E00000000007E00000000007 E00000000007E0000000000FC0000000000FC0000000000FC0000000000FC0000000000F C0000000000FC0000000001FC0000000001FC0000000001F80000000001F80000000001F 80000000003F80000000003F80000000003F00000000003F00000000007F00000000007F 00000000007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC 0000000001FC0000000001FC0000000001F80000000003F80000000003F80000000003F0 0000000003F00000000007F00000000007E0000000000FE0000000000FE0000000000FC0 000000001FC0000000001F80000000001F80000000003F00000000003F00000000007F00 000000007E0000000000FE0000000000FC0000000000FC0000000001F80000000001F800 00000003F00000000003F00000000007E0000000000FC0000000000FC0000000001F8000 0000001F80000000003F00000000003E00000000007E0000000000FC0000000000F80000 000001F00000000003F00000000003E00000000007C0000000000F80000000001F000000 00003F00000000003E00000000007C0000000000F80000000001F00000000003E0000000 0007C0000000000F80000000001F00000000003C0000000000780000000000F000000000 00E000000000002B797ED930>I<07C01FF03FF07FF87FF87FF8FFF8FFF0FFF07FE07FC0 1F000D0C738B24>46 D<000000000380000000000780000000000700000000000F000000 00001F00000000003F00000000007E0000000000FE0000000001FE0000000003FE000000 0007FC000000001FFC000000003FFC00000000FFFC00000007FFF8000000FFE7F8000001 FFCFF8000003FF0FF8000003F80FF0000000000FF0000000001FF0000000001FF0000000 001FE0000000001FE0000000003FE0000000003FE0000000003FC0000000003FC0000000 007FC0000000007FC0000000007F80000000007F8000000000FF8000000000FF80000000 00FF0000000000FF0000000001FF0000000001FF0000000001FE0000000001FE00000000 03FE0000000003FE0000000003FC0000000003FC0000000007FC0000000007FC00000000 07F80000000007F8000000000FF8000000000FF8000000000FF0000000000FF000000000 1FF0000000001FF0000000001FE0000000001FE0000000003FE0000000003FE000000000 3FC0000000003FC0000000007FC0000000007FC0000000007F80000000007F8000000000 FF8000000000FF8000000000FF0000000000FF0000000001FF0000000001FF0000000001 FE0000000001FE0000000003FE0000000003FE000000000FFF0000007FFFFFFFE000FFFF FFFFE000FFFFFFFFE000FFFFFFFFE000294F73CE3C>49 D<000000000007800000000000 0FC000000000001FC000000000001FC000000000003FC000000000003F8000000000003F 8000000000003F8000000000007F8000000000007F0000000000007F0000000000007F00 0000000000FE000000000000FE000000000000FE000000000001FE000000000001FC0000 00000001FC000000000003F8000000000003F8000000000003F8000000000007F0000000 000007F0000000000007F000000000000FE000000000000FE000000000001FC000000000 001FC000000000001F8000000000003F8000000000003F8000000000007F000000000000 7F000000000000FE000000000000FE000000000000FC000000000001FC000000000001F8 000000000003F8000000000003F0000000000007F0000000000007E000000000000FC000 000000001FC000000000001F8000000000003F8000000000003F0000000000007E000000 0000007E000000000000FC000000000001F801C000000001F807E000000003F007E00000 0007E00FE000000007C00FE00000000FC00FE00000001F801FE00000003F001FC0000000 3E001FC00000007E001FC0000000FC003FC0000001F8003F80000003F0003F80000007E0 003F8000000FC0007F8000001F80007F0000001F00007F0000003E00007F0000007C0000 FF000001F80000FE000003F00000FE000007FFF000FE00000FFFFF01FE00003FFFFFC1FC 00007FFFFFF9FC0000FF000FFFFC0000F80001FFFC0780F000003FFFFFC06000000FFFFF C000000003FFFF0000000007FFF00000000007F0000000000007F0000000000007F00000 0000000FF000000000000FE000000000000FE000000000000FE000000000001FE0000000 00001FC000000000001FC000000000001FC000000000003FC000000000003F8000000000 003F8000000000003F8000000000007F8000000000007F0000000000007F000000000000 7F0000000000007E0000000000003C00000032667BCE3C>52 D<00000000000001E00000 00000000000003E0000000000000000003F0000000000000000007F00000000000000000 07F000000000000000000FF000000000000000001FF000000000000000001FF000000000 000000003FF000000000000000003FF000000000000000007FF000000000000000007FF0 0000000000000000FFF00000000000000000FFF00000000000000001FFF0000000000000 0003FFF00000000000000003DFF000000000000000079FF000000000000000079FF80000 00000000000F1FF8000000000000000F0FF8000000000000001E0FF8000000000000003E 0FF8000000000000003C0FF8000000000000007C0FF800000000000000780FF800000000 000000F00FF800000000000000F00FF800000000000001E00FF800000000000003E00FF8 00000000000003C00FF800000000000007C00FF800000000000007800FF8000000000000 0F000FFC0000000000000F000FFC0000000000001E000FFC0000000000001E0007FC0000 000000003C0007FC0000000000007C0007FC000000000000780007FC000000000000F000 07FC000000000000F00007FC000000000001E00007FC000000000001E00007FC00000000 0003C00007FC000000000007C00007FC000000000007800007FC00000000000F800007FC 00000000000F000007FC00000000001E000007FE00000000001E000007FE00000000003C 000003FE00000000003C000003FE000000000078000003FE0000000000FFFFFFFFFE0000 000000FFFFFFFFFE0000000001FFFFFFFFFE0000000001FFFFFFFFFE0000000003C00000 03FE0000000003C0000003FE000000000780000003FE000000000F80000003FE00000000 0F00000003FE000000001E00000003FE000000001E00000003FF000000003C00000003FF 000000003C00000001FF000000007800000001FF00000000F800000001FF00000000F000 000001FF00000001F000000001FF00000001E000000001FF00000003C000000001FF0000 0007C000000001FF000000078000000001FF0000000F8000000001FF0000001F80000000 01FF0000003F8000000001FF0000007F8000000001FF800000FFC000000003FF800007FF E00000000FFFC000FFFFFE000003FFFFFF80FFFFFE000003FFFFFF80FFFFFC000007FFFF FF80FFFFFC000007FFFFFF80495579D457>65 D<00000FFFFFFFFFFFFFF800000FFFFFFF FFFFFFF800000FFFFFFFFFFFFFF800000FFFFFFFFFFFFFF80000000FFE000003FFF80000 0007FC0000003FF800000007FC0000000FF80000000FFC00000007F00000000FFC000000 07F00000000FF800000003F00000000FF800000003F00000001FF800000003F00000001F F800000001F00000001FF000000001F00000001FF000000001F00000003FF000000001E0 0000003FF000000001E00000003FE000000001E00000003FE000000001E00000007FE000 000001E00000007FE000000001E00000007FC000000003E00000007FC000000003E00000 00FFC000000003C0000000FFC000000003C0000000FF8000078003C0000000FF80000780 03C0000001FF80000F800000000001FF80000F000000000001FF00000F000000000001FF 00000F000000000003FF00001F000000000003FF00001E000000000003FE00003E000000 000003FE00003E000000000007FE00007E000000000007FE0000FC000000000007FC0001 FC000000000007FC000FFC00000000000FFFFFFFFC00000000000FFFFFFFFC0000000000 0FFFFFFFF800000000000FFFFFFFF800000000001FF8000FF800000000001FF80003F000 000000001FF00003F000000000001FF00001F000000000003FF00001F000000000003FF0 0001E000000000003FE00001E000000000003FE00001E000000000007FE00003E0000000 00007FE00003C000000000007FC00003C000000000007FC00003C00000000000FFC00007 C00000000000FFC00007800000000000FF800000000000000000FF800000000000000001 FF800000000000000001FF800000000000000001FF000000000000000001FF0000000000 00000003FF000000000000000003FF000000000000000003FE000000000000000003FE00 0000000000000007FE000000000000000007FE000000000000000007FC00000000000000 0007FC00000000000000000FFC00000000000000000FFC00000000000000000FF8000000 00000000000FF800000000000000001FF800000000000000001FF800000000000000007F FC000000000000007FFFFFFF800000000000FFFFFFFF800000000000FFFFFFFF00000000 0000FFFFFFFF0000000000004D5278D14C>70 D<00000FFFFFFFC000000FFFFFFFC00000 1FFFFFFF8000001FFFFFFF800000000FFF000000000007FE000000000007FC0000000000 0FFC00000000000FFC00000000000FF800000000000FF800000000001FF800000000001F F800000000001FF000000000001FF000000000003FF000000000003FF000000000003FE0 00000000003FE000000000007FE000000000007FE000000000007FC000000000007FC000 00000000FFC00000000000FFC00000000000FF800000000000FF800000000001FF800000 000001FF800000000001FF000000000001FF000000000003FF000000000003FF00000000 0003FE000000000003FE000000000007FE000000000007FE000000000007FC0000000000 07FC00000000000FFC00000000000FFC00000000000FF800000000000FF800000000001F F800000000001FF800000000001FF000000000001FF000000000003FF000000000003FF0 00000000003FE000000000003FE000000000007FE000000000007FE000000000007FC000 000000007FC00000000000FFC00000000000FFC00000000000FF800000000000FF800000 000001FF800000000001FF800000000001FF000000000001FF000000000003FF00000000 0003FF000000000003FE000000000003FE000000000007FE000000000007FE0000000000 07FC000000000007FC00000000000FFC00000000000FFC00000000000FF800000000000F F800000000001FF800000000001FF800000000007FF800000000FFFFFFFC000000FFFFFF FC000000FFFFFFFC000000FFFFFFFC000000325278D12D>73 D<00000FFFFFFFC00007FF FFF000000FFFFFFFC00007FFFFF000001FFFFFFF800007FFFFF000001FFFFFFF800007FF FFF00000000FFF00000000FFFE0000000007FE00000000FFF00000000007FC000000007F C0000000000FFC00000000FF00000000000FFC00000000FC00000000000FF800000001F8 00000000000FF800000003F000000000001FF800000007E000000000001FF80000000F80 00000000001FF00000001F0000000000001FF00000007E0000000000003FF0000000FC00 00000000003FF0000001F80000000000003FE0000003E00000000000003FE0000007C000 00000000007FE000000F800000000000007FE000003F000000000000007FC000007E0000 00000000007FC00000FC00000000000000FFC00001F000000000000000FFC00003E00000 0000000000FF800007C000000000000000FF80001F8000000000000001FF80003F000000 0000000001FF80007E0000000000000001FF0000F80000000000000001FF0001F0000000 0000000003FF0003E00000000000000003FF000FE00000000000000003FE001FE0000000 0000000003FE003FE00000000000000007FE007FF00000000000000007FE00FFF0000000 0000000007FC01FFF00000000000000007FC07FFF8000000000000000FFC0FDFF8000000 000000000FFC1F8FF8000000000000000FF83E0FFC000000000000000FF87C0FFC000000 000000001FF8F807FC000000000000001FFBF007FE000000000000001FF7E007FE000000 000000001FFFC003FF000000000000003FFF8003FF000000000000003FFE0003FF000000 000000003FFC0001FF800000000000003FF80001FF800000000000007FF00001FF800000 000000007FE00000FFC00000000000007FC00000FFC00000000000007FC000007FC00000 00000000FFC000007FE0000000000000FFC000007FE0000000000000FF8000003FE00000 00000000FF8000003FF0000000000001FF8000003FF0000000000001FF8000001FF00000 00000001FF0000001FF8000000000001FF0000001FF8000000000003FF0000000FF80000 00000003FF0000000FFC000000000003FE0000000FFC000000000003FE00000007FC0000 00000007FE00000007FE000000000007FE00000007FE000000000007FC00000003FF0000 00000007FC00000003FF00000000000FFC00000003FF00000000000FFC00000001FF8000 0000000FF800000001FF80000000000FF800000001FF80000000001FF800000001FFC000 0000001FF800000003FFE0000000007FF800000007FFF0000000FFFFFFFC0000FFFFFFC0 0000FFFFFFFC0000FFFFFFC00000FFFFFFFC0000FFFFFFC00000FFFFFFFC0000FFFFFF80 00005C5278D15A>75 D<00000FFFFFFFF0000000000FFFFFFFF0000000000FFFFFFFF000 0000000FFFFFFFF000000000000FFF8000000000000007FE0000000000000007FC000000 000000000FFC000000000000000FFC000000000000000FF8000000000000000FF8000000 000000001FF8000000000000001FF8000000000000001FF0000000000000001FF0000000 000000003FF0000000000000003FF0000000000000003FE0000000000000003FE0000000 000000007FE0000000000000007FE0000000000000007FC0000000000000007FC0000000 00000000FFC000000000000000FFC000000000000000FF8000000000000000FF80000000 00000001FF8000000000000001FF8000000000000001FF0000000000000001FF00000000 00000003FF0000000000000003FF0000000000000003FE0000000000000003FE00000000 00000007FE0000000000000007FE0000000000000007FC0000000000000007FC00000000 0000000FFC000000000000000FFC000000000000000FF8000000000000000FF800000000 0000001FF8000000000000001FF8000000000000001FF0000000000000001FF000000000 0000003FF0000000000000003FF0000000000000003FE0000000000000003FE000000000 0000007FE00000000F8000007FE00000000F0000007FC00000000F0000007FC00000001F 000000FFC00000001E000000FFC00000001E000000FF800000003E000000FF800000003C 000001FF800000007C000001FF800000007C000001FF0000000078000001FF00000000F8 000003FF00000000F8000003FF00000001F0000003FE00000001F0000003FE00000003F0 000007FE00000007E0000007FE00000007E0000007FC0000000FC0000007FC0000001FC0 00000FFC0000003FC000000FFC0000007F8000000FF8000000FF8000000FF8000003FF80 00001FF8000007FF0000001FF800003FFF0000007FF80001FFFF00007FFFFFFFFFFFFE00 00FFFFFFFFFFFFFE0000FFFFFFFFFFFFFE0000FFFFFFFFFFFFFC0000415278D149>I<00 000FFFFE0000003FFFFFE000000FFFFF0000003FFFFFE000001FFFFF0000007FFFFFC000 001FFFFF0000007FFFFFC000000007FF80000001FFF00000000007FF800000007FC00000 000007FF800000007F80000000000FFFC00000003F00000000000FFFC00000003E000000 00000F7FC00000003C00000000000F7FE00000003C00000000001F7FE00000007C000000 00001F3FE00000007800000000001E3FF00000007800000000001E3FF000000078000000 00003E1FF0000000F800000000003E1FF8000000F000000000003C1FF8000000F0000000 00003C0FF8000000F000000000007C0FFC000001F000000000007C0FFC000001E0000000 00007807FC000001E000000000007807FE000001E00000000000F807FE000003E0000000 0000F803FE000003C00000000000F003FE000003C00000000000F003FF000003C0000000 0001F001FF000007C00000000001F001FF000007800000000001E001FF80000780000000 0001E000FF800007800000000003E000FF80000F800000000003E000FFC0000F00000000 0003C0007FC0000F000000000003C0007FC0000F000000000007C0007FE0001F00000000 0007C0003FE0001E00000000000780003FE0001E00000000000780003FF0001E00000000 000F80001FF0003E00000000000F80001FF0003C00000000000F00001FF8003C00000000 000F00000FF8003C00000000001F00000FF8007C00000000001F00000FFC007800000000 001E000007FC007800000000001E000007FC007800000000003E000007FE00F800000000 003E000003FE00F000000000003C000003FE00F000000000003C000003FF00F000000000 007C000003FF01F000000000007C000001FF01E0000000000078000001FF81E000000000 0078000001FF81E00000000000F8000000FF83E00000000000F8000000FFC3C000000000 00F0000000FFC3C00000000000F00000007FC3C00000000001F00000007FE7C000000000 01F00000007FE7800000000001E00000003FE7800000000001E00000003FF78000000000 03E00000003FFF800000000003E00000001FFF000000000003C00000001FFF0000000000 03C00000001FFF000000000007C00000000FFF000000000007C00000000FFE0000000000 07800000000FFE0000000000078000000007FE00000000000F8000000007FE0000000000 0F8000000007FC00000000000F0000000003FC00000000001F8000000003FC0000000000 3F8000000003FC00000000007FC000000001F80000000003FFF000000001F800000000FF FFFF80000001F800000000FFFFFF80000000F800000000FFFFFF80000000F000000000FF FFFF80000000F0000000005B5278D157>78 D<00000FFFFFFFFFFC000000000FFFFFFFFF FF800000001FFFFFFFFFFFF00000001FFFFFFFFFFFF8000000000FFE00003FFE00000000 07FC000007FF0000000007FC000001FF800000000FFC000000FF800000000FFC0000007F C00000000FF80000003FE00000000FF80000003FE00000001FF80000001FE00000001FF8 0000001FF00000001FF00000001FF00000001FF00000001FF00000003FF00000001FF000 00003FF00000001FF00000003FE00000001FF80000003FE00000001FF00000007FE00000 001FF00000007FE00000003FF00000007FC00000003FF00000007FC00000003FF0000000 FFC00000003FF0000000FFC00000007FE0000000FF800000007FE0000000FF800000007F C0000001FF80000000FFC0000001FF80000000FF80000001FF00000000FF80000001FF00 000001FF00000003FF00000001FE00000003FF00000003FE00000003FE00000007FC0000 0003FE0000000FF800000007FE0000001FF000000007FE0000003FE000000007FC000000 7FC000000007FC000001FF000000000FFC000007FE000000000FFC00007FF8000000000F FFFFFFFFE0000000000FFFFFFFFF80000000000FFFFFFFF800000000001FF80000000000 0000001FF000000000000000001FF000000000000000001FF000000000000000003FF000 000000000000003FE000000000000000003FE000000000000000003FE000000000000000 007FE000000000000000007FC000000000000000007FC000000000000000007FC0000000 0000000000FFC00000000000000000FF800000000000000000FF800000000000000000FF 800000000000000001FF800000000000000001FF000000000000000001FF000000000000 000001FF000000000000000003FF000000000000000003FE000000000000000003FE0000 00000000000003FE000000000000000007FE000000000000000007FC0000000000000000 07FC000000000000000007FC00000000000000000FFC00000000000000000FF800000000 000000000FF800000000000000001FF800000000000000001FF800000000000000007FF8 00000000000000FFFFFFFC000000000000FFFFFFFC000000000000FFFFFFFC0000000000 00FFFFFFFC0000000000004D5278D14F>80 D<0000000007FC000380000000003FFF8007 8000000000FFFFE0070000000003FFFFF80F000000000FF807FC1F000000003FC000FE3F 000000007F80003F3E00000000FE00001F7E00000001FC00000FFE00000003F800000FFE 00000007F0000007FC0000000FE0000007FC0000000FE0000003FC0000001FC0000003FC 0000003F80000003F80000003F80000003F80000007F00000001F80000007F00000001F8 000000FF00000001F0000000FE00000001F0000000FE00000001F0000000FE00000001F0 000001FE00000001E0000001FE00000001E0000001FE00000001E0000001FE00000003E0 000001FE00000003C0000001FE00000003C0000001FE0000000000000001FF0000000000 000001FF0000000000000001FF8000000000000001FFC000000000000001FFE000000000 000000FFF800000000000000FFFF00000000000000FFFFE00000000000007FFFFE000000 0000003FFFFFC000000000003FFFFFF800000000001FFFFFFC000000000007FFFFFF0000 00000003FFFFFF800000000000FFFFFFC000000000001FFFFFE0000000000001FFFFE000 00000000003FFFF000000000000007FFF000000000000000FFF0000000000000003FF800 0000000000001FF8000000000000001FF8000000000000000FF8000000000000000FF800 00000000000007F80000000000000007F80000000000000007F80000000000000007F800 0003C000000003F8000003C000000003F8000003C000000007F8000007C000000007F800 0007C000000007F00000078000000007F00000078000000007F000000F800000000FF000 000F800000000FE000000F800000000FE000000F800000001FC000001FC00000001FC000 001FC00000003F8000001FC00000003F8000001FC00000007F0000003FE00000007E0000 003FE0000000FE0000003FF0000001FC0000003FF8000003F80000007FF8000007F00000 007FFE00000FE00000007E7F00003FC00000007C3FC0007F80000000F81FF803FE000000 00F807FFFFFC00000000F001FFFFF000000000E0007FFF8000000000C00007FC00000000 00415677D342>83 D<00FFFFFFFFFFFFFFFF8000FFFFFFFFFFFFFFFF8001FFFFFFFFFFFF FFFF8001FFFFFFFFFFFFFFFF8001FFF0001FF8000FFF0003FF00001FF00001FF0003FC00 003FF00000FF0003F800003FF000007F0007F000003FE000003F0007E000003FE000003F 0007C000007FE000003E000FC000007FE000003E000F8000007FC000003E000F8000007F C000003E001F000000FFC000003E001F000000FFC000003E001E000000FF8000003C003E 000000FF8000003C003E000001FF8000003C003C000001FF8000003C007C000001FF0000 003C0078000001FF0000007C0078000003FF0000007800F8000003FF0000007800F00000 03FE0000007800F0000003FE0000007800F0000007FE000000780000000007FE00000000 0000000007FC000000000000000007FC00000000000000000FFC00000000000000000FFC 00000000000000000FF800000000000000000FF800000000000000001FF8000000000000 00001FF800000000000000001FF000000000000000001FF000000000000000003FF00000 0000000000003FF000000000000000003FE000000000000000003FE00000000000000000 7FE000000000000000007FE000000000000000007FC000000000000000007FC000000000 00000000FFC00000000000000000FFC00000000000000000FF800000000000000000FF80 0000000000000001FF800000000000000001FF800000000000000001FF00000000000000 0001FF000000000000000003FF000000000000000003FF000000000000000003FE000000 000000000003FE000000000000000007FE000000000000000007FE000000000000000007 FC000000000000000007FC00000000000000000FFC00000000000000000FFC0000000000 0000000FF800000000000000000FF800000000000000001FF800000000000000001FF800 000000000000001FF000000000000000001FF000000000000000003FF000000000000000 003FF000000000000000003FE000000000000000003FE000000000000000007FE0000000 0000000000FFE00000000000000003FFF00000000000003FFFFFFFFF00000000003FFFFF FFFF00000000003FFFFFFFFF00000000003FFFFFFFFF000000000049516BD054>I<0000 00000007FC0000000007FFFC000000000FFFF8000000000FFFF8000000000FFFF8000000 00000FF800000000000FF0000000000007F000000000000FF000000000000FF000000000 000FE000000000000FE000000000001FE000000000001FE000000000001FC00000000000 1FC000000000003FC000000000003FC000000000003F8000000000003F8000000000007F 8000000000007F8000000000007F0000000000007F000000000000FF000000000000FF00 0000000000FE000000000000FE000000000001FE000000000001FE000000000001FC0000 0001FC01FC00000007FF03FC0000001FFFC3FC0000007F03E3F8000001FC01F3F8000003 F800FFF8000007F0007FF800000FE0007FF000001FC0003FF000003F80003FF000007F80 003FF00000FF00001FE00000FE00001FE00001FE00001FE00003FC00001FE00003FC0000 1FC00007FC00001FC00007F800003FC0000FF800003FC0000FF000003F80001FF000003F 80001FF000007F80003FF000007F80003FE000007F00003FE000007F00003FE00000FF00 007FE00000FF00007FC00000FE00007FC00000FE00007FC00001FE00007FC00001FE0000 FF800001FC0000FF800001FC0000FF800003FC0000FF800003FC03C0FF800003F803C0FF 000003F803C0FF000007F803C0FF000007F807C07F00000FF007807F00000FF007807F00 001FF00F807F00003FF00F003F80007FE00F003F8000FFE01F001F8001F7E01E001FC003 E7E03E000FC007C3F03C0007E00F83F07C0003F03F01F8F80001FFFC00FFF000007FF000 7FE000001FC0001F8000365474D23C>100 D<0000007F8000000007FFF00000001FFFF8 0000007F80FE000001FE003F000007F8001F00000FF0001F80001FC0000F80003F80000F 80007F80000F8000FF00000F8001FE00000F8003FC00000F8007FC00001F8007F800001F 000FF800003F000FF000007E001FF00000FE001FF00001FC003FE00007F0003FE0007FE0 003FE07FFF80007FFFFFFE00007FFFFFE000007FFF800000007FC000000000FFC0000000 00FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF00000000 00FF0000000000FF0000000000FF0000000000FF0000000000FF00000000007F00000003 007F00000007807F0000000F807F0000001F003F8000003F003F8000007E001F800000FC 001FC00001F8000FC00007E00007E0001FC00003F0007F000001FC07FC000000FFFFF000 00003FFFC000000007FC000000293573B336>I<00000000001F8000000000007FF00000 000001FFF80000000003F0FC0000000007E07E000000000FC1FE000000001FC1FE000000 001F83FE000000003F83FE000000003F83FE000000003F03FC000000007F03F800000000 7F00F0000000007F000000000000FE000000000000FE000000000000FE000000000000FE 000000000001FE000000000001FC000000000001FC000000000001FC000000000001FC00 0000000003FC000000000003F8000000000003F8000000000003F8000000000003F80000 00000007F8000000000007F0000000000007F0000000000007F0000000000007F0000000 001FFFFFFE0000003FFFFFFE0000003FFFFFFE0000003FFFFFFE000000000FE000000000 001FE000000000001FC000000000001FC000000000001FC000000000001FC00000000000 3FC000000000003F8000000000003F8000000000003F8000000000003F8000000000007F 8000000000007F0000000000007F0000000000007F0000000000007F000000000000FF00 0000000000FF000000000000FE000000000000FE000000000000FE000000000000FE0000 00000001FE000000000001FC000000000001FC000000000001FC000000000001FC000000 000003FC000000000003F8000000000003F8000000000003F8000000000003F800000000 0007F8000000000007F0000000000007F0000000000007F0000000000007F00000000000 0FF000000000000FE000000000000FE000000000000FE000000000001FE000000000001F C000000000001FC000000000001FC000000000001FC000000000003FC000000000003F80 00000000003F8000000000003F8000000000007F8000000000007F0000000000007F0000 000000007F0000000000007E000000000000FE000000000000FE000000000000FC000000 001E00FC000000003F81FC000000007F81F800000000FF81F800000000FF83F000000000 FF83F000000000FF03E000000000FF07C000000000FC0F80000000007E1F00000000003F FE00000000001FFC000000000003F00000000000376C83D324>I<000001E0000003F000 0007F800000FF800000FF800000FF800000FF000000FE000000380000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000007C000003FF00000 7FFC0000F87C0001E07E0003C03E0007803F000F803F000F007F001F007F001E007F003E 007F003C00FF003C00FE007C00FE007801FE007801FC00F803FC00F803F8000003F80000 07F8000007F0000007F000000FF000000FE000000FE000001FE000001FC000003FC00000 3F8000003F8000007F8000007F0000007F000000FF007800FE007800FE007801FE00F801 FC00F003FC00F003F801F003F801E003F801E003F803C003F003C003F0078003F00F8003 F00F0001F01E0001F87C0000FFF800007FE000001F80001D5077CE24>105 D<003E00001FE0000000FFC000FFFC000001FFE003FFFE000003E3F00FE07F800007C1F8 1F001F80000F81F87E001FC0000F01FCF8000FC0001F01FDF0000FE0001E01FDE0000FE0 001E01FFE0000FE0003E01FFC0000FE0003C01FF80000FE0003C01FF00000FE0003C03FF 00000FE0007C03FE00000FE0007803FE00000FE0007803FC00000FE000F807FC00001FE0 00F807F800001FC0000007F800001FC0000007F000001FC000000FF000003FC000000FF0 00003F8000000FE000003F8000000FE000003F8000001FE000007F8000001FE000007F00 00001FC000007F0000001FC00000FF0000003FC00000FE0000003FC00000FE0000003F80 0001FE0000003F800001FC0000007F800001FC0000007F800003FC01E0007F000003F801 E0007F000003F801E000FF000007F803E000FF000007F003C000FE00000FF003C000FE00 000FE007C001FE00000FE0078001FE00000FE0078001FC00000FE00F0001FC00000FC00F 0003FC00000FC01E0003FC00000FC03E0003F800000FC03C0003F8000007E0780003F800 0007E1F00003F0000003FFE00003F0000001FF800001C00000003E00003B3577B342> 110 D<0000003FC000000001FFF80000000FFFFE0000003FE07F8000007F001FC00001FE 000FE00003F80007F00007F00007F0000FE00003F8001FC00003F8003F800001FC007F80 0001FC00FF000001FE01FE000001FE01FE000001FE03FC000001FE07FC000001FE07F800 0001FE0FF8000001FE0FF8000001FE1FF0000001FE1FF0000003FE3FF0000003FE3FE000 0003FE3FE0000003FE3FE0000007FE7FE0000007FC7FC0000007FC7FC0000007FC7FC000 000FFC7FC000000FF8FF8000000FF8FF8000000FF8FF8000001FF0FF8000001FF0FF8000 003FE07F8000003FC07F8000007FC07F8000007F807F800000FF807F800000FF003F8000 01FE003F800003FC003F800003F8001FC00007F0001FC0000FE0000FE0001FC00007F000 7F800003F800FE000001FE07F80000007FFFE00000001FFF8000000007FC0000002F3574 B33C>I<00003E00007F00000000FFC003FFC0000001FFE007FFF0000003E3F01F81F800 0007C1F83E00FC00000F81F8FC007E00000F01FDF0007F00001F01FFE0003F00001E01FF C0003F80001E01FF80003F80003E01FF80003F80003C01FF00001FC0003C01FE00001FC0 003C03FE00001FC0007C03FC00001FC0007803F800003FC0007803F800003FC000F807F8 00003FC000F807F800003FC0000007F000003FC0000007F000003FC000000FF000007FC0 00000FF000007FC000000FE000007FC000000FE000007FC000001FE00000FFC000001FE0 0000FF8000001FC00000FF8000001FC00000FF8000003FC00001FF8000003FC00001FF00 00003F800001FF0000003F800001FF0000007F800003FE0000007F800003FE0000007F00 0003FC0000007F000007FC000000FF000007F8000000FF00000FF8000000FF00000FF000 0000FF00001FE0000001FF00001FC0000001FF00003FC0000001FF80007F80000001FF80 007F00000003FFC000FE00000003FFC001FC00000003FBE003F800000003F9F00FE00000 0007F8F81FC000000007F87FFF0000000007F03FFC0000000007F00FE0000000000FF000 00000000000FF00000000000000FE00000000000000FE00000000000001FE00000000000 001FE00000000000001FC00000000000001FC00000000000003FC00000000000003FC000 00000000003F800000000000003F800000000000007F800000000000007F800000000000 007F000000000000007F00000000000000FF00000000000001FF0000000000007FFFFF80 000000007FFFFF8000000000FFFFFF0000000000FFFFFF00000000003A4B7FB33C>I<00 3F0000FF0000FFC003FFC001FFE00FFFF003E3F03F01F807C1F87C007C0781F8F8007E0F 01FDF001FE0F01FFE003FE1E01FFC003FE1E01FFC003FE3E01FF8007FC3C01FF0003FC3C 01FF0003F83C03FE0001E07C03FE0000007803FC0000007803FC000000F807F8000000F8 07F80000000007F00000000007F0000000000FF0000000000FF0000000000FE000000000 0FE0000000001FE0000000001FE0000000001FC0000000001FC0000000003FC000000000 3FC0000000003F80000000003F80000000007F80000000007F80000000007F0000000000 7F0000000000FF0000000000FF0000000000FE0000000000FE0000000001FE0000000001 FE0000000001FC0000000001FC0000000003FC0000000003FC0000000003F80000000003 F80000000003F80000000003F00000000003F00000000001C0000000002F3577B331> 114 D<000001FE0000000FFFC000003FFFF00000FE03F80001F000FC0003E0007C0007C0 003E000F80001E001F80003E001F0000FE001F0001FE003E0001FE003E0001FE007E0001 FE007E0001FC007E0000F8007F000000007F000000007F800000007FC00000007FFC0000 003FFFE000003FFFF800001FFFFE00000FFFFF000007FFFF800001FFFFC000007FFFE000 0007FFE00000007FF00000001FF00000000FF000000007F000000003F000000003F01F00 0003F07F800003F07F800003F0FF800003E0FF800003E0FF800003E0FF000007C0FE0000 07C0F800000F80F800001F80F800001F007C00003E007E0000FC003F0001F8001FE00FE0 0007FFFF800001FFFE0000003FF00000273577B330>I<000FC0000078003FF00000FE00 7FFC0001FE00F07C0003FF01E07E0003FF03C03E0003FF07803F0003FF0F803F0003FF0F 007F0001FF1F007F0000FF1E007F0000FF3E007F00007F3C00FF00007F3C00FE00003E7C 00FE00003E7801FE00003E7801FC00003EF803FC00003EF803F800003C0003F800003C00 07F800003C0007F000007C0007F0000078000FF0000078000FE0000078000FE00000F800 1FE00000F0001FC00000F0001FC00000F0001FC00001F0003FC00001E0003F800001E000 3F800003E0003F800003C0007F800003C0007F00000780007F00000780007F0000078000 7F00000F00007F00000F00007F00001E00007F00001E00007F00003C00007F0000780000 3F00007800003F8000F000001F8001E000001FC003C000000FE00780000007F81F000000 03FFFE00000000FFF8000000001FE00000303577B336>118 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: Letter %%EndSetup %%Page: 1 1 1 0 bop 448 623 a Fi(L)-6 b(o)g(ops)42 b(in)f(F)-12 b(ASTLINK)42 b(\(r)-6 b(evise)g(d)41 b(for)h(version)f(4.1P\))1514 826 y Fh(Alejandro)30 b(A.)h(Sc)m(h\177)-45 b(a\013er)1455 939 y(formerly)29 b(Rice)i(Univ)m(ersit)m(y)1869 1051 y(and)1174 1164 y(curren)m(tly)f(National)g(Institutes)f(of)i(Health) 448 1375 y(This)40 b(do)s(cumen)m(t)i(w)m(as)g(originally)d(written)h (to)j(accompan)m(y)g(F)-10 b(ASTLINK,)41 b(v)m(ersion)448 1488 y(2.0)27 b(and)e(b)s(ey)m(ond.)38 b(This)24 b(v)m(ersion)h(is)g(a) h(revision)e(mean)m(t)i(to)h(accompan)m(y)g(F)-10 b(ASTLINK,)448 1601 y(v)m(ersion)41 b(4.1P)h(and)e(b)s(ey)m(ond.)72 b(It)41 b(describ)s(es)e(some)i(asp)s(ects)g(of)h(p)s(edigree)d(lo)s (ops)h(in)448 1714 y(F)-10 b(ASTLINK.)35 b(Due)h(to)g(the)g(co)s(de)g (mo)s(di\014cations)d(in)i(v)m(ersions)f(3.0P)j(and)e(4.0P)-8 b(,)37 b(the)448 1827 y(con)m(ten)m(ts)j(of)e(this)f(do)s(cumen)m(t)h (are)h(somewhat)f(in)m(tert)m(wined)f(with)g(the)h(con)m(ten)m(ts)i(of) 448 1940 y Fg(unknown.ps)p Fh(.)f(I)30 b(recommend)h(that)g(y)m(ou)g (con)m(tin)m(ue)g(reading)e(this)h(do)s(cumen)m(t)g(b)s(efore)448 2053 y(reading)g Fg(unknown.ps)p Fh(.)38 b(The)30 b(material)f(herein)g (is)h(based)g(on:)585 2263 y Ff(\017)46 b Fh(pages)26 b(170{171)j(of)d(the)g(revised)e(edition)h Fe(A)n(nalysis)j(of)h(Human) g(Genetic)f(Link-)676 2375 y(age)i Fh(b)m(y)g(Ott,)h(or)g(equiv)-5 b(alen)m(tly)29 b(pages)i(184{185)i(of)e(the)f(third)f(edition,)585 2562 y Ff(\017)46 b Fh(Section)24 b(2.8)h(of)g(Link)-5 b(age)24 b(Analysis)f(P)m(ac)m(k)-5 b(age)27 b(I)s(I:)d(User's)h(Guide) e(T)-8 b(o)25 b(Programs,)585 2749 y Ff(\017)46 b Fh(Section)30 b(4)g(of)g(\\Av)m(oiding)g(Recomputation)g(in)f(Link)-5 b(age)30 b(Analysis")f(b)m(y)h(A.)h(A.)676 2862 y(Sc)m(h\177)-45 b(a\013er,)37 b(S.)e(K.)g(Gupta,)i(K.)e(Shriram,)f(and)h(R.)g(W.)h (Cottingham)f(Jr.)55 b(\(this)676 2975 y(is)31 b(pap)s(er2.ps)h(that)h (comes)h(with)d(the)i(F)-10 b(ASTLINK)32 b(distribution)d(starting)j (at)676 3088 y(v)m(ersion)d(2.0\).)585 3275 y Ff(\017)46 b Fh(Section)22 b(3)h(of)g(\\F)-8 b(aster)25 b(Link)-5 b(age)22 b(Analysis)f(Computations)h(for)g(P)m(edigrees)h(with)676 3387 y(Lo)s(ops)34 b(or)h(Un)m(used)f(Alleles")g(b)m(y)g(A.)h(A.)g(Sc)m (h\177)-45 b(a\013er.)55 b(\(This)33 b(is)h(pap)s(er5.ps)f(that)676 3500 y(comes)e(with)e(the)h(F)-10 b(ASTLINK)30 b(distribution)d (starting)j(at)h(v)m(ersion)f(3.0P\).)585 3687 y Ff(\017)46 b Fh(\\Automatic)29 b(Selection)e(of)i(Lo)s(op)f(Break)m(ers)h(for)f (Genetic)g(Link)-5 b(age)28 b(Analysis")676 3800 y(b)m(y)k(A.)i(Bec)m (k)m(er,)h(D.)f(Geiger,)g(and)e(A.)i(A.)f(Sc)m(h\177)-45 b(a\013er.)48 b(\(This)32 b(is)g(pap)s(er6.ps)f(that)676 3913 y(comes)g(with)e(the)h(F)-10 b(ASTLINK)30 b(distribution)d (starting)j(at)h(v)m(ersion)f(4.0P\).)589 4123 y(It)42 b(di\013ers)e(from)h(these)h(sources)f(in)f(that)i(the)g(presen)m (tation)f(here)g(giv)m(es)h(more)448 4236 y(bac)m(kground)33 b(and)f(is)f(more)i(collo)s(quial)d(in)h(nature.)47 b(Thanks)32 b(to)h(Brian)e(Nic)m(hols)h(\(U.)448 4349 y(Io)m(w)m(a\))47 b(for)f(asking)e(enough)i(questions)e(ab)s(out)h(lo)s(ops)g(to)h(motiv) -5 b(ate)46 b(me)g(to)g(write)448 4462 y(this)e(do)s(cumen)m(t.)83 b(Thanks)44 b(to)h(Sandeep)f(Gupta)g(\(Rice)h(Univ)m(ersit)m(y\))g(for) f(helpful)448 4575 y(commen)m(ts)f(on)f(m)m(y)h(\014rst)e(draft.)76 b(Thanks)41 b(to)i(Dylan)e(Co)s(op)s(er)g(for)h(programming)448 4687 y(assistance)28 b(with)e(the)i(lo)s(op)f(algorithms)f(\014rst)h (put)g(in)f(F)-10 b(ASTLINK)27 b(3.0P)-8 b(.)29 b(Thanks)d(to)448 4800 y(Ann)k(Bec)m(k)m(er)i(and)e(Dan)h(Geiger)g(for)f(collab)s (orating)g(on)g(the)h(lo)s(op)e(break)m(er)i(selection)448 4913 y(co)s(de)g(put)f(in)f(F)-10 b(ASTLINK)29 b(4.0P)i(and)f(4.1P)-8 b(.)1920 5162 y(1)p eop %%Page: 2 2 2 1 bop 448 623 a Fd(In)m(breeding)38 b(Lo)s(ops)g(vs.)50 b(Marriage)38 b(Lo)s(ops)448 794 y Fh(After)22 b(reading)f(man)m(y)g (pap)s(ers)g(with)f(p)s(edigree)g(pictures,)j(I)e(ha)m(v)m(e)i(come)f (to)h(the)e(conclu-)448 907 y(sion)27 b(that)i(geneticists)f(think)f (it)h(is)f(imp)s(ortan)m(t)g(to)i(distinguish)24 b(b)s(et)m(w)m(een)29 b(in)m(breeding)448 1020 y(\(consanguinit)m(y\))44 b(lo)s(ops)f(and)g (marriage)g(lo)s(ops.)81 b(F)-8 b(or)44 b(the)g(purp)s(oses)e(of)i(p)s (edigree)448 1133 y(tra)m(v)m(ersal)29 b(algorithms)d(in)h(LINKA)m(GE)g (this)g(distinction)e(is)i(irrelev)-5 b(an)m(t.)39 b(Simply)24 b(put,)448 1246 y(a)32 b(lo)s(op)f(represen)m(ts)h(a)g(cycle)g(in)e (the)i(n)m(uclear)f(family)f(graph)i(de\014ned)e(in)g(the)i(accom-)448 1359 y(pan)m(ying)h(do)s(cumen)m(t)g Fe(Pe)-5 b(digr)g(e)g(e)35 b(T)-7 b(r)i(aversal)38 b(in)d(F)-9 b(ASTLINK)p Fh(.)32 b(Alternativ)m(ely)-8 b(,)34 b(a)g(lo)s(op)448 1472 y(represen)m(ts)44 b(an)f(undirected)e(cycle)j(in)e(the)i(undirected)d(v)m(ersion)i(of)h (the)f(marriage)448 1585 y(graph)30 b(de\014ned)f(in)g(pap)s(er6.ps.) 448 1828 y Fd(Maxlo)s(op)448 2000 y Fh(LINKA)m(GE)38 b(and)f(F)-10 b(ASTLINK)37 b(ha)m(v)m(e)i(a)f(constan)m(t)h(called)e (maxlo)s(op.)62 b(In)37 b(order)g(for)448 2113 y(the)42 b(programs)f(to)h(run)e(correctly)-8 b(,)45 b(maxlo)s(op)c(m)m(ust)g(b) s(e)g(at)h(least)g(as)g(large)f(as)h(the)448 2226 y(n)m(um)m(b)s(er)f (of)h(lo)s(ops)f(in)g(an)m(y)h(of)g(the)h(input)d(p)s(edigrees.)74 b(There)42 b(are)g(no)g(signi\014can)m(t)448 2338 y(negativ)m(e)32 b(consequences)f(for)f(making)g(maxlo)s(op)g(larger)g(than)h(it)f (needs)g(to)h(b)s(e)f(when)448 2451 y(running)24 b(sequen)m(tially)-8 b(,)26 b(except)h(that)g(the)g(prepro)s(cessor)e(program)h(MAKEPED)g (has)448 2564 y(an)i(output)f(formatting)g(bug)g(on)g(input)e(p)s (edigrees)i(that)g(ha)m(v)m(e)i(9)f(or)f(more)h(lo)s(ops)e(\(see)448 2677 y(the)c(section)g(on)f(Enco)s(ding)f(Lo)s(ops)h(in)f(p)s (edin.dat\).)36 b(The)21 b(UNKNO)m(WN)h(program)g(had)448 2790 y(a)33 b(similar)d(formatting)i(bug,)g(but)g(it)g(w)m(as)g (\014xed)g(in)f(F)-10 b(ASTLINK)31 b(3.0P)-8 b(.)34 b(F)-10 b(ASTLINK)448 2903 y(2.3P)40 b(w)m(ould)d(not)h(run)f(in)g(parallel)f (for)i(some)h(lo)s(op)s(ed)e(p)s(edigrees,)i(esp)s(ecially)d(with)448 3016 y(m)m(ultiple)28 b(lo)s(ops.)589 3129 y(In)i(LINKA)m(GE)h(5.1)h (and)e(early)h(v)m(ersions)f(of)g(F)-10 b(ASTLINK,)30 b(maxlo)s(op)g(is)g(set)h(to)h(2)448 3242 y(in)26 b(the)h (distribution.)36 b(More)27 b(recen)m(t)h(releases)f(of)g(F)-10 b(ASTLINK)26 b(ha)m(v)m(e)i(set)f(maxlo)s(op)f(at)448 3355 y(8)32 b(or)g(higher.)42 b(Starting)31 b(with)f(F)-10 b(ASTLINK,)31 b(v)m(ersion)g(3.0P)-8 b(,)33 b(the)f(constan)m(t)h (maxlo)s(op)448 3468 y(also)f(app)s(ears)f(in)f(unkno)m(wn.c.)44 b(Rumor)30 b(has)i(it)f(that)h(some)g(v)m(ersions)f(of)h(LINKA)m(GE)448 3580 y(ha)m(v)m(e)j(b)s(een)e(distributed)d(with)j(maxlo)s(op)g(set)h (to)g(1.)51 b(Some)33 b(v)m(ersions)g(of)h(LINKA)m(GE)448 3693 y(ha)m(v)m(e)e(a)f(bug)f(that)h(if)e(the)i(n)m(um)m(b)s(er)e(of)i (lo)s(ops)f(in)f(the)h(input)f(p)s(edigree)h(is)f(higher)g(than)448 3806 y(maxlo)s(op,)d(incorrect)e(results)g(are)h(giv)m(en,)h(rather)e (than)h(an)f(error)h(message.)40 b(The)24 b(user)448 3919 y(is)30 b(free)g(to)h(increase)g(the)f(v)-5 b(alue)30 b(of)g(maxlo)s(op.)589 4032 y(There)k(is)e(no)i(correctness)g(harm)f (in)g(trying)f(input)g(p)s(edigrees)g(with)h(arbitrarily)448 4145 y(large)41 b(n)m(um)m(b)s(er)e(of)i(lo)s(ops,)h(so)e(long)g(as)h (maxlo)s(op)f(is)f(set)i(at)g(least)g(as)g(large)f(as)h(the)448 4258 y(n)m(um)m(b)s(er)26 b(of)g(lo)s(ops.)39 b(Dep)s(ending)25 b(on)h(the)h(data)g(set,)h(the)f(running)d(time)i(ma)m(y)h(increase)448 4371 y(exp)s(onen)m(tially)42 b(with)g(the)i(n)m(um)m(b)s(er)e(of)i(lo) s(ops.)79 b(In)43 b(F)-10 b(ASTLINK)43 b(3.0P)-8 b(,)45 b(the)e(space)448 4484 y(requiremen)m(ts)c(ma)m(y)i(also)f(increase)g (substan)m(tially;)j(this)d(w)m(as)g(not)g(true)g(in)f(earlier)448 4597 y(v)m(ersions,)30 b(but)g(the)h(use)f(of)g(extra)h(space)g(p)s (ermits)e(substan)m(tial)g(time)h(sa)m(vings.)1920 5162 y(2)p eop %%Page: 3 3 3 2 bop 448 623 a Fd(Coun)m(ting)37 b(and)h(Breaking)g(Lo)s(ops)448 794 y Fh(Through)24 b(all)h(v)m(ersions)f(of)i(LINKA)m(GE)f(and)g(F)-10 b(ASTLINK)25 b(3.0P)-8 b(,)26 b(the)g(w)m(a)m(y)g(to)g(break)g(a)448 907 y(lo)s(op)f(is)g(to)h(\\clone")h(one)f(of)g(the)g(participating)e (individuals)d Fc(a)26 b Fh(in)m(to)f(t)m(w)m(o)i(p)s(eople:)38 b(one)448 1020 y(p)s(erson)c(acts)i(as)e(paren)m(t)h(and)g(the)f(other) h(acts)h(as)f(c)m(hild)e(and)h(sibling.)51 b(F)-10 b(ASTLINK)448 1133 y(4.0P)25 b(in)m(tro)s(duces)e(a)h(more)g(general)g(cloning)e(op)s (eration)i(for)f(p)s(edigrees)g(with)f(m)m(ultiple)448 1246 y(marriages.)40 b(If)29 b(a)g(p)s(erson)f(participates)g(in)g Fc(k)k Fh(marriages,)d(it)f(is)g(p)s(ermissible)d(to)30 b(mak)m(e)448 1359 y(up)c(to)i Fc(k)16 b Fh(+)d(1)28 b(copies,)f(one)h(c)m(hild)d(cop)m(y)i(and)g(up)f(to)h Fc(k)j Fh(paren)m(t)d(copies.)40 b(The)26 b(n)m(um)m(b)s(er)g(of)448 1472 y(copies)e(is)e(constrained)h(b)m(y)h(the)f(requiremen)m(t)g(that) h(the)g(p)s(ost-cloning)f(p)s(edigree)f(m)m(ust)448 1585 y(b)s(e)34 b(connected.)53 b Fe(Conne)-5 b(cte)g(d)36 b Fh(means)e(that)g(there)h(is)e(a)i(path)e(of)i(relationships)c (\(e.g.,)448 1698 y(sp)s(ouse,)h(c)m(hild,)f(paren)m(t\))h(connecting)g (an)m(y)h(t)m(w)m(o)g(p)s(eople.)44 b(The)32 b(cloning)f(op)s(eration)g (is)448 1810 y(illustrated)d(in)h(pap)s(er6.ps.)589 1923 y(Through)21 b(F)-10 b(ASTLINK)21 b(3.0P)-8 b(,)23 b(the)f(n)m(um)m(b)s (er)f(of)h(lo)s(ops)e(and)i(the)g(n)m(um)m(b)s(er)e(of)i(p)s(eople)448 2036 y(cloned)38 b(w)m(ere)g(equated.)63 b(The)37 b(in)m(tro)s(duction) f(of)i(generalized)f(cloning)g(means)g(that)448 2149 y(the)23 b(n)m(um)m(b)s(er)f(of)g(p)s(eople)g(cloned)g(is)g(no)m(w)h (less)f(than)g(or)h(equal)f(to)i(the)f(n)m(um)m(b)s(er)e(of)i(lo)s (ops.)448 2262 y(In)35 b(terms)f(of)i(the)f(n)m(uclear)f(family)f (graph)i(the)g(n)m(um)m(b)s(er)f(of)h(lo)s(ops)f(is)g(the)h(minim)m(um) 448 2375 y(n)m(um)m(b)s(er)e(of)h(edges)h(whose)f(remo)m(v)-5 b(al)35 b(from)e(the)i(n)m(uclear)e(family)g(graph)g(mak)m(es)i(that) 448 2488 y(graph)25 b(in)m(to)g(a)g(tree)h(\(i.e.)39 b(a)25 b(connected)h(graph)e(with)g(no)h(cycles\).)39 b(When)25 b(t)m(w)m(o)h(of)g(these)448 2601 y(edges)39 b(are)g(inciden)m(t)e(to)i(t)m(w)m(o)h(distinct)c(n)m(uclear)i (families)e(with)h(a)i(common)g(paren)m(t)448 2714 y(\(who)29 b(married)e(m)m(ultiple)g(times\),)i(then)f(that)i(common)f(paren)m(t)g (can)g(b)s(e)f(cloned)g(in)m(to)448 2827 y Fc(>)d Fh(2)31 b(copies.)589 2940 y(W)-8 b(e)41 b(call)d(the)h(individuals)34 b(who)k(are)h(cloned,)i Fe(lo)-5 b(op)42 b(br)-5 b(e)g(akers)p Fh(.)68 b(In)38 b(F)-10 b(ASTLINK)448 3052 y(4.0P)i(,)28 b(it)e(is)f(still)f(the)i(case)h(that)f(the)h(p)s(edigree)e(\014le)g (input)f(to)j(unkno)m(wn)d(m)m(ust)i(ha)m(v)m(e)h(at)448 3165 y(most)d(2)f(copies)h(p)s(er)e(lo)s(op)g(break)m(er.)39 b(Within)21 b(unkno)m(wn,)j(the)f(c)m(hoice)h(of)f(lo)s(op)g(break)m (ers)448 3278 y(ma)m(y)30 b(b)s(e)e(adjusted,)h(and)f(it)g(ma)m(y)i(b)s (e)e(the)h(case)h(that)g(the)f(p)s(edigree)e(presen)m(ted)i(to)h(the) 448 3391 y(main)e(program)g(\(ilink,)e(linkmap,)h(mlink\))f(has)i Fc(>)d Fh(2)k(copies)f(of)g(some)h(lo)s(op)f(break)m(ers.)448 3504 y(In)j(F)-10 b(ASTLINK)30 b(4.1P)-8 b(,)34 b(unkno)m(wn)29 b(can)j(no)m(w)g(accept)g(p)s(edigrees)f(in)f(whic)m(h)g(there)i(are) 448 3617 y Fc(>)i Fh(2)j(copies)e(of)h(some)h(lo)s(op)e(break)m(ers.)57 b(This)34 b(is)h(imp)s(ortan)m(t)g(for)h(some)g(non-h)m(uman)448 3730 y(p)s(edigrees,)25 b(in)d(whic)m(h)h(it)h(is)f(not)h(p)s(ossible)e (to)i(break)g(all)f(lo)s(ops)g(using)g(at)h(most)h(2)f(copies)448 3843 y(p)s(er)30 b(lo)s(op)f(break)m(er.)589 3956 y(The)23 b(selection)f(of)h(lo)s(op)f(break)m(ers)h(can)g(ha)m(v)m(e)h(a)f (drastic)f(impact)g(on)h(running)d(time.)448 4069 y(Through)27 b(F)-10 b(ASTLINK)26 b(3.0P)j(it)e(w)m(as)h(essen)m(tial)f(that)h(the)g (user)f(b)s(e)g(extremely)h(clev)m(er)448 4182 y(in)h(c)m(ho)s(osing)h (the)h(lo)s(op)e(break)m(ers.)41 b(In)30 b(F)-10 b(ASTLINK)29 b(4.0P)j(it)d(w)m(as)i(only)f(necessary)g(to)448 4294 y(c)m(ho)s(ose)g(a)g(v)-5 b(alid)27 b(set)j(of)f(lo)s(op)f(break)m (ers.)41 b(F)-10 b(ASTLINK)28 b(4.1P)i(pro)m(vides)e(the)h(abilit)m(y)e (to)448 4407 y(c)m(ho)s(ose)32 b(a)e(go)s(o)s(d)h(set)g(of)f(lo)s(op)g (break)m(ers)g(automatically)-8 b(,)31 b(as)g(follo)m(ws.)559 4563 y(1.)47 b(Put)30 b(the)g(p)s(edigree)g(\014le)f(in)g Fg(pedfile.dat)p Fh(.)559 4738 y(2.)47 b(Put)30 b(the)g(lo)s(cus)f (\014le)h(in)f Fg(datafile.dat)p Fh(.)559 4913 y(3.)47 b(Call)29 b Fg(unknown)45 b(-l)p Fh(.)1920 5162 y(3)p eop %%Page: 4 4 4 3 bop 589 623 a Fh(A)21 b(new)f(p)s(edigree)f(\014le)g(with)g(lo)s (op)h(break)m(ers)g(c)m(hosen)h(will)d(b)s(e)h(prin)m(ted)g(to)i Fg(lpedfile.dat)p Fh(.)448 736 y(The)j(new)f(p)s(edigree)g(\014le)g (can)h(then)g(b)s(e)f(used)h(as)g(a)g(standard)f(p)s(ost-mak)m(ep)s(ed) h(p)s(edigree)448 848 y(\014le)34 b(in)g(input)f(for)h(more)h(link)-5 b(age)34 b(analysis.)53 b(A)35 b(v)m(ery)g(imp)s(ortan)m(t)f(b)s (ene\014t)g(is)g(that)i(it)448 961 y(is)d(no)g(longer)h(necessary)g(to) g(break)g(lo)s(ops)e(in)h(the)g Fg(makped)f Fh(prepro)s(cessor)h (program.)448 1074 y(The)42 b(user)g(can)h(no)m(w)g(simply)d(tell)i (mak)m(ep)s(ed)g(that)h(all)f(p)s(edigrees)f Fe(have)j(no)h(lo)-5 b(ops)p Fh(,)448 1187 y(ev)m(en)28 b(though)f(that)g(ma)m(y)h(b)s(e)e (false,)h(and)g(then)f(break)h(the)g(lo)s(ops)f(using)g Fg(unknown)45 b(-l)p Fh(.)448 1300 y(In)32 b(particular,)f(the)h (iterativ)m(e,)h(and)e(in)m(teractiv)m(e)i(metho)s(d)e(of)i(breaking)e (lo)s(ops)g(using)448 1413 y(mak)m(ep)s(ed)i(and)f(a)h(program)g (called)f(LOOPS)f([Xie)i(X,)g(Ott)g(J:)g(Finding)d(all)i(lo)s(ops)f(in) 448 1526 y(a)f(p)s(edigree.)39 b(Am)29 b(J)g(Hum)g(Genet)h(1992;)i (51:A205],)h(as)c(adv)m(o)s(cated)i(on)e(pages)h(93{96)448 1639 y(of)e(Handb)s(o)s(ok)f(of)h(Human)f(Genetic)i(Link)-5 b(age)27 b(Analysis)f(b)m(y)i(T)-8 b(erwilliger)25 b(and)i(Ott,)i(is) 448 1752 y(no)m(w)i Fe(obsolete)p Fh(.)589 1865 y(The)c(problem)d(of)j (selecting)g(lo)s(op)e(break)m(ers)i(clev)m(erly)f(is)g(the)h(topic)f (of)h(pap)s(er6.ps.)448 1978 y(This)34 b(problem)h(has)g(deep)h (connections)g(to)h(w)m(ork)f(in)e(com)m(binatorial)h(optimization)448 2090 y(and)21 b(probabilistic)c(inference.)37 b(F)-10 b(ASTLINK)20 b(4.0P)i(implemen)m(ts)e(a)h(solution)f(to)i(math-)448 2203 y(ematical)37 b(de\014nition)e(of)i(the)g(lo)s(op)f(break)m(er)h (selection)g(problem.)58 b(The)37 b(problem)e(is)448 2316 y(to)41 b(minimize)c(a)j(mathematical)g(quan)m(tit)m(y)g(that)g (should)e(b)s(e)h(w)m(ell-correlated)g(with)448 2429 y(computation)28 b(time.)39 b(The)27 b(solution)f(in)h(F)-10 b(ASTLINK)26 b(4.0P)j(is)d(pro)m(v)-5 b(ably)27 b(optimal)f(for)448 2542 y(p)s(edigrees)34 b(without)h(m)m(ultiple)e(marriages,)j(and)f (sho)m(ws)g(esp)s(ecially)f(go)s(o)s(d)h(impro)m(v)m(e-)448 2655 y(men)m(t)30 b(\(but)e(is)g(not)h(necessarily)f(optimal\))g(on)h (p)s(edigrees)f(with)f(m)m(ultiple)g(marriages.)448 2768 y(F)-10 b(ASTLINK)22 b(4.1)i(in)m(tro)s(duces)e(a)i(new)e(metho)s(d)g (of)i(lo)s(op)e(break)m(er)h(selection)g(for)f(lo)s(op)s(ed)448 2881 y(p)s(edigrees)32 b(with)f(m)m(ultiple)f(marriages.)47 b(This)30 b(metho)s(d)i(w)m(as)h(dev)m(elop)s(ed)f(b)m(y)g(Reuv)m(en) 448 2994 y(Bar-Y)-8 b(eh)m(uda,)32 b(Ann)e(Bec)m(k)m(er,)i(and)e(Dan)h (Geiger,)g(and)f(is)f(explained)g(in)g(pap)s(er7.ps.)448 3237 y Fd(Enco)s(ding)37 b(Lo)s(ops)i(in)d(p)s(edin.dat)448 3409 y Fh(I)h(ha)m(v)m(e)h(learned)e(the)i(hard)d(w)m(a)m(y)j(that)g (the)f(w)m(a)m(y)h(lo)s(ops)e(are)i(enco)s(ded)e(in)g(p)s(edin.dat)448 3522 y(is)31 b(not)h(prominen)m(tly)d(explained)h(in)g(the)i(LINKA)m (GE)g(do)s(cumen)m(tation.)44 b(Here)32 b(is)f(m)m(y)448 3635 y(attempt)h(at)f(a)g(comprehensiv)m(e)e(explanation.)589 3748 y(The)36 b(presence)g(or)f(absence)i(of)e(lo)s(ops)g(is)g(enco)s (ded)g(in)g(column)f(9)j(of)f(p)s(edin.dat.)448 3860 y(The)e(en)m(tries)h(in)e(column)g(9)i(range)g(from)f(0)h(to)g(\(1)h(+) e(n)m(um)m(b)s(er)f(of)i(lo)s(ops\).)53 b(F)-8 b(or)35 b(eac)m(h)448 3973 y(lo)s(op)24 b(the)g(user)f(m)m(ust)h(designate)g (one)h(individual)19 b(to)25 b(b)s(e)f(the)g(lo)s(op)f(break)m(er.)39 b(The)24 b(user)448 4086 y(should)35 b(then)h(mak)m(e)i(t)m(w)m(o)f (copies)g(of)f(the)h(ro)m(w)g(of)f(data)h(for)g(the)f(lo)s(op)g(break)m (er.)59 b(All)448 4199 y(the)33 b(genot)m(yp)s(e)g(data)g(in)e(those)h (t)m(w)m(o)i(ro)m(ws)e(is)f(the)h(same,)i(but)d(the)h(\014rst)g (columns)f(are)448 4312 y(di\013eren)m(t.)40 b(In)27 b(one)i(instance)e(the)i(lo)s(op)e(break)m(er)i(has)f(no)g(paren)m(ts,) h(but)e(has)h(c)m(hildren,)448 4425 y(and)i(in)f(the)i(other)f(the)h (lo)s(op)e(break)m(er)i(has)f(c)m(hildren)e(but)i(no)g(paren)m(ts.)589 4538 y(The)24 b(t)m(w)m(o)i(copies)f(of)f(the)h(lo)s(op)f(break)m(er)g (for)h(the)f Fc(i)2273 4505 y Fb(th)2369 4538 y Fh(lo)s(op)g(m)m(ust)g (ha)m(v)m(e)i(the)e(n)m(um)m(b)s(er)448 4651 y(i+1)34 b(in)f(column)h(9)h(unless)d(one)j(of)g(them)f(is)g(also)g(the)h (proband)e(in)g(whic)m(h)g(case)j(one)448 4764 y(cop)m(y)c(has)f(a)h(1) g(and)e(the)i(other)f(has)g(i+1)g(in)f(column)g(9.)44 b(I.e.,)32 b(the)g(t)m(w)m(o)g(copies)f(of)h(the)448 4877 y(lo)s(op)d(break)m(er)h(for)g(the)f(\014rst)g(lo)s(op)g(ha)m(v)m (e)i(a)f(2,)g(the)g(t)m(w)m(o)h(copies)f(of)f(a)h(lo)s(op)f(break)m(er) h(for)1920 5162 y(4)p eop %%Page: 5 5 5 4 bop 448 623 a Fh(the)31 b(second)g(lo)s(op)g(ha)m(v)m(e)h(a)f(3,)h (etc.)43 b(In)31 b(eac)m(h)h(p)s(edigree)e(the)h(user)f(ma)m(y)i (designate)f(one)448 736 y(non-lo)s(op)g(break)m(er)h(to)g(b)s(e)g(the) f(\\proband")h(b)m(y)f(giving)g(that)h(p)s(erson)f(a)h(1)g(in)e(column) 448 848 y(9.)40 b(An)m(y)26 b(other)g(individuals)21 b(who)k(are)h(not)g(the)g(proband)f(and)g(not)h(lo)s(op)f(break)m(ers)h (get)448 961 y(a)33 b(0)g(in)e(column)h(9.)47 b(The)32 b(setup)h(of)f(p)s(edin.dat,)g(including)d(the)k(designation)e(of)i(lo) s(op)448 1074 y(break)m(ers,)e(can)g(b)s(e)e(done)h(semi-automatically) g(with)f(the)h(MAKEPED)h(program)f(as)448 1187 y(describ)s(ed)39 b(b)m(y)h(T)-8 b(erwilliger)38 b(and)i(Ott.)72 b(Bew)m(are)42 b(of)f(old)f(v)m(ersions)g(of)h(MAKEPED)448 1300 y(con)m(taining)f(a)g (bug)f(that)i(puts)e(a)h(2)g(in)f(column)g(9)h(for)g Fe(every)f Fh(cop)m(y)i(of)f Fe(every)g Fh(lo)s(op)448 1413 y(break)m(er.)589 1526 y(F)-8 b(or)32 b(example,)e(t)m(w)m(o)i (lines)c(that)j(start:)589 1689 y(1)g(3)g(0)g(0)f(7)h(0)g(0)g(1)g(2)f ([Genot)m(yp)s(e)i(data)f(here])589 1802 y(1)g(4)g(1)g(2)f(0)h(5)g(5)g (1)g(2)f([same)h(genot)m(yp)s(e)h(data)f(here])448 1964 y(w)m(ould)e(enco)s(de)i(a)g(lo)s(op.)589 2077 y(The)f(1)g(in)f(column) f(1)i(indicates)f(p)s(edigree)g(n)m(um)m(b)s(er)g(1.)41 b(The)29 b(3)h(and)f(4)i(in)d(column)448 2190 y(2)33 b(indicate)f(the)h(t)m(w)m(o)h(n)m(um)m(b)s(ers)d(assigned)h(to)h(the)g (t)m(w)m(o)h(copies)e(of)h(the)g(lo)s(op)e(break)m(er.)448 2303 y(This)c(p)s(erson)h(is)g(a)h(male)f(due)g(to)i(the)f(1)g(in)e (column)h(8)h(and)f(is)g(a)h(lo)s(op)f(break)m(er)h(due)f(to)448 2416 y(the)i(2)h(in)d(column)h(9.)41 b(Individual)26 b(n)m(um)m(b)s(er)i(3)i(acts)h(as)f(a)h(paren)m(t;)f(the)g(7)g(in)f (column)g(5)448 2529 y(indicates)j(that)h(individual)28 b(7)33 b(is)f(the)h(\014rst)f(c)m(hild)f(of)h(the)h(lo)s(op)f(break)m (er.)48 b(Individual)448 2642 y(n)m(um)m(b)s(er)35 b(4)i(acts)h(as)e(a) h(c)m(hild)e(and)h(sibling.)55 b(The)36 b(1)h(in)e(column)h(3)g (indicates)g(that)h(1)448 2755 y(is)j(the)i(father)f(of)g(the)g(lo)s (op)f(break)m(er.)73 b(The)41 b(2)g(in)f(column)g(4)h(indicates)f(that) i(2)f(is)448 2868 y(the)c(mother)g(of)g(the)g(lo)s(op)f(break)m(er.)61 b(The)36 b(5)h(in)f(columns)f(6)i(and)f(7)i(indicates)d(that)448 2980 y(individual)20 b(n)m(um)m(b)s(er)j(5)i(is)e(the)i(next)g (paternal)f(sibling)d(and)j(next)g(maternal)g(sibling)e(of)448 3093 y(the)h(lo)s(op)e(break)m(er.)38 b(The)22 b(n)m(um)m(b)s(ers)f (assigned)g(to)i(the)g(t)m(w)m(o)g(copies)f(of)h(the)f(lo)s(op)g(break) m(er)448 3206 y(in)34 b(column)g(2)h(need)g(not)h(b)s(e)e(consecutiv)m (e.)56 b(The)34 b(t)m(w)m(o)j(lines)c(for)i(a)g(lo)s(op)g(break)m(er)g (do)448 3319 y(not)h(ha)m(v)m(e)g(to)g(o)s(ccur)g(consecutiv)m(ely)f (in)f(p)s(edin.dat.)54 b(Since)34 b(F)-10 b(ASTLINK)34 b(4.0P)i(uses)448 3432 y(m)m(ulti-cop)m(y)e(cloning)f(it)h(is)g(p)s (ossible)d(to)k(use)f(more)h(than)f(t)m(w)m(o)i(lines)c(with)h(the)i (same)448 3545 y(n)m(um)m(b)s(er)d(in)g(column)g(9.)49 b(In)33 b(suc)m(h)g(a)g(case,)i(only)d(one)i(cop)m(y)g(should)d(b)s(e)h (a)i(c)m(hild)d(\(i.e.,)448 3658 y(ha)m(v)m(e)h(non-zero)f(en)m(tries)f (in)f(columns)g(3)i(and)f(4\).)589 3771 y(Here)h(is)f(a)h(tabular)e (summary)g(of)i(what)f(the)h(columns)e(enco)s(de:)589 3884 y(Column)g(1:)41 b(P)m(edigree)31 b(n)m(um)m(b)s(er)589 3997 y(Column)e(2:)41 b(Individual)26 b(n)m(um)m(b)s(er)589 4110 y(Column)j(3:)41 b(Num)m(b)s(er)29 b(of)i(father)589 4223 y(Column)e(4:)41 b(Num)m(b)s(er)29 b(of)i(mother)589 4335 y(Column)e(5:)41 b(First)30 b(c)m(hild)589 4448 y(Column)f(6:)41 b(Next)31 b(sibling)d(with)h(same)h(father)589 4561 y(Column)f(7:)41 b(Next)31 b(sibling)d(with)h(same)h(mother)589 4674 y(Column)f(8:)41 b(Male)31 b(\(enco)s(ded)f(as)h(1\))g(or)f (female)h(\(enco)s(ded)f(as)h(2\))589 4787 y(Column)h(9:)48 b(Neither)33 b(proband)f(nor)h(lo)s(op)g(break)m(er)h(\(0\),)i(proband) c(\(1\),)j(or)f(lo)s(op)448 4900 y(break)m(er)d(for)f(lo)s(op)g Fc(i)g Fh(\()p Fc(i)21 b Fh(+)f(1\))1920 5162 y(5)p eop %%Page: 6 6 6 5 bop 589 623 a Fh(It)50 b(is)e(highly)g(preferable)g(to)i(c)m(ho)s (ose)g(lo)s(op)f(break)m(ers)g(whose)g(genot)m(yp)s(es)i(are)448 736 y(kno)m(wn.)j(This)33 b(is)i(done)f(automatically)h(in)f(F)-10 b(ASTLINK)34 b(4.0P)i(and)e(b)s(ey)m(ond.)54 b(This)448 848 y(w)m(as)31 b(not)f(as)g(apparen)m(t)g(as)g(it)f(should)f(ha)m(v)m (e)j(b)s(een)e(in)g(LINKA)m(GE)h(5.1)h(or)f(earlier)e(v)m(er-)448 961 y(sions)37 b(of)g(F)-10 b(ASTLINK)36 b(b)s(ecause)i(there)f(w)m(as) h(an)f(algorithmic)f(ine\016ciency)g(in)g(han-)448 1074 y(dling)29 b(lo)s(op)g(break)m(ers)i(of)g(kno)m(wn)f(genot)m(yp)s(e.)42 b(I)30 b(ha)m(v)m(e)i(corrected)g(this)d(ine\016ciency)g(in)448 1187 y(F)-10 b(ASTLINK)36 b(3.0P)i(and)e(the)h(correction)g(is)e (describ)s(ed)g(in)g(pap)s(er5.ps.)59 b(Thanks)35 b(to)448 1300 y(Jacques)f(Bec)m(kmann)h(for)e(sending)f(me)i(a)g(data)g(set)h (that)f(brough)m(t)f(the)h(problem)e(to)448 1413 y(m)m(y)f(atten)m (tion.)589 1526 y(As)24 b(a)f(result)f(of)i(the)f(c)m(hanges)h(in)e(F) -10 b(ASTLINK)22 b(3.0P)-8 b(,)25 b(ha)m(ving)e(more)g(lo)s(op)g(break) m(ers)448 1639 y(of)36 b(kno)m(wn)g(genot)m(yp)s(e)h(do)s(es)e(not)i (increase)e(the)i(running)c(time)i(or)h(space)h(usage)f(to)s(o)448 1752 y(badly)-8 b(.)60 b(What)38 b(matters)f(no)m(w)g(is)f(the)h(n)m (um)m(b)s(er,)h Fc(u)p Fh(,)h(of)e(lo)s(op)f(break)m(ers)h(of)h(unkno)m (wn)448 1865 y(genot)m(yp)s(e.)k(It)29 b(w)m(as)g(alw)m(a)m(ys)g(true)g (that)h(the)f(running)d(time)j(increased)f(exp)s(onen)m(tially)448 1978 y(as)39 b Fc(u)g Fh(increased.)64 b(In)38 b(F)-10 b(ASTLINK)37 b(3.0P)-8 b(,)40 b(the)f(space)g(usage)g(also)g(increases) f(exp)s(o-)448 2090 y(nen)m(tially)30 b(with)f Fc(u)j Fh(in)d(return)h(for)h(substan)m(tial)f(time)h(sa)m(vings.)42 b(One)31 b(can)g(trade)g(time)448 2203 y(for)41 b(space)h(b)m(y)e(lo)m (w)m(ering)h(the)g(constan)m(t)h(max)p 2076 2203 28 4 v 33 w(v)m(ectors)p 2386 2203 V 34 w(considered)e(in)g(unkno)m(wn.c.) 448 2316 y(When)33 b(space)g(is)e(a)i(problem,)f(the)h(co)s(de)f(will)e (output)i(a)h(diagnostic)f(suggesting)h(the)448 2429 y(next)28 b(lo)m(w)m(er)h(v)-5 b(alue)27 b(of)h(max)p 1393 2429 V 33 w(v)m(ectors)p 1703 2429 V 35 w(considered)e(that)j(w)m (ould)e(lead)g(to)i(a)f(substan)m(tial)448 2542 y(space)j(sa)m(vings.) 448 2786 y Fd(Lo)s(op)38 b(Ordering)448 2957 y Fh(One)33 b(of)g(the)h(things)e(that)i(the)f(lo)s(op)f(enco)s(ding)g(system)i (used)e(to)i(imply)d(is)h(that)i(the)448 3070 y(user)28 b(gets)i(to)f(c)m(ho)s(ose)h(the)f(n)m(um)m(b)s(ering)d(of)j(the)g(lo)s (ops.)39 b(F)-8 b(or)30 b(example,)f(supp)s(ose)e(there)448 3183 y(are)35 b(three)f(lo)s(ops.)52 b(Then)33 b(there)h(will)e(b)s(e)h (three)i(lo)s(op)e(break)m(er)i(pairs)d(of)j(individuals)448 3296 y(\(in)f(p)s(edin.dat\).)53 b(The)35 b(user)f(can)h(c)m(ho)s(ose)h (whic)m(h)e(pair)g(gets)i(2)f(in)f(column)g(9,)i(whic)m(h)448 3409 y(pair)31 b(gets)j(3)f(in)e(column)g(9,)i(and)f(whic)m(h)f(pair)g (gets)j(4)e(in)f(column)g(9.)48 b(The)31 b(programs)448 3522 y(should)e(giv)m(e)i(the)f(same)h(answ)m(er)f(no)g(matter)i(whic)m (h)d(lo)s(op)g(ordering)g(is)h(c)m(hosen.)589 3635 y(Ho)m(w)m(ev)m(er,) 35 b(in)30 b(F)-10 b(ASTLINK)31 b(2.0,)i(the)f(\014rst)f(lo)s(op,)h (whose)f(lo)s(op)g(break)m(ers)h(get)h(a)f(2)448 3748 y(in)g(column)g(9,)j(is)e(treated)h(sp)s(ecially)-8 b(.)48 b(What)34 b(this)e(means)h(for)g(the)h(user)f(is)f(that)i(the)448 3860 y(c)m(hoice)e(of)f(whic)m(h)e(lo)s(op)h(gets)i(enco)s(ded)e(as)h (2)g(can)g(ha)m(v)m(e)h(a)f(drastic)f(e\013ect)i(on)f(running)448 3973 y(time,)g(but)e(not)i(correctness)g(of)g(the)f(results.)589 4086 y(F)-10 b(ASTLINK)23 b(4.0P)i(automatically)f(reorders)g(the)g(lo) s(op)f(break)m(ers)h(according)g(to)h(a)448 4199 y(heuristic)e(that)i (should)d(giv)m(e)j(the)f(b)s(est)g(running)e(time)i(in)f(most)i (cases.)39 b(The)24 b(heuristic)448 4312 y(is)29 b(to)h(put)f(the)h(lo) s(op)f(break)m(er)h(with)e(the)i(most)g(p)s(ossible)d(genot)m(yp)s(es)j (\014rst)f(\(n)m(um)m(b)s(er)g(2)448 4425 y(in)e(column)g(9\),)j(and)d (then)h(sort)h(the)f(rest)g(from)g(few)m(est)h(p)s(ossible)d(genot)m (yp)s(es)j(to)g(most)448 4538 y(p)s(ossible.)1920 5162 y(6)p eop %%Page: 7 7 7 6 bop 448 623 a Fd(Error)37 b(Detection)f(for)h(Lo)s(op)s(ed)i(P)m (edigrees)448 794 y Fh(There)24 b(are)h(three)g(di\013eren)m(t)e(asp)s (ects)i(of)g(error)f(detection)h(in)e(lo)s(op)s(ed)g(p)s(edigrees:)36 b(non-)448 907 y(Mendelian)29 b(inheritance,)g(to)s(o)j(few)e(lo)s(op)f (break)m(ers,)i(to)s(o)g(man)m(y)g(lo)s(op)e(break)m(ers.)589 1020 y(The)38 b(prepro)s(cessor)e(program)i(UNKNO)m(WN)g(\(See)g(unkno) m(wn.ps\))e(is)h(supp)s(osed)448 1133 y(to)i(detect)h(violations)c(of)j (Mendelian)d(rules)h(in)g(input)f(p)s(edigrees.)62 b(Un)m(til)37 b(a)i(recen)m(t)448 1246 y(p)s(osting)44 b(on)h (bionet.molbio.gene-link)-5 b(age)44 b(b)m(y)h(Lucien)f(Bac)m(hner,)50 b(it)45 b(w)m(as)g(a)h(w)m(ell-)448 1359 y(k)m(ept)36 b(secret)g(that)g(UNKNO)m(WN)g(did)d(no)i(genot)m(yp)s(e)h(inference)f (or)g(error)f(detection)448 1472 y(for)43 b(p)s(edigrees)e(with)g(lo)s (ops.)76 b(I)42 b(ha)m(v)m(e)i(corrected)g(this)d(de\014ciency)h(in)f (F)-10 b(ASTLINK)448 1585 y(3.0P)i(.)30 b(When)e(a)g(lo)s(op)s(ed)f(p)s (edigree)f(con)m(tains)j(an)e(instance)h(of)g(non-Mendelian)f(inher-) 448 1698 y(itance,)34 b(UNKNO)m(WN)f(will)d(simply)g(rep)s(ort)i(the)h (lo)s(cus)e(where)h(there)h(is)e(a)i(problem.)448 1810 y(If)38 b(one)h(then)f(remo)m(v)m(es)i(the)e(lo)s(ops)g(b)m(y)g (zeroing)g(out)h(all)e(en)m(tries)h Fc(>)h Fh(1)f(in)f(column)h(9)448 1923 y(of)j(p)s(edin.dat,)g(one)f(can)h(rerun)e(UNKNO)m(WN)i(with)e(a)i (lo)s(opless)d(p)s(edigree.)70 b(With)448 2036 y(lo)s(opless)34 b(p)s(edigrees,)h(UNKNO)m(WN)h(giv)m(es)g(more)f(information)f(ab)s (out)g(the)i(vicinit)m(y)448 2149 y(of)31 b(the)f(non-Mendelian)f (inheritance.)589 2262 y(LINKA)m(GE)i(and)f(early)g(v)m(ersions)f(of)i (F)-10 b(ASTLINK)29 b(con)m(tained)i(a)g(\015a)m(w)f(that)h(they)448 2375 y(w)m(ould)40 b(allo)m(w)h(the)h(input)d(of)j(lo)s(op)s(ed)e(p)s (edigrees)g(in)g(whic)m(h)g(the)h(selection)g(of)h(lo)s(op)448 2488 y(break)m(ers)26 b(w)m(ould)d(b)s(e)i(insu\016cien)m(t)e(to)j (break)f(all)f(the)h(lo)s(ops.)38 b(In)24 b(most)i(cases)f(including) 448 2601 y(all)43 b(p)s(edigrees)h(without)f(m)m(ultiple)f(marriages,) 48 b(UNKNO)m(WN)d(w)m(ould)e(go)i(in)m(to)f(an)448 2714 y(in\014nite)33 b(lo)s(op.)55 b(This)34 b(in\014nite)f(lo)s(op)h(w)m (as)i(detected)h(with)d(a)h(diagnostic)g(starting)g(in)448 2827 y(F)-10 b(ASTLINK)30 b(2.3P)-8 b(.)589 2940 y(Ken)36 b(Morgan)h(p)s(oin)m(ted)e(out)h(that)h(for)f(p)s(edigrees)f(with)g(m)m (ultiple)f(marriages)i(it)448 3052 y(w)m(as)24 b(p)s(ossible)d(to)k(ha) m(v)m(e)g(an)e(insu\016cien)m(t)f(set)i(of)g(lo)s(op)f(break)m(ers)g (and)g(a)m(v)m(oid)i(the)e(in\014nite)448 3165 y(lo)s(op.)73 b(Therefore,)43 b(in)d(F)-10 b(ASTLINK)41 b(3.0P)h(I)f(added)f(a)i (diagnostic)e(that)i(I)f(b)s(eliev)m(e)448 3278 y(catc)m(hes)32 b(all)e(un)m(brok)m(en)f(p)s(edigree)h(lo)s(ops.)589 3391 y(LINKA)m(GE)44 b(and)e(all)f(v)m(ersions)i(of)g(F)-10 b(ASTLINK,)42 b(through)g(3.0P)i(con)m(tained)f(a)448 3504 y(\015a)m(w)f(in)f(that)h(they)g(accepted)h(some)f(p)s(edigrees)f (with)f(to)s(o)j(man)m(y)f(lo)s(op)f(break)m(ers,)448 3617 y(causing)21 b(the)g(p)s(edigree)g(to)h(b)s(e)e(disconnected.)37 b(The)21 b(results)f(\(i.e.,)k(lik)m(eliho)s(o)s(ds)18 b(and)i(lo)s(d)448 3730 y(scores\))i(for)e(disconnected)g(p)s(edigrees) f(w)m(ould)g(often,)k(but)d(not)g(alw)m(a)m(ys,)k(b)s(e)19 b(su\016cien)m(tly)448 3843 y(implausible)k(as)k(to)g(indicate)f(a)h (serious,)g(unexplained)d(problem)h(in)g(the)i(input.)38 b(This)448 3956 y(problem)29 b(is)h(corrected)h(implicitly)-8 b(,)27 b(without)j(a)g(diagnostic,)g(in)f(F)-10 b(ASTLINK)30 b(4.0P)-8 b(.)448 4199 y Fd(Lo)s(op)38 b(Algorithm)448 4371 y Fh(The)c(basic)g(algorithm)g(for)g(handling)e(lo)s(ops)h(in)h (LINKA)m(GE)g(is)g(describ)s(ed)e(in)i(Ott's)448 4484 y(b)s(o)s(ok,)52 b(pages)d(170{171.)96 b(W)-8 b(e)49 b(describ)s(e)d(it)h(here)h(using)e(more)i(algorithmic)f(lan-)448 4597 y(guage.)k(As)34 b(describ)s(ed)d(in)h(the)i(accompan)m(ying)g(do) s(cumen)m(t)f(on)g Fe(Pe)-5 b(digr)g(e)g(e)36 b(T)-7 b(r)i(aversal)448 4710 y(in)33 b(F)-9 b(ASTLINK)p Fh(,)31 b(the)g(basic)f(goal)i(is)e(to)h(compute)h(for)e(eac)m(h)i(individual) 27 b Fc(x)k Fh(and)f(eac)m(h)448 4822 y(genot)m(yp)s(e)i Fc(g)j Fh(the)c(conditional)e(probabilit)m(y)f Fc(P)13 b Fh(\()p Fc(x;)i(g)s Fh(\))33 b(that)e Fc(x)g Fh(has)f(genot)m(yp)s(e) i Fc(g)s Fh(.)43 b(This)1920 5162 y(7)p eop %%Page: 8 8 8 7 bop 448 623 a Fh(probabilit)m(y)30 b(is)g(conditioned)g(on)i(the)g (parts)f(of)h(the)g(p)s(edigree)f(tra)m(v)m(ersed)h(so)g(far)g(and)448 736 y(the)f(candidate)f Fc(\022)s Fh(.)589 848 y(The)j(probabilit)m(y)e (that)j Fc(x)g Fh(has)f(genot)m(yp)s(e)h Fc(g)j Fh(ma)m(y)d(dep)s(end)e (on)h(the)g(genot)m(yp)s(e)i(of)448 961 y(the)24 b(lo)s(op)e(break)m (er.)39 b(Because)24 b(the)g(lo)s(op)e(break)m(er)i(is)e(treated)i(as)g (t)m(w)m(o)g(di\013eren)m(t)f(p)s(eople,)448 1074 y(w)m(e)35 b(m)m(ust)f(force)h(those)g(t)m(w)m(o)h(p)s(eople)e(to)h(ha)m(v)m(e)g (the)g(same)g(genot)m(yp)s(e)g(during)d(a)j(giv)m(en)448 1187 y(tra)m(v)m(ersal.)k(This)21 b(means)h(that)h(w)m(e)g(m)m(ust)f (re-tra)m(v)m(erse)j(the)d(p)s(edigree)g(for)g(eac)m(h)h(p)s(ossible) 448 1300 y(genot)m(yp)s(e)37 b(of)f(the)h(lo)s(op)e(break)m(er)h(and)f (sum)g(the)i(probabilities)32 b(for)k(eac)m(h)h(tra)m(v)m(ersal.)448 1413 y(F)-8 b(or)42 b(example,)h(supp)s(ose)c(the)i(lo)s(op)f(break)m (er)h(ma)m(y)g(ha)m(v)m(e)h(an)m(y)f(of)g(three)g(genot)m(yp)s(es)448 1526 y Ff(f)p Fh(1)p Fc(;)15 b Fh(2)p Fc(;)g Fh(3)p Ff(g)p Fh(.)42 b(Then)23 b(for)h Fc(i)i Fh(=)f(1)p Fc(;)15 b Fh(2)p Fc(;)g Fh(3)26 b(w)m(e)f(compute)f(the)h(conditional)d (probabilit)m(y)g Fc(P)3199 1540 y Fa(i)3227 1526 y Fh(\()p Fc(x;)15 b(g)s Fh(\))448 1639 y(that)43 b Fc(x)e Fh(has)h(genot)m(yp)s (e)h Fc(g)i Fh(where)c(w)m(e)i(condition)d(on)i(the)g(additional)e (assumption)448 1752 y(that)i(the)f(lo)s(op)g(break)m(er)g(has)g(genot) m(yp)s(e)h Fc(i)p Fh(.)74 b(Then)40 b Fc(P)13 b Fh(\()p Fc(x;)i(g)s Fh(\))43 b(w)m(ould)d(b)s(e)g(computed)448 1865 y(as)35 b(\()p Fc(P)657 1879 y Fb(1)697 1865 y Fh(\()p Fc(x;)15 b(g)s Fh(\))24 b Ff(\003)f Fc(B)5 b Fh(\(1\)\))24 b(+)e(\()p Fc(P)1431 1879 y Fb(2)1471 1865 y Fh(\()p Fc(x;)15 b(g)s Fh(\))25 b Ff(\003)e Fh(\()p Fc(B)1876 1879 y Fb(2)1916 1865 y Fh(\)\))g(+)f(\()p Fc(P)2195 1879 y Fb(3)2235 1865 y Fh(\()p Fc(x;)15 b(g)s Fh(\))25 b Ff(\003)e Fc(B)2605 1879 y Fb(3)2644 1865 y Fh(\),)36 b(where)d Fc(B)5 b Fh(\()p Fc(i)p Fh(\))35 b(is)e(the)448 1978 y(probabilit)m(y)28 b(that)j(the)g(lo)s(op)e(break)m(er)i(has)f (genot)m(yp)s(e)h Fc(i)p Fh(.)589 2090 y(Since)h(eac)m(h)j(p)s(ossible) 30 b(genot)m(yp)s(e)k(of)g(the)f(lo)s(op)f(break)m(er)h(requires)f (another)h(com-)448 2203 y(plete)42 b(tra)m(v)m(ersal)h(of)g(the)f(lo)s (op,)i(it)e(is)f(highly)f(desirable)h(to)h(c)m(ho)s(ose)i(lo)s(op)d (break)m(ers)448 2316 y(that)d(ha)m(v)m(e)h(the)e(few)m(est)h(n)m(um)m (b)s(er)e(of)i(p)s(ossible)c(genot)m(yp)s(es.)63 b(When)37 b(there)g(are)h(m)m(ul-)448 2429 y(tiple)32 b(lo)s(ops,)g(the)h (algorithm)f(m)m(ust)g(do)h(one)g(tra)m(v)m(ersal)g(for)g(eac)m(h)g(v)m (ector)i(of)d(p)s(ossible)448 2542 y(genot)m(yp)s(es)j(of)g(all)d(the)j (lo)s(op)e(break)m(ers.)52 b(I)34 b(am)g(calling)f(these)h Fe(lo)-5 b(op-br)g(e)g(aker)39 b(ve)-5 b(ctors)p Fh(.)448 2655 y(F)d(or)32 b(example,)g(if)e(the)h(\014rst)g(lo)s(op)f(break)m (er)i(has)f(3)g(p)s(ossible)e(genot)m(yp)s(es)j(and)f(the)g(sec-)448 2768 y(ond)26 b(lo)s(op)f(break)m(er)h(has)g(4)g(p)s(ossible)e(genot)m (yp)s(es,)k(there)e(are)h(3)11 b Ff(\002)g Fh(4)26 b(=)f(12)i(lo)s (op-break)m(er)448 2881 y(v)m(ectors)d(and)e(12)i(tra)m(v)m(ersals)f (of)f(the)h(p)s(edigree)f(will)d(b)s(e)j(done)h(for)f(eac)m(h)i(lik)m (eliho)s(o)s(d)19 b(ev)-5 b(al-)448 2994 y(uation.)53 b(This)33 b(explains)g(wh)m(y)h(it)g(ma)m(y)h(b)s(e)f(impractical)f(to) j(handle)d(p)s(edigrees)g(with)448 3107 y(more)h(than)f(2)h(lo)s(ops,)f (whic)m(h)f(in)g(turn)g(explains)g(wh)m(y)h(LINKA)m(GE)g(w)m(as)h (distributed)448 3220 y(with)23 b(maxlo)s(op)g(set)i(to)f(2.)39 b(The)24 b(sp)s(eed)f(of)h(F)-10 b(ASTLINK)23 b(has)h(em)m(b)s(oldened) f(some)h(users)448 3333 y(to)36 b(try)e(more)h(complicated)g(p)s (edigrees,)g(so)g(w)m(e)g(ha)m(v)m(e)h(b)s(o)s(osted)e(the)h(default)f (setting)448 3445 y(to)d(3.)589 3558 y(In)c(F)-10 b(ASTLINK)26 b(2.0,)k(I)d(in)m(tro)s(duced)e(the)j(follo)m(wing)e(optimization.)38 b(Those)27 b(parts)448 3671 y(of)i(the)f(p)s(edigree)g(whose)g (conditional)f(genot)m(yp)s(e)i(probabilities)c(are)k(indep)s(enden)m (t)d(of)448 3784 y(the)d(genot)m(yp)s(e)g(of)g(the)g(lo)s(op)e(break)m (er)i(for)f(the)h(\014rst)f(lo)s(op)f(\(lab)s(eled)g(as)i(2)g(in)e (column)g(9)i(of)448 3897 y(p)s(edin.dat\))30 b(are)i(only)e(tra)m(v)m (ersed)i(once.)44 b(In)30 b(LINKA)m(GE)i(these)g(parts)e(are)i(tra)m(v) m(ersed)448 4010 y(once)f(for)g(eac)m(h)g(p)s(ossible)d(genot)m(yp)s(e) j(of)g(the)f(lo)s(op)g(break)m(er.)589 4123 y(In)37 b(F)-10 b(ASTLINK)36 b(3.0P)-8 b(,)38 b(I)f(in)m(tro)s(duced)e(t)m(w)m(o)j (optimizations.)59 b(First)36 b(in)g(the)h(case)448 4236 y(of)46 b(lo)s(op)f(break)m(ers)g(of)h(kno)m(wn)f(genot)m(yp)s(es,)51 b(the)45 b(new)g(co)s(de)h(iterates)g(m)m(uc)m(h)g(more)448 4349 y(e\016cien)m(tly)29 b(o)m(v)m(er)i(the)e(p)s(ossible)e(lo)s(op)i (break)m(er)g(v)m(ectors.)42 b(Second,)30 b(UNKNO)m(WN)g(no)m(w)448 4462 y(do)s(es)35 b(genot)m(yp)s(e)g(inference)f(for)h(lo)s(op)s(ed)e (p)s(edigrees.)53 b(As)35 b(a)g(consequence,)i(it)d(\014gures)448 4575 y(out)28 b(whic)m(h)e(v)m(ectors)i(of)g(lo)s(op)e(break)m(er)i (genot)m(yp)s(es)g(are)f(not)h(consisten)m(t)g(with)d(the)j(rest)448 4687 y(of)j(the)f(p)s(edigree.)40 b(It)31 b(can)f(also)h(sharply)d (reduce)i(the)h(set)g(of)f(p)s(ossible)e(genot)m(yp)s(es)j(for)448 4800 y(eac)m(h)h(individual,)26 b(for)k(eac)m(h)i(lo)s(op)d(break)m(er) i(v)m(ector.)589 4913 y(F)-10 b(ASTLINK)33 b(4.0P)i(includes)d(a)i (sophisticated)f(algorithm)g(to)h(try)g(to)h(minimize)1920 5162 y(8)p eop %%Page: 9 9 9 8 bop 448 623 a Fh(the)41 b(n)m(um)m(b)s(er)f(of)h(lo)s(op)f(break)m (er)i(v)m(ectors.)74 b(The)40 b(algorithm)g(w)m(as)h(devised)f(b)m(y)h (Ann)448 736 y(Bec)m(k)m(er)23 b(and)c(Dan)i(Geiger)g(of)f(the)g(T)-8 b(ec)m(hnion,)23 b(and)c(in)m(tegrated)i(b)m(y)f(me)h(in)m(to)f(F)-10 b(ASTLINK.)589 848 y(F)g(ASTLINK)33 b(4.1P)h(includes)d(a)j(sligh)m (tly)d(b)s(etter)j(implemen)m(tation)e(of)h(the)h(ideas)448 961 y(in)m(tro)s(duced)h(in)f(3.0P)-8 b(.)38 b(It)e(also)g(includes)d (c)m(hanges)k(to)g(UNKNO)m(WN)g(to)f(select)h(lo)s(op)448 1074 y(break)m(ers)31 b(from)f(scratc)m(h.)589 1187 y(The)20 b(genot)m(yp)s(e)h(inference)f(information)f(is)g(prin)m(ted)g(out)h (in)f(the)i(\014le)e Fg(loopfile.dat)p Fh(,)448 1300 y(whic)m(h)g(is)h(read)g(in)f(and)g(used)h(b)m(y)g(the)h(main)e (program)h(\(ILINK,)g(MLINK,)g(or)h(LINKMAP\).)448 1413 y(The)27 b(exact)h(syn)m(tax)g(of)f Fg(loopfile.dat)c Fh(is)j(describ)s(ed)f(in)h Fg(README.loopfile)p Fh(.)35 b(Some)448 1526 y(of)c(the)g(c)m(hanges)g(in)e(F)-10 b(ASTLINK)30 b(4.1P)h(can)g(mak)m(e)h(lo)s(op\014le.dat)d(a)i(lot)f (smaller)f(than)448 1639 y(it)h(used)g(to)h(b)s(e)f(for)g(p)s(edigrees) f(with)g(m)m(ultiple)f(lo)s(ops.)1920 5162 y(9)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.Digital0000644000265600020320000000325006737457627015662 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last Mod: October 6, 1997 FASTLINK Portability Information for Digital UNIX Digital UNIX is an implementation of UNIX currently used on most DEC Alpha workstations. Earlier versions of Digital UNIX were called OSF. The code for FASTLINK 2.2 and beyond compiles fine on Digital UNIX. In version 2.1 of FASTLINK it is necessary to comment out the definition of uchar in commondefs.h. No modifications are needed to the Makefile. Unfortunately, there are some problems with the implementation of floating point on the Alpha, which may interact badly with any or all of the compilers and FASTLINK. The bad behavior you get is a floating point exception and a core dump. I recoded some lines in FASTLINK to work around one manifestation of the problem, however, Martin Farrall reports that he still has a problem using the cc compiler with -O2 level of optimization (interestingly, both -O1 and -O3 seem to work). If you hit a floating-point exception, please perform as many of the the following experiments as you can before reporting the problem to me: You can recompile the program with the following compiler flags added: 1. Flag -ieee_compliant and without -O 2. Without -O and -ieee_compliant. 3. With -O1 and without -ieee_compliant. 4. With -O2 and without -ieee_compliant. 5. With -O3 and without -ieee_compliant. and rerun in each case to see if a crash occurs. These flags should be added by editing the line in the Makefile that reads: #SYSDEP = For example, to add the flag -ieee_compliant, change it to: SYSDEP = -ieee_compliant To run parallel FASTLINK, refer to README.p4 for Digital UNIX-specific notes. fastlink-4.1P-fix95/README.VAX0000644000265600020320000001614606737457627014753 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last Mod: October 9, 1997 Porting FASTLINK to VAX/VMS This document describes how to get the FASTLINK (v4.0P and beyond) package running under VAX/VMS with the DEC C compiler or the VAX C compiler. It should also be applicable to AXP/VMS. You have two choices: either use the compilation script prepared by Steve Roberts for DEC C with troubleshooting by Anita Destefano, or use the MMS script prepared by Kimmo Kallio, Don Plugge, Shriram Krishnamurthi and Alejandro Schaffer. |*| Instructions for DEC C: ---------------------- AUTHOR ------ Steve Roberts, Paterson Institute for Cancer Research, Manchester, M20 9BX, U.K. bmcsar@picr.cr.man.ac.uk. 22-Sep-1994 Slight modifications to explain where to find things in the FASTLINK distribution by Alejandro A. Schaffer. PREREQUISITES ------------- Use DEC C. DEC C is the latest C compiler distributed by Digital for VMS. Unfortunately it costs money, but the upgrade from VMS C to DEC C is "free" to those with valid support contracts. DISCLAIMER ---------- The programs all compile and link successfully under VAX/VMS v5.5-2 with DEC C v4.0. The programs used by my users all work for their data. However not all the programs have been thoroughly tested, and those that have only as far as my users require. SETUP ----- Copy the file decc_checkpointdefs.h found in the fastlink subdirectory 4.0P/vaxvms in place of checkpointdefs.h. Copy the files FASTLINK_BUILD.VMS and FASTLINK_START.VMS to that directory as well, and change to that directory. The place where the standard .h definition files for C are found seems to vary from VAX to VAX. It is likely that you need to change the first few lines of commondefs.h. In particular, the section: /* VMS: MAY NEED TO CHANGE -- possibly uncomment the following 2 lines */ /* #include unixio */ /* #include file */ #include /* Shriram: begin */ #include #include /* VMS: MAY NEED TO CHANGE -- possibly remove "sys/" from the next 3 lines */ #include #include #include /* Shriram: end */ #if !defined(vms) #include #endif #include /* VMS: MAY NEED TO CHANGE -- comment out the any of the next 3 lines for files your system can't find */ #include #include #include includes 3 possible places you might need to edit (marked "VMS: MAY NEED TO CHANGE"). If you have trouble compiling as-is, this is the first place to look. You may consult with your system administrator for help on how to make this modification for your VMS machine. COMPILING --------- The VMS command file FASTLINK_BUILD.VMS will compile and link all the source code to produce the 10 executables. The DEC C compiler is fussy and produces a small heap of warnings and informational messages. As far as I can tell, these are all perfectly ignorable! It should be possible to use the distributed makefile, with a few minor changes if you have a unix-compatible make facility. There are a number of make facilities on the net, and the VMS POSIX interface also provides one. I have not yet got this approach to work, but if you have any of these facilities working then give it a go. VMS POSIX has a "feature" that means you cannot give the object file produced by the C compiler a name different from the input source file - so the supplied makefile will need some modification. You will need to add references to VMS.C and its object file in the appropriate places. RUNNING ------- The VMS command file FASTLINK_START.VMS will define symbols for all the executables. The line defining the source code directory will need modifying for your local installation. This file needs to be run before using the programs. We define a global command FASTLINK :== @fastlink_dir:FASTLINK_START.VMS in Sylogin.com, then our users just need to type the command FASTLINK to set up their environment to run the programs. The programs are run by simply typing the program names. The datafiles (Datafile, pedfile, etc.) all require a .DAT filetype (datafile.dat, pedfile,dat, etc.) CHECKPOINTING ------------- With the changes outlined above the checkpointing code will run and not cause any problems. However I am not sure yet that the checkpointing will allow you to recover from a crash under VMS. I am still working on this! OUTSTANDING ISSUES ------------------ Checkpointing has not been tested (see above). The CKPT program will not work |*| Instructions for MMS: ---------------------- AUTHOR ------ Alejandro Schaffer with lots of help from Shriram Krishnamurthi and Don Plugge. PREREQUISITES ------------- Must have MMS compilation utility installed. DISCLAIMER ---------- Testing has been somewhat limited and I know very little about VMS. SETUP for VAXC ------------- Before compiling you must run the commands: $DEFINE LNK$LIBRARY SYS$LIBRARY:VAXCRTLG $DEFINE LNK$LIBRARY_1 SYS$LIBRARY:VAXCRTL It may be safe to put these in your LOGIN.COM, but check with your system administrator before doing so. Copy the file vaxc_checkpointdefs.h found in the fastlink subdirectory 4.0P/vaxvms in place of checkpointdefs.h. The place where the standard .h definition files for C are found seems to vary from VAX to VAX. It is likely that you need to change the first few lines of commondefs.h. In particular, the section: /* VMS: MAY NEED TO CHANGE -- possibly uncomment the following 2 lines */ /* #include unixio */ /* #include file */ #include /* Shriram: begin */ #include #include /* VMS: MAY NEED TO CHANGE -- possibly remove "sys/" from the next 3 lines */ #include #include #include /* Shriram: end */ #if !defined(vms) #include #endif #include /* VMS: MAY NEED TO CHANGE -- comment out the any of the next 3 lines for files your system can't find */ #include #include #include includes 3 possible places you might need to edit (marked "VMS: MAY NEED TO CHANGE"). If you have trouble compiling as-is, this is the first place to look. You may consult with your system administrator for help on how to make this modification for your VMS machine. COMPILING --------- Copy the files OLD.MMS to the directory where the source code is: Run: MMS/DESCRIP=OLD.MMS fastlink for fast versions MMS/DESCRIP=OLD.MMS slowfastlink for slow versions MMS/DESCRIP=OLD.MMS unknown for UNKNOWN MMS/DESCRIP=OLD.MMS clean to clean up SETUP for DEC C ------------- Similar to VAX C, but use decc_checkpointdefs.h instead of vaxc_checkpointdefs.h to replace checkpointdefs.h and use NEW.MMS instead of OLD.MMS. CHECKPOINTING ------------- Crash recovery works for MLINK and LINKMAP. Crash recovery does not work for ILINK and LODSCORE and has been disabled for those two programs. The checkpointing leaves many files around because MMS has version numbers and does not overwrite the old checkpoint with the new. Use PURGE frequently to clean up. OUTSTANDING ISSUES ------------------ Checkpointing does not yet work for ILINK and LODSCORE. fastlink-4.1P-fix95/README.diseq0000644000265600020320000001310706737457627015414 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 28, 1999 Using Conditional Allele Frequencies or Parameterized Disequiliobrium in FASTLINK By Ken Morgan and Alejandro Schaffer Starting with FASTLINK 4.1, I am exploring the possibility of adding several options to model linkage disequilibrium in FASTLINK. On such option, conditional allele frequencies, has been completed. Conditional allele frequencies means that allele frequencies at markers can depend on the genotype at the disease locus on the same chromosome strand (haplotype). This is slightly more general and flexible than the disequilibrium option currently allowed in LINKAGE/FASTLINK |*| Baiscs of using conditional allele frequencies The user is assumed to be familiar with FASTLINK usage and estimating allele frequencies with ILINK. The constant ALLELE_SPEED works as in FASTLINK. It is located in unknown.h and commondefs.h. Set #define ALLELE_SPEED 1 to achieve greater speed in non-estimation mode, when using conditional allele frequencies. Set #define ALLELE_SPEED 0 #define fitmodel true to allow for estimation of frequencies. #define ALLELE_SPEED 0 #define fitmodel true is always safe but may be unnecessarily slow. "Conditional allele frequences" means that at a marker, the frequency of an allele may depend conditionally on the allele at the disease locus. E.g., the relative frequencies of the haplotypes Disease 1 1 Marker 1 2 Disease 2 2 Marker 1 2 may be quite different. Estimating conditional allele frequencies is conceptually different from estimating haplotype frequencies because in the former case the disease allele frequencies stay fixed, while in the latter case they do not stay fixed. To get started it is necessary to make a basic change in the format of datafile.dat. For each marker locus, put 2 lines of allele frequencies instead of 1. E.g., instead of: 3 5 0.07000000 0.01000000 0.15000000 0.04000000 0.73000000 put 3 5 0.07000000 0.01000000 0.15000000 0.04000000 0.73000000 0.07000000 0.01000000 0.15000000 0.04000000 0.73000000 So long as the two lines of frequencies are equal and you are not estimating frequencies, the results should be identical to regular FASTLINK. If you want to use conditional allele frequencies, you must similarly double all marker allele frequency lines in datafile.dat. This is a reasonable requirement because if for some marker you do not want the allele frequencies to vary depending on the disease allele, then the two lines can be identical. Do not change the way in which the disease locus is specified. To tell unknown that you are using conditional allele frequencies, use unknown -c instead of unknown To tell mlink/ilink/linkmap that you are using conditional allele frequencies, use: mlink -c ilink -c linkmap -c instead of mlink ilink linkmap To estimate conditional allele frequencies with ILINK, the procedure is similar to regular ILINK. At the bottom of datafile.dat are two lines that look like: k 1 1 1 1 ... or k 0 1 1 1 ... where k is index of the locus for which frequencies are to be estimated, and the first number of the last line is: 0 if theta stays fixed 1 if theta is to be estimated the remainder of the last line has (a - 1) 1's where a is the number of alleles at locus k. Caution: The highest numbered allele, a, must occur or regular ILINK will crash. For conditional estimation, the last line of datafile.dat should have 2a -1 numbers instead of a numbers. Again the first number may be 0 or 1, and the remaining 2a-2 numbers should be 1's. When ilink -c is used to estimate frequencies conditionally, part of the output final.dat might look like: GENE FREQUENCIES : 0.309689 0.424004 0.250168 0.016138 CONDITIONAL (on disease allele) GENE FREQUENCIES : 0.242056 0.303824 0.452248 0.001871 The first line is conditional on the healthy allele at the disease locus. The second line is conditional on the unhealthy allele at the disease locus. |*| Usage Suggestions 1. To caluculate LOD scores for linkage under each of the Linkage Disequilibrium (LD) (usingILINK -c) and linkage equilibrium (LE; using ILINK) models requires two analyses: (a) the log-likelihood for estimated marker allele frequencies and the recombination fraction (theta) between the marker and disease loci; (b) the log-likelihood for estimated marker allele frequencies and fixed theta=0.5; the difference in the log-likelihoods is converted to a lod score. 2. For the test of LD, compare the change in the log-likehoods under LD and LE where both theta and the marker allele frequencies are jointly estimated. One may assume that twice this difference is asymptotically distributed as chi-square with k -1 degrees of freedom (where k = number of distinct alleles of the marker locus in the data). (The P-value may need to be estimated empirically for small samples for the situation where one or more conditional allele frequencies are estimated to be 0.) 3. For a test of linkage allowing for linkage disequilibrium, there are tqo approaches. Approach A: Constrain the two vectors of conditional allele frequencies to be equal when theta=0.5. Approach B: Allow the vectors of allele frequencies to be unconstrained in both cases. Then in the likelihood ratio test for linkage, the allele frequencies (conditional or not) become nuisance paramaters, and there is only 1 degree of freedom. Approach B (as a special case of the general idea of likelihood ratio tests with nuisance parameters) is advocated by Joe Terwilliger. fastlink-4.1P-fix95/README.ILINK0000644000265600020320000001346306737457627015162 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last Mod: May 30, 1995 |*| What does the output of ILINK and LODSCORE mean? This file describes the output that the programs ILINK and LODSCORE print to the screen. For the rest of the text we describe things in terms of ILINK because the output for LODSCORE is very similar. The need for this document was suggested by Marcy Speer (Duke). ILINK uses the GEMINI optimization procedure to find a locally optimal value of the theta vector of recombination fractions. If you use the default scripts produced by lcp, your initial guess for theta is .1 in every dimension. GEMINI evaluates each theta by its likelihood, seeking to find theta vectors that have a higher pedigree likelihood. The GEMINI procedure has multiple iterations. Each iteration corresponds to one line of output. Each iteration includes multiple likelihood function evaluations. Each iteration has two phases. In Phase I GEMINI seeks to improve the current best theta. In Phase II, GEMINI estimates the gradient of the likelihood with respect to the current best theta vector. In the first iteration, Phase I only evaluates the likelihood at the initial candidate theta. When ILINK prints out a line such as: maxcensor can be reduced to -32767, it has completed the first likelihood function evaluation. On long runs, this fact can be used to estimate running time. A reasonable rough estimate for the number of function evaluations is 10*(number of dimensions of theta vector). The number of dimensions of the theta vector is one fewer than the number of loci in most cases. If maletheta and femaletheta are allowed to differ (sexdif is set to 1), then the number of dimensions doubles to 2 * (number of loci - 1). Estimating other parameters (with fitmodel set to true) can also increase the number of dimensions. After each iteration, ILINK prints out one line with four pieces of information: ITERATION is a positive integer showing the number of the iteration just completed. T is an indication of the step size that the GEMINI procedure takes in updating theta. Sometimes, very small T indicates that GEMINI did many updates (and hence the iteration probably took longer than average) each of which requires a likelihood function evaluation. NFE is a positive integer indicating how many likelihood function evaluations have been done through that iteration. F is a scaled representation of -2log(likelihood) at the current best theta. Because of the - sign, the value of F decreases until it reaches a local minimum. After the last printed iteration, ILINK in FASTLINK does one more likelihood function evaluation for the purpose of computing Ott's Generalized LODSCORE which shows up in final.dat (transferred to final.out by the default pedin scripts). Ott's generalized LODSCORE compares -2log(likelihood) at the locally optimal theta to -2log(likelihood) at a theta that is .5 in every component (i.e. each locus unlinked to all the rest). In LINKAGE ILINK more likelihood function evaluations are done after the last printed iteration line, but these likelihood function evaluations are unnecessary (see paper2.ps from the FASTLINK distribution for more details). Some users run ILINK and LODSCORE with execution scripts that do not delete the output file outfile.dat upon termination. The file outfile.dat is primarily useful in storing information about the values of certain variables at each iteration; these variables are not of interest, except for those who wish to modify the code. Of interest to users is the last thing in outfile.dat which is some description of the condition under which LODSCORE and ILINK terminated. This is a code stored in the variable idg and takes one of 8 values: 1: Maximum possible accuracy reached 2: Search direction no longer downhill 3: Accumulation of rounding error prevents further progress 4: All significant differences lost through cancellation in conditioning 5: Specified tolerance on normalized gradient met 6: Specified tolerance on gradient met 7: Maximum number of iterations reached 8: Excessive cancellation in gradient Under all circumstances it should be emphasized that if ILINK or LODSCORE is used with only a single starting theta, the output value is only a local optimum and not a global optimum. It is a good idea to try with several different starting thetas. It is perfectly valid to compare the local optima from different starting points and choose the one that gives the best value of -2*log(likelihood); the more staring points tried, the more likely that the best value will be a global optimum. If ILINK or LODSCORE exits with condition 5 or 6, the output value is pretty safe as a local optimum. If ILINK or LODSCORE exits with condition 7, the output values are completely unsafe. The source code must be modified to increase iterationMultiple, which is #defined in gemdefs.h. If ILINK or LODSCORE exits with conditions 1,2,3,4, or 8 the situation is more nebulous, but it is a good idea to try more experiments to test how robust the output values are. Try starting from different initial thetas. One might also try increasing the constant tol in gemdefs.h Increasing tol will have the effect of relaxing the convergence criteria, so that ILINK and LODSCORE may come close to a local optimum, where a smaller tol causes problems. If increasing tol helps, then one should: find the local optimum with the higher tol reset tol to its previous value restart the program with the first local optimum as the initial value This experiment will test whether the initial local optimum can be improved by more precise calculations. ILINK or LODSCORE does not allow the theta values to get down to 0.0. Therefore, if one of the locally optimal thetas is reported as close to 0.0, the situation ought to be explored further using LINKMAP or MLINK, which will allow arbitrarily small values of theta. fastlink-4.1P-fix95/README.VMS0000644000265600020320000000351406737457627014755 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last update: October 9, 1997 Portability Information for VMS FASTLINK can be ported to VMS, although it takes some effort to get things set up. At this time, checkpointing and crash-recovery do not work in all cases, but they do not interfere with runs that do not crash. There are two significant variants of VMS in existence. One is VMS for VAXen and the other is OpenVMS for Alphas. The FASTLINK distribution includes separate instructions for these two versions. The availability of these instructions is largely due to the super effort of four adventuresome FASTLINK users, Steve Roberts in the United Kingdom, Kimmo Kallio in Finland, Anita Destefano in the U.S., Don Plugge in the U.S and to Shriram Krishnamurthi, a student at Rice. Steve provided instructions for VAXen and Kimmo for Alphas. Don updated both the MMS file and the Make tool for FASTLINK 4.0P and tested them on several systems. All four users did extensive testing and troubleshooting. Thanks to Steve, Kimmo, Anita, Don, and Shriram! You can find the top level instructions for VAX/VMS in README.VAX and they refer to some files in fastlink/4.0P/vaxvms, where fastlink is the top level directory created when you untar FASTLINK. Caution: I am using UNIX syntax for subdirectories here; you need to adapt this to VMS syntax. You can find the top level instructions for OpenVMS in README.ALPHAVMS and they refer to some files in fastlink/4.0P/alphavms. One way of compilation that may work on either type of system is MMS. A suitable MMS file can be found in the fastlink/4.0P/vaxvms directory. It may require small modifications to be ported to different VMS computers. More user input on simplifying the FASTLINK port to VMS, making it work with more compilers, and testing checkpointing would be very much appreciated. fastlink-4.1P-fix95/README.constants0000644000265600020320000001362606737457627016331 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 FASTLINK, version 4.0P and beyond This file describes an issue that will affect all users: how to set certain constants, that vary from run to run depending on the data set and chosen loci. See the file README for a roadmap to all the FASTLINK documentation. The definitions for most of the constants that a user wants to change have now been set up in such a way that they can be modified in the Makefile without ever having to edit the code. An important consequence is that it is now possible to edit just the Makefile and be able to compile different versions of the programs with different values of of the constants. If you are not an experienced user of the Make utility, consult your system administrator for help in editing the Makefile. The following .h files contain declarations of constants and data: commondefs.h stuff that is common to all 4 main programs checkpointdefs.h stuff for checkpointing gemdefs.h stuff for GEMINI, common to LODSCORE and ILINK moddefs.h stuff specific to fast versions of programs slowmoddefs.h stuff specific to slow versions of programs ildefs.h stuff specific to ILINK lidefs.h stuff specific to LINKMAP lodefs.h stuff specific to LODSCORE mldefs.h stuff specific to MLINK compar.h stuff specific to parallel FASTLINK unknown.h stuff specific to UNKNOWN |*| Constant definitions - VERY IMPORTANT!!! -------------------- There are at least 2 constants that are defined in moddefs.h that you will want to set before compiling. This means that you can edit the files to put in the appropriate numbers and then compile. The next section explains how to change the constants by editing only the Makefile. The constants in moddefs.h are AUTOSOMAL_RUN SEXDIF_RUN The user gets a severe warning if either of these constants is set to 0 and should be 1. The program will probably crash after the warning is printed. AUTOSOMAL_RUN must be 1 if your data is autosomal. It can be 0 if your data is sexlinked. It may be worth it to change it to 0 for a sexlinked run because this will drastically reduce the memory requirements and may make it possible to use the faster versions. In terms of correctness, it always safe to set AUTOSOMAL_RUN to 1. SEXDIF_RUN must be 1 if your data is autosomal AND you want to allow the male theta and female theta to be DIFFERENT. From our experience, such runs are rare in practice, so we are distributing the code with SEXDIF_RUN set to 0. It is always safe to have SEXDIF_RUN set to 1, but again you can save a lot of memory by setting SEXDIF_RUN to 0. It is safe to set SEXDIF_RUN to 0 if: a) your data is sexlinked or b) your data is autosomal and you assume male theta = female theta Here are some other constants that you might need to change occasionally. There is relatively little harm caused by boostong these constants higher. maxsys: maximum number of loci used in the run; this is most relevant for LODSCORE where one may do 2-point analysis on many different pairs of loci. maxlocus: maximum number of loci in one run of one program. maxall: maximum number of alleles at a numbered-allele or binary-factors locus maxfact: maximum number of binary factors; should be at least as large as maxall maxind: maximum number of people in all pedigrees combined maxped: maximum number of pedigrees maxchild: maximum number of children of one parent maxloop: maximum number of loops fitmodel: is false unless you are estimating some parameter other than theta ALLLE_SPEED: Is 1 if you want allele renumbering to be used; you should keep it at 1, except when estimating allele frequencies. |*| Setting Constants by Editing only the Makefile ---------------------------------------------- It is now possible to use the -D feature supported by cc, gcc, and most C compilers to change constants during compilation. For example, the default declaration of maxloop now looks like: #ifndef maxloop #define maxloop 6 #endif This tells the C preprocessor that reads the hashed lines: "If maxloop is not already defined, then set maxloop to be 6". The way you can make maxloop already defined is to include the string -Dmaxloop= in all the compilation commands. For example, if you wanted maxloop to be 8, you would include the flag -Dmaxloop=8 in your compilation. This overrides the setting of 6 that is in commondefs.h See README.Makefile for detailed instructions on how to edit the Makefile to set maxloop and other constants. |*| Checking how constants are set for a given executable ----------------------------------------------------- FASTLINK now includes a -i option (for infor) for ILINK, MLINK, LINKMAP, and LODSCORE that summarizes how the various compilation options/variables are set for a given executable. For example, if you run: linkmap -i you get a description of how the program is configured, but nothing interesting is computed. A sample output might be: Program LINKMAP version 5.10 (1-Feb-1991) FASTLINK (slow) version 3.0P (29-Sep-1995) LINKMAP has been compiled with the following options: CHECKPOINTING is enabled (DOS not defined) SLOW version (LESSMEMORY defined) Program constants are set to the following maxima: 8 maximum number of loci (maxlocus) 15 maximum number of alleles at a single locus (maxall) 1000 maximum number of individuals in a pedigree (maxind) 6 maximum number of loops (maxloop) 16 maximum number of children of a parent (maxchild) This option works for both sequential and parallel versions of FASTLINK. Flagless runs now also print out "(slow)" with the version number if the given executable is a "slow" version (as seen in the example above). fastlink-4.1P-fix95/README.time0000644000265600020320000000430406737457627015244 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: July 13, 1995 FASTLINK, version 3.0P and beyond How long will a sequential FASTLINK run take? This turns out to be extremely difficult to estimate ahead of time, but relatively easy to estimate once the run is underway. Each FASTLINK run evaluates the same likelihood function at different candidate thetas vector inputs. For MLINK and LINKMAP the user specifies all the candidate theta vectors. For ILINK and LODSCORE they are generated on the fly. It is reasonably safe to assume that each candidate theta takes roughly the same time to evaluate. Therefore, if you know how many candidate thetas there will be, you multiply the number of thetas times the running time for one theta. Caution: This approach will not work on a computer where the load (from other users) is varying significantly during the run. You can estimate the time for one theta by watching the screen. When the first output gets printed after the header information, one theta is complete. Alternatively, MLINK and LINKMAP take a checkpoint after every theta. Therefore, by comparing the timestamps of the files checkpoint.LINKMAP and checkpoint.LINKMAP.bak (or checkpoint.MLINK and checkpoint.MLINK.bak), you may infer how long one candidate theta takes to evaluate. ILINK and LODSCORE usually take checkpoints every one or two thetas, so you must be more careful in making inferences from the timestamps of those checkpoint files. The timestamp of a file can usually be determined with the command "ls -l". The number of thetas for ILINK and LODSCORE cannot be predetermined, but a good estimate is (10 * number of loci) if you have sex-averaged thetas. If male theta and female theta differ, estimate with (20 * number of loci). After each iteration, ILINK and LODSCORE print an update in which the number following the string NFE (number of function evaluations) is the number of candidate thetas already evaluated. See README.ILINK for more details. These NFE numbers can be used to estimate how much more work remains to be done by using the formula: (((Number of thetas estimated) / (Number of thetas completed)) * (running time so far)) - (running time so far) fastlink-4.1P-fix95/paper5.ps0000644000265600020320000040506606506236527015165 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvips 5.55 Copyright 1986, 1994 Radical Eye Software %%Title: top.dvi %%CreationDate: Thu Dec 21 09:59:03 1995 %%Pages: 15 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips top.dvi -o %DVIPSParameters: dpi=300, comments removed %DVIPSSource: TeX output 1995.12.21:0958 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (/afs/alw.nih.gov/dcrt/gob4/loops/revision/top.dvi) @start /Fa 13 117 df<7FFF00FFFF80FFFF807FFF0011047D8F18>45 D<0FF8003FFE007FFF00 780F00700700F00780E00380E00380E00380E00380E00380E00380E00380E00380E00380 E00380E00380E00380E00380E00380E00380E00380F00780700700780F007FFF003FFE00 0FF800111C7D9B18>79 D<01FE0007FF001FFF803E0780380300700000700000E00000E0 0000E00000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012 147D9318>99 D<001F80003F80001F8000038000038000038000038000038003E3800FFB 801FFF803C1F80380F80700780700380E00380E00380E00380E00380E00380E003807007 80700780380F803C1F801FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E 0F00380780700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C038 01C03E03C01FFF8007FF0001FC0012147D9318>I<01E1F007FFF80FFFF81E1E301C0E00 3807003807003807003807003807001C0E001E1E001FFC001FF80039E0003800001C0000 1FFE001FFFC03FFFE07801F0700070E00038E00038E00038E000387800F07E03F01FFFC0 0FFF8001FC00151F7F9318>103 D<7E0000FE00007E00000E00000E00000E00000E0000 0E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E0 0E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC171C809B18>I<0380 0007C00007C00007C0000380000000000000000000000000007FC000FFC0007FC00001C0 0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 0001C000FFFF00FFFF80FFFF00111D7C9C18>I107 D<7FE000FFE0007FE00000E00000E00000E00000E00000E00000E00000E00000 E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 E00000E00000E0007FFFC0FFFFE07FFFC0131C7E9B18>I<7CE0E000FFFBF8007FFFF800 1F1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C00 1C1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F1F00FFBFBF807F1F1F0019148193 18>I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000E0E000E0E000E0 E000E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E9318>111 D<0180000380000380000380000380007FFFC0FFFFC0FFFFC00380000380000380000380 000380000380000380000380000380000380400380E00380E00380E001C1C001FFC000FF 80003E0013197F9818>116 D E /Fb 1 107 df<00200020000000000000000000000380 04C008C008C000C0018001800180018003000300030003004600CC0078000B1780910D> 106 D E /Fc 1 50 df<0C003C00CC000C000C000C000C000C000C000C000C000C000C00 0C000C00FF8009107E8F0F>49 D E /Fd 5 107 df0 D<400004C0000C6000183000301800600C00C006018003030001860000CC000078000030 0000300000780000CC000186000303000601800C00C0180060300030600018C0000C4000 0416187A9623>2 D<03C00FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7F FE3FFC1FF80FF003C010127D9317>15 D<03E0001F000FFC007FC01C7E00C020301F0180 10600F8300084007C600084003EC00088001F800048001F800048000F8000480007C0004 80007E000480007E00044000DF000840018F8008400307C018200603E030100C01F8E00F F800FFC003E0001F0026147D932D>49 D106 D E /Fe 31 122 df<1C3C3C3C3C040408081020204080060E7D840E>44 D<7FF0FFE07FE00C037D8A10>I<70F8F8F0E005057B840E>I<000200020006000E003C00 DC031C001C0038003800380038007000700070007000E000E000E000E001C001C001C001 C003800380038003800780FFF80F1E7B9D17>49 D<001F800060E0008070010030020038 0420380420380410380420700460700380600000E00001C000030000FE00001C00000600 000700000780000780000780300780780780780780F00F00800F00401E00401C00403800 20E0001F8000151F7C9D17>51 D<0000600000E00000E00000E00001C00001C00001C000 0380000380000300000700000700000600000E00000C0000180000180000300000300000 630000C700008700010700030700060E00040E00080E003F8E00607C00801FC0001C0000 1C0000380000380000380000380000700000700000600013277E9D17>I<001F00007180 00C0C00180C00380E00700E00F00E00F01E01E01E01E01E01E01E01E01C01C03C01C03C0 1C03C01C07C01C0F800C0F8006378003C700000F00000E00000E00001C00601C00F03800 F07000E0600080C0004380003E0000131F7B9D17>57 D<00000200000006000000060000 000E0000001E0000001E0000003F0000002F0000004F0000004F0000008F0000010F0000 010F0000020F0000020F0000040F00000C0F0000080F0000100F0000100F0000200F8000 3FFF800040078000C007800080078001000780010007800200078002000780060007801E 000F80FF807FF81D207E9F22>65 D<0000FE0200078186001C004C0038003C0060003C00 C0001C01C0001803800018070000180F0000181E0000101E0000103C0000003C00000078 000000780000007800000078000000F0000000F0000000F0000000F0000000F000008070 00008070000080700001003800010038000200180004000C001800060020000381C00000 FE00001F217A9F21>67 D<01FFF0001F00001E00001E00001E00003C00003C00003C0000 3C0000780000780000780000780000F00000F00000F00000F00001E00001E00001E00001 E00003C00003C00003C00003C0000780000780000780000780000F8000FFF800141F7D9E 12>73 D<01FFFF80001E00E0001E0070001E0038001E003C003C003C003C003C003C003C 003C003C0078007800780078007800F0007800E000F003C000F00F0000FFFC0000F00000 01E0000001E0000001E0000001E0000003C0000003C0000003C0000003C0000007800000 0780000007800000078000000F800000FFF000001E1F7D9E1F>80 D<01FFFF00001E03C0001E00E0001E0070001E0078003C0078003C0078003C0078003C00 78007800F0007800F0007801E0007801C000F0070000F01E0000FFF00000F0380001E01C 0001E01E0001E00E0001E00F0003C01E0003C01E0003C01E0003C01E0007803C0007803C 0807803C0807803C100F801C10FFF00C20000007C01D207D9E21>82 D<00F1800389C00707800E03801C03803C0380380700780700780700780700F00E00F00E 00F00E00F00E20F01C40F01C40703C40705C40308C800F070013147C9317>97 D<07803F8007000700070007000E000E000E000E001C001C001CF01D0C3A0E3C0E380F38 0F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031C01F0010207B9F15>I< 007E0001C1000300800E07801E07801C07003C0200780000780000780000F00000F00000 F00000F00000F0000070010070020030040018380007C00011147C9315>I<0000780003 F80000700000700000700000700000E00000E00000E00000E00001C00001C000F1C00389 C00707800E03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E 20F01C40F01C40703C40705C40308C800F070015207C9F17>I<007C01C207010E011C01 3C013802780C7BF07C00F000F000F000F0007000700170023804183807C010147C9315> I<00007800019C00033C00033C000718000700000700000E00000E00000E00000E00000E 0001FFE0001C00001C00001C00001C000038000038000038000038000038000070000070 0000700000700000700000700000E00000E00000E00000E00000C00001C00001C0000180 003180007B0000F300006600003C00001629829F0E>I<003C6000E27001C1E00380E007 00E00F00E00E01C01E01C01E01C01E01C03C03803C03803C03803C03803C07003C07001C 0F001C17000C2E0003CE00000E00000E00001C00001C00301C00783800F0700060E0003F 8000141D7E9315>I<01E0000FE00001C00001C00001C00001C000038000038000038000 038000070000070000071E000763000E81800F01C00E01C00E01C01C03801C03801C0380 1C0380380700380700380700380E10700E20700C20701C20700C40E00CC060070014207D 9F17>I<00C001E001E001C000000000000000000000000000000E003300230043804300 470087000E000E000E001C001C001C003840388030807080310033001C000B1F7C9E0E> I<01E0000FE00001C00001C00001C00001C0000380000380000380000380000700000700 000703C00704200E08E00E11E00E21E00E40C01C80001D00001E00001FC00038E0003870 00387000383840707080707080707080703100E03100601E0013207D9F15>107 D<03C01FC0038003800380038007000700070007000E000E000E000E001C001C001C001C 0038003800380038007000700070007100E200E200E200E200640038000A207C9F0C>I< 1C0F802630C04740604780604700704700708E00E00E00E00E00E00E00E01C01C01C01C0 1C01C01C03843803883803083807083803107003303001C016147C931A>110 D<007C0001C3000301800E01C01E01C01C01E03C01E07801E07801E07801E0F003C0F003 C0F003C0F00780F00700700F00700E0030180018700007C00013147C9317>I<01C1E002 621804741C04781C04701E04701E08E01E00E01E00E01E00E01E01C03C01C03C01C03C01 C0380380780380700380E003C1C0072380071E000700000700000E00000E00000E00000E 00001C00001C0000FFC000171D809317>I<1C1E00266100478380478780470780470300 8E00000E00000E00000E00001C00001C00001C00001C0000380000380000380000380000 70000030000011147C9313>114 D<00FC030206010C030C070C060C000F800FF007F803 FC003E000E700EF00CF00CE008401020601F8010147D9313>I<018001C0038003800380 038007000700FFF007000E000E000E000E001C001C001C001C0038003800380038207040 70407080708031001E000C1C7C9B0F>I<0E03803307802307C04383C04301C04700C087 00800E00800E00800E00801C01001C01001C01001C02001C02001C04001C04001C08000E 300003C00012147C9315>118 D<0E00C03300E02301C04381C04301C04701C08703800E 03800E03800E03801C07001C07001C07001C07001C0E00180E00180E001C1E000C3C0007 DC00001C00001C00003800F03800F07000E06000C0C0004380003E0000131D7C9316> 121 D E /Ff 7 108 df<07FF0000E00000E00000E00000E00001C00001C00001C00001 C0000380000380000380000380000700000700080700080700100E00100E00300E00200E 00601C01E0FFFFC015177F9618>76 D<7C00180018001800180030003000300030006780 68C070406060C060C060C060C06080C080C08180C10046003C000B177E960F>98 D<00E2031E060E0C0E0C0C180C180C180C101810181018183808F00730003000306060E0 60C1C07F000F14808D11>103 D<1F0006000600060006000C000C000C000C0018F01B18 1C08180838183018301830306030603160616062C022C03C10177E9614>I<0300038003 000000000000000000000000001C002400460046008C000C001800180018003100310032 0032001C0009177F960C>I<00180038001000000000000000000000000001C002200430 0430086000600060006000C000C000C000C001800180018001806300E300C60078000D1D 80960E>I<1F0006000600060006000C000C000C000C00181C1866188E190C32003C003F 00318060C060C460C460C8C0C8C0700F177E9612>I E /Fg 3 51 df<003000003000003000003000003000003000003000003000003000003000003000FF FFFCFFFFFC00300000300000300000300000300000300000300000300000300000300000 300016187E931B>43 D<03000700FF000700070007000700070007000700070007000700 07000700070007000700070007007FF00C157E9412>49 D<0F8030E040708030C038E038 4038003800700070006000C00180030006000C08080810183FF07FF0FFF00D157E9412> I E /Fh 21 115 df<001E0000630000C38001C1800381800301C00701C00F01C00E01C0 1E03C01C03C03C03C03C03C03C03C07807807FFF807FFF80780780F00F00F00F00F00F00 F00E00F01E00E01C00E03C00E03800E0300060700060E00070C0003180001E000012207E 9F15>18 D<70F8F8F87005057C840D>58 D<70F8FCFC74040404080810102040060E7C84 0D>I<000001C00000078000001E00000078000001E00000078000000E00000038000000 F0000003C000000F0000003C000000F0000000F00000003C0000000F00000003C0000000 F0000000380000000E0000000780000001E0000000780000001E0000000780000001C01A 1A7C9723>I<000100030003000600060006000C000C000C001800180018003000300030 00600060006000C000C000C00180018001800300030003000600060006000C000C000C00 180018001800300030003000600060006000C000C000C000102D7DA117>II<0000 02000000060000000E0000000E0000001E0000001F0000002F0000002F0000004F000000 8F0000008F0000010F0000010F0000020F0000040F0000040F0000080F80000807800010 07800020078000200780007FFF8000400780008007800180078001000780020007800200 07C0040003C00C0003C01E0007C0FF807FFC1E207E9F22>65 D<00FFFFE0000F0078000F 003C000F001C000F001E001E001E001E001E001E001E001E001E003C003C003C003C003C 0078003C00F0007803C0007FFF80007803C0007801E000F000F000F000F000F000F000F0 007001E000F001E000F001E000F001E000E003C001E003C003C003C0038003C00F000780 1E00FFFFF0001F1F7E9E22>I<0000FE0200078186001C004C0038003C0060003C00C000 1C01C0001803800018070000180F0000181E0000101E0000103C0000003C000000780000 00780000007800000078000000F0000000F0000000F0000000F0000000F0000080700000 8070000080700001003800010038000200180004000C001800060020000381C00000FE00 001F217E9F21>I<00FFF9FFF0000F801F00000F001E00000F001E00000F001E00001E00 3C00001E003C00001E003C00001E003C00003C007800003C007800003C007800003C0078 00007800F000007FFFF000007800F000007800F00000F001E00000F001E00000F001E000 00F001E00001E003C00001E003C00001E003C00001E003C00003C007800003C007800003 C007800003C007800007C00F8000FFF8FFF800241F7E9E26>72 D<00FFFC00000F800000 0F0000000F0000000F0000001E0000001E0000001E0000001E0000003C0000003C000000 3C0000003C00000078000000780000007800000078000000F0000000F0000000F0000000 F0004001E0008001E0008001E0018001E0010003C0030003C0030003C0060003C00E0007 803C00FFFFFC001A1F7E9E1F>76 D<00FFFFC0000F0070000F0038000F001C000F001E00 1E001E001E001E001E001E001E001E003C003C003C003C003C0078003C0070007800E000 780380007FFE000078000000F0000000F0000000F0000000F0000001E0000001E0000001 E0000001E0000003C0000003C0000003C0000003C0000007C00000FFFC00001F1F7E9E1D >80 D86 D<07803F8007000700070007000E000E000E000E001C001C001CF01D0C3A0E3C0E380F38 0F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031C01F0010207E9F14>98 D<001E3000713800E0F001C0700380700780700700E00F00E00F00E00F00E01E01C01E01 C01E01C01E01C01E03801E03800E07800E0B8006170001E700000700000700000E00000E 00300E00781C00F038006070003FC000151D809316>103 D<01E0000FE00001C00001C0 0001C00001C000038000038000038000038000070000070000071F000761800E80C00F00 C00E00E00E00E01C01C01C01C01C01C01C01C0380380380380380380380704700708700E 08700E10700610E006206003C016207E9F1A>I<00E001E001E000C00000000000000000 0000000000000E00130023804380438043808700070007000E000E001C001C001C203840 38403840388019000E000B1F7E9E10>I<0000C00001E00001E00001C000000000000000 0000000000000000000000000000001E0000630000438000838001038001038002070000 0700000700000700000E00000E00000E00000E00001C00001C00001C00001C0000380000 380000380000380000700000700030700078E000F1C0006380003E00001328819E13>I< 01E0000FE00001C00001C00001C00001C000038000038000038000038000070000070000 0701E00706100E08700E10F00E20F00E40601C80001D00001E00001FC000387000383800 383800381C20703840703840703840701880E01880600F0014207E9F18>I<1E07C07C00 231861860023A032030043C0340300438038038043803803808700700700070070070007 0070070007007007000E00E00E000E00E00E000E00E00E000E00E01C101C01C01C201C01 C038201C01C038401C01C0184038038018801801800F0024147E9328>109 D<1E1E0023210023C38043C7804387804383008700000700000700000700000E00000E00 000E00000E00001C00001C00001C00001C000038000018000011147E9315>114 D E /Fi 35 120 df<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE007FFFFE7FFFFE7FFFFE17277BA622>49 D<00FF800003FFF0000FFF FC001F03FE003800FF007C007F80FE003FC0FF003FC0FF003FE0FF001FE0FF001FE07E00 1FE03C003FE000003FE000003FC000003FC000007F8000007F000000FE000000FC000001 F8000003F0000003E00000078000000F0000001E0000003C00E0007000E000E000E001C0 01C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFF FF801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF003F80FF003F807F 803F807F803F807F801F807F800F007F800000FF000000FF000000FE000001FC000001F8 000007F00000FFC00000FFF0000001FC0000007E0000007F0000007F8000003FC000003F C000003FE000003FE03C003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F 807C007F003F01FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000001E00 00003E0000007E000000FE000000FE000001FE000003FE0000077E00000E7E00000E7E00 001C7E0000387E0000707E0000E07E0000E07E0001C07E0003807E0007007E000E007E00 0E007E001C007E0038007E0070007E00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE00 0000FE000000FE000000FE000000FE000000FE000000FE000000FE00007FFFF8007FFFF8 007FFFF81D277EA622>I<0C0003000F803F000FFFFE000FFFFC000FFFF8000FFFF0000F FFE0000FFFC0000FFE00000E0000000E0000000E0000000E0000000E0000000E0000000E 7FC0000FFFF8000F80FC000E003E000C003F0000001F8000001FC000001FC000001FE000 001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001FC078003F8078 003F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA622>I<0007F000003F FC0000FFFE0001FC0F0003F01F8007E03F800FC03F801FC03F801F803F803F801F003F80 00007F0000007F0000007F000000FF000000FF0FC000FF3FF800FF707C00FFC03E00FFC0 3F00FF801F80FF801FC0FF001FC0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F00 1FE07F001FE03F001FE03F001FC01F801FC01F803F800FC03F0007E07E0003FFFC0000FF F000003FC0001B277DA622>I<380000003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFF E07FFFFFC07FFFFF807FFFFF0070000E0070000E0070001C00E0003800E0007000E000E0 000000E0000001C000000380000007800000078000000F0000000F0000001F0000001F00 00003F0000003E0000003E0000007E0000007E0000007E0000007E000000FE000000FE00 0000FE000000FE000000FE000000FE000000FE000000FE0000007C0000003800001C297C A822>I<000003800000000007C00000000007C0000000000FE0000000000FE000000000 0FE0000000001FF0000000001FF0000000003FF8000000003FF8000000003FF800000000 73FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00000001 C0FF00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E 003FE000000E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003F FFFFF80000780007FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E0 0001FF0001C00000FF0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F29 7EA834>65 DI68 D73 D76 DI82 D85 D<01FF800007FFF0000F81F8001FC07E001FC07E00 1FC03F000F803F8007003F8000003F8000003F8000003F80000FFF8000FFFF8007FC3F80 0FE03F803F803F803F003F807F003F80FE003F80FE003F80FE003F80FE003F807E007F80 7F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9A21>97 DI<001FF80000FFFE0003F01F 0007E03F800FC03F801F803F803F801F007F800E007F0000007F000000FF000000FF0000 00FF000000FF000000FF000000FF000000FF0000007F0000007F0000007F8000003F8001 C01F8001C00FC0038007E0070003F01E0000FFFC00001FE0001A1B7E9A1F>I<00003FF8 0000003FF80000003FF800000003F800000003F800000003F800000003F800000003F800 000003F800000003F800000003F800000003F800000003F800000003F800000003F80000 1FE3F80000FFFBF80003F03FF80007E00FF8000FC007F8001F8003F8003F8003F8007F00 03F8007F0003F8007F0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003 F800FF0003F800FF0003F8007F0003F8007F0003F8007F0003F8003F8003F8001F8003F8 000F8007F80007C00FF80003F03BFF8000FFF3FF80003FC3FF80212A7EA926>I<003FE0 0001FFF80003F07E0007C01F000F801F801F800F803F800FC07F000FC07F0007C07F0007 E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000FF000000FF0000007F0000007F0000 007F0000003F8000E01F8000E00FC001C007E0038003F81F0000FFFE00001FF0001B1B7E 9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F07F07F07F03E07F00007F00007F0 0007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F0 0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 0007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7 F80FC1FE7C1F80FC7C1F007C383F007E107F007F007F007F007F007F007F007F007F007F 007F007F003F007E001F007C001F80FC000FC1F8001FFFE00018FF800038000000380000 003C0000003E0000003FFFF8001FFFFF001FFFFF800FFFFFC007FFFFE01FFFFFF03E0007 F07C0001F8F80000F8F80000F8F80000F8F80000F87C0001F03C0001E01F0007C00FC01F 8003FFFE00007FF0001E287E9A22>II<07000FC01FE03FE03FE03FE01FE00FC0070000 00000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00F E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14 >I107 DII< FFC07F0000FFC1FFC000FFC787E0000FCE03F0000FD803F0000FD803F8000FF003F8000F F003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0 03F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003 F8000FE003F8000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80211B7D9A26>I<003F E00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F0007F07F0007F07F00 07F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F00 07F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B 7E9A22>II114 D<03FE300FFFF01E03F03800F0700070F00070F00070F80070FC0000 FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003FC0000FC60007CE0003CF0003C F00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<0070000070000070000070 0000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007F0 0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 3807F03807F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B >II< FFFE7FFC0FFEFFFE7FFC0FFEFFFE7FFC0FFE0FE007E000E007F003F001C007F003F001C0 07F807F803C003F807F8038003F807F8038001FC0EFC070001FC0EFC070001FE1EFC0F00 00FE1C7E0E0000FE1C7E0E0000FF383F1E00007F383F1C00007F783F3C00003FF01FB800 003FF01FB800003FF01FF800001FE00FF000001FE00FF000000FC007E000000FC007E000 000FC007E00000078003C00000078003C0002F1B7F9A32>119 D E /Fj 14 119 df<70F8F8F8700505798414>46 D<01E007F00E38181C38FC71FC739E73 9EE70EE70EE70EE70EE70EE70EE70E739C739C71F838F018060E1E07F801F00F177E9614 >64 D<1FC0007FF000707800201800001C00001C0007FC001FFC003C1C00701C00E01C00 E01C00E01C00707C003FFF800F8F8011107E8F14>97 D<03F80FFC1C1C380870006000E0 00E000E000E00060007000380E1C1E0FFC03F00F107E8F14>99 D<07E00FF01C38301C70 0CE00EE00EFFFEFFFEE00060007000380E1C1E0FFC03F00F107E8F14>101 D<007C00FE01CE03840380038003807FFEFFFE0380038003800380038003800380038003 800380038003807FFC7FFC0F177F9614>I<07CF001FFF80383B80301800701C00701C00 701C003018003838003FF00037C0007000007000003FF8001FFC003FFE00700F00E00380 E00380E00380E003807007003C1E001FFC0007F00011197F8F14>II<03000780 0780030000000000000000007F807F800380038003800380038003800380038003800380 03800380FFFCFFFC0E187D9714>I110 D<07C01FF03C78701C701CE00EE00EE00EE00EE00EE00E701C783C3C781FF007C00F107E 8F14>I114 D<0FD83FF86038C038C038F0 007F803FF007F8001C6006E006F006F81CFFF8CFE00F107E8F14>I118 D E /Fk 1 4 df<0C000C008C40EDC07F800C007F80EDC08C 400C000C000A0B7D8B10>3 D E /Fl 84 128 df6 D<001F83E000F06E3001C078780380F8780300F03007007000070070 000700700007007000070070000700700007007000FFFFFF800700700007007000070070 000700700007007000070070000700700007007000070070000700700007007000070070 000700700007007000070070000700700007007000070070007FE3FF001D20809F1B>11 D<003F0000E0C001C0C00381E00701E00701E00700000700000700000700000700000700 00FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 E00700E00700E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<003FE000 E0E001C1E00381E00700E00700E00700E00700E00700E00700E00700E00700E0FFFFE007 00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E007 00E00700E00700E00700E00700E00700E07FE7FE1720809F19>I<001F81F80000F04F04 0001C07C06000380F80F000300F00F000700F00F00070070000007007000000700700000 070070000007007000000700700000FFFFFFFF0007007007000700700700070070070007 007007000700700700070070070007007007000700700700070070070007007007000700 700700070070070007007007000700700700070070070007007007000700700700070070 07007FE3FE3FF02420809F26>I<7038F87CFC7EFC7E743A040204020402080408041008 1008201040200F0E7E9F17>34 D<0F0000301880003030600060703001C0602C06C06013 F980E0100300E0100300E0100600E0100C00E0100C00E010180060103000602030007020 60003040C0001880C0000F018000000300E0000303100006060800060604000C0C040018 0C0400181C0200301C0200601C0200601C0200C01C0201801C0201801C0203000C040600 0C04060006040C00060818000310080000E01F257DA126>37 D<70F8FCFC740404040808 10102040060E7C9F0D>39 D<0020004000800100020006000C000C001800180030003000 30007000600060006000E000E000E000E000E000E000E000E000E000E000E000E0006000 600060007000300030003000180018000C000C000600020001000080004000200B2E7DA1 12>I<800040002000100008000C00060006000300030001800180018001C000C000C000 C000E000E000E000E000E000E000E000E000E000E000E000E000C000C000C001C0018001 80018003000300060006000C00080010002000400080000B2E7DA112>I<000600000006 000000060000000600000006000000060000000600000006000000060000000600000006 000000060000000600000006000000060000FFFFFFF0FFFFFFF000060000000600000006 000000060000000600000006000000060000000600000006000000060000000600000006 00000006000000060000000600001C207D9A23>43 D<70F8FCFC74040404080810102040 060E7C840D>II<70F8F8F87005057C840D>I<00010003000300 0600060006000C000C000C00180018001800300030003000600060006000C000C000C001 80018001800300030003000600060006000C000C000C0018001800180030003000300060 0060006000C000C000C000102D7DA117>I<03F0000E1C001C0E00180600380700700380 700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0 F003C0F003C0F003C0F003C07003807003807003807807803807001806001C0E000E1C00 03F000121F7E9D17>I<018003800F80F380038003800380038003800380038003800380 03800380038003800380038003800380038003800380038003800380038007C0FFFE0F1E 7C9D17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F803C020 07C00007C0000780000780000F00000E00001C0000380000700000600000C00001800003 00000600400C00401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00 100E00200F00780F80780780780780380F80000F80000F00000F00000E00001C00003800 03F000003C00000E00000F000007800007800007C02007C0F807C0F807C0F807C0F00780 400780400F00200E001C3C0003F000121F7E9D17>I<000600000600000E00000E00001E 00002E00002E00004E00008E00008E00010E00020E00020E00040E00080E00080E00100E 00200E00200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E00000E 0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE00010000010000010000010 000010000010000011F000161C00180E001007001007800003800003800003C00003C000 03C07003C0F003C0F003C0E00380400380400700200600100E000C380003E000121F7E9D 17>I<007C000182000701000E03800C07801C0780380300380000780000700000700000 F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C07003C0 7003C07003803803803807001807000C0E00061C0001F000121F7E9D17>I<4000007FFF C07FFF807FFF804001008002008002008004000008000008000010000020000020000040 0000400000C00000C00001C0000180000380000380000380000380000780000780000780 00078000078000078000078000030000121F7D9D17>I<03F0000C0C0010060030030020 01806001806001806001807001807803003E03003F06001FC8000FF00003F80007FC000C 7E00103F00300F806003804001C0C001C0C000C0C000C0C000C0C0008060018020010010 02000C0C0003F000121F7E9D17>I<03F0000E18001C0C00380600380700700700700380 F00380F00380F003C0F003C0F003C0F003C0F003C07007C07007C03807C0180BC00E13C0 03E3C0000380000380000380000700300700780600780E00700C002018001070000FC000 121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F87005147C930D>I<70F8F8 F8700000000000000000000070F0F8F878080808101010202040051D7C930D>I<7FFFFF E0FFFFFFF000000000000000000000000000000000000000000000000000000000000000 00FFFFFFF07FFFFFE01C0C7D9023>61 D<000100000003800000038000000380000007C0 000007C0000007C0000009E0000009E0000009E0000010F0000010F0000010F000002078 00002078000020780000403C0000403C0000403C0000801E0000801E0000FFFE0001000F 0001000F0001000F00020007800200078002000780040003C00E0003C01F0007E0FFC03F FE1F207F9F22>65 DI<000FC040 007030C001C009C0038005C0070003C00E0001C01E0000C01C0000C03C0000C07C000040 7C00004078000040F8000000F8000000F8000000F8000000F8000000F8000000F8000000 F8000000F8000000780000007C0000407C0000403C0000401C0000401E0000800E000080 070001000380020001C0040000703800000FC0001A217D9F21>II II<000FE0200078186000E004E0 038002E0070001E00F0000E01E0000601E0000603C0000603C0000207C00002078000020 F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8007FFCF80003E0 780001E07C0001E03C0001E03C0001E01E0001E01E0001E00F0001E0070001E0038002E0 00E0046000781820000FE0001E217D9F24>III<0FFFC0007C00003C00003C00003C00003C00003C00003C00003C00003C00003C00 003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00 203C00F83C00F83C00F83C00F0380040780040700030E0000F800012207E9E17>IIIII<001F800000F0F00001C0380007801E000F00 0F000E0007001E0007803C0003C03C0003C07C0003E0780001E0780001E0F80001F0F800 01F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0780001E07C00 03E07C0003E03C0003C03C0003C01E0007800E0007000F000F0007801E0001C0380000F0 F000001F80001C217D9F23>II< FFFF80000F80F0000780780007803C0007801E0007801E0007801F0007801F0007801F00 07801F0007801E0007801E0007803C00078078000780F00007FF80000781C0000780E000 0780F0000780700007807800078078000780780007807C0007807C0007807C0007807C04 07807E0407803E040FC01E08FFFC0F10000003E01E207E9E21>82 D<07E0800C1980100780300380600180600180E00180E00080E00080E00080F00000F000 007800007F00003FF0001FFC000FFE0003FF00001F800007800003C00003C00001C08001 C08001C08001C08001C0C00180C00380E00300F00600CE0C0081F80012217D9F19>I<7F FFFFE0780F01E0600F0060400F0020400F0020C00F0030800F0010800F0010800F001080 0F0010000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 0F0000000F0000001F800007FFFE001C1F7E9E21>IIII<7FF83FF80FE00FC007C0070003 C0020001E0040001F00C0000F0080000781000007C1000003C2000003E4000001E400000 0F8000000F8000000780000003C0000007E0000005E0000009F0000018F8000010780000 207C0000603C0000401E0000801F0001800F0001000780020007C0070003C01F8007E0FF E01FFE1F1F7F9E22>II<7FFFF8 7C00F87000F06001E04001E0C003C0C003C0800780800F80800F00001E00001E00003C00 003C0000780000F80000F00001E00001E00003C00403C0040780040F80040F000C1E000C 1E00083C00183C0018780038F801F8FFFFF8161F7D9E1C>II<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E7B 9F17>II<1FE000303000781800781C00300E0000 0E00000E00000E0000FE00078E001E0E00380E00780E00F00E10F00E10F00E10F01E1078 1E103867200F83C014147E9317>97 D<0E0000FE00000E00000E00000E00000E00000E00 000E00000E00000E00000E00000E00000E3E000EC3800F01C00F00E00E00E00E00700E00 700E00780E00780E00780E00780E00780E00780E00700E00700E00E00F00E00D01C00CC3 00083E0015207F9F19>I<03F80E0C1C1E381E380C70007000F000F000F000F000F000F0 0070007000380138011C020E0C03F010147E9314>I<000380003F800003800003800003 8000038000038000038000038000038000038000038003E380061B801C07803803803803 80700380700380F00380F00380F00380F00380F00380F003807003807003803803803807 801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E0038070038070070070070 0380F00380F00380FFFF80F00000F00000F000007000007000003800801800800C010007 060001F80011147F9314>I<007C00C6018F038F07060700070007000700070007000700 FFF007000700070007000700070007000700070007000700070007000700070007000700 07007FF01020809F0E>I<0000E003E3300E3C301C1C30380E00780F00780F00780F0078 0F00780F00380E001C1C001E380033E0002000002000003000003000003FFE001FFF800F FFC03001E0600070C00030C00030C00030C000306000603000C01C038003FC00141F7F94 17>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E0000 0E00000E3E000E43000E81800F01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C0 0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC16207F9F19>I<1C00 1E003E001E001C000000000000000000000000000E007E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E000E000E00FFC00A1F809E0C>I<00E001F001 F001F000E0000000000000000000000000007007F000F000700070007000700070007000 70007000700070007000700070007000700070007000700070007000706070F060F0C061 803F000C28829E0E>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00 000E00000E00000E00000E0FF00E03C00E03000E02000E04000E08000E10000E30000E70 000EF8000F38000E1C000E1E000E0E000E07000E07800E03800E03C00E03E0FFCFF81520 7F9F18>I<0E00FE000E000E000E000E000E000E000E000E000E000E000E000E000E000E 000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00B2080 9F0C>I<0E1F01F000FE618618000E81C81C000F00F00E000F00F00E000E00E00E000E00 E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E0 0E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00FFE7FE7FE023147F93 26>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C0 0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC16147F9319>I<01F8 00070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0F000 F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<0E3E00FEC3800F 01C00F00E00E00E00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E 00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00000E00000E00000E00000E 00000E0000FFE000151D7F9319>I<03E0800619801C05803C0780380380780380700380 F00380F00380F00380F00380F00380F003807003807803803803803807801C0B800E1380 03E380000380000380000380000380000380000380000380000380003FF8151D7E9318> I<0E78FE8C0F1E0F1E0F0C0E000E000E000E000E000E000E000E000E000E000E000E000E 000E00FFE00F147F9312>I<1F9030704030C010C010C010E00078007F803FE00FF00070 803880188018C018C018E030D0608F800D147E9312>I<020002000200060006000E000E 003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E080E080E080E080E 080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E01C00E01C00E01C00E01C00E 01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E03C00603C0030DC001 F1FC16147F9319>III<7FC3FC0F01E00701C007018003810001C2 0000E40000EC00007800003800003C00007C00004E000087000107000303800201C00601 E01E01E0FF07FE1714809318>II< 3FFF380E200E201C40384078407000E001E001C00380078007010E011E011C0338027006 700EFFFE10147F9314>II<30307878F87C787830300E057C9E17> 127 D E /Fm 26 122 df<387CFEFEFE7C38000000000000387CFEFEFE7C3807147C930F >58 D<0000E000000000E000000001F000000001F000000001F000000003F800000003F8 00000006FC00000006FC0000000EFE0000000C7E0000000C7E000000183F000000183F00 0000303F800000301F800000701FC00000600FC00000600FC00000C007E00000FFFFE000 01FFFFF000018003F000018003F000030001F800030001F800060001FC00060000FC000E 0000FE00FFE00FFFE0FFE00FFFE0231F7E9E28>65 D70 D73 D75 D77 D<7FFFFFFC7FFFFFFC7C07E07C7007E01C6007E00C6007E00CE007E00EC007E0 06C007E006C007E006C007E0060007E0000007E0000007E0000007E0000007E0000007E0 000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0 000007E0000007E00003FFFFC003FFFFC01F1E7E9D24>84 D88 D<07FC001FFF003F0F803F07C03F03E03F03E00C03E00003E0007FE007 FBE01F03E03C03E07C03E0F803E0F803E0F803E0FC05E07E0DE03FF8FE0FE07E17147F93 19>97 D<01FE0007FF801F0FC03E0FC03E0FC07C0FC07C0300FC0000FC0000FC0000FC00 00FC0000FC00007C00007E00003E00603F00C01F81C007FF0001FC0013147E9317>99 D<0007F80007F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000 F801F8F80FFEF81F83F83E01F87E00F87C00F87C00F8FC00F8FC00F8FC00F8FC00F8FC00 F8FC00F87C00F87C00F87E00F83E01F81F07F80FFEFF03F8FF18207E9F1D>I<01FE0007 FF800F83C01E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C 00007C00003E00181E00180F807007FFE000FF8015147F9318>I<001F8000FFC001F3E0 03E7E003C7E007C7E007C3C007C00007C00007C00007C00007C000FFFC00FFFC0007C000 07C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C000 07C00007C00007C0003FFC003FFC0013207F9F10>I<01FC3C07FFFE0F079E1E03DE3E03 E03E03E03E03E03E03E03E03E01E03C00F07800FFF0009FC001800001800001C00001FFF 800FFFF007FFF81FFFFC3C007C70003EF0001EF0001EF0001E78003C78003C3F01F80FFF E001FF00171E7F931A>II<1C003E003F007F003F003E001C00000000000000000000000000FF00FF00 1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE0 0B217EA00E>I108 D110 D<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC007EFC007EFC007EFC 007EFC007EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017147F931A>I< FF1FC0FF7FF01FE1F81F80FC1F007E1F007E1F003E1F003F1F003F1F003F1F003F1F003F 1F003F1F003E1F007E1F007C1F80FC1FC1F81F7FE01F1F801F00001F00001F00001F0000 1F00001F00001F0000FFE000FFE000181D7E931D>I114 D<0FE63FFE701E600EE006E006F800FFC07F F83FFC1FFE03FE001FC007C007E007F006F81EFFFCC7F010147E9315>I<018001800180 03800380038007800F803F80FFFCFFFC0F800F800F800F800F800F800F800F800F800F80 0F860F860F860F860F8607CC03F801F00F1D7F9C14>II119 D121 D E /Fn 34 122 df<70F8FCFC7404040404080810102040060F7C840E>44 D<70F8F8F87005057C840E>46 D<0001800000018000000180000003C0000003C0000003 C0000005E0000005E000000DF0000008F0000008F0000010F80000107800001078000020 3C0000203C0000203C0000401E0000401E0000401E0000800F0000800F0000FFFF000100 078001000780030007C0020003C0020003C0040003E0040001E0040001E00C0000F00C00 00F03E0001F8FF800FFF20237EA225>65 DI<0007E0100038183000E0063001C00170038000 F0070000F00E0000701E0000701C0000303C0000303C0000307C00001078000010780000 10F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000780000 00780000107C0000103C0000103C0000101C0000201E0000200E00004007000040038000 8001C0010000E0020000381C000007E0001C247DA223>II<0007F008003C0C1800E0021801 C001B8038000F8070000780F0000381E0000381E0000183C0000183C0000187C00000878 00000878000008F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8 001FFF780000F8780000787C0000783C0000783C0000781E0000781E0000780F00007807 000078038000B801C000B800E00318003C0C080007F00020247DA226>71 DI< FFFC0FC00780078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800780078007800780078007800FC0FFFC0E227EA1 12>I77 DI< FFFFE000000F803C000007800E00000780078000078007C000078003C000078003E00007 8003E000078003E000078003E000078003E000078003C000078007C00007800780000780 0E000007803C000007FFE000000780700000078038000007801C000007801E000007800E 000007800F000007800F000007800F000007800F000007800F800007800F800007800F80 0007800F808007800FC080078007C0800FC003C100FFFC01E2000000007C0021237EA124 >82 D<03F0200C0C601802603001E07000E0600060E00060E00060E00020E00020E00020 F00000F000007800007F00003FF0001FFE000FFF0003FF80003FC00007E00001E00000F0 0000F0000070800070800070800070800070C00060C00060E000C0F000C0C80180C60700 81FC0014247DA21B>I<7FFFFFF87807807860078018400780084007800840078008C007 800C80078004800780048007800480078004000780000007800000078000000780000007 800000078000000780000007800000078000000780000007800000078000000780000007 800000078000000780000007800000078000000780000007800000078000000FC00003FF FF001E227EA123>II<7FF807FF0007E001F80003C000E00003E000C00001E00080 0000F001000000F80300000078020000007C040000003E0C0000001E080000001F100000 000FB000000007A000000007C000000003E000000001E000000001F000000003F8000000 0278000000047C0000000C3E000000081E000000101F000000300F800000200780000040 07C00000C003E000008001E000010001F000030000F000070000F8001F8001FC00FFE007 FFC022227FA125>88 D<0FE0001838003C0C003C0E0018070000070000070000070000FF 0007C7001E07003C0700780700700700F00708F00708F00708F00F087817083C23900FC1 E015157E9418>97 D<01FE000703000C07801C0780380300780000700000F00000F00000 F00000F00000F00000F00000F000007000007800403800401C00800C010007060001F800 12157E9416>99 D<0000E0000FE00001E00000E00000E00000E00000E00000E00000E000 00E00000E00000E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F0 00E0F000E0F000E0F000E0F000E0F000E0F000E07000E07800E03800E01801E00C02E007 0CF001F0FE17237EA21B>I<01FC000707000C03801C01C03801C07801E07000E0F000E0 FFFFE0F00000F00000F00000F00000F000007000007800203800201C00400E0080070300 00FC0013157F9416>I<003C00C6018F038F030F07000700070007000700070007000700 0700FFF80700070007000700070007000700070007000700070007000700070007000700 0700070007807FF8102380A20F>I<0E0000FE00001E00000E00000E00000E00000E0000 0E00000E00000E00000E00000E00000E00000E00000E1F800E60C00E80E00F00700F0070 0E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070 0E00700E00700E0070FFE7FF18237FA21B>104 D<1C001E003E001E001C000000000000 00000000000000000000000E00FE001E000E000E000E000E000E000E000E000E000E000E 000E000E000E000E000E000E000E00FFC00A227FA10E>I<0E00FE001E000E000E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E000E00FFE00B237FA20E>108 D<0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E00E003800E00E003800E0 0E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E 003800E00E003800E00E003800E00E003800E00E003800E00E003800E0FFE3FF8FFE2715 7F942A>I<0E1F80FE60C01E80E00F00700F00700E00700E00700E00700E00700E00700E 00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF18157F94 1B>I<01FC000707000C01801800C03800E0700070700070F00078F00078F00078F00078 F00078F00078F000787000707800F03800E01C01C00E038007070001FC0015157F9418> I<0E1F00FE61C00E80600F00700E00380E003C0E001C0E001E0E001E0E001E0E001E0E00 1E0E001E0E001E0E003C0E003C0E00380F00700E80E00E41C00E3F000E00000E00000E00 000E00000E00000E00000E00000E00000E0000FFE000171F7F941B>I<0E3CFE461E8F0F 0F0F060F000E000E000E000E000E000E000E000E000E000E000E000E000E000F00FFF010 157F9413>114 D<0F8830786018C018C008C008E008F0007F803FE00FF001F8003C801C 800C800CC00CC008E018D0308FC00E157E9413>I<02000200020002000600060006000E 001E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E 040E040E040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E0070 0E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F0 06017003827800FC7F18157F941B>II121 D E /Fo 2 4 df0 D<020002000200C218F2783AE00F800F803AE0F278C2180200020002000D0E7E8E12>3 D E /Fp 15 128 df<0000FC1E000007026180000E07C38000180F878000380F83800070 0700000070070000007007000000E00E000000E00E000000E00E000000E00E000000E00E 000000E00E00003FFFFFF00001C01C000001C01C000001C01C000001C01C000001C01C00 000380380000038038000003803800000380380000038038000003803800000700700000 070070000007007000000700700000070070000007007000000E00E000000F00F00000FF C7FF000021237FA21C>11 D<3078F8787005057C840E>46 D<0000040000000006000000 000E000000001E000000001E000000003E000000003F000000004F000000004F00000000 8F000000008F000000010F00000001078000000207800000020780000004078000000407 8000000807C000000803C000001003C000001003C000002003C000003FFFE000004001E0 00004001E000008001E000008001E000010001E000010000F000020000F000060000F000 040000F0000C0000F0003E0001F800FF800FFF8021237EA225>65 D<000FC0800030318000C00B0001800700038007000300030007000300070003000E0002 000E0002000F0002000F0000000F0000000F80000007E0000007FE000003FFC00001FFE0 00007FF000000FF8000000F8000000780000003C0000003C0000003C0020003C00400038 004000380040003800600030006000700060006000F000C000E8018000C607000081FC00 0019247DA21B>83 D<03FC000606000F03000F03800601800001C0000380000380007F80 03E3800F03801C0380380700780700F00708F00708F00F08F00F08F017107867A01F83C0 15157D9418>97 D<00FF000381C00603C00C03C01C0180380000780000700000F00000F0 0000F00000F00000F00000E00000F00000F000807001007001003806001C180007E00012 157C9416>99 D<00001E0000FE00001C00001C00001C00001C00001C00001C0000380000 3800003800003800003800003800FC700383700700F00C00F01C00703800707800E07000 E0F000E0F000E0F000E0F000E0E001C0E001C0E001C0E001C07003C07003C0380F801C33 C007C3F817237CA21B>I<00FE000383800701C00C00E01C00E03800E07800E07000E0FF FFE0F00000F00000F00000F00000E00000E00000F000407000803000801803000E0C0003 F00013157D9416>I<00780003F80000700000700000700000700000700000700000E000 00E00000E00000E00000E00000E00001C3F001CC1801D00C01E00E01E00E01C00E03C01C 03801C03801C03801C03801C03801C0700380700380700380700380700380700380E0070 0F0078FFE7FF18237FA21B>104 D<000300000780000F80000F80000700000000000000 000000000000000000000000000000000000000E0000FE00001E00000E00000E00000E00 001C00001C00001C00001C00001C00001C00003800003800003800003800003800003800 00700000700000700000700000700000700000E00000E00060E000F1C000F18000E30000 3E0000112C83A10F>106 D<007803F800700070007000700070007000E000E000E000E0 00E000E001C001C001C001C001C001C00380038003800380038003800700070007000700 070007000E000F00FFE00D237FA20E>108 D<01C3F01FCC1801D00C01E00E01E00E01C0 0E03C01C03801C03801C03801C03801C03801C0700380700380700380700380700380700 380E00700F0078FFE7FF18157F941B>110 D<007E000383800600C00C00E01C00703800 70780078700078F00078F00078F00078F00078E000F0E000F0E000E0F001E07001C07003 803807001C1C0007F00015157D9418>I<01C7C01FC8E001D1E001E1E001E0C001C00003 C0000380000380000380000380000380000700000700000700000700000700000700000E 00000F0000FFF00013157F9413>114 D<30307878F8F8F8F870700D0576A118>127 D E /Fq 25 122 df<000003000000000003000000000003000000000007800000000007 80000000000FC0000000000FC0000000000FC00000000017E00000000013E00000000013 E00000000023F00000000021F00000000021F00000000040F80000000040F80000000040 F800000000807C00000000807C00000001807E00000001003E00000001003E0000000200 3F00000002001F00000002001F00000004000F80000004000F80000004000F8000000800 07C00000080007C00000180007E000001FFFFFE000001FFFFFE00000200003F000002000 01F00000200001F00000400001F80000400000F80000400000F800008000007C00008000 007C00008000007C00010000003E00010000003E00030000003F00030000001F00070000 001F001F8000003F80FFE00003FFFCFFE00003FFFC2E327EB132>65 D<00003FE0010001FFF8030007F01E03001F800307003E000087007800004F00F000002F 01E000001F03C000000F078000000F0F800000070F000000071F000000031E000000033E 000000033C000000017C000000017C000000017C000000017800000000F800000000F800 000000F800000000F800000000F800000000F800000000F800000000F800000000F80000 0000F800000000F80000000078000000007C000000007C000000017C000000013C000000 013E000000011E000000011F000000020F000000020F80000006078000000403C0000008 01E000000800F00000100078000020003E0000C0001F8003800007F00F000001FFFC0000 003FE00028337CB130>67 D70 D76 D80 D85 D<00FE00000303C0000C00E00010007000100038003C003C003E001C003E001E003E001E 0008001E0000001E0000001E0000001E00000FFE0000FC1E0003E01E000F801E001F001E 003E001E003C001E007C001E00F8001E04F8001E04F8001E04F8003E04F8003E0478003E 047C005E043E008F080F0307F003FC03E01E1F7D9E21>97 D<000001E000003FE000003F E0000003E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001 E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0001F81E000F061 E001C019E0078005E00F0003E00E0003E01E0001E03C0001E03C0001E07C0001E0780001 E0F80001E0F80001E0F80001E0F80001E0F80001E0F80001E0F80001E0F80001E0F80001 E0780001E0780001E03C0001E03C0001E01C0001E01E0003E00E0005E0070009E0038011 F000E061FF003F81FF20327DB125>100 D<003F800000E0E0000380380007003C000E00 1E001E001E001C000F003C000F007C000F0078000F8078000780F8000780F8000780FFFF FF80F8000000F8000000F8000000F8000000F8000000F8000000780000007C0000003C00 00003C0000801E0000800E0001000F0002000780020001C00C0000F03000001FC000191F 7E9E1D>I<0007E0001C1000383800707C00E07C01E07C01C03803C00003C00003C00003 C00003C00003C00003C00003C00003C00003C00003C00003C000FFFFC0FFFFC003C00003 C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003 C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003 C00007E0007FFF007FFF0016327FB114>I<000000F0007F030801C1C41C0380E81C0700 70080F0078001E003C001E003C003E003E003E003E003E003E003E003E003E003E003E00 3E001E003C001E003C000F007800070070000780E00009C1C000087F0000180000001800 00001800000018000000180000001C0000000E0000000FFFF80007FFFF0003FFFF800E00 0FC0180001E0300000F070000070E0000038E0000038E0000038E0000038E00000387000 007070000070380000E01C0001C00700070001C01C00003FE0001E2F7E9F21>I<078000 0000FF80000000FF800000000F8000000007800000000780000000078000000007800000 000780000000078000000007800000000780000000078000000007800000000780000000 07800000000780000000078000000007800000000780FE00000783078000078C03C00007 9001E00007A001E00007A000F00007C000F00007C000F000078000F000078000F0000780 00F000078000F000078000F000078000F000078000F000078000F000078000F000078000 F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0 00078000F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1FFF8021327EB125 >I<07000F801F801F800F80070000000000000000000000000000000000000000000000 0780FF80FF800F8007800780078007800780078007800780078007800780078007800780 07800780078007800780078007800780078007800FC0FFF8FFF80D307EAF12>I<078000 00FF800000FF8000000F8000000780000007800000078000000780000007800000078000 000780000007800000078000000780000007800000078000000780000007800000078000 0007801FFC07801FFC078007E00780078007800600078004000780080007801000078060 0007808000078100000783800007878000078FC0000793C00007A1E00007C1F0000780F0 000780780007807C0007803C0007803E0007801F0007800F0007800F80078007C0078003 C0078003E00FC007F8FFFC0FFFFFFC0FFF20327EB123>107 D<0780FF80FF800F800780 078007800780078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800780078007800780078007800780078007800780 0780078007800780078007800FC0FFFCFFFC0E327EB112>I<0780FE001FC000FF830780 60F000FF8C03C18078000F9001E2003C0007A001E4003C0007A000F4001E0007C000F800 1E0007C000F8001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E 00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00 078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E0007 8000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E000780 00F0001E000FC001F8003F00FFFC1FFF83FFF0FFFC1FFF83FFF0341F7E9E38>I<0780FE 0000FF83078000FF8C03C0000F9001E00007A001E00007A000F00007C000F00007C000F0 00078000F000078000F000078000F000078000F000078000F000078000F000078000F000 078000F000078000F000078000F000078000F000078000F000078000F000078000F00007 8000F000078000F000078000F000078000F000078000F000078000F0000FC001F800FFFC 1FFF80FFFC1FFF80211F7E9E25>I<001FC00000F0780001C01C00070007000F0007801E 0003C01C0001C03C0001E03C0001E0780000F0780000F0780000F0F80000F8F80000F8F8 0000F8F80000F8F80000F8F80000F8F80000F8F80000F8780000F07C0001F03C0001E03C 0001E01E0003C01E0003C00F00078007800F0001C01C0000F07800001FC0001D1F7E9E21 >I<0781FC00FF860700FF8803C00F9001E007A000F007C00078078000780780003C0780 003C0780003E0780001E0780001F0780001F0780001F0780001F0780001F0780001F0780 001F0780001F0780001F0780003E0780003E0780003C0780007C0780007807C000F007A0 00F007A001E00798038007860F000781F800078000000780000007800000078000000780 00000780000007800000078000000780000007800000078000000FC00000FFFC0000FFFC 0000202D7E9E25>I<0783E0FF8C18FF907C0F907C07A07C07C03807C00007C00007C000 078000078000078000078000078000078000078000078000078000078000078000078000 0780000780000780000780000780000780000780000FC000FFFE00FFFE00161F7E9E19> 114 D<01FC100E03301800F0300070600030E00030E00010E00010E00010F00010F80000 7E00003FF0001FFF000FFFC003FFE0003FF00001F80000F880003C80003C80001CC0001C C0001CE0001CE00018F00038F00030CC0060C301C080FE00161F7E9E1A>I<0040000040 0000400000400000400000C00000C00000C00001C00001C00003C00007C0000FC0001FFF E0FFFFE003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C0 0003C00003C00003C00003C00003C00003C01003C01003C01003C01003C01003C01003C0 1003C01001C02001E02000E0400078C0001F00142C7FAB19>I<078000F000FF801FF000 FF801FF0000F8001F000078000F000078000F000078000F000078000F000078000F00007 8000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 00F000078000F000078000F000078000F000078000F000078000F000078000F000078001 F000078001F000078001F000038002F00003C004F00001C008F800007030FF80001FC0FF 80211F7E9E25>I119 D121 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 420 377 a Fq(F)-6 b(aster)22 b(Link)l(age)g(Analysis)e (Computations)357 469 y(for)i(P)n(edigrees)g(with)g(Lo)r(ops)f(or)h(Un) n(used)e(Alleles)737 653 y Fp(Alejandro)c(A.)f(Sc)o(h\177)-24 b(a\013er)1213 635 y Fo(\003)483 711 y Fn(National)16 b(Cen)o(ter)g(for)g(Human)f(Genome)g(Researc)o(h)667 769 y(National)h(Institutes)g(of)h(Health)751 827 y(Bethesda,MD)f (U.S.A.)936 886 y(and)619 944 y(Departmen)o(t)f(of)h(Computer)g (Science)811 1002 y(Rice)f(Univ)o(ersit)o(y)757 1060 y(Houston,)h(TX)g(U.S.A.)150 1380 y Fm(Keyw)o(ords:)i Fl(Genetic)e(link)m(age)h(analysis,)e(algorithms,)g(lo)q(ops,)g(unkno)o (wn)h(gen)o(top)o(y)o(es)150 2245 y Fm(Address)28 b(for)h(corresp)q (ondence:)40 b Fl(Alejandro)26 b(A.)f(Sc)o(h\177)-23 b(a\013er,)27 b(National)f(Institutes)g(of)150 2302 y(Health,)15 b(Building)j(38A/Ro)q(om)d(8N805,)e(8600)h(Ro)q(c)o(kville)k(Pik)o(e,)d (Bethesda,)g(MD)g(20894.)150 2358 y Fm(F)-6 b(AX:)14 b Fl(\(301\))f(480-9241)150 2415 y Fm(T)l(elephone:)20 b Fl(\(301\))14 b(496-2477)f(x202)150 2471 y(F)l(or)i(the)g(Section)h (on:)k Fm(Metho)q(dological)g(Issues)p 150 2511 660 2 v 201 2538 a Fk(\003)219 2554 y Fj(schaffer@n)o(ch)o(gr.)o(nih)o(.g)o (ov)p eop %%Page: 2 2 2 1 bop 150 195 a Fi(Abstract)150 252 y Fl(There)16 b(seems)g(to)g(b)q (e)g(no)g(limit)i(to)d(the)h(complexit)o(y)h(of)e(computations)h(that)g (genetic)g(link)m(age)150 308 y(analysts)k(w)o(an)o(t)g(to)g(do.)36 b(Tw)o(o)20 b(primary)h(factors)e(that)h(increase)i(the)f(length)g(of)f (computa-)150 364 y(tions)g(are)g(p)q(edigree)h(lo)q(ops)g(and)f(unkno) o(wn)g(genot)o(yp)q(es.)35 b(I)20 b(describ)q(e)i(the)e(implemen)o (tation)150 421 y(in)g(F)-5 b(ASTLINK)21 b(of)e(some)g(algorithmic)i (impro)o(v)o(emen)o(ts)e(to)g(partly)g(address)h(the)f(problems)150 477 y(of)f(p)q(edigree)h(lo)q(ops)f(and)g(unkno)o(wn)h(genot)o(yp)q (es.)28 b(LINKA)o(GE)18 b(is)h(b)o(y)f(far)f(the)h(most)f(p)q(opular) 150 534 y(soft)o(w)o(are)g(pac)o(k)m(age)i(to)g(do)g(lo)q(d)h(score)f (computations)g(on)g(disease)h(p)q(edigrees.)33 b(F)-5 b(ASTLINK)150 590 y(is)18 b(deriv)o(ed)h(from)e(LINKA)o(GE)h(5.1)e(and) i(compatible)h(with)f(it.)27 b(In)18 b(con)o(trast)f(to)g(LINKA)o(GE,) 150 647 y(F)-5 b(ASTLINK)13 b(has)f(the)g(virtues)g(that)f(it)i(is)f (faster)f(sequen)o(tially)l(,)j(runs)e(w)o(ell)h(in)g(parallel,)h(is)e (more)150 703 y(robust)i(against)f(errors,)h(and)g(includes)i(substan)o (tial)f(new)f(do)q(cumen)o(tation.)20 b(One)15 b(of)f(the)g(new)150 760 y(impro)o(v)o(emen)o(ts)h(allo)o(ws)h(the)f(detection)h(of)f (violation)i(of)e(Mendelian)i(rules)f(of)f(inheritance)i(in)150 816 y(input)f(p)q(edigree)h(\014les)g(with)f(lo)q(ops.)21 b(This)16 b(error-detection)f(capabilit)o(y)i(w)o(as)e(not)g(pro)o (vided)h(in)150 873 y(an)o(y)f(previous)h(v)o(ersion)f(of)g(LINKA)o(GE) h(or)f(F)-5 b(ASTLINK.)964 2678 y(2)p eop %%Page: 3 3 3 2 bop 150 195 a Fi(1)69 b(In)n(tro)r(duction)150 297 y Fl(P)o(edigree)15 b(lo)q(ops)h(and)f(unkno)o(wn)g(genot)o(yp)q(es)f (are)h(banes)g(to)f(link)m(age)i(analysts)f(who)f(h)o(un)o(t)h(dis-)150 353 y(ease)21 b(genes)g(with)g(the)g(p)q(opular)g(soft)o(w)o(are)e(pac) o(k)m(age)i(LINKA)o(GE)g([14)o(,)g(13)o(,)g(15)o(].)36 b(The)21 b(slo)o(w)150 409 y(running)c(times)f(these)f(problems)i (cause)e(b)q(ecome)i(more)e(sev)o(ere)h(as)f(geneticists)h(increase)h (the)150 466 y(n)o(um)o(b)q(er)11 b(of)g(lo)q(ci)h(and)f(the)g(n)o(um)o (b)q(er)h(of)e(alleles)j(p)q(er)e(lo)q(cus.)20 b(In)11 b(this)h(pap)q(er)f(I)h(describ)q(e)g(the)f(imple-)150 522 y(men)o(tation)k(of)f(sev)o(eral)h(algorithmic)g(impro)o(v)o(emen)o (ts)g(to)f(address)h(these)g(problems.)20 b(Because)150 579 y(LINKA)o(GE)c(is)g(m)o(uc)o(h)f(more)g(p)q(opular)h(than)f(comp)q (eting)h(pac)o(k)m(ages,)f(suc)o(h)g(as)g(MENDEL)g([12)o(])150 635 y(or)h(P)l(AP)i([9)o(],)f(it)g(is)g(of)g(practical)h(imp)q(ortance) f(to)g(soft)o(w)o(are)e(users)i(to)f(implemen)o(t)j(new)e(algo-)150 692 y(rithms)f(in)i(a)e(LINKA)o(GE-compatible)i(manner.)23 b(I)17 b(ha)o(v)o(e)f(implemen)o(ted)i(the)e(impro)o(v)o(emen)o(ts)150 748 y(in)d(F)-5 b(ASTLINK,)13 b(whic)o(h)h(is)f(compatible)g(with)g (LINKA)o(GE)g(5.1,)f(but)g(has)g(the)h(additional)h(b)q(en-)150 805 y(e\014ts)j(that)g(it)h(is)f(faster)g([4)o(,)g(24],)g(runs)g(w)o (ell)i(in)f(parallel)h([6)o(,)e(8],)g(is)h(robust)f(against)g(a)g(v)m (ariet)o(y)150 861 y(of)h(errors)f(suc)o(h)h(as)g(computer)g(crashes)g ([24)o(],)g(and)h(includes)h(substan)o(tial)e(new)h(do)q(cumen)o(ta-) 150 918 y(tion\(e.g.,)37 b([22)o(,)18 b(21)o(,)h(23)o(]\).)29 b(The)19 b(impro)o(v)o(emen)o(ts)g(describ)q(ed)h(herein)g(constitute)f (the)f(ma)s(jor)150 974 y(co)q(de)e(di\013erences)g(b)q(et)o(w)o(een)g (v)o(ersions)f(2.3P)f(and)i(3.0P)e(of)g(F)-5 b(ASTLINK.)221 1030 y(In)12 b(this)h(pap)q(er)g(I)f(return)g(to)g(the)g(initial)i (goal)e(of)g(the)g(F)-5 b(ASTLINK)13 b(pro)s(ject,)f(implemen)o(ting) 150 1087 y(faster)f(sequen)o(tial)h(algorithms)g(for)f(link)m(age)i (analysis.)19 b(The)12 b(impro)o(v)o(emen)o(ts)f(describ)q(ed)j(herein) 150 1143 y(di\013er)i(conceptually)g(from)f(those)g(in)h([4)o(])f(in)h (t)o(w)o(o)e(imp)q(ortan)o(t)h(w)o(a)o(ys.)221 1200 y(First,)j(the)g (new)h(impro)o(v)o(emen)o(ts)f(are)g(targeted)f(at)h(t)o(w)o(o)f(sp)q (eci\014c)j(problems)f(\(lo)q(ops)g(and)150 1256 y(unkno)o(wn)f(genot)o (yp)q(es\),)f(while)i(the)e(initial)j(impro)o(v)o(emen)o(ts)d(w)o(ere)g (targeted)g(at)f(virtually)j(all)150 1313 y(inputs.)i(As)15 b(a)g(result,)g(the)g(new)g(v)o(ersion)h(of)e(F)-5 b(ASTLINK)16 b(sho)o(ws)f(measurable)g(impro)o(v)o(emen)o(t)150 1369 y(only)f(on)g(some)f(inputs,)h(while)h(F)-5 b(ASTLINK)15 b(1.0)e(impro)o(v)o(ed)g(on)h(LINKA)o(GE)g(5.1)f(for)g(virtually)150 1426 y(all)18 b(inputs.)26 b(Ho)o(w)o(ev)o(er,)16 b(when)h(the)g(new)h (impro)o(v)o(emen)o(ts)e(apply)l(,)i(they)f(can)g(yield)i(a)d(sp)q (eedup)150 1482 y(m)o(uc)o(h)f(more)g(substan)o(tial)h(than)f(an)o(y)f (individual)19 b(impro)o(v)o(emen)o(t)c(in)h(F)-5 b(ASTLINK)16 b(1.0.)221 1539 y(Second,)23 b(the)e(new)h(impro)o(v)o(emen)o(ts)f (require)h(substan)o(tial)f(reco)q(ding)i(of)e(seemingly)h(un-)150 1595 y(related)h(parts)f(of)h(the)g(appro)o(ximately)g(30,000)e(lines)j (of)e(F)-5 b(ASTLINK,)24 b(while)g(the)f(initial)150 1651 y(impro)o(v)o(emen)o(ts)d(w)o(ere)g(fo)q(cused)h(on)f(one)g (complicated)i(section)f(of)e(LINKA)o(GE)i(co)q(de.)36 b(The)150 1708 y(complexit)o(y)14 b(of)f(the)g(soft)o(w)o(are)f (engineering)j(lik)o(ely)g(explains)g(wh)o(y)e(the)g(ideas)h(b)q(ehind) i(our)d(new)150 1764 y(impro)o(v)o(emen)o(ts)19 b(are)h(kno)o(wn)g(to)f (a)h(handful)h(of)e(link)m(age)j(analysis)e(exp)q(erts,)h(but)f(they)g (w)o(ere)150 1821 y(nev)o(er)15 b(implemen)o(ted)i(in)f(LINKA)o(GE.)221 1877 y(This)e(pap)q(er)h(is)g(organized)f(as)g(follo)o(ws.)20 b(The)14 b(next)h(section)f(describ)q(es)i(some)e(bac)o(kground)150 1934 y(information)19 b(on)h(link)m(age)h(analysis,)f(LINKA)o(GE,)g (and)g(F)-5 b(ASTLINK.)20 b(This)g(is)f(follo)o(w)o(ed)h(b)o(y)150 1990 y(t)o(w)o(o)12 b(sections)i(on)g(the)f(new)h(algorithms,)f(t)o(w)o (o)f(sections)i(describing)i(sp)q(eedup)f(measuremen)o(ts,)150 2047 y(and)g(\014nally)i(a)e(short)f(Discussion.)150 2190 y Fi(2)69 b(Bac)n(kground)150 2291 y Fl(In)16 b(this)h(section)f (I)g(review)g(some)g(bac)o(kground)f(on)h(link)m(age)h(analysis,)g(the) f(LINKA)o(GE)g(pac)o(k-)150 2348 y(age,)e(and)h(F)-5 b(ASTLINK.)16 b(The)f(basic)h(input)g(to)e(LINKA)o(GE)i(includes)h(an)e (ordered)g(list)h(of)f(lo)q(ci)150 2404 y Fh(L)181 2411 y Fg(1)201 2404 y Fh(;)8 b(L)253 2411 y Fg(2)272 2404 y Fh(;)g(:)g(:)g(:)t(;)g(L)404 2411 y Ff(k)q Fg(+1)482 2404 y Fl(with)k(allele)i(frequencies)g(at)d(eac)o(h)h(lo)q(cus)h(and)f (one)g(or)g(more)f(p)q(edigrees)j(with)150 2461 y(some)h(individuals)j (t)o(yp)q(ed)d(at)f(some)h(lo)q(ci.)21 b(The)15 b(general)h(goal)e(of)h (link)m(age)h(analysis)g(computa-)150 2517 y(tions)e(is)g(to)f(ev)m (aluate)i(the)f(lik)o(eliho)q(o)q(d)i(of)d(a)h(candidate)g(v)o(ector)f ([)p Fh(\022)1278 2524 y Fg(1)1298 2517 y Fh(;)8 b(:)g(:)g(:)d(;)j (\022)1421 2524 y Ff(k)1442 2517 y Fl(])13 b(of)g(recom)o(bination)964 2678 y(3)p eop %%Page: 4 4 4 3 bop 150 195 a Fl(fractions)15 b(for)f(the)i(input)g(p)q (edigree\(s\))g(and)f(lo)q(cus)h(order.)k(The)15 b(comp)q(onen)o(t)g Fh(\022)1525 202 y Ff(i)1555 195 y Fl(is)h(the)f(candi-)150 252 y(date)f(recom)o(bination)g(fraction)g(b)q(et)o(w)o(een)g(the)g(lo) q(ci)h Fh(L)1077 259 y Ff(i)1105 252 y Fl(and)f Fh(L)1223 259 y Ff(i)p Fg(+1)1282 252 y Fl(.)20 b(LINKA)o(GE)14 b(pro)o(vides)g(four)150 308 y(programs)20 b(ILINK,)i(LINKMAP)l(,)f (LODSCORE,)h(MLINK)f(to)f(do)h(lik)o(eliho)q(o)q(d)j(ev)m(aluations)150 364 y(and)15 b(help)i(select)f(those)f(v)o(ectors)f(that)h(giv)o(e)g (the)h(highest)f(lik)o(eliho)q(o)q(ds.)23 b(The)16 b(programs)e (di\013er)150 421 y(largely)20 b(in)g(ho)o(w)f(they)h(c)o(ho)q(ose)f (the)h(candidate)g Fh(\022)h Fl(v)o(ectors,)e(whic)o(h)i(is)f(not)f (relev)m(an)o(t)h(to)f(this)150 477 y(pap)q(er.)221 534 y(The)24 b(LINKA)o(GE)i(pac)o(k)m(age)e(also)h(includes)i(a)d(prepro)q (cessor)g(program)g(UNKNO)o(WN,)150 590 y(whic)o(h)15 b(is)g(con)o(v)o(en)o(tionally)g(used)g(b)q(efore)g(all)g(the)f (programs)f(except)i(LODSCORE.)g(The)g(pur-)150 647 y(p)q(oses)g(of)f (UNKNO)o(WN)i(are)e(to)g(detect)h(violations)h(of)e(Mendelian)i(rules)g (of)e(inheritance)j(and)150 703 y(to)k(infer)h(p)q(ossible)i(genot)o (yp)q(es)d(for)g(all)i(un)o(t)o(yp)q(ed)f(individuals)i(who)e(ha)o(v)o (e)f(c)o(hildren)i(in)g(the)150 760 y(p)q(edigree.)37 b(If)21 b(the)f(input)i(is)f(error-free,)g(UNKNO)o(WN)g(outputs)f(a)g (\014le)i(of)e(p)q(ossible)i(geno-)150 816 y(t)o(yp)q(es)14 b(called)h(sp)q(eed\014le.dat,)g(whic)o(h)g(is)f(used)h(b)o(y)e(the)h (main)g(program)f(to)g(reduce)i(the)f(n)o(um)o(b)q(er)150 873 y(of)20 b(p)q(ossible)i(genot)o(yp)q(es)e(of)g(unkno)o(wn)h (individuals)i(during)f(the)e(lik)o(eliho)q(o)q(d)j(computation.)150 929 y(F)-5 b(ASTLINK)15 b(replaces)g(the)f(four)g(main)h(LINKA)o(GE)g (programs)e(and)h(UNKNO)o(WN;)g(through)150 985 y(F)-5 b(ASTLINK)16 b(v)o(ersion)f(2.3P)f(it)i(w)o(as)e(p)q(ossible)i(to)f (use)g(v)o(ersions)g(of)g(UNKNO)o(WN)g(distributed)150 1042 y(with)i(LINKA)o(GE,)g(but)g(m)o(uc)o(h)g(of)f(the)h(new)g(co)q (de)h(in)f(v)o(ersion)g(3.0P)f(is)h(in)h(UNKNO)o(WN.)f(All)150 1098 y(the)e(other)g(LINKA)o(GE)h(prepro)q(cessor)f(programs)f(are)h (used)h(unc)o(hanged)g(with)f(F)-5 b(ASTLINK.)221 1155 y(A)15 b(signi\014can)o(t)h(\015a)o(w)f(of)g(UNKNO)o(WN)h(is)f(that)g (for)g(p)q(edigrees)h(with)g(lo)q(ops,)f(UNKNO)o(WN)150 1211 y(do)q(es)i(no)f(error-c)o(hec)o(king)h(and)f(no)g(genot)o(yp)q(e) h(inference.)24 b(All)18 b(genot)o(yp)q(es)e(are)g(listed)i(as)e(p)q (os-)150 1268 y(sible)j(in)f(sp)q(eed\014le.dat.)28 b(The)18 b(ma)s(jor)e(thrust)h(of)g(our)g(curren)o(t)h(impro)o(v)o(emen)o(ts)f (is)h(to)e(correct)150 1324 y(these)21 b(t)o(w)o(o)e(\015a)o(ws)h(in)h (UNKNO)o(WN.)g(The)f(lo)q(op)q(ed)i(p)q(edigree)g(\015a)o(ws)e(in)h (UNKNO)o(WN)g(w)o(ere)150 1381 y(w)o(ell-hidden)f(for)c(man)o(y)g(y)o (ears)h(b)q(ecause)h(UNKNO)o(WN)f(w)o(as)f(essen)o(tially)i(undo)q (cumen)o(ted.)27 b(I)150 1437 y(supplied)18 b(do)q(cumen)o(tation)d ([23)o(])g(b)q(eginning)i(with)f(F)-5 b(ASTLINK,)16 b(v)o(ersion)f (2.2.)221 1494 y(F)l(or)d(lo)q(opless)i(p)q(edigrees,)h(the)e(lik)o (eliho)q(o)q(d)j(ev)m(aluation)e(pro)q(ceeds)g(b)o(y)f(visiting)h(one)f (n)o(uclear)150 1550 y(family)i(at)f(a)g(time,)g Fe(p)n(e)n(eling)f Fl(that)g(family)i(from)f(the)g(rest)g(of)g(the)g(p)q(edigree.)21 b(The)15 b(order)f(of)g(the)150 1606 y(n)o(uclear)k(family)g(p)q (eeling)i(is)e(describ)q(ed)h(in)f([22)o(].)27 b(F)l(or)16 b(our)i(purp)q(oses)g(what)e(matters)h(is)h(that)150 1663 y(they)e(o)q(ccur)h(in)g(suc)o(h)g(a)f(w)o(a)o(y)f(that)h(the)g (curren)o(t)g(n)o(uclear)h(family)g(\(except)f(the)h(last)f(one\))g (has)150 1719 y(exactly)h(one)f(mem)o(b)q(er)h Fh(m)f Fl(who)g(connects)h(that)f(family)h(to)f(the)g(un)o(visited)i(part)e (of)g(the)g(tree.)150 1776 y(F)l(or)f(eac)o(h)g(genot)o(yp)q(e)g Fh(i)p Fl(,)f(w)o(e)h(compute:)841 1854 y Fh(P)6 b Fl(\()p Fh(m;)i(i)j Fd(j)h Fh(V)s(;)c(\022)q Fl(\))p Fh(;)150 1933 y Fl(whic)o(h)22 b(is)f(the)g(probabilit)o(y)i(that)d(p)q(erson)h Fh(m)g Fl(expresses)h(the)f(phenot)o(yp)q(e)g(asso)q(ciated)h(with)150 1989 y(genot)o(yp)q(e)15 b Fh(i)p Fl(,)f(conditional)j(on)e(the)g (genot)o(yp)q(es)g(of)g(p)q(eople)i(already)e(visited,)h Fh(V)10 b Fl(,)k(and)h(the)h(can-)150 2045 y(didate)g Fh(\022)q Fl(.)k(If)c Fh(r)g Fl(is)f(the)h(last)f(p)q(erson)g(visited,) h(then)g(the)f(p)q(edigree)i(lik)o(eliho)q(o)q(d)h(is)e(\006)1589 2052 y Ff(i)1603 2045 y Fh(P)6 b Fl(\()p Fh(r)o(;)i(i)p Fl(\))p Fh(:)221 2102 y Fl(The)14 b(p)q(eeling)j(approac)o(h)d(to)g (computing)h(the)g(lik)o(eliho)q(o)q(d)i(w)o(as)d(\014rst)g(suggested)g (b)o(y)h(Elston)150 2158 y(and)i(Stew)o(art)e([7)o(])i(for)e(p)q (edigrees)j(that)e(can)h(b)q(e)g(p)q(eeled)i(from)c(b)q(ottom)h(to)g (top,)g(but)h(ev)o(en)g(for)150 2215 y(suc)o(h)c(p)q(edigrees)h(LINKA)o (GE)f(do)q(es)g(not)f(necessarily)i(p)q(eel)g(in)g(the)f(Elston-Stew)o (art)e(order)i([22)o(].)150 2271 y(P)o(eeling)23 b(w)o(as)e (generalized)j(to)d(arbitrary)h(p)q(edigrees)h(b)o(y)f(Lange)g(and)g (Elston)g([11)o(].)40 b(They)150 2328 y(prop)q(osed)16 b(that)f(a)g(lo)q(op)h(can)g(b)q(e)g(\\brok)o(en")f(b)o(y)h(replacing)h (one)e(individual)k(with)d(t)o(w)o(o)e(copies,)150 2384 y(where)21 b(one)f(cop)o(y)h(acts)e(as)i(paren)o(t)f(and)g(sp)q(ouse)h (and)g(the)f(other)g(cop)o(y)h(acts)f(as)g(c)o(hild)i(and)150 2441 y(sibling.)27 b(The)18 b(n)o(um)o(b)q(er)f(of)g(lo)q(ops)g(in)h(a) f(p)q(edigree)h(is)g(the)f(minim)o(um)h(n)o(um)o(b)q(er)f(of)g (individuals)150 2497 y(who)i(m)o(ust)g(b)q(e)g Fe(clone)n(d)g Fl(in)o(to)g(t)o(w)o(o)f(to)g(mak)o(e)h(the)g(p)q(edigree)i(in)o(to)e (a)g(tree.)32 b(I)19 b(call)h(the)g(cloned)150 2554 y(individuals)e Fe(lo)n(op)f(br)n(e)n(akers)p Fl(.)964 2678 y(4)p eop %%Page: 5 5 5 4 bop 221 195 a Fl(A)26 b(comprehensiv)o(e)i(explanation)g(of)e(ho)o (w)g(lo)q(ops)h(are)f(handled)i(in)g(LINKA)o(GE)f(and)150 252 y(F)-5 b(ASTLINK)13 b(can)f(b)q(e)h(found)g(in)g(the)f(com)o (bination)h(of)f(Chapter)f(7)h(of)g([25)o(])g(and)g([21)o(].)19 b(I)12 b(summa-)150 308 y(rize)j(a)e(few)h(salien)o(t)h(p)q(oin)o(ts)f (here.)20 b(Supp)q(ose)15 b(\014rst)f(that)f(there)h(is)h(only)f(one)h (lo)q(op)f(and)g(the)g(lo)q(op)150 364 y(break)o(er)g(is)i Fh(b)p Fl(.)j(T)l(o)14 b(use)h(the)g(tree)g(tra)o(v)o(ersal)f (algorithm)g(on)h(the)g(adjusted)g(p)q(edigree)h(correctly)l(,)150 421 y(one)i(m)o(ust)g(force)f(the)h(genot)o(yp)q(e)g(of)g(the)g(t)o(w)o (o)e(copies)j(of)f Fh(b)p Fl(,)g Fh(g)1230 428 y Ff(b)1264 421 y Fl(to)g(b)q(e)g(iden)o(tical.)30 b(Therefore,)150 477 y(the)15 b(lik)o(eliho)q(o)q(d)j(of)d(p)q(edigree)i Fh(P)k Fl(is)16 b(computed)g(as:)796 579 y(\006)829 586 y Ff(g)849 579 y Fh(L)p Fl(\()p Fh(P)j Fd(j)12 b Fh(g)993 586 y Ff(b)1022 579 y Fl(=)h Fh(g)r(;)8 b(\022)q Fl(\))150 682 y(Where)18 b Fh(g)h Fl(ranges)f(o)o(v)o(er)f(all)h(genot)o(yp)q(es) g(and)g Fh(L)p Fl(\()p Fh(P)24 b Fd(j)16 b Fh(g)1107 689 y Ff(b)1141 682 y Fl(=)i Fh(g)r(;)8 b(\022)q Fl(\))16 b(is)j(the)f(p)q(edigree)h(lik)o(eliho)q(o)q(d)150 738 y(when)d Fh(b)e Fl(is)i(constrained)g(to)e(ha)o(v)o(e)h(genot)o(yp)q(e) g Fh(g)r Fl(.)221 795 y(The)22 b(n)o(um)o(b)q(er)g(of)f(p)q(edigree)i (tra)o(v)o(ersals)e(required)h(to)f(compute)h(the)g(lik)o(eliho)q(o)q (d)j(is)d(the)150 851 y(n)o(um)o(b)q(er)16 b(of)g(p)q(ossible)h(genot)o (yp)q(es)f(of)f Fh(b)p Fl(.)22 b(F)l(or)15 b(this)h(reason,)f(users)h (are)g(encouraged)g(to)f(c)o(ho)q(ose)150 907 y(lo)q(op)f(break)o(ers)f (\(in)h(the)f(prepro)q(cessor)h(program)e(MAKEPED\))g(of)h(kno)o(wn)h (genot)o(yp)q(e,)f(if)h(p)q(os-)150 964 y(sible.)21 b(A)13 b(previous)g(algorithmic)h(impro)o(v)o(emen)o(t)e(in)i(F)-5 b(ASTLINK)14 b([24)o(])e(sa)o(v)o(es)g(that)g(part)g(of)h(the)150 1020 y(tra)o(v)o(ersal)i(computation)g(that)g(is)i(indep)q(enden)o(t)h (of)d(the)h(genot)o(yp)q(e)f(of)h Fh(b)p Fl(,)f(thereb)o(y)g (mitigating)150 1077 y(sligh)o(tly)g(the)f(cost)g(of)g(m)o(ultiple)i (tra)o(v)o(ersals.)i(The)c(running)i(time)e(gro)o(ws)f(exp)q(onen)o (tially)j(if)f(the)150 1133 y(p)q(edigree)j(has)f Fh(j)g(>)f Fl(1)h(lo)q(ops.)25 b(In)17 b(this)g(case,)g(the)g(user)g(m)o(ust)f (de\014ne)i(a)e(v)o(ector)g([)p Fh(b)1576 1140 y Fg(1)1595 1133 y Fh(;)8 b(:)g(:)g(:)d(;)j(b)1717 1140 y Ff(j)1734 1133 y Fl(])16 b(of)150 1190 y(lo)q(op)g(break)o(ers)f(and)h(the)g(lik) o(eliho)q(o)q(d)i(computation)e(m)o(ust)e(do)i(a)f(tra)o(v)o(ersal)g (for)g(eac)o(h)g(p)q(ossible)150 1246 y(genot)o(yp)q(e)c(com)o (bination)h(of)e([)p Fh(g)676 1253 y Ff(b)691 1258 y Fc(1)710 1246 y Fh(;)e(:)g(:)g(:)d(;)j(g)834 1253 y Ff(b)849 1258 y Fb(j)866 1246 y Fl(].)18 b(F)l(or)11 b(example,)h(if)g(there)f (are)f(3)h(lo)q(ops,)h(and)f(the)g(lo)q(op)150 1303 y(break)o(ers)18 b(ha)o(v)o(e)g(12,)h(20,)f(and)h(25,)f(p)q(ossible)i(genot)o(yp)q(es)f (resp)q(ectiv)o(ely)l(,)i(then)d(one)h(lik)o(eliho)q(o)q(d)150 1359 y(computation)c(requires)h(12)10 b Fd(\002)g Fl(20)g Fd(\002)g Fl(25)i(=)h(6000)h(p)q(edigree)j(tra)o(v)o(ersals.)221 1416 y(F)-5 b(ASTLINK)16 b(is)g(a)o(v)m(ailable)i(b)o(y)d(anon)o(ymous) g(ftp)h(to)f(softlib.cs.rice.edu)i(in)f(the)g(sub)q(direc-)150 1472 y(tory)e(pub/fastlink.)150 1615 y Fi(3)69 b(Better)22 b(Algorithms)f(for)j(Lo)r(ops)150 1717 y Fl(This)18 b(section)f (describ)q(es)i(the)e(algorithmic)h(impro)o(v)o(emen)o(ts)e(for)g(lo)q (op)q(ed)j(p)q(edigrees)f(that)e(are)150 1773 y(new)e(to)f(F)-5 b(ASTLINK)15 b(3.0P)l(.)e(The)h(impro)o(v)o(emen)o(ts)f(address)h(the)g (cases)g(of)f(lo)q(op)h(break)o(ers)g(with)150 1830 y(kno)o(wn)k(genot) o(yp)q(es)g(and)g(lo)q(op)h(break)o(ers)e(with)i(unkno)o(wn)f(genot)o (yp)q(es.)28 b(The)18 b(impro)o(v)o(emen)o(ts)150 1886 y(w)o(ork)g(w)o(ell)i(together)e(on)h(p)q(edigrees)h(with)g(lo)q(op)f (break)o(ers)g(of)f(eac)o(h)h(kind,)i(as)d(is)i(illustrated)150 1942 y(under)13 b(Results.)20 b(The)13 b(impro)o(v)o(emen)o(ts)e(for)h (the)h(unkno)o(wn)f(genot)o(yp)q(e)g(case)h(require)g(signi\014can)o(t) 150 1999 y(c)o(hanges)i(to)g(b)q(oth)g(UNKNO)o(WN)h(and)f(the)g(main)h (programs.)221 2055 y(I)f(consider)g(\014rst)g(the)g(unkno)o(wn)g (genot)o(yp)q(e)g(case.)k(Here)c(the)g(impro)o(v)o(emen)o(ts)g(within)h (UN-)150 2112 y(KNO)o(WN)f(can)h(b)q(e)g(summarized)g(as)e(follo)o(ws:) 964 2678 y(5)p eop %%Page: 6 6 6 5 bop 311 195 a Fl(F)l(or)15 b(eac)o(h)g(lo)q(cus)h Fh(L)402 252 y Fl(F)l(or)f(eac)o(h)g(v)o(ector)g Fh(V)750 259 y Ff(L)790 252 y Fl(of)g(genot)o(yp)q(es)g(assigned)h(to)f(the)g (lo)q(op)h(break)o(ers:)493 308 y(Run)g(the)g(algorithm)f(in)h(UNKNO)o (WN)g(to)e(infer)493 364 y(p)q(ossible)j(genot)o(yp)q(es)e(for)g(other) g(individuals)493 421 y(Store)g(the)g(p)q(ossible)i(genot)o(yp)q(es)e (for)g(eac)o(h)g(individual)493 477 y(indexed)i(b)o(y)e(lo)q(op-break)o (er)h(v)o(ector)493 534 y(If)g(for)e(some)h(individual)k(and)c(lo)q (cus)h(there)f(are)493 590 y(no)g(p)q(ossible)i(genot)o(yp)q(es,)584 647 y(then)f Fh(V)715 654 y Ff(L)755 647 y Fl(is)g(not)f(a)g(p)q (ossible)i(lo)q(op-break)o(er)e(v)o(ector)402 703 y(If)h(all)g(lo)q (op-break)o(er)g(v)o(ectors)e(are)h(imp)q(ossible,)493 760 y(then)h(\(and)f(only)h(then\))f(there)g(is)h(a)f(Mendelian)i (error)d(in)i(the)f(p)q(edigree.)221 941 y(Despite)e(this)g(simple)h (description,)g(the)f(implemen)o(tation)h(required)g(w)o(ell)f(o)o(v)o (er)f(1000)f(lines)150 997 y(of)k(new)h(co)q(de)g(for)f(a)h(v)m(ariet)o (y)g(of)f(reasons.)21 b(W)l(e)16 b(structured)f(the)h(co)q(de)g(so)g (one)f(is)i(able)f(to)f(turn)150 1054 y(on)e(and)g(o\013)f(the)g(lo)q (op)i(impro)o(v)o(emen)o(ts)e(for)g(easy)h(testing,)g(debugging,)h(and) f(timing.)19 b(Ho)o(w)o(ev)o(er,)150 1110 y(this)i(increased)h(the)f (co)q(de)g(size)g(substan)o(tially)l(.)38 b(I)21 b(highligh)o(t)h(some) e(of)g(the)h(other)f(di\016cult)150 1166 y(implemen)o(tation)c(issues)h (here.)221 1223 y(First,)d(the)h(list)h(of)e(p)q(ossible)j(genot)o(yp)q (es)e(for)f(eac)o(h)h(lo)q(op-break)o(er)g(v)o(ector)g(and)g(lo)q(cus)h (m)o(ust)150 1279 y(b)q(e)g(comm)o(unicated)f(to)f(the)h(main)h (program.)i(W)l(e)d(solv)o(ed)g(this)h(b)o(y)f(using)g(a)g(\014le,)g (lo)q(op\014le.dat,)150 1336 y(similar)i(in)g(spirit)g(to)e(sp)q (eed\014le.dat.)24 b(UNKNO)o(WN)16 b(writes)g(out)f(lo)q(op\014le.dat)i (and)f(the)h(main)150 1392 y(program)c(reads)i(it)g(in.)20 b(Large)15 b(amoun)o(ts)e(of)i(co)q(de)g(w)o(ere)f(written)h(to)f(giv)o (e)g(the)h(data)f(a)g(reason-)150 1449 y(able)g(format)e(that)h(migh)o (t)g(b)q(e)h(comprehensible)h(to)e(the)g(debugging)i(h)o(uman)e(ey)o(e) g(as)g(w)o(ell)i(as)e(to)150 1505 y(to)i(the)h(computer.)21 b(Details)c(of)e(the)h(lo)q(op\014le.dat)h(format)d(are)h(giv)o(en)i (in)f(README.lo)q(op\014le,)150 1562 y(whic)o(h)g(will)h(b)q(e)f (distributed)g(with)g(F)-5 b(ASTLINK)16 b(3.0P)l(.)221 1618 y(Second,)h(the)g(problem)g(of)f(enco)q(ding)i(and)f(deco)q(ding)h (genot)o(yp)q(es)e(required)i(a)e(surprising)150 1675 y(amoun)o(t)f(of)g(co)q(de.)23 b(The)16 b(problem)g(arises)g(due)h(to)e (implemen)o(tation)i(c)o(hoices)g(made)f(long)g(ago)150 1731 y(in)k(LINKA)o(GE)f(that)f(w)o(e)h(found)g(to)q(o)f(en)o(trenc)o (hed)h(to)g(c)o(hange.)30 b(Consider)20 b(a)e(3-lo)q(cus)i(phase)150 1787 y(kno)o(wn)15 b(join)o(t)g(genot)o(yp)q(e:)902 1900 y Fh(A)936 1907 y Fg(1)969 1900 y Fd(j)d Fh(A)1028 1907 y Fg(2)902 1984 y Fh(B)936 1991 y Fg(1)969 1984 y Fd(j)g Fh(B)1028 1991 y Fg(2)904 2067 y Fh(C)937 2074 y Fg(1)969 2067 y Fd(j)g Fh(C)1027 2074 y Fg(2)150 2151 y Fl(UNKNO)o(WN)21 b(w)o(orks)f(one)i(lo)q(cus)g(at)e(a)h(time,)h(so)f(its)g(co)q(de)h (con)o(v)o(erts)e(the)h(pairs)g(\()p Fh(A)1676 2158 y Fg(1)1696 2151 y Fh(;)8 b(A)1751 2158 y Fg(2)1770 2151 y Fl(\),)150 2207 y(\()p Fh(B)202 2214 y Fg(2)222 2207 y Fh(;)g(B)277 2214 y Fg(2)296 2207 y Fl(\),)17 b(and)h(\()p Fh(C)486 2214 y Fg(1)505 2207 y Fh(;)8 b(C)559 2214 y Fg(2)577 2207 y Fl(\))17 b(in)o(to)g(single)i(lo)q(cus)f(genot)o(yp)q (es.)26 b(The)17 b(main)h(programs)e(do)h(all)i(lo)q(ci)150 2264 y(at)c(once,)h(so)g(they)f(\014rst)h(translate)f(the)h(columns)h (\()p Fh(A)1076 2271 y Fg(1)1095 2264 y Fh(;)8 b(B)1150 2271 y Fg(1)1170 2264 y Fh(;)g(C)1224 2271 y Fg(1)1242 2264 y Fl(\))16 b(and)g(\()p Fh(A)1417 2271 y Fg(2)1436 2264 y Fh(;)8 b(B)1491 2271 y Fg(2)1510 2264 y Fh(;)g(C)1564 2271 y Fg(2)1583 2264 y Fl(\))15 b(in)o(to)h(join)o(t)150 2320 y(haplot)o(yp)q(es,)i Fh(H)432 2327 y Fg(1)469 2320 y Fl(and)f Fh(H)597 2327 y Fg(2)634 2320 y Fl(and)h(then)f(translate)g (that)g(pair)g(in)o(to)h(a)f(join)o(t)g(genot)o(yp)q(e.)26 b(In)18 b(the)150 2377 y(main)23 b(program)e(a)h(lo)q(op-break)o(er)h (v)o(ector)e(is)i(presen)o(ted)g(as)f(a)f(v)o(ector)h(of)g(join)o(t)g (genot)o(yp)q(es)150 2433 y(enco)q(ded)d(as)f(haplot)o(yp)q(e)h(pairs.) 29 b(T)l(o)17 b(lo)q(ok)i(up)f(the)g(lo)q(op-break)o(er)h(v)o(ector)e (one)h(m)o(ust)g(deco)q(de)150 2489 y(the)f(haplot)o(yp)q(e)g(pairs)g (in)o(to)g(single-lo)q(cus)i(alleles)g(and)e(then)g(re-enco)q(de)h (them)f(in)o(to)f(a)h(v)o(ector)150 2546 y(of)e(single)h(lo)q(cus)g (genot)o(yp)q(es.)964 2678 y(6)p eop %%Page: 7 7 7 6 bop 221 195 a Fl(Third,)16 b(w)o(e)f(are)h(storing)f(the)h(p)q (ossible)i(genot)o(yp)q(es)d(for)h(eac)o(h)f(individual)k(and)d(eac)o (h)g(lo)q(op-)150 252 y(break)o(er)j(v)o(ector.)33 b(Because,)21 b(UNKNO)o(WN)f(w)o(orks)f(one)h(lo)q(cus)h(at)e(a)g(time)h(this)g (amoun)o(t)f(of)150 308 y(information)g(is)g(not)g(to)q(o)f(large.)30 b(The)19 b(information)g(for)g(one)f(lo)q(cus)i(is)f(written)g(out)g(b) q(efore)150 364 y(the)i(next)g(lo)q(cus)i(is)e(started.)37 b(Ho)o(w)o(ev)o(er,)22 b(the)f(n)o(um)o(b)q(er)g(of)g(lo)q(op-break)o (er)h(v)o(ectors)e(can)h(get)150 421 y(arbitrarily)14 b(large)f(as)f(the)h(n)o(um)o(b)q(er)h(of)e(lo)q(ops)i(gro)o(ws,)d (straining)j(space)f(usage.)19 b(Therefore,)13 b(the)150 477 y(user)g(can)f(limit)i(ho)o(w)e(man)o(y)g(lo)q(op-break)o(er)h(v)o (ectors)f(are)g(considered,)j(whic)o(h)e(implicitly)j(limits)150 534 y(ho)o(w)h(man)o(y)g(lo)q(ops)i(are)e(considered.)29 b(Substan)o(tial)18 b(co)q(de)h(is)f(required)h(to)e(safely)h (distinguish)150 590 y(those)i(additional)j(lo)q(ops)e(that)f(are)g (not)g(considered)i(when)g(the)e(n)o(um)o(b)q(er)h(of)g(lo)q(op-break)o (er)150 647 y(v)o(ectors)14 b(gets)h(to)q(o)g(large.)221 703 y(My)10 b(impro)o(v)o(emen)o(t)g(for)f(the)i(case)f(of)g(lo)q(op)h (break)o(ers)f(of)g(kno)o(wn)g(genot)o(yp)q(e)h(corrects)f(a)g(small,) 150 760 y(but)15 b(serious)g(algorithmic)h(ine\016ciency)h(in)f(the)f (LINKA)o(GE)g(implemen)o(tation.)21 b(T)l(o)15 b(illustrate)150 816 y(the)d(ine\016ciency)l(,)j(supp)q(ose)e(that)f(there)g(are)g(3)f (lo)q(op)i(break)o(ers)f(and)g(50)g(join)o(t)g(genot)o(yp)q(es.)18 b(Then)150 873 y(the)12 b(routine)h Fa(likelihood)e Fl(used)i(to)f (iterate)g(o)o(v)o(er)g(all)h(50)5 b Fd(\002)g Fl(50)g Fd(\002)g Fl(50)10 b(=)j(125)p Fh(;)8 b Fl(000)i(v)o(ectors)i(in)h(the) 150 929 y(order)j([1)p Fh(;)8 b Fl(1)p Fh(;)g Fl(1])g Fh(:)f(:)g(:)t Fl([50)p Fh(;)h Fl(1)p Fh(;)g Fl(1])13 b Fh(:)8 b(:)g(:)e Fl([1)p Fh(;)i Fl(2)p Fh(;)g Fl(1])f Fh(:)g(:)g(:)e Fl([50)p Fh(;)j Fl(50)p Fh(;)g Fl(1)o(])p Fh(;)13 b Fl([1)p Fh(;)8 b Fl(1)p Fh(;)g Fl(2])p Fh(;)f(:)g(:)g(:)e Fl([50)p Fh(;)j Fl(50)p Fh(;)f Fl(2])p Fh(:)13 b Fl(The)j(old)h(co)q (de)150 985 y(did)h(a)f(p)q(edigree)i(tra)o(v)o(ersal)e(only)g(for)g (those)g(v)o(ectors)g(that)g(are)g(consisten)o(t)g(with)h(the)f(kno)o (wn)150 1042 y(genot)o(yp)q(es.)31 b(Ho)o(w)o(ev)o(er,)19 b(it)g(did)h(a)f(separate)g(c)o(hec)o(k)g(for)f(eac)o(h)h(v)o(ector)g ([)p Fh(i;)8 b(j;)g(k)q Fl(])16 b(to)i(see)i(if)f(it)g(is)150 1098 y(p)q(ossible.)24 b(This)17 b(is)f(ine\016cien)o(t)i(b)q(ecause)f (if)f Fh(k)h Fl(is)g(not)f(a)f(p)q(ossible)j(genot)o(yp)q(e)e(for)g (the)g(3rd)f(lo)q(op)150 1155 y(break)o(er,)d(all)h(2500)e(v)o(ectors)g (that)g(end)i(in)g Fh(k)g Fl(can)f(b)q(e)g(ruled)h(out)f(at)f(once,)i (rather)e(than)h(c)o(hec)o(king)150 1211 y(eac)o(h)j(v)o(ector)g (separately)l(.)221 1268 y(In)e(the)f(case)h(where)g(the)f(lo)q(op)h (break)o(ers)g(ha)o(v)o(e)f(kno)o(wn)g(genot)o(yp)q(es)g(ev)o(en)h(at)f (a)h(single)g(lo)q(cus,)150 1324 y(most)g(of)g(the)h(genot)o(yp)q(e)f (v)o(ectors)g(are)h(ruled)g(out.)19 b(Run-time)d(pro\014ling)e(of)g (the)f(MD1)g(example)150 1381 y(\(describ)q(ed)j(in)f(Results\))g(sho)o (w)o(ed)f(that)f(more)h(than)g(95\045)g(of)g(the)g(time)h(w)o(as)e(sp)q (en)o(t)i(ruling)g(out)150 1437 y(imp)q(ossible)20 b(lo)q(op-break)o (er)f(v)o(ectors.)28 b(Ruling)20 b(out)e(a)g(lo)q(op-break)o(er)h(v)o (ector)e(can)i(b)q(e)g(done)f(in)150 1494 y(under)d(a)f(millisecond)j (with)e(just)e(a)h(few)g(lines)i(of)e(co)q(de.)20 b(Ho)o(w)o(ev)o(er,) 13 b(when)i(there)f(are)g(m)o(ultiple)150 1550 y(lo)q(ops,)23 b(the)f(n)o(um)o(b)q(er)f(of)g(v)o(ectors)g(b)q(eing)i(considered)g(w)o (as)d(gro)o(wing)h(exp)q(onen)o(tially)j(in)e(the)150 1606 y(n)o(um)o(b)q(er)16 b(of)e(lo)q(ops.)221 1663 y(T)l(o)i(\014x)i (this)f(problem,)h(the)g(new)f(co)q(de)h(precomputes)f(a)g(list)h(of)f (p)q(ossible)i(genot)o(yp)q(es)e(for)150 1719 y(eac)o(h)12 b(lo)q(op)h(break)o(er.)18 b(Then)13 b(it)f(iterates)g(o)o(v)o(er)f(v)o (ectors)g(comp)q(osed)h(only)h(of)e(p)q(ossible)j(genot)o(yp)q(es)150 1776 y(for)i(eac)o(h)h(lo)q(op)h(break)o(er.)25 b(This)18 b(is)f(a)g(pro)q(duct)g(that)g(is)g(still)i(exp)q(onen)o(tial)f(in)g (the)f(n)o(um)o(b)q(er)g(of)150 1832 y(lo)q(ops,)12 b(but)e(the)h (terms)f(in)h(the)f(pro)q(duct)h(are)f(m)o(uc)o(h)h(smaller.)19 b(Sp)q(eci\014cally)13 b(if)e(the)g(genot)o(yp)q(e)f(of)g(a)150 1889 y(lo)q(op)h(break)o(er)f(is)h(kno)o(wn,)g(it)f(no)o(w)g(con)o (tributes)h(2)981 1872 y Ff(h)p Fo(\000)p Fg(1)1058 1889 y Fl(where)g Fh(h)f Fl(is)h(the)g(n)o(um)o(b)q(er)f(of)g(heterozygous) 150 1945 y(lo)q(ci,)16 b(rather)d(than)i(the)f(n)o(um)o(b)q(er)h(of)f (genot)o(yp)q(es.)19 b(In)c(the)g(example)g(run)g(done)f(with)h(MD1)f (this)150 2002 y(w)o(ould)f(replace)h(the)g(term)e(171)g(\(n)o(um)o(b)q (er)h(of)g(genot)o(yp)q(es\))g(with)g(a)g(term)f(of)h(at)f(most)h(2)f (for)h(eac)o(h)150 2058 y(lo)q(op)g(break)o(er)f(with)h(kno)o(wn)f (genot)o(yp)q(e.)19 b(In)13 b(that)e(case)i(3)f(of)g(the)g(4)g(lo)q(op) h(break)o(ers)f(ha)o(v)o(e)g(kno)o(wn)150 2115 y(genot)o(yp)q(e.)150 2258 y Fi(4)69 b(Amalgamating)22 b(Un)n(used)h(Allele)o(s)150 2359 y Fl(Allele)17 b(amalgamation)e(is)g(a)g(tec)o(hnique)h(that)f (reduces)g(the)h(n)o(um)o(b)q(er)f(of)g(p)q(ossible)h(haplot)o(yp)q(es) 150 2416 y(for)f(eac)o(h)h(individual)j(in)e(a)e(p)q(edigree.)23 b(Since)18 b(the)d(running)i(time)g(and)e(space)i(used)f(in)h(LINK-)150 2472 y(A)o(GE)11 b(and)g(F)-5 b(ASTLINK)12 b(gro)o(w)e(roughly)h(as)g (the)g(fourth)g(p)q(o)o(w)o(er)g(of)f(the)i(n)o(um)o(b)q(er)f(of)g (haplot)o(yp)q(es,)150 2529 y(reducing)j(the)f(n)o(um)o(b)q(er)g(of)g (alleles)i(at)d(an)o(y)g(lo)q(cus)i(is)g(useful.)20 b(Allele)15 b(amalgamation)d(is)i(feasible)964 2678 y(7)p eop %%Page: 8 8 8 7 bop 150 195 a Fl(when)19 b(there)g(are)f Fh(k)i Fl(p)q(ossible)h (alleles)f(at)e(a)h(lo)q(cus,)h(but)f(only)g Fh(j)i(<)e(k)13 b Fd(\000)g Fl(1)19 b(alleles)h(app)q(ear)f(in)150 252 y(kno)o(wn)13 b(genot)o(yp)q(es)h(of)f(individuals)j(in)f(the)e(p)q (edigree.)21 b(When)14 b(this)g(o)q(ccurs,)g(the)f Fh(k)8 b Fd(\000)f Fh(j)16 b Fl(un)o(used)150 308 y(alleles)h(can)f(b)q(e)g (com)o(bined)g(in)o(to)g(one)f(allele,)i(whic)o(h)g(I)e(call)i(the)e Fe(c)n(atch)i(al)r(lele)p Fl(.)j(The)15 b(frequency)150 364 y(of)i(the)g(catc)o(h)g(allele)i(is)f(sp)q(eci\014ed)h(as)e(the)g (sum)g(of)g(the)g(frequencies)i(of)e(the)g(original)h(un)o(used)150 421 y(alleles.)24 b(F)l(or)15 b(example,)i(supp)q(ose)f(w)o(e)g(sp)q (ecify)h(5)f(alleles,)h(with)g(frequencies:)22 b(0.4,)15 b(0.25,)g(0.15,)150 477 y(0.12,)f(0.08.)k(If)d(only)h(the)f(\014rst)g (3)g(alleles)i(are)e(used,)g(then)g(the)g(last)g(t)o(w)o(o)f(are)h(com) o(bined)h(in)o(to)f(a)150 534 y(catc)o(h)g(allele)i(of)e(frequency)h(0) p Fh(:)p Fl(2)c(=)h(0)p Fh(:)p Fl(12)8 b(+)j(0)p Fh(:)p Fl(08.)221 590 y(Allele)21 b(amalgamation)d(w)o(as)f(already)i (implemen)o(ted)i(in)e(MENDEL)g([12)o(],)g(but)f(w)o(as)g(not)150 647 y(do)q(cumen)o(ted,)d(except)f(in)h(a)e(tin)o(y)i(description)g(of) f(the)g(parameter)f(where)h(one)g(can)g(turn)g(it)g(on)150 703 y(or)j(o\013)g([5)o(].)27 b(Allele)21 b(amalgamation)16 b(is)j(particularly)g(helpful)g(for)f(p)q(edigrees)h(with)f(unkno)o(wn) 150 760 y(genot)o(yp)q(es)12 b(b)q(ecause)i(it)f(reduces)g (signi\014can)o(tly)h(the)f(n)o(um)o(b)q(er)g(of)f(p)q(ossible)j(genot) o(yp)q(es)d(that)g(the)150 816 y(un)o(t)o(yp)q(ed)k(individuals)i(can)d (ha)o(v)o(e.)20 b(I)15 b(men)o(tion)h(allele)h(amalgamation)e(here)g (for)g(3)g(reasons:)206 922 y(1.)22 b(T)l(o)d(bring)h(the)g(metho)q(d)f (to)g(the)h(atten)o(tion)f(of)g(more)g(link)m(age)i(analysts)f(and)f (explain)264 979 y(some)c(subtle)h(implemen)o(tation)g(issues.)206 1073 y(2.)22 b(T)l(o)c(do)q(cumen)o(t)h(that)f(amalgamation)f(is)i(no)o (w)f(implemen)o(ted)j(in)e(F)-5 b(ASTLINK,)19 b(whic)o(h)264 1129 y(will)d(help)h(man)o(y)e(users.)206 1223 y(3.)22 b(T)l(o)g(mak)o(e)g(the)g(assessmen)o(t)g(of)g(the)g(sp)q(eedups)i(pro) o(vided)f(b)o(y)f(the)h(lo)q(op)q(ed)g(p)q(edigree)264 1279 y(impro)o(v)o(emen)o(ts)14 b(more)h(fair.)221 1386 y(Allele)24 b(amalgamation)d(is)i(relativ)o(ely)g(straigh)o(tforw)o (ard)d(to)h(do,)i(b)o(y)f(hand)h(editing)g(the)150 1442 y(input)16 b(\014les,)g(if)f(there)g(is)h(only)f(one)g(p)q(edigree.)21 b(The)16 b(need)f(for)g(automation)f(arises)h(when)h(data)150 1499 y(sets)e(ha)o(v)o(e)f(m)o(ultiple)j(p)q(edigrees.)k(Then)15 b(what)e(t)o(ypically)i(happ)q(ens)g(is)f(that)g(among)f(the)h(en)o (tire)150 1555 y(data)k(set)g(all)h Fh(k)g Fl(alleles)h(o)q(ccur,)f (but)g(within)g(eac)o(h)g(sp)q(eci\014c)h(p)q(edigree)g(some)e(alleles) i(ma)o(y)d(b)q(e)150 1611 y(un)o(used.)i(Since)13 b(the)e(lik)o(eliho)q (o)q(d)i(is)f(computed)f(one)g(p)q(edigree)h(at)e(a)h(time,)h(it)f(is)g (highly)h(desirable)150 1668 y(to)18 b(use)g(the)h(minim)o(um)g(n)o(um) o(b)q(er)g(of)f(required)h(alleles)h(and)f(haplot)o(yp)q(es)g(for)e (eac)o(h)i(p)q(edigree.)150 1724 y(The)f(lik)o(eliho)q(o)q(d)i(ev)m (aluation)e(routines)g(in)g(LINKA)o(GE)g(and)g(F)-5 b(ASTLINK)18 b(assume)f(that)g(the)150 1781 y(alleles)i(are)f(n)o(um)o(b)q(ered)g (consecutiv)o(ely)h(starting)e(at)g(1)g(for)g(easy)g(table)h(lo)q (okups.)28 b(Therefore)150 1837 y(implemen)o(ting)16 b(allele)g(amalgamation)d(requires)i(ren)o(um)o(b)q(ering)g(the)f (alleles)i(that)d(are)h(presen)o(t)150 1894 y(starting)h(at)f(1.)221 1950 y(I)i(added)h(some)f(routines)h(that)e(are)h(used)h(b)q(efore)f (an)o(y)g(lik)o(eliho)q(o)q(d)j(ev)m(aluations)f(are)e(done)150 2007 y(to)f(assess)h(the)g(prosp)q(ects)g(for)g(allele)i(amalgamation.) j(These)c(routines)f(determine)h(for)f(eac)o(h)150 2063 y([p)q(edigree,)d(lo)q(cus])e(pair)h(whic)o(h)f(alleles)i(are)e(presen) o(t)g(and)g(compute)g(the)g(mapping)h(b)q(et)o(w)o(een)f(old)150 2120 y(allele)17 b(n)o(um)o(b)q(ers)e(and)g(frequencies)h(and)g(new)f (allele)h(n)o(um)o(b)q(ers)g(and)f(frequencies.)21 b(The)15 b(alleles)150 2176 y(asso)q(ciated)g(with)g(eac)o(h)g(individual)j(can) c(b)q(e)i(ren)o(um)o(b)q(ered)f(just)g(once)g(b)q(efore)g(an)o(y)f(lik) o(eliho)q(o)q(ds)150 2232 y(are)d(ev)m(aluated)h(b)q(ecause)g(eac)o(h)f (individual)k(app)q(ears)c(in)h(only)f(one)h(p)q(edigree.)20 b(Ho)o(w)o(ev)o(er,)10 b(the)h(ta-)150 2289 y(bles)j(that)f(store)f (the)h(corresp)q(ondences)i(b)q(et)o(w)o(een)e(allele)i(n)o(um)o(b)q (ers)f(and)f(haplot)o(yp)q(e)h(n)o(um)o(b)q(ers,)150 2345 y(and)21 b(b)q(et)o(w)o(een)f(haplot)o(yp)q(e)h(n)o(um)o(b)q(ers)g (and)f(genot)o(yp)q(e)h(n)o(um)o(b)q(ers,)g(ma)o(y)f(need)h(to)f(b)q(e) h(recom-)150 2402 y(puted)16 b(b)q(et)o(w)o(een)f(eac)o(h)g(lik)o (eliho)q(o)q(d)j(ev)m(aluation)f(of)d(di\013eren)o(t)i(p)q(edigrees.)21 b(The)15 b(tables)h(need)g(to)150 2458 y(get)h(recomputed)h(if)g(and)f (only)h(the)f(n)o(um)o(b)q(er)h(of)f(alleles)i(presen)o(t)f(at)e(an)o (y)h(lo)q(cus)i(c)o(hanges,)e(so)150 2515 y(the)c(new)h(co)q(de)f (predetermines)i(b)q(et)o(w)o(een)e(whic)o(h)h(pairs)g(of)f(consecutiv) o(e)h(p)q(edigrees)g(the)g(tables)964 2678 y(8)p eop %%Page: 9 9 9 8 bop 150 195 a Fl(sta)o(y)15 b(the)h(same)g(and)g(b)q(et)o(w)o(een)h (whic)o(h)g(pairs)f(the)g(tables)h(m)o(ust)e(b)q(e)i(recomputed.)23 b(The)16 b(p)q(edi-)150 252 y(grees)c(con)o(tin)o(ue)h(to)f(b)q(e)h (analyzed)g(in)g(the)g(same)f(order)g(they)g(are)g(input,)i(to)e (simplify)i(ac)o(hieving)150 308 y(output)h(compatibilit)o(y)i(with)e (LINKA)o(GE.)221 364 y(A)h(further)h(substan)o(tial)g(complication)h (is)f(that)f(the)h(allele)i(amalgamation)d(m)o(ust)g(b)q(e)h(in-)150 421 y(tegrated)e(with)h(the)f(lo)q(op)i(impro)o(v)o(emen)o(ts.)j(I)c (found)g(that)f(the)h(implemen)o(tation)h(of)e(the)g(lo)q(op)150 477 y(impro)o(v)o(emen)o(ts)c(w)o(as)g(greatly)g(simpli\014ed)j(if)e(I) g(required)g(the)g(allele)h(n)o(um)o(b)q(ers)f(in)g(lo)q(op\014le.dat)h (to)150 534 y(b)q(e)h(the)f(p)q(ost-amalgamation)g(allele)i(n)o(um)o(b) q(ers)f(b)q(ecause)g(this)g(mak)o(es)e(it)i(unnecessary)g(to)e(ha)o(v)o (e)150 590 y(extra)17 b(genot)o(yp)q(e)g(to)g(haplot)o(yp)q(e)h(to)f (allele)i(con)o(v)o(ersion)f(routines.)27 b(As)18 b(a)f(consequence,)i (UN-)150 647 y(KNO)o(WN)11 b(uses)g(almost)f(the)h(same)f(allele)j (amalgamation)d(routines)h(as)f(the)h(main)g(F)-5 b(ASTLINK)150 703 y(programs.)31 b(Doing)19 b(allele)j(amalgamation)c(in)i(UNKNO)o (WN)g(has)f(the)h(further)f(b)q(ene\014ts)h(of)150 760 y(sp)q(eeding)15 b(it)f(up)g(and)f(reducing)i(the)e(size)i(of)e(lo)q (op\014le.dat.)20 b(A)13 b(sp)q(ecial)j(constan)o(t)c(is)i(prep)q (ended)150 816 y(to)i(sp)q(eed\014le.dat)i(sp)q(ecifying)h(whether)e (allele)i(amalgamation)d(is)h(\\on")f(or)g(\\o\013)t(",)f(to)h(ensure) 150 873 y(that)i(the)g(main)h(program)e(will)j(pro)q(ceed)g(if)e(and)h (only)g(if)g(it)f(is)h(in)g(the)g(same)f(mo)q(de)h(as)f(UN-)150 929 y(KNO)o(WN.)150 1070 y Fi(5)69 b(Metho)r(ds)150 1172 y Fl(I)17 b(compared)f(F)-5 b(ASTLINK)18 b(v)o(ersion)e(2.3P)g(to)g(F) -5 b(ASTLINK)17 b(3.0P)e(on)i(some)f(data)g(sets)g(where)150 1228 y(the)k(c)o(hanges)f(are)g(lik)o(ely)j(to)c(mak)o(e)h(the)h(new)o (er)g(v)o(ersion)f(run)h(faster.)32 b(V)l(ersion)20 b(2.3P)f(is)h(the) 150 1284 y(most)13 b(recen)o(t)h(release)h(of)f(F)-5 b(ASTLINK)15 b(from)e(August)h(1995.)k(The)c(timing)h(exp)q(erimen)o (ts)g(w)o(ere)150 1341 y(run)k(on)f(a)g(ligh)o(tly)h(loaded)g(Sun)g(SP) l(AR)o(CStation)g(5)f(computer)g(with)h(64)f(Mb)o(ytes)f(of)h(RAM.)150 1397 y(This)c(mac)o(hine)g(runs)g(the)g(op)q(erating)f(system)h(SunOS,) g(v)o(ersion)g(5.4,)e(whic)o(h)j(is)f(also)f(kno)o(wn)g(as)150 1454 y(Solaris,)f(v)o(ersion)g(2.4,)e(and)i(is)g(an)f(implemen)o (tation)h(of)f(UNIX.)h(T)l(o)f(compile)h(all)h(v)o(ersions)e(of)g(the) 150 1510 y(programs)h(w)o(e)h(used)h(the)f Fa(gcc)g Fl(compiler,)i(v)o (ersion)f(2.7.0)d(using)j(the)g Fa(-O)f Fl(\015ag)g(for)f (optimization.)150 1567 y(The)18 b(times)h(rep)q(orted)f(in)h(the)f (next)g(section)h(are)f(the)g(sum)g(of)g(the)g(user)h(and)f(system)g (times)150 1623 y(giv)o(en)e(b)o(y)f(the)g Fa(time)g Fl(command.)150 1764 y Fi(6)69 b(Results)150 1866 y Fl(I)17 b(presen)o(t)f(timing)i(for)e(F)-5 b(ASTLINK)17 b(3.0P)f(with)h(sev)o (eral)f(input)i(data)e(sets.)23 b(T)l(o)17 b(k)o(eep)g(things)150 1922 y(simple)i(and)f(relev)m(an)o(t)g(to)f(most)f(users,)i(I)g(sho)o (w)f(user)h(+)f(system)g(time)h(when)g(running)h(on)e(1)150 1979 y(pro)q(cessor.)24 b(The)16 b(times)h(w)o(ould)g(b)q(e)g(m)o(uc)o (h)g(smaller)g(if)g(the)f(runs)h(had)g(b)q(een)g(done)g(in)g(parallel) 150 2035 y(on)d(m)o(ultiple)i(pro)q(cessors,)e(whic)o(h)h(has)f(b)q (een)h(feasible)h(b)q(eginning)g(with)f(F)-5 b(ASTLINK,)15 b(v)o(ersion)150 2092 y(2.3P)f(The)i(timings)f(come)h(from)e(the)h (follo)o(wing)h(data)f(sets.)218 2182 y Fd(\017)23 b Fl(RP01:)18 b(data)11 b(on)h(a)f(large)h(family)l(,)h(UCLA-RP01,)f (with)h(autosomal)e(dominan)o(t)h(retinitis)264 2238 y(pigmen)o(tosa)f(\(RP1\))h(from)f(the)h(lab)q(oratory)g(of)g(Dr.)f (Stephen)i(P)l(.)f(Daiger)g(at)f(the)h(Univ)o(er-)264 2295 y(sit)o(y)j(of)h(T)l(exas)g(Health)g(Science)i(Cen)o(ter)d(at)h (Houston.)21 b(This)c(family)f(has)g(2)g(lo)q(ops.)22 b(As)264 2351 y(sho)o(wn)16 b(in)h([3)o(],)f(this)g(p)q(edigree)i(had)e (to)g(b)q(e)h(split)g(in)o(to)f(3)g(pieces)i(b)q(ecause)f(computation) 264 2408 y(on)c(the)h(whole)g(family)g(together)f(w)o(as)g(prohibitiv)o (ely)j(long.)j(Here)14 b(I)g(lea)o(v)o(e)g(the)f(lo)q(ops)h(in.)218 2497 y Fd(\017)23 b Fl(BAD1:)f(data)17 b(on)f(a)h(p)q(ortion)g(of)f (the)h(Old)h(Order)g(Amish)f(p)q(edigree)i(110)d(\(OO)o(A)h(110\),)264 2554 y(with)10 b(bip)q(olar)i(a\013ectiv)o(e)e(disorder)h(\(BAD\))f (from)f(the)i(lab)q(oratory)f(of)f(Drs.)h(Da)o(vid)g(R.)h(Co)o(x)964 2678 y(9)p eop %%Page: 10 10 10 9 bop 264 195 a Fl(and)17 b(Ric)o(hard)i(M.)e(My)o(ers)g(at)g(the)g (Univ)o(ersit)o(y)i(of)e(California)h(at)f(San)h(F)l(rancisco)g([16)o (].)264 252 y(This)d(p)q(edigree)i(has)e(1)g(lo)q(op.)20 b(The)c(assumed)f(mo)q(de)h(of)e(inheritance)j(is)f(dominan)o(t.)218 345 y Fd(\017)23 b Fl(BAD2:)c(Data)13 b(from)h(c)o(hromosome)f(18)h(on) g(22)g(p)q(edigrees)i(with)f(with)f(bip)q(olar)i(a\013ectiv)o(e)264 401 y(disorder)g(\(BAD\),)g(supplied)i(b)o(y)f(Dr.)22 b(Lynn)17 b(Goldin)h([2)o(].)23 b(One)17 b(large)f(p)q(edigree)i(in)f (the)264 458 y(set)d(has)g(a)f(lo)q(op.)21 b(The)14 b(data)f(set)h(has) g(t)o(w)o(o)f(di\013eren)o(t)i(disease)g(mo)q(dels,)f(and)h(I)f(happ)q (ened)264 514 y(to)g(use)i(the)f(one)g(that)g(w)o(as)f(dominan)o(t.)218 608 y Fd(\017)23 b Fl(CLP:)11 b(Data)f(on)i(12)e(families)j(with)f (autosomal)f(dominan)o(t)g(nonsyndromic)i(cleft)f(lip)h(and)264 664 y(palate)f(\(CLP\))g(from)g(the)h(lab)q(oratory)e(of)h(Dr.)g (Jacqueline)j(T.)d(Hec)o(h)o(t)g(at)g(the)g(Univ)o(ersit)o(y)264 721 y(of)i(T)l(exas)h(Health)h(Science)h(Cen)o(ter)e(at)g(Houston)f ([10].)218 814 y Fd(\017)23 b Fl(MD1:)32 b(Data)20 b(on)i(one)g (Brazilian)h(family)g(with)f(one)g(form)f(of)g(autosomal)g(recessiv)o (e)264 870 y(m)o(uscular)e(dystroph)o(y)g(from)f(Dr.)31 b(Jacques)20 b(Bec)o(kmann)f([19)o(].)31 b(This)20 b(p)q(edigree)g(has) f(4)264 927 y(lo)q(ops.)218 1020 y Fd(\017)k Fl(MD2:)17 b(Data)9 b(on)i(one)h(T)l(unisian)g(family)g(with)g(a)e(di\013eren)o(t) i(form)e(of)h(autosomal)f(recessiv)o(e)264 1077 y(m)o(uscular)20 b(dystroph)o(y)f(from)g(Dr.)34 b(Marcy)19 b(Sp)q(eer)i([1)o(].)34 b(This)20 b(p)q(edigree)i(has)d(6)h(lo)q(ops,)264 1133 y(but)g(Dr.)g(Sp)q(eer)i(rep)q(orts)e(that)g(the)h(link)m(age)h (analysis)f(computations)g(w)o(ere)f(deemed)264 1190 y(infeasible)d(with)f(all)g(6)f(lo)q(ops,)g(so)g(only)h(3)e(w)o(ere)h (left)h(in)g(originally)l(.)218 1283 y Fd(\017)23 b Fl(ALZ:)15 b(Data)g(on)g(an)h(Amish)h(family)f(with)g(Alzheimer's)h(disease)g (from)e(Drs.)g(Margaret)264 1339 y(P)o(ericak-V)l(ance,)i(Jonathan)g (Haines,)h(and)f(Marcy)f(Sp)q(eer)i([20)o(].)24 b(This)17 b(p)q(edigree)i(has)d(4)264 1396 y(lo)q(ops.)k(The)15 b(assumed)h(mo)q(de)f(of)g(inheritance)i(is)f(dominan)o(t.)218 1489 y Fd(\017)23 b Fl(WS:)17 b(Data)g(on)h(an)g(Italian)h(family)f (with)h(W)l(erner)f(syndrome)g(from)f(Dr.)g(Ellen)j(Wijs-)264 1546 y(man)10 b([17,)g(26].)18 b(This)11 b(p)q(edigree)i(has)e(3)f(lo)q (ops.)19 b(The)11 b(data)g(set)g(is)g(particularly)h(in)o(teresting)264 1602 y(for)f(metho)q(dological)j(studies)f(b)q(ecause)g(it)f(includes)j (descriptions)e(for)f(t)o(w)o(o)f(mark)o(er)g(lo)q(ci,)264 1659 y(but)k(no)h(mark)o(er)e(genot)o(yp)q(es)i(are)f(a)o(v)m(ailable,) h(only)g(a\013ection)g(status)e(is)i(a)o(v)m(ailable.)23 b(The)264 1715 y(lo)q(op)d(impro)o(v)o(emen)o(ts)g(help)h(here)f(b)q (ecause)h(b)o(y)f(c)o(ho)q(osing)g(genot)o(yp)q(es)g(for)f(the)h(3)f (lo)q(op)264 1771 y(break)o(ers,)13 b(one)h(can)h(infer)g(genot)o(yp)q (es)f(for)f(others.)19 b(The)14 b(mo)q(de)h(of)e(inheritance)j(is)f (dom-)264 1828 y(inan)o(t.)221 1933 y(More)e(detailed)j(descriptions)g (of)e(the)g(data)g(sets)g(can)h(generally)g(b)q(e)g(found)g(in)g(the)g (pap)q(ers)150 1989 y(cited)22 b(for)e(eac)o(h)i(one.)37 b(All)23 b(the)e(runs,)h(except)g(for)e(BAD2,)i(w)o(ere)f(done)g(with)h (ILINK;)g(the)150 2045 y(BAD2)13 b(runs)h(w)o(ere)f(done)g(with)h (MLINK)g(to)f(ensure)h(that)e(eac)o(h)i(run)f(w)o(ould)h(include)i(the) d(same)150 2102 y(n)o(um)o(b)q(er)g(of)f(lik)o(eliho)q(o)q(d)k(ev)m (aluations)e(for)e(all)h(runs.)20 b(The)12 b(c)o(hoice)i(of)e(allele)j (pro)q(duct)e(represen)o(ts)150 2158 y(either)g(all)h(the)e(mark)o(ers) g(that)g(are)g(a)o(v)m(ailable)i(or)e(a)g(run)h(of)f(mo)q(dest)g(size)i (for)e(F)-5 b(ASTLINK)13 b(2.3P)l(.)150 2215 y(Sev)o(eral)f(of)g(the)g (data)f(sets)g(used)i(reduced)g(p)q(enetrance)f(and)g(m)o(ultiple)i (liabilit)o(y)g(classes)f(for)e(the)150 2271 y(disease)18 b(lo)q(cus;)h(the)f(data)e(sets)h(BAD1)g(and)h(BAD2)f(also)g(assumed)h (a)f(non-zero)g(pheno)q(cop)o(y)150 2328 y(rate.)221 2384 y(T)l(able)k(1)f(sho)o(ws)g(sample)g(sp)q(eedups)i(that)e(users)g (w)o(ould)h(p)q(erceiv)o(e.)37 b(The)21 b(only)f(general)150 2441 y(conclusions)g(one)e(should)i(dra)o(w)d(are)h(that)g(all)h(the)f (impro)o(v)o(emen)o(ts)g(help,)i(and)e(the)h(amoun)o(t)150 2497 y(of)c(sp)q(eedup)j(v)m(aries)e(widely)h(from)e(data)h(set)f(to)g (data)g(set.)22 b(The)16 b(RP01,)f(BAD1,)g(MD1,)g(ALZ,)150 2554 y(and)j(WS)g(data)f(sets)h(ha)o(v)o(e)f(no)h(opp)q(ortunit)o(y)g (for)f(allele)j(amalgamation,)d(so)h(they)g(sho)o(w)f(the)952 2678 y(10)p eop %%Page: 11 11 11 10 bop 331 155 1289 2 v 330 212 2 57 v 339 212 V 364 195 a Fl(Data)14 b(Set)p 564 212 V 50 w(No.)20 b(of)14 b(Alleles)p 886 212 V 52 w(2.3P)h(Time)p 1143 212 V 50 w(3.0P)f(Time)p 1401 212 V 50 w(Sp)q(eedup)p 1618 212 V 331 213 1289 2 v 330 270 2 57 v 339 270 V 397 253 a(RP01)p 564 270 V 175 w(2)c Fd(\002)h Fl(5)e Fd(\002)i Fl(3)p 886 270 V 151 w(703m)p 1143 270 V 151 w(186m)p 1401 270 V 158 w(3.8)p 1618 270 V 331 271 1289 2 v 330 326 2 57 v 339 326 V 390 309 a(BAD1)p 564 326 V 168 w(2)f Fd(\002)h Fl(4)e Fd(\002)i Fl(4)p 886 326 V 171 w(397s)p 1143 326 V 171 w(275s)p 1401 326 V 158 w(1.4)p 1618 326 V 331 328 1289 2 v 330 383 2 57 v 339 383 V 390 366 a(BAD2)p 564 383 V 146 w(2)e Fd(\002)i Fl(9)f Fd(\002)g Fl(10)p 886 383 V 128 w(1507m)p 1143 383 V 173 w(43m)p 1401 383 V 172 w(35)p 1618 383 V 331 384 1289 2 v 330 439 2 57 v 339 439 V 406 422 a(CLP)p 564 439 V 106 w(2)g Fd(\002)g Fl(4)g Fd(\002)h Fl(4)e Fd(\002)i Fl(4)p 886 439 V 174 w(40m)p 1143 439 V 173 w(21m)p 1401 439 V 159 w(1.9)p 1618 439 V 331 441 1289 2 v 330 496 2 57 v 339 496 V 402 479 a(MD1)p 564 496 V 259 w(2)e Fd(\002)i Fl(9)p 886 496 V 151 w(578m)p 1143 496 V 173 w(24m)p 1401 496 V 172 w(24)p 1618 496 V 331 497 1289 2 v 330 552 2 57 v 339 552 V 373 535 a(MD2\(3\))p 564 552 V 150 w(2)f Fd(\002)h Fl(4)e Fd(\002)i Fl(3)p 886 552 V 148 w(4206s)p 1143 552 V 193 w(86s)p 1401 552 V 172 w(49)p 1618 552 V 331 554 1289 2 v 330 609 2 57 v 339 609 V 373 592 a(MD2\(6\))p 564 609 V 150 w(2)f Fd(\002)h Fl(4)e Fd(\002)i Fl(3)p 886 609 V 212 w Fd(1)p 1143 609 V 152 w Fl(122m)p 1401 609 V 171 w Fd(1)p 1618 609 V 331 610 1289 2 v 330 665 2 57 v 339 665 V 407 648 a Fl(ALZ)p 564 665 V 264 w(2)e Fd(\002)i Fl(4)p 886 665 V 128 w(1670m)p 1143 665 V 151 w(884m)p 1401 665 V 158 w(1.9)p 1618 665 V 331 667 1289 2 v 330 721 2 57 v 339 721 V 416 705 a(WS)p 564 721 V 194 w(2)f Fd(\002)h Fl(2)e Fd(\002)i Fl(2)p 886 721 V 151 w(223m)p 1143 721 V 173 w(89m)p 1401 721 V 159 w(2.5)p 1618 721 V 331 723 1289 2 v 468 800 a(T)l(able)16 b(1:)k(Comparison)15 b(of)g(F)-5 b(ASTLINK)16 b(2.3P)e(and)h(3.0P)p 724 861 503 2 v 723 917 2 57 v 732 917 V 757 900 a(Lo)q(ops)p 899 917 V 50 w(Allele)p 1061 917 V 55 w(Time)p 1217 917 V 1226 917 V 724 919 503 2 v 723 975 2 57 v 732 975 V 785 958 a(O\013)p 899 975 V 103 w(O\013)p 1061 975 V 75 w(612m)p 1217 975 V 1226 975 V 724 977 503 2 v 723 1032 2 57 v 732 1032 V 786 1015 a(On)p 899 1032 V 104 w(O\013)p 1061 1032 V 75 w(266m)p 1217 1032 V 1226 1032 V 724 1033 503 2 v 723 1088 2 57 v 732 1088 V 785 1071 a(O\013)p 899 1088 V 104 w(On)p 1061 1088 V 99 w(29m)p 1217 1088 V 1226 1088 V 724 1090 503 2 v 723 1145 2 57 v 732 1145 V 786 1128 a(On)p 899 1145 V 105 w(On)p 1061 1145 V 122 w(6m)p 1217 1145 V 1226 1145 V 724 1146 503 2 v 265 1222 a(T)l(able)h(2:)j(Comparison)c(of)g(Impro)o(v)o(emen)o(ts) g(on)g(Lo)q(op)q(ed)h(P)o(edigree)g(from)e(BAD2)150 1355 y(e\013ect)i(of)g(the)h(lo)q(op)g(sp)q(eedups.)25 b(The)17 b(CLP)g(data)f(set)g(has)g(no)h(lo)q(ops,)g(so)f(it)h(sho)o(ws)f(the)g (e\013ect)150 1412 y(of)e(allele)i(amalgamation)e(on)g(a)g(data)g(set)g (where)g(it)h(applies)h(only)f(to)f(some)g(of)f(the)i(p)q(edigrees.)150 1468 y(The)g(MD2)g(data)f(set)h(is)h(sho)o(wn)f(with)g(3)g(lo)q(ops)h (and)f(all)h(6)f(lo)q(ops.)221 1525 y(In)j(the)g(MD2)f(data)g(set,)h (it)h(is)f(p)q(ossible)i(to)d(reduce)i(the)f(n)o(um)o(b)q(er)g(of)f (alleles)j(at)e(the)g(sec-)150 1581 y(ond)i(lo)q(cus)h(from)e(4)g(to)g (3.)34 b(I)20 b(did)h(this)f(ren)o(um)o(b)q(ering)g(b)o(y)g(hand)g (editing)h(the)f(\014le,)i(and)e(the)150 1637 y(run)e(to)q(ok)f(857s.) 26 b(One)19 b(migh)o(t)e(b)q(e)i(tempted)e(to)g(conclude)j(that)d(the)g (sp)q(eedup)j(due)e(to)f(allele)150 1694 y(amalgamation)e(is)i(4206)p Fh(=)p Fl(857)11 b(=)j(4)p Fh(:)p Fl(9)h(and)h(the)g(sp)q(eedup)i(due)e (to)g(the)g(lo)q(op)g(impro)o(v)o(emen)o(ts)f(is)150 1750 y(857)p Fh(=)p Fl(86)c(=)i(10)p Fh(:)p Fl(0.)18 b(Ho)o(w)o(ev)o(er,)c(this)h(w)o(ould)g(b)q(e)h(erroneous,)e(since)i (the)f(impro)o(v)o(emen)o(ts)f(in)o(teract.)221 1807 y(The)j(BAD2)f(data)g(set)h(also)f(allo)o(ws)h(one)g(to)f(measure)h (the)g(e\013ect)f(of)g(eac)o(h)h(impro)o(v)o(emen)o(t)150 1863 y(separately)l(.)24 b(I)16 b(extracted)g(the)h(one)f(lo)q(op)q(ed) i(p)q(edigree)g(it)e(con)o(tains)h(and)f(tried)h(the)g(same)f(run)150 1920 y(as)h(in)i(T)l(able)f(1)f(on)h(that)f(p)q(edigree)i(alone.)27 b(I)18 b(tried)g(the)g(run)g(with)g(the)f(lo)q(op)h(impro)o(v)o(emen)o (ts)150 1976 y(on/o\013)c(and)h(the)h(allele)h(impro)o(v)o(emen)o(ts)e (on/o\013)f(and)h(the)g(results)h(are)f(sho)o(wn)g(in)h(T)l(able)g(2.) 221 2033 y(In)i(this)g(case)f(the)h(e\013ect)f(of)g(the)g(allele)j (amalgamation)d(is)h(clearly)g(greater,)f(and)h(this)f(is)150 2089 y(b)q(ecause)f(it)f(is)h(p)q(ossible)h(to)d(reduce)i(the)f(allele) i(pro)q(duct)e(from)g(180)f(all)i(the)f(w)o(a)o(y)f(do)o(wn)h(to)f(60.) 150 2146 y(Nev)o(ertheless,)19 b(it)f(is)g(w)o(orth)f(noting)h(that)f (the)g(sp)q(eedup)j(on)d(the)h(lo)q(op)q(ed)h(p)q(edigree)g(b)o(y)f (itself)150 2202 y(is)g(roughly)g(100,)f(while)j(the)d(sp)q(eed)i(up)f (on)g(the)g(en)o(tire)g(data)f(set)g(is)i(35.)26 b(Put)18 b(another)f(w)o(a)o(y)l(,)150 2258 y(without)g(the)g(new)g(impro)o(v)o (emen)o(ts,)f(the)h(lo)q(op)q(ed)i(p)q(edigree)f(consumes)f(roughly)g (40\045)f(of)h(the)150 2315 y(total)12 b(time,)h(while)i(with)e(the)g (impro)o(v)o(emen)o(ts,)f(it)h(consumes)g(roughly)g(14\045)g(of)f(the)h (total)f(time.)952 2678 y(11)p eop %%Page: 12 12 12 11 bop 150 195 a Fi(7)69 b(Discussion)150 297 y Fl(I)17 b(describ)q(ed)h(the)f(implemen)o(tation)h(of)e(sev)o(eral)h (algorithmic)g(impro)o(v)o(emen)o(ts)f(in)i(the)e(link)m(age)150 353 y(analysis)f(pac)o(k)m(age)g(F)-5 b(ASTLINK)16 b(3.0P)l(.)d(These)i (impro)o(v)o(emen)o(ts)g(sp)q(eed)g(up)g(F)-5 b(ASTLINK)16 b(com-)150 409 y(putations)d(on)h(data)e(sets)h(with)h(lo)q(op)q(ed)g (p)q(edigrees)h(and)e(data)g(sets)g(with)g(un)o(used)i(alleles.)21 b(The)150 466 y(running)c(time)f(measuremen)o(ts)f(ab)q(o)o(v)o(e)g (sho)o(w)h(that)f(the)g(new)h(algorithms)g(can)g(mak)o(e)f(a)g(qual-) 150 522 y(itativ)o(e)h(di\013erence)i(in)f(whic)o(h)g(link)m(age)h (analysis)f(computations)f(can)g(b)q(e)h(carried)g(out)f(within)150 579 y(a)f(reasonable)g(amoun)o(t)g(of)g(time.)221 635 y(The)h(amalgamation)g(of)g(un)o(used)h(alleles)h(w)o(as)d(implemen)o (ted)j(in)g(MENDEL)e(some)g(y)o(ears)150 692 y(ago.)21 b(Someho)o(w)15 b(this)h(feature)g(of)f(MENDEL)h(did)h(not)e(get)h(the) f(publicit)o(y)j(it)e(deserv)o(ed.)23 b(The)150 748 y(ideas)d(b)q (ehind)h(the)e(lo)q(op)h(impro)o(v)o(emen)o(ts)f(w)o(ere)g(also)g(kno)o (wn)g(to)f(exp)q(erts,)j(but)e(getting)g(the)150 805 y(implemen)o(tation)d(details)h(correct)d(pro)o(v)o(ed)h(to)g(b)q(e)h (quite)g(complicated.)221 861 y(O'Connell)j(and)g(W)l(eeks)f([18)o(])g (ha)o(v)o(e)g(dev)o(elop)q(ed)i(and)f(recen)o(tly)g(a)f(new)g(link)m (age)i(analysis)150 918 y(pac)o(k)m(age)13 b(called)i(VITESSE,)f(whic)o (h)g(is)f(compatible)i(with)e(LINKA)o(GE)h(and)g(F)-5 b(ASTLINK)14 b(and)150 974 y(replaces)22 b(the)g(MLINK)g(and)f(LINKMAP) h(programs.)37 b(VITESSE)22 b(is)g(signi\014can)o(tly)h(faster)150 1030 y(than)f(F)-5 b(ASTLINK)23 b(on)g(some)f(data)f(sets,)i(esp)q (ecially)i(for)d(m)o(ultilo)q(cus)i(analysis.)42 b(A)o(t)22 b(this)150 1087 y(time,)d(VITESSE)g(do)q(es)g(not)e(replace)j(ILINK,)f (and)g(do)q(es)f(not)g(handle)i(complex)f(p)q(edigrees.)150 1143 y(Therefore,)13 b(the)h(impro)o(v)o(emen)o(ts)f(describ)q(ed)i (herein)g(will)g(b)q(e)f(useful)h(to)e(link)m(age)i(analysts)e(who)150 1200 y(w)o(an)o(t)h(to)h(use)g(ILINK)i(or)e(ha)o(v)o(e)g(data)f(sets)h (with)g(lo)q(op)q(ed)i(p)q(edigrees.)221 1256 y(F)l(rom)30 b(the)h(user's)f(pragmatic)h(p)q(oin)o(t)g(of)f(view)i(the)f(most)f (imp)q(ortan)o(t)g(c)o(hange)h(in)150 1313 y(F)-5 b(ASTLINK)17 b(3.0P)f(impro)o(v)o(es)g(functionalit)o(y)h(rather)f(than)g(running)h (time.)24 b(The)16 b(prepro)q(ces-)150 1369 y(sor)11 b(program)g(UNKNO)o(WN)i(no)o(w)e(detects)i(violations)f(of)g (Mendelian)i(rules)f(of)e(inheritance)j(in)150 1426 y(lo)q(op)q(ed)h(p) q(edigrees.)21 b(All)15 b(previously)h(distributed)f(v)o(ersions)g(of)e (LINKA)o(GE)i(and)f(F)-5 b(ASTLINK)150 1482 y(did)15 b(not)e(detect)h(suc)o(h)g(errors.)k(This)d(omission)f(caused)g(some)g (users)f(to)g(w)o(aste)g(large)h(amoun)o(ts)150 1539 y(of)e(computing)h(time)f(only)h(to)f(get)g(a)g(p)q(edigree)i(lik)o (eliho)q(o)q(d)h(of)d(0)g(b)q(ecause)h(the)g(input)g(genot)o(yp)q(es) 150 1595 y(w)o(ere)i(inconsisten)o(t.)150 1738 y Fi(Ac)n(kno)n (wledgmen)n(ts)150 1840 y Fl(I)22 b(should)g(lik)o(e)h(to)e(thank)g (man)o(y)g(p)q(eople)i(for)e(there)h(assistance)f(in)h(this)g(researc)o (h:)33 b(Dylan)150 1896 y(Co)q(op)q(er)13 b(and)h(Christopher)g(Ho)q (elsc)o(her)g(for)f(programming)g(assistance;)h(Christopher)g(Hy)o(ams) 150 1953 y(for)e(assisting)i(man)o(y)e(F)-5 b(ASTLINK)14 b(users,)f(so)g(that)f(I)h(could)h(write)f(more)g(new)g(co)q(de;)h(h)o (undreds)150 2009 y(of)j(F)-5 b(ASTLINK)19 b(users)f(around)f(the)h(w)o (orld)g(for)f(ha)o(ving)h(the)f(courage)h(to)f(try)g(new)h(soft)o(w)o (are)150 2066 y(and)e(the)h(patience)g(to)f(w)o(ait)f(for)h(impro)o(v)o (emen)o(ts;)g(Lucien)i(Bac)o(hner,)e(Lynn)h(Goldin,)h(Kimmo)150 2122 y(Kallio,)d(Cathryn)e(Lewis,)i(Jim)f(T)l(omlin,)h(and)e(Gerard)g (T)l(romp)h(for)f(b)q(eta)g(testing)h(F)-5 b(ASTLINK)150 2178 y(3.0P;)15 b(Lucien)k(Bac)o(hner)e(for)f(a)g(p)q(osting)h(to)f (bionet.molbio.gene-link)n(age)j(raising)e(the)g(prob-)150 2235 y(lem)i(of)f(detecting)h(Mendelian)i(errors)c(in)i(lo)q(op)q(ed)h (p)q(edigrees;)h(Jacques)e(Bec)o(kmann,)h(Susan)150 2291 y(Blan)o(ton,)j(Da)o(vid)e(Co)o(x,)h(Stephen)h(Daiger,)g(Jonathan)e (Haines,)j(Jacqueline)f(Hec)o(h)o(t,)g(Lynn)150 2348 y(Goldin,)16 b(Ric)o(hard)g(My)o(ers,)e(Margaret)g(P)o(ericak-V)l (ance,)i(Marcy)e(Sp)q(eer,)i(and)f(Ellen)i(Wijsman)150 2404 y(for)c(c)o(hallenge)j(data)d(sets.)19 b(Dev)o(elopmen)o(t)14 b(of)g(the)g(RP01)g(data)f(set)h(w)o(as)f(supp)q(orted)h(b)o(y)g(gran)o (ts)150 2461 y(from)19 b(the)h(National)g(Retinitis)i(Pigmen)o(tosa)d (F)l(oundation)h(and)g(the)g(George)g(Gund)g(F)l(oun-)150 2517 y(dation.)26 b(Dev)o(elopmen)o(t)17 b(of)g(the)g(BAD1)g(data)g (set)f(w)o(as)h(supp)q(orted)h(b)o(y)f(a)f(gran)o(ts)g(from)h(NIH.)952 2678 y(12)p eop %%Page: 13 13 13 12 bop 150 195 a Fl(Dev)o(elopmen)o(t)16 b(of)f(the)h(CLP)f(data)g (set)g(w)o(as)g(supp)q(orted)h(b)o(y)g(gran)o(ts)e(from)h(NIH)h(and)g (Shriners)150 252 y(Hospital.)j(Dev)o(elopmen)o(t)13 b(of)e(the)h(MD2)f(data)g(set)h(w)o(as)f(supp)q(orted)i(b)o(y)f(a)f (gran)o(t)g(from)g(NIH)i(and)150 308 y(gran)o(ts)f(from)g(the)h (Muscular)g(Dystroph)o(y)f(Asso)q(ciation.)20 b(Dev)o(elopmen)o(t)13 b(of)f(the)h(ALZ)g(data)f(set)150 364 y(w)o(as)j(supp)q(orted)i(b)o(y)e (a)h(gran)o(t)f(from)g(NIH.)h(Collection)i(of)d(the)h(WS)g(p)q(edigree) h(w)o(as)e(supp)q(orted)150 421 y(b)o(y)g(gran)o(t)f(from)g(NIH.)i(The) f(part)f(of)h(this)h(researc)o(h)f(done)g(at)f(Rice)j(Univ)o(ersit)o(y) f(w)o(as)e(partially)150 477 y(supp)q(orted)i(b)o(y)f(gran)o(ts)f(from) g(NIH)i(and)f(NSF)h(and)f(a)g(con)o(tract)f(from)h(IBM.)150 646 y Fi(References)173 747 y Fl([1])21 b(Ben)h(Othmane)g(K,)f(Ben)h (Hamida)g(M,)e(P)o(ericak-V)l(ance)j(MA,)d(Ben)i(Hamida)g(C,)e(Blel)243 803 y(S,)d(Carter)f(SC,)h(Bo)o(w)o(co)q(c)o(k)f(AM,)g(P)o(etrukhin)i (K,)f(Gilliam)h(TC,)e(Roses)i(AD,)e(Hen)o(tati)h(F,)243 860 y(V)l(ance)k(JM:)35 b(Link)m(age)22 b(of)d(Tunisian)j(autosomal)d (recessiv)o(e)i(duc)o(henne-lik)o(e)j(m)o(uscular)243 916 y(dystroph)o(y)d(to)f(the)h(p)q(ericen)o(tromeric)i(region)e(of)g (c)o(hromosome)f(13q.)36 b(Nature)21 b(Genet)243 973 y(1992;)14 b(2:315{317.)173 1067 y([2])21 b(Berrettini)e(WB,)e(F)l (erraro)g(TN,)g(W)l(eeks)h(D,)f(Goldin)i(LR,)f(Detera-W)l(adleigh)h(S,) e(Nurn-)243 1123 y(b)q(erger)23 b(Jr.)f(JI,)h(Gershon,)g(ES:)41 b(P)o(ericen)o(tric)23 b(c)o(hromosome)f(18)f(DNA)h(mark)o(ers)g(and) 243 1180 y(manic-depressiv)o(e)17 b(illness:)22 b(evidence)16 b(for)e(a)h(susceptibilit)o(y)i(gene.)i(Pro)q(c)c(Nat)f(Acad)h(Sci)243 1236 y(1994;)f(91:5918{5921.)173 1330 y([3])21 b(Blan)o(ton)12 b(SH,)f(Hec)o(k)o(enliv)o(ely)i(JR,)f(Cottingham)f(A)-5 b(W,)10 b(F)l(riedman)i(J,)f(Sadler)h(LA,)f(W)l(agner)243 1386 y(M,)i(F)l(riedman)g(LH,)g(Daiger)g(SP:)k(Link)m(age)d(mapping)g (of)e(autosomal)g(dominan)o(t)i(retinitis)243 1443 y(pigmen)o(tosa)f (\(RP1\))f(to)h(the)g(p)q(ericen)o(tric)h(region)f(of)g(h)o(uman)g(c)o (hromosome)f(8.)k(Genomics)243 1499 y(1991;)e(11:857{869.)173 1593 y([4])21 b(Cottingham)14 b(Jr.)g(R)-5 b(W,)14 b(Idury)h(RM,)f(Sc)o (h\177)-23 b(a\013er)14 b(AA:)19 b(F)l(aster)14 b(sequen)o(tial)h (genetic)g(link)m(age)243 1649 y(computations.)20 b(Am)15 b(J)h(Hum)f(Genet)g(1993;)f(53:)19 b(252{263.)173 1743 y([5])i(Diehl)c(SR,)f(Lange)f(KL,)h(MacLean,)e(C:)20 b(P)o(ersonal)15 b(Comm)o(unication,)g(1995.)173 1837 y([6])21 b(Dw)o(ark)m(adas)33 b(S,)h(Sc)o(h\177)-23 b(a\013er)34 b(AA,)g(Cottingham)f(Jr.)h(R)-5 b(W,)34 b(Co)o(x)f(AL,)i(Keleher)g(P)l (,)243 1894 y(Zw)o(aenep)q(o)q(el)24 b(W:)42 b(P)o(arallelization)24 b(of)e(general)i(link)m(age)g(analysis)f(problems.)43 b(Hum)243 1950 y(Hered)16 b(1994;)e(44:127{141.)173 2044 y([7])21 b(Elston)15 b(R)o(C,)f(Stew)o(art)f(J:)18 b(A)d(general)f(mo)q (del)i(for)d(the)i(analysis)g(of)e(p)q(edigree)j(data.)i(Hum)243 2100 y(Hered)e(1971;)e(21:523{542.)173 2194 y([8])21 b(Gupta)e(SK,)g(Sc)o(h\177)-23 b(a\013er)18 b(AA,)h(Co)o(x)f(AL,)h(Dw)o (ark)m(adas)f(S,)h(Zw)o(aenep)q(o)q(el)h(W:)30 b(In)o(tegrating)243 2250 y(parallelization)20 b(strategies)d(for)f(link)m(age)j(analysis.) 27 b(Computers)17 b(and)g(Biomedical)i(Res)243 2307 y(1995;)14 b(28:116{139.)173 2401 y([9])21 b(Hasstedt)f(SJ:)33 b Fe(P)m(AP)20 b(-)h(Pe)n(digr)n(e)n(e)e(A)o(nalysis)f(Package,)k(R)n (evision)d(3)p Fl(.)34 b(Departmen)o(t)18 b(of)243 2457 y(Human)e(Genetics,)f(Univ)o(ersit)o(y)h(of)f(Utah,)f(Salt)i(Lak)o(e)f (Cit)o(y)l(,)g(Utah,)f(1989.)952 2678 y(13)p eop %%Page: 14 14 14 13 bop 150 195 a Fl([10])21 b(Hec)o(h)o(t)d(JT,)g(W)l(ang)f(Y,)h (Connor)f(B,)h(Blan)o(ton)g(SH,)g(Daiger)g(SP:)28 b(Non-syndromic)18 b(cleft)243 252 y(lip)e(and)e(palate:)19 b(No)13 b(evidence)j(of)d (link)m(age)j(to)d(HLA)h(or)f(factor)g(13a.)j(Am)e(J)g(Hum)g(Genet)243 308 y(1993;)g(52:1230{1233.)150 399 y([11])21 b(Lange)15 b(K,)f(Elston)g(R)o(C:)k(Extensions)c(to)g(p)q(edigree)h(analysis.)g (I.)f(Lik)o(eliho)q(o)q(d)i(calculation)243 456 y(for)f(simple)i(and)e (complex)h(p)q(edigrees.)21 b(Hum)16 b(Hered)f(1975;)f(25:95{105.)150 547 y([12])21 b(Lange)e(K,)f(W)l(eeks)g(D,)g(Bo)q(ehnk)o(e)h(M:)28 b(Programs)17 b(for)g(p)q(edigree)j(analysis:)27 b(MENDEL,)243 603 y(FISHER,)16 b(and)f(dGene.)21 b(Genet)15 b(Epidem)h(1988;)e (5:471{473.)150 695 y([13])21 b(Lathrop)16 b(GM,)e(Lalouel)j(JM:)k (Easy)15 b(calculations)i(of)e(lo)q(d)h(scores)f(and)h(genetic)g(risks) g(on)243 751 y(small)g(computers.)k(Am)15 b(J)h(Hum)f(Genet)g(1984;)f (36:460{465.)150 842 y([14])21 b(Lathrop)f(GM,)e(Lalouel)j(JM,)f (Julier)h(C,)e(Ott)g(J:)34 b(Strategies)19 b(for)g(m)o(ultilo)q(cus)i (link)m(age)243 899 y(analysis)16 b(in)g(h)o(umans.)k(Pro)q(c)15 b(Nat)g(Acad)g(Sci)i(1984;)c(81:3443{3446.)150 990 y([15])21 b(Lathrop)i(GM,)e(Lalouel)j(JM,)e(Julier)i(C,)e(Ott,)h(J:)42 b(Multilo)q(cus)24 b(link)m(age)g(analysis)f(in)243 1046 y(h)o(umans:)31 b(detection)21 b(of)f(link)m(age)i(and)f(estimation)g (of)f(recom)o(bination.)36 b(Am)21 b(J)g(Hum)243 1103 y(Genet)16 b(1985;)d(37:482{498.)150 1194 y([16])21 b(La)o(w)c(A,)g (Ric)o(hard)g(I)q(I)q(I)i(CW,)d(Cottingham)g(Jr)h(.)g(R)-5 b(W,)16 b(Lathrop)h(GM,)f(Co)o(x)g(DR,)h(My)o(ers)243 1251 y(RM:)38 b(Genetic)22 b(link)m(age)h(analysis)f(of)e(bip)q(olar)j (a\013ectiv)o(e)e(disorder)g(in)h(an)f(Old)i(Order)243 1307 y(Amish)16 b(p)q(edigree.)22 b(Hum)15 b(Genet)g(1992;)f (88:562{568.)150 1398 y([17])21 b(Nakura)d(J,)f(Wijsman)h(EM,)f(Miki)h (T,)g(Kamino)g(K,)f(Y)l(u)i(CE,)e(Oshima)h(J,)g(F)l(ukuc)o(hi)h(KI,)243 1455 y(W)l(eb)q(er)f(JL,)e(Piussan)i(C,)e(Melaragno)g(MI,)g(Epstein)h (CJ,)f(Scappaticci)j(S,)d(F)l(raccaro)g(M,)243 1511 y(Matsum)o(ura)h (T,)h(Murano)g(S,)g(Y)l(oshida)h(S,)g(F)l(ujiw)o(ara)e(Y,)i(Saida)f(T,) g(Ogihara)h(T,)f(Mar-)243 1568 y(tin)i(GM,)e(Sc)o(hellen)o(b)q(erg)k (GD:)31 b(Homozygosit)o(y)18 b(mapping)i(of)f(the)g(Werner)h(Syndrome) 243 1624 y(lo)q(cus\(WRN\).)h(Genomics)15 b(1994;)f(23:600{608.)150 1715 y([18])21 b(O'Connell)c(JR,)e(W)l(eeks)f(DE:)19 b(The)c(VITESSE)g(algorithm)g(for)f(rapid)h(exact)f(m)o(ultilo)q(cus) 243 1772 y(link)m(age)h(analysis)f(via)f(genot)o(yp)q(e)g(set-reco)q (ding)h(and)g(fuzzy)f(inheritance.)18 b(Nature)13 b(Genet)243 1828 y(1995;)h(11:402{408.)150 1919 y([19])21 b(P)o(assos-Bueno)13 b(MR,)f(Ric)o(hard)h(I,)g(V)l(ainzof)g(M,)f(F)l(ougerousse)g(F,)g(W)l (eissen)o(bac)o(h)i(J,)e(Broux)243 1976 y(O,)22 b(Cohen)g(D,)f(Akiy)o (ama)h(J,)f(Marie)h(SKN,)g(Carv)m(alho)g(AA,)f(Guilherme)j(L,)d(Kalil)j (J,)243 2032 y(Tsanaclis)15 b(AM,)e(Zatz)g(M,)f(Bec)o(kmann)i(JS:)k (Evidence)d(of)e(genetic)i(heterogeneit)o(y)e(in)i(the)243 2089 y(autosomal)21 b(recessiv)o(e)g(adult)h(forms)e(of)g(lim)o (b-girdle)k(m)o(uscular)d(dystroph)o(y)f(follo)o(wing)243 2145 y(link)m(age)k(analysis)f(with)g(15q)e(prob)q(es)i(in)g(Brazilian) h(families.)42 b(J)22 b(Med)g(Genet)g(1993;)243 2202 y(30:385{387.)150 2293 y([20])f(P)o(ericak-V)l(ance)g(MA,)f(Johnson)g (CC,)f(Rimmler)i(JB,)f(Saunders)h(AM,)e(Robinson)i(LC,)243 2349 y(Hondt)e(EG,)f(Jac)o(kson)g(CE,)g(Haines)h(JL:)30 b(Alzheimer)20 b(demen)o(tia)f(and)g(APOE-4)g(in)g(an)243 2406 y(Amish)d(p)q(opulation.)22 b(Submitted,)15 b(1995.)150 2497 y([21])21 b(Sc)o(h\177)-23 b(a\013er)13 b(AA:)k(Lo)q(ops)d(in)g(F) -5 b(ASTLINK.)18 b(One)c(\014le)g(in)g(the)g(F)-5 b(ASTLINK)14 b(do)q(cumen)o(tation,)243 2554 y(1993.)952 2678 y(14)p eop %%Page: 15 15 15 14 bop 150 195 a Fl([22])21 b(Sc)o(h\177)-23 b(a\013er)20 b(AA.)34 b(P)o(edigree)20 b(tra)o(v)o(ersal)f(in)i(F)-5 b(ASTLINK.)35 b(One)20 b(\014le)h(in)g(the)f(F)-5 b(ASTLINK)243 252 y(do)q(cumen)o(tation,)16 b(1993.)150 345 y([23])21 b(Sc)o(h\177)-23 b(a\013er)22 b(AA.)40 b(The)22 b(m)o(ystery)f(of)g (\(the\))g(Unkno)o(wn.)40 b(One)23 b(\014le)f(in)h(the)f(F)-5 b(ASTLINK)243 402 y(do)q(cumen)o(tation,)16 b(1994.)150 496 y([24])21 b(Sc)o(h\177)-23 b(a\013er)16 b(AA,)h(Gupta)e(SK,)i (Shriram)g(K,)f(Cottingham)g(Jr.)g(R)-5 b(W:)23 b(Av)o(oiding)18 b(recompu-)243 552 y(tation)d(in)h(link)m(age)h(analysis.)k(Hum)15 b(Hered)h(1994;)d(44:225{237.)150 646 y([25])21 b(T)l(erwilliger)c(JD,) e(Ott)g(J.)k(Handb)q(o)q(ok)d(of)e(Human)i(Genetic)f(Link)m(age.)21 b(The)15 b(Johns)h(Hop-)243 702 y(kins)g(Univ)o(ersit)o(y)g(Press,)f (Baltimore)g(and)h(London,)f(1994.)150 796 y([26])21 b(Thompson)c(EA:)25 b(Mon)o(te)17 b(Carlo)f(estimation)i(of)e(m)o (ultilo)q(cus)j(autozygosit)o(y)d(probabili-)243 853 y(ties.)j(In)14 b Fe(Pr)n(o)n(c.)h(of)g(the)h(1994)g(Interfac)n(e)e (Confer)n(enc)n(e)p Fl(,)e(pp.)i(498{506.)e(In)o(terface)i(F)l(ounda-) 243 909 y(tion)i(of)f(North)f(America,)i(1994.)952 2678 y(15)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.lselect0000644000265600020320000000345606737457627015750 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 A new method of selecting loop breakers Alejandro A. Schaffer |*| Selecting loop breakers easily and automatically Exercise 7 on pages 93--96 of Handbook of Human Genetic Linkage by Ott and Terwilliger describes a complicated, interactive method to break loops using the makeped program and the LOOPS program LOOPS [Xie X, Ott J: Finding all loops in a pedigree. Am J Hum Genet 1992; 51:A205]. As a result of innovations in FASTLINK 4.0P and FASTLINK 4.1P, their method is now obsolete. The new method is as follows: 1. When running your pre-makeped file through makeped, ALWAYS say that the pedigrees have no loops, even if they do. 2. Put the post-makeped pedigree file in pedfile.dat. 3. Put the locus file in datafile.dat. 4. Run unknown -l Note that the flag is the letter 'l', not the number '1'. This will produce a new output file called lpedfile.dat which has all the loops broken for you. If your goal is to run an lcp-produced script with pedigree file in pedin.dat and locus file in datain.dat, you then 5. Copy lpedile.dat to pedin.dat 6 Copy the locus file to datain.dat and run your script. You will see diagnostic output showing that unknown is still trying to find a better loop breaker set for you during the running of the lcp-produced script. The reasons are as follows. A. Your pedigree file may have dozens of loci while any specific analysis may have only 2 or 3. The initial loop breaker set selected by unknown -l attempts to be good for all loci, but may not be optimal for any specific locus subset. B. The method used during the main run uses a more precise weight function to choose among the loop breaker possibilities than does the preliminary run of unknown -l fastlink-4.1P-fix95/README.allele0000644000265600020320000001071006737457627015542 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: January 30, 1996 |*| Diagnostic for extra alleles This file explains the diagnostic that states that a pedigree or dataset has unused alleles. This diagnostic has been implemented by Chris Hoelscher for inclusion in FASTLINK 2.3P and beyond. The renumbering is implemented starting in version 3.0P and beyond. The running time of LINKAGE and FASTLINK grows rapidly with the number of alleles specified for each locus used in a run. Therefore, it is important to specify no more alleles than are actually needed for the analysis. Various partial solutions to the "extra allele" problem have been implemented by: Ellen Wijsman (in the context of LIPED) Jathine Wong and Cathryn Lewis (in the context of LINKAGE/FASTLINK) Scott Diehl, Bettie Duke, and Lynn Ploughman (in the context of MENDEL) Alan Young (in the context of GAS) At the end of this essay we briefly describe the the partial solution implemented by Wijsman and Diehl-Duke-Ploughman. In the context of FASTLINK, their solution is applicable only to the LINKMAP and MLINK programs. We have not implemented an extension of their solution in FASTLINK 3.0P. |*| Extra alleles in symbols and an example Suppose a locus has n alleles, A1 through An, that occur in the population at large. Suppose that in a population to be studied with linkage analysis, only alleles A1 through Ak, with k < n-1 occur. Then one may combine alleles A(k+1) through An into one "catch-all" allele unless one is estimating allele frequencies. The frequency of the catch-all allele is the the sum of the frequencies of A(k+1) though An. A concrete FASTLINK example: Suppose the general population has the possibilities: Allele 1 2 3 4 5 6 Frequency .3 .2 .15 .1 .22 .03 and this is encoded in the locus file (datain.dat). Suppose that the pedigree(s) encoded in the pedigree file (pedin.dat) contain only the alleles 2, 4, and 5. LINKAGE and FASTLINK require that the alleles be numbered consecutively starting at 1. Therefore, in the process of reducing from 6 to 4 alleles it is necessary to renumber the alleles. Renumber old allele 2 to be new allele 1 with frequency .2 Renumber old allele 4 to be new allele 2 with frequency .1 Renumber old allele 5 to be new allele 3 with frequency .22 Create catch-all allele 4 with frequency .48 (sum of frequencies of old 1, old 3, old 6) No person should have the catch-all allele, but it is absolutely wrong to omit the catch-all allele. Important technical note: the process of renumbering alleles to reduce their number loses no information in a statistical sense, unless one is estimating allele frequencies. Renumbering is distinct from "downcoding", in which multiple alleles that are distinct and do occur in the population are given the same number, in the interest of reducing running time. In general, downcoding loses information, although there are some special situations in which it does not because the frequencies of some different alleles happen to be identical. |*| Extra alleles and separating pedigrees The use of extra alleles often arises when the original data had P pedigrees amongst which all n alleles occur, but the population in some analysis with Q < P pedigrees contains only k < n-1 of the alleles. The MLINK and LINKMAP programs analyze each pedigree one at a time, and sum the values of -2*(log(likelihood)) for each pedigree. Since allele renumbering makes sense on a per pedigree basis, it is valid to renumber alleles for each pedigree in an optimal manner. This requires using a different locus file for each pedigree because the renumbering may assign the same new allele number to different old alleles. One annoyance of doing the analysis for each pedigree separately is that the output values must be summed. The process of automating the separation of input pedigrees and combination of output results was automated for LIPED by Ellen Wijsman and for MENDEL by Scott Diehl, Bettie Duke, and Lynn Ploughman. The above solution does not work for ILINK or LODSCORE. |*| FASTLINK diagnostic error message The main programs in FASTLINK do not know about all the loci in the locus file (datain.dat). They only know about the loci that are actually used in a given analysis. For example, if an analysis uses loci 1, 7, and 12, in *any* order, locus 1 will have index 1, locus 7 will have index 2, and locus 12 will have index 3 when reported in the diagnostic. fastlink-4.1P-fix95/README.scaling0000644000265600020320000000610406737457627015726 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 FASTLINK, version 4.0P |*| Output values from FASTLINK are scaled -------------------------------------- The output log likelihood values printed by both LINKAGE and FASTLINK are scaled on some pedigrees by an additive constant that depends on the pedigree structure and selection of loop breakers, if any. This means that output log likelihood values should be used only by subtracting one from another to obtain a LOD score. This problem first surfaced in the initial release of FASTLINK because FASTLINK/LINKMAP uses a different scaling convention from LINKAGE/LINKMAP. See the next section below. The scaling issue became fundamental with FASTLINK 4.0P where the change in loop breaker choice means that the raw output is unlikely to match earlier versions on looped pedigrees. The reason is that when FASTLINK 4.0P changes the selection of loop breakers, this has the side effect of changing the scaling constant. Therefore, FASTLINK 4.0P can be compared for correctness to earlier versions only by comparing LOD scores. More changes in both loop breaker selection and genotype inference for looped pedigrees were made in version 4.1P. So the printed log likelihood values for versions 4.0P and 4.1P may differ on looped pedigrees. In general, the value for 4.1P should be the same or smaller in magnitude, indicating that less time is being wasted exploring unnecessary genoype combinations for the loop breakers. |*| Scaling discrepancy - IMPORTANT FOR LINKMAP USERS -------------------- Prof. Ellen Wijsman (U. Washington) brought to our attention a situation in which FASTLINK versions of LINKMAP print out some values that differ from those printed out by LINKMAP in LINKAGE 5.1. What follows are two explanations for the discrepancy, one short, and one long. Short Explanation. The different values represent differences in scaling LINKMAP's representation of the likelihood value. If you run the post-processor program which computes odds, the discrepancies will disappear. Long Explanation. Because LINKAGE computes with very small numbers, these numbers must be scaled to avoid underflow. Any (log) likelihood values that are printed out by any of the LINKAGE programs are actually scaled by some amount that depends on the structure of the input pedigree(s). Various scaling rules can be used. In LINKAGE 5.1, the programs LODSCORE, ILINK, and MLINK all use the same scaling rules, while LINKMAP uses different scaling rules. We could find no internal or external documentation to explain this difference. The difference arises only for some pedigrees that have loops. To increase the amount of code that the four programs can share in our versions, we have decided to make our LINKMAP use the same scaling rules as the other three programs. If you would like details on how to modify our LINKMAP to make it consistent with the old LINKMAP contact schaffer@cs.rice.edu. The necessary editing is simple, but you would have to edit the code each time you switch between LINKMAP and one of the other three programs. fastlink-4.1P-fix95/README.trouble0000644000265600020320000011425006737457627015764 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: November 28, 1995 LINKAGE/FASTLINK Troubleshooting Alejandro A. Schaffer LINKAGE and FASTLINK produce lots of different error messages that may be difficult to understand. This file briefly summarizes the error messages in five groups. 1. Error messages in LINKAGE that were inherited in FASTLINK These all have numbers, although the numbers are not printed out. 2. Error messages new to FASTLINK 3. Incompatibility errors in UNKNOWN 4. Error messages in lsp. These error messages are especially cryptic. They all have a 6 letter error code and little other information. 5. Error messages in lrp. Unfortunately, the error printing routine ignores a lot of useful diagnostic information that is passed to it. The way to use this file is to note down the error message you got and then use grep to find it in this file to figure out what may be wrong. Almost all the common errors in the first and third categories are white-space placement errors. Thus the error message should be interpreted only as a clue of what is the vicinity of the error in the data files. |*| Error Messages in LINKAGE Main Programs and UNKNOWN The main programs and UNKNOWN use the same error routine, although in practice some of the errors can occur only one place or the other. This section describes the errors that have been reported in LINKAGE all along. Other errors may be found in the next two sections Error Number:0 Message: Number of loci 17 exceeds the constant maxlocus What it means: maxlocus is the maximum number of loci that can be used simultaneously in a run. You can increase maxlocus by changing commondefs.h or Makefile. Error Number:1 Message: Number of loci read . Less than minimum of 1 What it means: The first number in locus file (datain.dat) or datafile.dat is mangled; you probably erred in using preplink to prepare the locus file. Error Number:2 Message: Error detected reading loci order. Locus number 17 in position 5 exceeds number of loci What it means: The third line of your locus file has no locus 17 on it, but you asked lcp to use hat locus. This probably occurred by using a text editor to add new loci to the locus file and forgetting to update the locus order on line 3. Error Number:3 Message: Error detected reading loci order. Illegal locus number 17 in position 2 What it mens: Your lcp script wants to use locus 17, but your locus file does not have 17 loci described. This can occur when you mix-up data sets. Error Number:4 Message: Error detected reading loci order. Locus number repeated in positions 2 and 3 What it means: Your probably made a typo in lcp and used the same locus in two different positions of the fixed locus map Error Number:5 Message: Error detected reading locus description. Illegal locus type 7 for locus 6 What it means: The first number in the description of each locus in the locus file must be 1,2,3,or 4. Error Number:6 Message: Error detected reading locus description for system 7. Number of alleles 25 exceeds maxall What it means: One of your loci is described as having 25 alleles in the locus file. maxall is a constant limiting the maximum number of alleles at a locus. You can increase maxall to more than 25, by changing unknown.c, commondefs.h, or Makefile. Important: Versions of FASTLINK earlier than 3.0P cannot handle maxall > 31. Error Number:7 Message: Error detected reading locus description for system 6. Illegal number of alleles 0 What it means: One of your loci is described as having 0 alleles. This is likely a white space error in the locus file causing the wrong string to be interpreted as the number of alleles Error Number:8 Message: Error detected reading locus description for system 6. Number of factors 17 exceeds maxfact What it means: Similar to error number 6. There is a constant maxfact that is the maximum number of binary factors allowed at a locus of that type. You can change maxfact in unknown.c commondefs.h and Makefile. Important: Set maxfact and maxall to the same value; FASTLINK cannot handle maxfact > 31. Error Number:9 Message: Error detected reading locus description for system 6. Illegal number of factors 0 What it means: Very similar to error number 7. 7 appears for numbered allele loci, while 9 appears for binary factors loci. Error Number:10 Message: Error detected reading locus description for system 6. Alleles not codominant. THIS ERROR IS OBSOLETE Error Number:11 Message: Error detected reading pedigree record 17. Illegal code for sex 8. What it means: The column for gender is the eighth column in pedin.dat and the fifth column in the input to MAKEPED. Error 11 can be caused by entering either the wrong value for the gender or having a white-space error that causes the wrong column to be read as gender. Be especially careful to have exactly one carriage return after the entry for each person, and no other carriage returns. Error Number:12 Message: Error detected reading pedigree record at pedigree 17. Maximum number of pedigree records exceeded What it means: The maximum number of pedigrees is determined by the constant maxind, which can be changed in commondefs.h unknown.c, and Makefile. You may have truly exceeded maxped or you may have a white-space error. Error Number:13 Message: Error detected reading pedigree record 501. Maximum number of individuals exceeded, What it means: Similar to error 12. The maximum number of people in a a data set is determined by the constant maxped. Error Number:14 Message: Error detected reading pedigree record 300. Illegal binary factor code 2. What it means: Binary factors must be 0 or 1. Usually this error occurs because of a white-space problem that causes lsp to look in the wrong columns. Error Number:15 Message: Error detected reading pedigree record 300. No allelic pair for genotype. THIS ERROR IS OBSOLETE Error Number:16 Message: Error detected reading pedigree record 300. Allele number 25 exceeds maxall. What it means: A numbered allele cannot have a value larger than the constant maxall. See error 6. Error Number:17 Message: Error detected reading pedigree record 300. Illegal allele number -1. What it means: You have a negative allele number in your input file. I have not figured out any plausible circumstances under which this error could occur. Error Number: 18 Message: Number of systems after factorization 60 exceeds maxsystem THIS ERROR IS OBSOLETE Error Number:19 Message: Number of systems after factorization 0 less than minimum of 1. THIS ERROR IS OBSOLETE Error Number:20 Message: Number of recombination types 100 exceeds maxrectype THIS ERROR IS OBSOLETE Error Number:21 Message: Number of recombination types 0 less than minimum of 1. THIS ERROR IS OBSOLETE Error Number: 22 Message: End of file detected in tempdat by procedure readthg before all data found THIS ERROR IS OBSOLETE Error Number: 23 Message: Error detected reading iterated locus in datafile. Value (7) greater than nlocus What it means: You are using ILINK to estimate allele frequencies or something else, and you gave a locus number that is too high. Error Number: 24 Message: Error detected reading iterated locus in datafile. Illegal value (-1)\n", What it means: Similar to error 23, but this one occurs when the locus number is negative. I have not figured out any plausible circumstances under which this error could occur. Error Number: 25 Message: Number of iterated parameters greater then maxn. What it means: The number of parameters that you can simultaneously estimate in ILINK is determined by the constant maxn, which can be increased in ildefs.h or Makefile. You have exceeded maxn in the way your datafile.dat is set up. Could be caused by a white-space error. Error Number: 26 Message: Error detected reading pedigree record 200. Liability class (9) exceeds nclass. What it means: When you specify a locus as as an affection status locus, you may specify different liability classes that get numbered 1,2,3... If you assign an individual a class number in the pedigree file that is higher than the number of liability classes specified, then error 26 occurs. It is important to remember that affection status loci get 1 column is no liability classes are used and 2 columns if classes are used. Therefore, this error can occur if you specify an affection status locus to have liability classes in the locus file, but forget to specify the class in the pedigree file. Error Number: 27 Message: Error detected reading pedigree record 200. Illegal liability class (0). What it means: See error 26. In this case the liability class is being read as a number that is too low (rather than too high), but the likely causes are the same as for 26. Error Number: 28 Message: Error detected reading locus description for system 1. Liability classes (100) exceed maxliab. What it means: The maximum number of liability classes at a locus is determined by the constant maxliab, which can be set in unknown.c, commondefs.h, or Makefile. Error Number: 29 Message: Error detected reading locus description for system 2. Illegal number of liability classes (-1)\n", What it means: The number of liability classes that you specified for an affection status locus is too low. This could be a white-space error. Error Number: 30 Message: Error detected reading locus description for system 2. Penetrance out of range" What it means: You specified a penetrance for a liability class of an affection status locus as a number bigger than 1.0. Probably a white-space error. Error Number: 31 Message: Error detected reading locus description for system 2. Number of traits (17) exceeds maxtrait What it means: The maximum number of traits for a quantitative trait locus is determined by the constant maxtrait, which can be set in unknown.c, commondefs.h, or Makefile. Error Number: 32 Message: Error detected reading locus description for system 2. Number of traits out of range (-1) What it means: Similar to error 31, but now the number of traits is too low. Probably a white-space error. Error Number: 33 Message: Error detected reading locus description for system 3. Variance must be positive What it means: You specified a variance for a quantitative trait as 0 or less. Almost certainly what happened is that a 0 was read because of a white-space error. Error Number: 34 Message: Error detected reading locus description for system 2. Variance multiplier must be positive What it means: Similar to error 33. Error Number: 35 Message: Error detected reading locus description for system 1. Risk allele (17) exceeds nallele What it means: You are doing a risk assessment and you specified an allele number that is higher than the number of alleles possible for that locus. Error Number: 36 Message: Error detected reading locus description for system 2. Illegal risk allele (0) What it means: Similar to 35, but here the risk allele number is 0 or less. Probably a white-space error. Error Number: 37 Message: Error detected reading datafile. Risk locus (5) exceeds nlocus What it means: The locus at which you want to do a risk analysis is specified as an index that is higher than the number of loci you specified in the lcp script. Error Number: 38 Message: Error detected reading datafile. Illegal value for risk locus (0) What it means: Similar to 37, but now the risk locus number is too low. Probably a white-space error. Error Number: 39 Message: Error detected reading datafile. Mutation locus (5) exceeds nlocus What it means: Similar to 37, but this occurs when you are using the mutation model, rather than risk analysis. Error Number: 40 Message: Error detected reading datafile. Illegal value for mutation locus (0) What it means:Similar to 38, but this occurs when you are using the mutation model, rather than risk analysis. Error Number: 41 Message: Error detected reading datafile. Linkage disequilibrium is not allowed with this program What it means: You are trying to allow for linkage disequilibrium and trying to use LODSCORE. Use ILINK instead. Error Number: 42 Message: Locus 17 in lod score list exceeds nlocus 5 What it means: Essentially the same as error 2, but you get this one if you use LODSCORE because the lcp script format for lodscore is different. Error Number: 43 Message: Illegal locus number 0 in lod score list What it means: Similar to error 42, but now the locus number is too high instead of too low. Warning number: 0 Message: Illegal sex difference parameter 3 Parameter should be 0, 1, or 2 What it means: The first number after the last locus description in the locus file indicates whether you want male theta and female theta to be different Codes are: 0 -- no difference (almost everyone uses this) 1 -- difference, but no females seen yet 2 -- difference (common value for sex difference) This is probably a white-space error Warning number: 1 Message: Illegal interference parameter 17 Lack of interference assumed What it means: The second number after the last locus description in the locus file indicates whether you want interference (1) or mapping (2). No interference (the common case) is 0. Warning Number: 2 Message: Illegal sex difference parameter 1 Parameter must be 0 with sex-linked data What it means: You are using X-chromosome data and you specified that male theta should be different from female theta in datain.dat. This number is the first number after the last locus description in the locus file. This warning may be harmless. Warning Number 3 Message: Non-standard affection status 6 interpreted as normal in pedigree record 200 What it means: The affection status of a person can be 0,1, or 2. You probably have a white-space error. This warning should not be ignored. |*| Error Message Introduced in FASTLINK Message: WARNING: You are doing an autosomal run but have AUTOSOMAL_RUN set to 0 What it means: Change AUTOSOMAL_RUN to 1 in moddefs.h Message: You probably need to run the slower version of this program What it means: FASTLINK can be configure to use more memory "fast version" or less memory "slow version". You are using the fast version and have run out of memory. Recompile to get the slow version instead, with make installslow. Message:Problem with malloc, probably not enough space What it means: You are out of memory, get more swap space. Message: Your pedigree has more loops than allowed by the constant maxloop What it means: You must increase maxloop in commondefs.h. Starting with FASTLINK 3.0P maxloop will occur also in unknown.c You are *strongly encouraged* to read loops.ps. Message: The program will exit politely to allow you to correct the problem What it means: I am sparing you a core dump Message: Error opening ipedfile.dat and pedfile.dat. What it means: Something is wrong in your lcp script or your usage of it Message: NOTE: attempting to continue previous (unfinished) run What it means: FASTLINK thinks you want to recover from a crash Message: Data recovered What it means: FASTLINK is recovering from a crash whether you like it or not. Message: Illegal instruction (on Suns) What it means: maxhap is probably too big causing you to blow out the stack in segdown or segup Message: The next pedigree appears to have an unbroken loop What it means: You failed to use properly the loops program as part of makeped See Chapter 7 of Terwilliger and Ott |*| Incompatibility Errors in UNKNOWN One of the main purposes of UNKNOWN is to detect violations of Mendelian rules of inheritance. In LINKAGE and FASTLINK, through version 2.2, error detection was done only for loopless pedigrees and the program would report only the erroneous pedigree/locus pair. In FASTLINK 2.3P, the loopless error checking was improved so that the program now pinpoints the nuclear family which contains the error. It is not possible for the program to determine automatically whether it is a parent or a child (or both) whose genotype must be changed. Sometimes, the program will pinpoint multiple nuclear families that are in error in the same pedigree. In this situation, only the first nuclear family is sure to be wrong; the others may be propagated consequences of the first error detected. It may not be possible to determine whether they are separate errors or not without correcting the first error. If you want to see the first error only, change the default value of the constant ONE_ERROR_ONLY to 1. In FASTLINK 3.0P, UNKNOWN now detects incompatibility errors in looped pedigrees. However, it reports only the pedigree/locus pair. If you wish to have the nuclear families pinpointed, then artificially remove all the loops by replacing every number that is 2 or higher in column 9 of the pedigree file with a 0. Then re-run UNKNOWN. Do not throw away your original pedigree file, since you will want to fix the genotype errors there and use that file for the actual computations. Here are some UNKNOWN-specific error messages: Message: Reduce max_vectors_considered to 9999 What it means: You have a looped pedigree, probably with multiple loops. UNKNOWN is running out of memory keeping track of all the possible loop breaker vectors. If you reduce the constant max_vectors_considered you trade space for time. The genotype inference for loops becomes less precise, but takes less space. Message: Error opening pedfile.dat in UNKNOWN What it means: pedfile.dat is not there or you do not have permission to read it. This error could arise if you are doing multiple runs in the same directory simultaneously (this is a no-no for both LINKAGE and FASTLINK) or your directory permissions are not set up properly. Message: foundped() found 0 pedigrees - UNKNOWN What it means: Something is seriously wrong with pedfile.dat. It's hard to imagine what could cause this, but the message is in there for safety. Message: Press to continue What it means: Recent versions of UNKNOWN ask for an interactive response when errors occur. This was introduced by Terwilliger and Ott. Press if you want incompatibilities checked for the remaining pedigrees in your data set. Otherwise, kiil the program. Message: You must increase the constant maxloop What it means: In FASTLINK 3.0P, maxloop is defined in both unknown.c and commondefs.h. In bothe files, the value must be at least as large as the number of loops in each pedigree. In previous versions of FASTLINK, maxloop appeared only in commondefs.h. Edit unknown.c and commondefs.h to increase maxloop. Message: One incompatibility involves the family in which person 17 is a parent What it means: You have a violation of Mendelian rules of inheritance in the current pedigree. This message will be printed before the message for the whole pedigree. Here "family" means "nuclear family", including parents and children. The first nuclear family that is pinpointed definitely has an error (see the introduction to this section. Note that the individuals are counted starting at 1 with each pedigree, so 17 means the 17th person listed in pedfile.dat for the current pedigree. Note that if 17 is involved in multiple marriages, each of these should be checked. Message: One incompatibility involves the family in which person 9 is a child What it means: Essentially the same as the previous error message, except that there are two ways of flagging errors depending on how the pedigree is traversed. Message: The next pedigree appears to have an unbroken loop What it means: The program is getting into an infinite loop probably because you have not broken a loop properly. The LINKAGE preprocessor program MAKEPED can be used to break loops before running UNKNOWN. Message: ERROR: Incompatibility detected in this family for locus 2 What it means: This is the overall incompatibility message for a pedigree. Here "family" means "pedigree". Note that locus 2 here is post-lsp locus numbering. so it means the second locus in your analysis. Message: ERROR: File empty or inconsistent. What it means: One of pedfile.dat and datafile.dat is not there or has the wrong permissions. |*| LSP Error Messages In many of the following error codes, substituting S for P in the fifth letter means the problem is in the secondary file, rather than the primary file. Almost nobody uses secondary files. Code: LN1RPR What it means: First line of datain.dat does not have 4 numbers on it The 4 numbers are: Number of loci Risk locus X-linked Program code Code: NOLIPR What it means: Number of loci is lees than 1 or bigger than the maximum allowed by lsp. Code: RKLIPR What it means: Risk locus is < 0 or bigger than the number of loci Risk locus should be 0 unless you want to do a risk calculation Code: XLKIPR What it means: The X-linked status is something other than 0 (autosomal) or 1 (X-linked) Code: PRGIPR What it means: Program code is not valid Code: MPLXPR What it means: Program code is not valid Code: NLEXPR What it means: I wish I knew! Code: LN2RPR What it means: There is a problem reading the second line of the locus file This should have 4 numbers: Mutation locus Male mutation Rate Female Mutation Rate Disequilibrium Unless you are a LINKAGE wizard, I *strongly* recommend that this line should always be: 0 0.0 0.0 0 Code: MTLIPR What it means: Mutation locus is out of range Code: MMRIPR What it means: Male mutation rate is out of range Code: FMRIPR What it means: Female mutation rate is out of range Code: MTMXPS What it means: Mutation locus index is not 0 Code: DISIPR What it means: Disequilibrium is not 0 or 1 Code: DENXPR What it means: Disequilibrium is not 0 Code: LN3RPR What it means: Problem reading the 3 line of locus file that specifies the locus order. Usually this means that number of entries on this line does not match the number of loci specified in the first line of the locus file Code: LN5RPR What it means: Problems reading line with sex difference and interference Code: LN6RPR What it means: Problems reading line with male recombination fractions Code: LN7RPR What it means: Problems reading line with female recombination fractions Code: LCOIPR What it means: Entry in locus order is not between 1 and the number of loci specified. Code: SXDIPR What it means: Problems reading the sex difference entry in the line immediately after the last locus, which has two numbers: Sex difference Interference Code: INFIPR What it means: Problems reading the interference entry, which should be 0, 1 or 2. Code: MRFIPR What it means: Male recombination fraction not in the range [0.0, 1.0] Code: GDRIPR What it means: Problems reading either the sex difference ratio Code: FRFIPR What it means: Female recombination fraction not in the range [0.0, 1.0] Code: PNORPP What it means: Problems reading column 1 entry in pedigree file. This is the most common lsp error. It occurs when there are extra blanks at the end of the file Code: IIDRP What it means: Problems reading column 2 entry in pedigree file. Code: PIDRP What it means: Problems reading column 3 entry in pedigree file. Code: MIDRP What it means: Problems reading column 4 entry in pedigree file. Code: FOSRPP What it means: Problems reading column 5 entry in pedigree file. Code: NPSRPP What it means: Problems reading column 6 entry in pedigree file. Code: NMRSPP What it means: Problems reading column 7 entry in pedigree file. Code: SEXRPP What it means: Problems reading column 8 entry in pedigree file. Code: PRORPP What it means: Problems reading column 9 entry in pedigree file. Code: QANRPP What it means: Problems reading value for quantitative locus in pedigree file. Beware of spurious carriage returns Code: AFFRPP What it means: Problems reading affection status entry in pedigree file Beware of spurious carriage returns Code: BINRPP What it means: Problems reading binary code entry in pedigree file Beware of spurious carriage returns Code: ALERPP What it means: Problems reading allele entry in pedigree file Beware of spurious carriage returns Code: FLDRPR What it means: Cannot find two entries on the first line of a locus description. First entry is locus type, meaning second entry depends on locus type. Code: LDCIPR What it means: First entry in a locus description is something other than 1,2,3,4 Code: NALIPR What it means: Second entry of a locus description is < 1 Code: FGFRPR What it means: Problems finding an allele frequency Code: GFQIPR What it means: Allele frequency is not in the open interval (0.0,1.0) Beware that Genethon publishes some allele frequencies as 0.0 Code: GFSXPR What it means: Warning if allele frequencies sum to < 0.95 or more than 1.05 Code: NQVRPR What it means: Problems reading a quantitative trait locus Code: NQVIPR What it means: Number of classes for a quantitative trait locus is < 1 Code: GTMRPR What it means: Problem reading details of a quantitative trait locus Code: VARRPR What it means: Problems reading variance for quantitative trait locus Code: VARIPR What it means: A variance component is < 0.0 Code: CVMRPR What it means: Problems reading a covariance component Code: VMLRPR What it means: Something to do with a quantitative trait locus, but I don't know what Code: VMLIPR What it means: Something to do with a quantitative trait locus, but I don't know what Code: NLCRPR What it means: Problems reading number of liability classes for affection status Code: NLCIPR What it means: Number of liability classes is < 1 Code: GTPRPR What it means: Problems reading a penetrance Code: GTPIPR What it means: A penetrance is not in the range [0.0, 1.0] Code: NBFRPR What it means: Problems reading number of factors for a binary factors locus Code: NBFIPR What it means: Number of factors is < 1 Code: BFCRPR What it means: Problems reading the meaning of a binary factor combination Code: BFCIPR What it means: A binary factor is not 0 or 1 Code: RKAPR What it means: Problems reading risk allele Code: RKIPR What it means: Risk allele is < 1 Code: CMDRCI What it means: Problems parsing the arguments to lsp Code: CMDOPN What it means: Cannot open one of the data files or arguments to lsp are wrong Code: PEDRCI What it means: Not enough arguments to lsp Code: PEDOPN What it means: Cannot open one of the data files or arguments to lsp are wrong Code: PARRCI What it means: Not enough arguments to lsp Code: PAROPN What it means: Cannot open one of the data files or arguments to lsp are wrong Code: NOLRCI What it means: Not enough arguments to lsp Code: NOLICI What it means: Number of loci given to lsp is < 2 or too many Code: LCORCI What it means: Not enough arguments to lsp Code: LCOICI What it means: Invalid locus number in locus order Code: INFRCI What it means: Not enough arguments to lsp Code: INFICI What it means: Interference value is not 0,1, or 2 in call to lsp Code: SXDRCI What it means: Not enough arguments to lsp Code: SXDICI What it means: Sex difference argument to lsp is not 0,1, or 2 Code: MRFRCI What it means: Not enough arguments to lsp Code: MRFICI What it means: Male recombination fraction argument to lsp is not between 0.0 and 1.0 Code: GDRRCI What it means: Nor enough arguments to lsp Code: GDRICI What it means: Problems reading genetic distance ratio as argument to lsp Code: FRFRCI What it means: Not enough arguments to lsp Code: FRFICI What it means: Problems reading a female recombination fraction as an argument to lsp Code: CMDPAR What it means: Too many arguments to lsp Code: PDFOPN What it means: Problems opening pedigree file Code: DTFOPN What it means: Problems opening data file Code: LOGOPN What it means: Problems opening lsp logfile Code: STMOPN What it means: Problems opening stream file Code: LEPIPR What it means: I wish I knew Code: LEPRPR What it means: You cannot do this with LODSCORE or ILINK Code: GNPIPR What it means: Problems with iterated parameters Code: GNPRPR What it means: You cannot do this with LODSCORE or ILINK Code: TLCRCI What it means: Not enough arguments to lsp Code: TLCIC What it means: Locus number is < 1 or too high as argument to lsp Code: STVRCI What it means: Not enough arguments to lsp Code: STVRCI What it means: Stop value for moving theta is not between 0.0 and 1.0 Code: GRSRCI What it means: Not enough arguments to lsp Code: GRSICI What it means: Number of evaluations in interval or LINKMAP is < 1 Code: RFVRCI What it means: Not enough arguments to lsp Code: RFVICI What it means: For MLINK usage recombination fraction to vary is < 1 or > number of loci Code: INVRCI What it means: Not enough arguments to lsp Code: INVICI What it means: Increment value for MLINK is <= 0.0 Code:NOERCI What it means: Not enough arguments to lsp Code: NOEICI What it means: Number of additional likelihood evaluations for MLINK is < 0 or > some specified limit. Code: IRFRCI What it means: Not enough arguments to lsp Code: IRFICI What it means: Initial recombination fraction for MLINK is not in the range [0.0, 1.0] Code: INTERR What it means: Internal error in lsp. Heaven help you if you get this code! Code: CMDNTF What it means: Lsp does not understand how to set up for this program I think you get this if you ask to run a program that is not one of the LINKAGE main programs. Code: CMDNTU What it means: Similar to CMDNTF. I can't tell the difference. Code: CMDNOD What it means: Probably some junk characters in input Code: SPDRCI What it means: Looking for name of secondary pedigree file and can't find it Code: SPDOPN What it means: Problems opening secondary pedigree file Code: SPRRCI What it means: Looking for name of secondary locus file and can't find it Code: SPROPN What it means: Problems opening secondary locus file Code: OPDRCI What it means: Problems finding the name of output pedigree file (to use as input to unknown) Code: OPDOPN What it means: Problems opening output pedigree file Code: OPRRCI What it means: Problems finding the name of output locus file Code: OPRRCN What it means: Problems opening output locus file Code: FTLXSP What it means: Problems setting up secondary pedigree file Code: SPEMP What it means: Individual has index 0 Code: FSKXSP What it means: Problems with secondary pedigree file Code: PPDEMP What it means: Problems reading a pedigree number Code: PLNRSP What it means: Problems reading from secondary pedigree file Code: PNMXPS What it means: Problems merging primary and secondary pedigree files Code: INMXPS What it means: Problems merging primary and secondary pedigree files Code: FIMXPS What it means: Problems merging primary and secondary pedigree files Code: MIMXPS What it means: Problems merging primary and secondary pedigree files Code: FOMXPS What it means: Problems merging primary and secondary pedigree files Code: NPMXPS What it means: Problems merging primary and secondary pedigree files Code: SXMXPS What it means: Problems merging primary and secondary pedigree files Code: IIDIPP What it means: Problems merging primary and secondary pedigree files Code: PIDIPP What it means: Problems merging primary and secondary pedigree files Code: MIDIPP What it means: Problems merging primary and secondary pedigree files Code: FOSIPP What it means: Problems merging primary and secondary pedigree files Code: NPSIPP What it means: Problems merging primary and secondary pedigree files Code: NMSIPP What it means: Problems merging primary and secondary pedigree files Code: SEXIPP What it means: Problems merging primary and secondary pedigree files Code: PROIPP What it means: Problems merging primary and secondary pedigree files |*| LRP Error Messages Message: Screen width is too small What it means: If you are using a one-window system, there is not much you can do. However, if you have control over your windows, it may help to widen the window in which you run lrp and start over. Message: Screen length is too small What it means: Similar to previous message. Try lengthening your window and starting over. Message: Internal Error What it means: If there is no modifier to describe the Internal Error you have hit a bug in lrp. Message: Internal Error - Length of 'lrp_rprt_scrn' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: You hit a bug in lrp and the authors of the program are protecting you from a core dump. Message: Internal Error - Length of 'lrp_hlp1_scrn' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message: Internal Error - Length of 'lrp_hlp2_scrn' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message; Internal Error - Length of 'lrp_hlp3_scrn' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message: Internal Error - Length of 'lrp_help_line' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message: Internal Error - Length of 'lrp_info_line' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message: Internal Error - Length of 'lrp_cmmd_line' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message: Internal Error - Length of 'lrp_wait_line' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message: Internal Error - Length of 'lrp_vers_line' exceeded LRP_MAX_STRING_BUFFER_LENGTH What it means: See the previous message Message: Internal Error - Memory allocation failure What it means: You are out of memory. Look around for other processes that may be using all the memory. Message: Internal Error - Bad field number What it means: There was a problem in the way you specified the report format Message: Internal Error - Function FSEEK failed What it means: There was a problem modifying the report file. If your disk is on a different machine, this might be a network problem. Message Internal Error - Function TMPNAM failed What it means: I do not know Message: Internal Error - Function FOPEN failed What it Means: Could not open the file that you designated as the report file Possible reasons include improper permission for the directory you are working in or a disk problem. mutl.c: Internal Error - Function LSF_REWIND failed What it Means: Could not read from the stream file that you designated. Maybe it doesn't exist. Maybe the permission is wrong. Maybe there is a disk problem. mutl.c: Internal Error - Function LSF_STATUS_TEXT failed What it Means: While attempting to print out an error message, another error occurred. I cannot figure out why this would happen, though. mutl.c: Internal Error - Function LSF_INFORMATION failed What it Means: While trying to figure out if the stream file was properly formatted, an error occurred. This is probably not an error with the contents of the stream file, but with access to it. rful.c: Internal error - LSF_READ error detected What it Means: Problems reading the contents of your stream file. Although the lsf_read routine reports a diagnostic of the error, this diagnostic is not used in the error printing routine. rloc.c: Internal error - LSF_ALLOCATE error detected What it Means: Memory allocation problem rloc.c: Internal error - LSF_READ_SET error detected What it Means: Problems reading the contents of the stream file ulth.c: Must specify temporary file name What it Means: You mangled the file specifications for the input or output files. Start over. ulth.c: Must specify temporary file name What it Means: You mangled the file specifications for the input or output files. Start over. ulth.c: Must specify report file name What it Means: You mangled the file specifications for the input or output files. Start over. ulth.c: Must specify stream file name What it Means: You mangled the file specifications for the input or output files. Start over. ulth.c: Must specify report title What it Means: You mangled the file specifications for the input or output files. Start over. fastlink-4.1P-fix95/README.ALPHAVMS0000644000265600020320000000751306737457627015526 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: October 9, 1997 The following are instructions for running FASTLINK 4.0P on DEC Alphas which run the OpenVMS operating system. The instructions were mostly put together by FASTLINK user Kimmo Kallio in Finland with recent adapatations by Don Plugge in the U.S.. Thanks Kimmo and Don! There are two fundamental problems in porting FASTLINK to a VMS system, compilation and checkpointing. Since checkpointing provides extra functionality over LINKAGE, for now we are primarily concerned with ensuring that the checkpointing does not break anything during runs that do not crash. It is not clear whether crash-recovery works on VMS. Kimmo has solved the compilation problem by creating his own make utility for OpenVMS. Note that there may be problems in porting this utility to VMS on a VAX. Here are the instructions I got via Kimmo. The top level directory after you untar the FASTLINK package is called fastlink. The main source code files can be found in the subdirectory 4.0P/src. In the subdirectory 4.0P/alphavms, you will find the following extra files. 1. checkpointdefs.h (intended to replace the checkpointdefs.h that comes with FASTLINK) 2. maketool_vms.com (command file to assist with Make) 3. maketool_vms.c (little C program to assist with make) Here are the instructions, as I understand them. 1. Read comments in maketool_vms.com and maketool_vms.c 2. Among other things, these comments refer you to an ftp site from which you can retrieve a version of make for OpenVMS. 3. Install the make that you retrieve. 4. Make sure all the 3 files from the alphavms directory are in the same directory as the main FASTLINK source code files. Note that you will overwrite checkpointdefs.h with the new version. 5. Unlike in version 2.2, you may now use the regular Makefile provided with the FASTLINK distribution. Find the section in the Makefile marked "VMS Specific". Follow the directions there to uncomment all of the lines below up to (but not including) the line that starts "END: VMS". 6. Now you can make any of the targets in Makefile as on UNIX. Note that you should make the make_tool target first, since it is used to make all the FASTLINK targets. Caution: The file commondefs.h includes certain .h files, which have definitions that come with any C compiler. The way these files are #included in commondefs.h makes standard assumptions about the user's search path and where the files are found. If you get compilation errors suggesting that these .h files cannot be found, you need to ask your system administrator where the files are on your VMS system and modify the #include lines at the top of commondefs.h accordingly. The compiled executables will end up in the source directory. You need to move them to where you want the exeutables to reside, and you will probably want to rename them to add the extension exe to the file name. Kimmo has also provided a couple of other utility programs that can be found in the 4.0P/alphavms subdirectory. 1. setup.com -- A simplified version of a linkage setup file for VMS used at the National Public Health institute in Finland. 2. start_pedin.com -- A simplified version of a command file used to start linkage batch jobs on VMS; to be used with SETUP.COM. Thanks again to Kimmo for all his work. A more traditional way to compile on VMS is to use the MMS utility. In the subdirectory 4.0P/vaxvms you will find mms files called old.mms and new.mms that may be used on either VAX or Alpha. old.mms is a slight change from what used to work on some VAX systems for earlier versions of FASTLINK. The change reflects the existence of new code files (unknown.h and loopbrk.c). new.mms is a varient put together by Don Plugge that explicitly links in libraries to provide certain standard UNIX file functions. See README.VAX.fastlink-4.1P-fix95/paper7.ps0000644000265600020320000136026006737457773015202 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvips 5.74 (MiKTeX 1.09) Copyright 1997 Radical Eye Software (www.radicaleye.com) %%Title: fvs-uai99.dvi %%CreationDate: Mon May 10 18:33:51 1999 %%Pages: 8 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%EndComments %DVIPSCommandLine: dvips fvs-uai99 %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 1999.05.10:1833 %%BeginProcSet: tex.pro %! /TeXDict 300 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{dup length product length le{dup length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false} ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot} imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}B /d{ -3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w} B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginProcSet: special.pro %! TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{ /CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{ 10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{} N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{itransform lineto} }{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{ itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{ closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp {pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray} N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale true def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial {CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath }N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{ end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin} N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{ /SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin 39158280 55380996 1000 600 600 (C:\AAMYDOCS\uai99\FVS/fvs-uai99.dvi) @start %DVIPSBitmapFont: Fa cmmi9 9 3 /Fa 3 87 df<000FFFFFFFFFFE000FFFFFFFFFFE000FFFFFFFFFFC00003FC00003FC0000 3FC00000FC00003FC000007C00003F8000003C00003F8000003C00007F8000001C00007F 8000001800007F0000001800007F000000180000FF000000180000FF000000180000FE00 0300180000FE000300180001FE000700380001FE000600300001FC000600000001FC000E 00000003FC000E00000003FC001C00000003F8007C00000003FFFFFC00000007FFFFFC00 000007FFFFF800000007F000F800000007F000380000000FF000380000000FF000300000 000FE000300000000FE000300060001FE0007000E0001FE0006000C0001FC0006001C000 1FC000000180003FC000000180003FC000000380003F8000000300003F8000000700007F 8000000E00007F8000000E00007F0000001E00007F0000003C0000FF0000007C0000FF00 0000F80000FE000003F80001FE00001FF000FFFFFFFFFFF000FFFFFFFFFFF000FFFFFFFF FFE00037337DB239>69 D<000FFFFFFFFFFC000FFFFFFFFFFC000FFFFFFFFFF800003FC0 0007F800003FC00000F800003FC000007800003F8000007800003F8000003800007F8000 003800007F8000003000007F0000003000007F000000300000FF000000300000FF000000 300000FE000000300000FE000600300001FE000E00700001FE000C00600001FC000C0000 0001FC000C00000003FC001C00000003FC003800000003F8003800000003F800F8000000 07FFFFF800000007FFFFF800000007FFFFF000000007F001F00000000FF000F00000000F F000600000000FE000600000000FE000600000001FE000E00000001FE000C00000001FC0 00C00000001FC000C00000003FC000000000003FC000000000003F8000000000003F8000 000000007F8000000000007F8000000000007F0000000000007F000000000000FF000000 000000FF000000000000FE000000000001FF0000000000FFFFFF00000000FFFFFF000000 00FFFFFF0000000036337DB231>I86 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fb cmsy9 9 1 /Fb 1 107 df<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F060044B78B715>106 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fc cmsy5 5 1 /Fc 1 4 df<00E00000E00000E00000E000F0E1E0F843E07E4FC00F5E0001F00001F000 0F5E007E4FC0F843E0F0E1E000E00000E00000E00000E00013127B921F>3 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fd cmmi12 12 6 /Fd 6 120 df<000007FE00007FFF0001FFFE0007F800001FE000003F8000007F000000 FE000001FC000003F8000007F800000FF000000FE000001FE000003FE000003FC000003F C000007FFFFFC07FFFFFE07FFFFFE07F800000FF800000FF000000FF000000FF000000FF 000000FF000000FF000000FE000000FE0000007E0000007F0000007F0000003F0000003F 0000003F8000001F8000000FC0000007C0000C03E0003C01F000F000FC07C0003FFF0000 07F800202C7CAA27>15 D<00000FC0000000007FF000000001F8381C000007E01C7E0000 0FC00E7E00003F0007FE00007F0003FC0000FE0003FC0001FC0003FC0001F80001FC0003 F80001F80007F00001F8000FF00001F8000FE00003F8001FE00003F0001FE00003F0003F C00003F0003FC00007F0007FC00007E0007F800007E0007F800007E0007F80000FE000FF 80000FC000FF00000FC000FF00000FC000FF00001FC000FF00001F8000FE00001F8000FE 00001F8000FE00003F8030FE00003F0070FE00003F0060FE00003F0060FE00007F00E0FE 00007F00C0FE0000FE00C07E0001FE00C07E0003FE01C03E00073E01803F000E3E03801F 001C3E03000F80381F070007C0F00F0E0001FFC007FC00007F0001F0002C2D7CAB33>97 D<000FE0000007FFE0000007FFE0000007FFE00000001FC00000000FC00000001FC00000 001FC00000001F800000001F800000001F800000003F800000003F000000003F00000000 3F000000007F000000007E000000007E000000007E00000000FE00000000FC00000000FC 00000000FC00000001FC00000001F800000001F80FC00001F83FF00003F8F07C0003F3C0 3E0003F7001F0003FE001F8007FC000F8007F8000FC007F0000FC007F0000FE00FE0000F E00FC0000FE00FC0000FE00FC0000FE01FC0000FE01F80000FE01F80000FE01F80001FE0 3F80001FE03F00001FE03F00001FE03F00003FE07F00003FC07E00003FC07E00003FC07E 00007FC07E00007F80FC00007F80FC00007F00FC0000FF00FC0000FF00FC0001FE007C00 01FC007C0001FC007C0003F8007C0007F0007C0007E0003C000FE0003E001FC0001E003F 80001F007E00000F00FC000007C1F0000001FFC00000007F00000023467CC429>I<0000 07F80000003FFF000000FC07C00003F000E00007E00070001F800030003F000070007E00 03F800FE0007F801FC0007F803F8000FF007F8000FF007F0000FF00FF00007C01FE00000 001FE00000003FC00000003FC00000007FC00000007F800000007F800000007F80000000 FF80000000FF00000000FF00000000FF00000000FF00000000FE00000000FE00000000FE 00000000FE00000000FE00000000FE00000018FE00000038FE000000707E000000E07E00 0001C03F000003803F000007001F80001E000F8000380007C001F00003F00FC00000FFFE 0000001FF00000252D7CAB2A>I<00F80003FC00007F800003FE001FFF0003FFE000071F 007C0FC00F81F8000E0F80E007E01C00FC001C0FC3C003E078007C001807C70003F0E000 7E001807CE0001F1C0003E003807DC0001FB80003F003007D80001FB00003F00300FF800 01FF00003F00700FF00001FE00003F00600FE00001FC00003F00600FE00001FC00003F00 E00FC00003F800007F00C01FC00003F800007E00C01F800003F000007E00001F800003F0 00007E00001F800007F00000FE00003F800007F00000FC00003F000007E00000FC00003F 000007E00000FC00003F00000FE00001FC00007F00000FE00001F800007E00000FC00001 F800007E00000FC00003F800007E00001FC00003F00000FE00001FC00003F00000FC0000 1F800007F00000FC00001F800007E00000FC00003F800007E00E01FC00003F80000FE00C 01F800003F00000FC00C01F800003F00001FC00C01F800007F00001F801C03F800007F00 001F801803F000007E00001F803803F000007E00001F003003F00000FE00001F007007F0 0000FE00001F006007E00000FC00001F00E007E00000FC00001F01C007E00001FC00000F 03800FE00001FC00000F87000FC00001F8000003FE000380000070000000F8004F2D7DAB 55>109 D<003E00000000003800FF800001C000FC03C3C00007E001FE0703E00007E001 FE0601F00007E001FE0E01F0000FE001FE1C01F0000FC001FE1803F0000FC000FE3803F0 000FC0007E3003F0001FC0003E7003F0001F80003E6007F0001F80001E6007E0001F8000 1E6007E0003F80001EE00FE0003F00001CC00FC0003F00000C001FC0003F00000C001F80 007F00001C001F80007E000018003F80007E000018003F00007E000018003F0000FE0000 38007F0000FE000030007E0000FC000030007E0000FC000030007E0001FC00007000FE00 01FC00006000FC0001F800006000FC0001F80000E000FC0001F80000C000FC0001F80000 C000F80003F00001C000F80003F000018000F80003F000038000F80003F000030000F800 03F000070000FC0007F000060000FC0007F8000E00007C000FF8001C00007E000CF80018 00003E001CFC003800001F00387E00F000000FC0F01F01C0000003FFC00FFF800000007F 0001FE00003F2D7DAB46>119 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fe cmr12 12 8 /Fe 8 100 df<00000C00001C0000380000700000E00001C00003C0000780000F00000F 00001E00003C00003C0000780000F80000F00001F00001E00003E00003E00007C00007C0 0007C0000F80000F80000F80001F00001F00001F00003F00003F00003E00003E00007E00 007E00007E00007E00007C00007C00007C0000FC0000FC0000FC0000FC0000FC0000FC00 00FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00 00FC0000FC00007C00007C00007C00007E00007E00007E00007E00003E00003E00003F00 003F00001F00001F00001F00000F80000F80000F800007C00007C00007C00003E00003E0 0001E00001F00000F00000F800007800003C00003C00001E00000F00000F000007800003 C00001C00000E000007000003800001C00000C166476CA26>40 DI<0001FF0000000FFFE000003FFFFC0000FE01FE0001F0007F8003 C0003FC00700001FE00E00001FE00E00000FF00FE0000FF01FF0000FF81FF0000FF81FF0 0007F81FF80007F81FF00007F81FF00007F80FE0000FF803C0000FF80000000FF0000000 0FF00000000FF00000001FE00000001FE00000003FC00000003F800000007F00000000FE 00000001FC00000003F00000001FC000000FFF0000000FFFF000000001FC000000007F00 0000003F800000001FC00000000FE00000000FF000000007F800000007FC00000003FC00 000003FE00000003FE00000001FE00000001FF00000001FF00000001FF1E000001FF7F80 0001FFFFC00001FFFFC00001FFFFC00001FFFFC00001FFFFC00001FEFF800003FEFF8000 03FE7E000003FC70000007FC30000007F83800000FF81C00000FF00E00001FE00780003F C003E0007F8001FE01FE00007FFFF800000FFFE0000001FF000028447CC131>51 D<000007FC0000003FFF000000FFFFC00003FC03E00007E000F0001FC00038003F000058 007E0001FC00FE0003FC00FC0007FC01F80007FC03F00007FC03F00007FC07E00003F80F E00001F00FE00000001FC00000001FC00000001FC00000003F800000003F800000003F80 0000007F800000007F800000007F007F80007F01FFF0007F0780FC00FF0E003E00FF1C00 1F80FF38000FC0FF700007E0FF600007E0FFE00003F0FFC00003F8FFC00001F8FFC00001 FCFF800001FCFF800000FEFF800000FEFF800000FEFF000000FFFF000000FFFF000000FF FF000000FF7F000000FF7F000000FF7F000000FF7F000000FF7F000000FF7F800000FF3F 800000FF3F800000FF3F800000FE1F800000FE1F800001FE1FC00001FC0FC00001FC0FC0 0003F807E00003F807E00007F003F00007E001F8000FC000FC001F80007E003F00003F80 FE00000FFFF8000003FFE0000000FF800028447CC131>54 D<7FFFFFFFFFFFFFFF00FFFF FFFFFFFFFFFF80FFFFFFFFFFFFFFFF807FFFFFFFFFFFFFFF000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFF00FFFF FFFFFFFFFFFF80FFFFFFFFFFFFFFFF807FFFFFFFFFFFFFFF0041187BA44C>61 D<0007FC000000003FFF80000000F80FE0000003C003F00000070001F800000E0000FC00 000FC0007E00001FE0007F00001FF0003F80001FF0003F80001FF0003F80001FF0001FC0 001FF0001FC0000FE0001FC0000380001FC0000000001FC0000000001FC0000000001FC0 000000001FC00000000FFFC0000001FFFFC000000FFE1FC000003FC01FC00000FF001FC0 0003FC001FC00007F8001FC0000FF0001FC0001FE0001FC0003FC0001FC0007FC0001FC0 007F80001FC0007F80001FC060FF00001FC060FF00001FC060FF00001FC060FF00003FC0 60FF00003FC060FF00003FC060FF80007FC0607F8000EFC0607FC000C7E0C03FC001C7E0 C01FE00783F1C007F81E03FF8001FFFC01FF00001FE0007C002B2E7CAC31>97 D<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC03FC000001FC0FFF800001FC3C07E00001FC7001F80001FDE0007E 0001FD80003F0001FF80001F8001FF00001FC001FE00000FE001FC000007E001FC000007 F001FC000007F001FC000003F801FC000003F801FC000003FC01FC000003FC01FC000001 FC01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001 FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001FE01FC000001 FC01FC000003FC01FC000003FC01FC000003F801FC000003F801FC000007F001FC000007 F001FE00000FE001FE00000FC001FF00001FC001FB00003F8001F380007E0001E1C000FC 0001E0F001F80001C03C07E00001801FFF8000000003FC00002F467DC436>I<00007F80 000003FFF000000FC07C00003F000F0000FC00038001F80001C003F8000FC007F0001FE0 07E0003FE00FE0003FE01FC0003FE01FC0003FE03F80003FE03F80001FC07F800007007F 800000007F800000007F00000000FF00000000FF00000000FF00000000FF00000000FF00 000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000007F0000 00007F800000007F800000003F800000003F800000303FC00000301FC00000700FE00000 600FE00000E007F00000C003F80001C001F800038000FC000700003F001E00001FC07800 0007FFF0000000FF8000242E7DAC2B>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Ff lasy10 10 1 /Ff 1 51 df<3FFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000F F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000F F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000F F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000F F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000F F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000F F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000F F0000000000FF0000000000FF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF303079B43E>50 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fg cmr6 6 5 /Fg 5 118 df<0C003F003F003F003F000C0000000000000000000000000000000F00FF 00FF001F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F 00FFE0FFE00B237DA212>105 D<0F07F000FF1FFC00FF703E001FC01E000F800F000F80 0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00 0F000F000F000F000F000F000F000F000F000F000F00FFF0FFF0FFF0FFF01C167D9522> 110 D<007E0003FFC00781E00F00F01E00783C003C3C003C78001E78001EF8001FF8001F F8001FF8001FF8001FF8001FF8001F78001E7C003E3C003C3E007C1F00F80F81F003FFC0 00FF0018187D961E>I<0180000180000180000180000380000380000780000780000F80 003F8000FFFF80FFFF800780000780000780000780000780000780000780000780000780 000780000780C00780C00780C00780C00780C00780C003C18003E30001FE00007C001220 7E9E18>116 D<0F000F00FF00FF00FF00FF001F001F000F000F000F000F000F000F000F 000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F 000F000F001F000F001F0007003F8007C0EFF003FF8FF000FE0F001C177D9522>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fh cmbx10 10 47 /Fh 47 120 df<00001C00003C0000F80001F00003E00007E0000FC0001F80001F00003F 00007E0000FE0000FC0001FC0001F80003F80003F80007F00007F0000FF0000FE0001FE0 001FE0001FC0003FC0003FC0003FC0003FC0007F80007F80007F80007F80007F8000FF80 00FF8000FF8000FF8000FF8000FF8000FF8000FF8000FF8000FF8000FF8000FF8000FF80 00FF8000FF8000FF8000FF80007F80007F80007F80007F80007F80003FC0003FC0003FC0 003FC0001FC0001FE0001FE0000FE0000FF00007F00007F00003F80003F80001F80001FC 0000FC0000FE00007E00003F00001F00001F80000FC00007E00003E00001F00000F80000 3C00001C165377BD25>40 DI<0F803FE07FF07FF0FFF8FFF8FFFCFFFCFFFC7FFC 7FFC3FFC0F9C001C003C0038003800380078007000F001E001E003C007800F001F001C00 18000E1D798C1B>44 D<0F803FE07FF07FF0FFF8FFF8FFF8FFF8FFF87FF07FF03FE00F80 0D0D798C1B>46 D<00001E000000003E00000000FE00000007FE0000003FFE0000FFFFFE 0000FFFFFE0000FFFFFE0000FFCFFE0000000FFE0000000FFE0000000FFE0000000FFE00 00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000 000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000000 0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000F FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE 0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00 00000FFE0000000FFE00007FFFFFFF807FFFFFFF807FFFFFFF807FFFFFFF80213779B630 >49 D<000FFC0000007FFFC00001FFFFF00007FFFFFC000FF03FFF001F800FFF803F0003 FFC07F0003FFC07FC001FFE0FFE000FFF0FFF000FFF0FFF000FFF0FFF0007FF8FFF0007F F8FFF0007FF8FFF0007FF87FE0007FF83FC0007FF80F00007FF80000007FF8000000FFF0 000000FFF0000000FFE0000001FFE0000001FFC0000003FF80000003FF00000007FE0000 0007FC0000000FF80000001FF00000003FE00000007F800000007F00000000FE00000001 F800000003F000780007E00078000FC00078001F800078003E0000F8007C0000F000F800 00F001F00001F003FFFFFFF003FFFFFFF007FFFFFFF00FFFFFFFF01FFFFFFFF03FFFFFFF F07FFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE025377BB630>I<0003FF 0000001FFFF000007FFFFC0001FC07FF0003F003FF8007E001FFC007C000FFE00FF000FF E00FFC00FFF01FFC00FFF01FFE00FFF01FFE00FFF01FFE00FFF01FFE00FFF01FFE00FFF0 0FFC00FFE00FFC00FFE003F001FFE0000001FFC0000003FF80000003FF00000007FE0000 000FFC0000003FF000000FFFC000000FFF0000000FFFF000000007FE00000001FF800000 00FFC0000000FFE00000007FF00000007FF80000007FFC0000003FFC0000003FFC000000 3FFE1FC0003FFE3FE0003FFE7FF0003FFEFFF8003FFEFFF8003FFEFFF8003FFEFFF8003F FEFFF8003FFCFFF8003FFCFFF0007FF87FF0007FF87FC000FFF03F8000FFE01FC001FFC0 0FFC07FF8007FFFFFF0001FFFFFC00007FFFF0000007FF000027387CB630>I<00000007 C0000000000FC0000000000FC0000000001FC0000000003FC0000000007FC000000000FF C000000000FFC000000001FFC000000003FFC000000007FFC00000000FFFC00000000FFF C00000001EFFC00000003CFFC00000007CFFC0000000F8FFC0000000F0FFC0000001E0FF C0000003C0FFC0000007C0FFC000000F80FFC000000F00FFC000001E00FFC000003C00FF C000007C00FFC00000F800FFC00000F000FFC00001E000FFC00003C000FFC00007C000FF C0000F8000FFC0000F0000FFC0001E0000FFC0003C0000FFC0007C0000FFC000F80000FF C000FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF80000001FFC000000001FF C000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FF C000000001FFC000000001FFC0000003FFFFFF800003FFFFFF800003FFFFFF800003FFFF FF8029377DB630>I<1C000000C01F800007C01FF8007FC01FFFFFFF801FFFFFFF801FFF FFFF001FFFFFFE001FFFFFFC001FFFFFF0001FFFFFE0001FFFFF80001FFFFE00001FFFF0 00001F000000001F000000001F000000001F000000001F000000001F000000001F000000 001F000000001F07FE00001F3FFFE0001FFFFFF8001FFC07FC001FE003FF001F8001FF80 1F0000FFC00E0000FFC0000000FFE00000007FE00000007FF00000007FF00000007FF800 00007FF80600007FF83F80007FF87FE0007FF8FFE0007FF8FFF0007FF8FFF0007FF8FFF0 007FF8FFF0007FF8FFE0007FF0FFE0007FF07FC000FFF07F0000FFE07C0000FFC03E0001 FFC01F0003FF801FC007FF000FF01FFE0007FFFFF80001FFFFE000007FFF8000000FF800 0025387BB630>I<00000FF8000000FFFE000003FFFF80000FF80FC0003FE003E0007FC0 01F000FF000FF001FF001FF803FE003FF807FC003FF80FFC003FF80FF8003FF81FF8003F F81FF8003FF83FF8001FF03FF8000FE03FF00000007FF00000007FF00000007FF0080000 7FF07FF000FFF1FFFC00FFF3FFFF00FFF780FF80FFFF007FC0FFFE003FE0FFFC003FF0FF FC001FF8FFF8001FF8FFF8001FFCFFF8001FFCFFF8001FFCFFF0001FFEFFF0001FFEFFF0 001FFEFFF0001FFEFFF0001FFE7FF0001FFE7FF0001FFE7FF0001FFE7FF0001FFE7FF000 1FFE3FF0001FFE3FF0001FFC3FF0001FFC1FF8001FFC1FF8001FF80FF8003FF807FC003F F007FC007FE003FE007FC001FF81FF8000FFFFFF00003FFFFC00000FFFF0000001FF8000 27387CB630>I<0F803FE07FF07FF0FFF8FFF8FFF8FFF8FFF87FF07FF03FE00F80000000 000000000000000000000000000000000000000F803FE07FF07FF0FFF8FFF8FFF8FFF8FF F87FF07FF03FE00F800D2579A41B>58 D<00000003E00000000000000007F00000000000 000007F0000000000000000FF8000000000000000FF8000000000000000FF80000000000 00001FFC000000000000001FFC000000000000003FFE000000000000003FFE0000000000 00003FFE000000000000007FFF000000000000007FFF00000000000000FFFF8000000000 0000FFFF80000000000000FFFF80000000000001FFFFC0000000000001F3FFC000000000 0003F3FFE0000000000003E1FFE0000000000003E1FFE0000000000007E1FFF000000000 0007C0FFF000000000000FC0FFF800000000000F807FF800000000000F807FF800000000 001F807FFC00000000001F003FFC00000000003F003FFE00000000003E001FFE00000000 003E001FFE00000000007E001FFF00000000007C000FFF0000000000FC000FFF80000000 00F80007FF8000000000F80007FF8000000001F80007FFC000000001F00003FFC0000000 03FFFFFFFFE000000003FFFFFFFFE000000003FFFFFFFFE000000007FFFFFFFFF0000000 07C00000FFF00000000FC00000FFF80000000F8000007FF80000000F8000007FF8000000 1F8000007FFC0000001F0000003FFC0000003F0000003FFE0000003E0000001FFE000000 3E0000001FFE0000007E0000001FFF0000007C0000000FFF000000FE0000000FFF8000FF FFF80007FFFFFF80FFFFF80007FFFFFF80FFFFF80007FFFFFF80FFFFF80007FFFFFF8041 3A7DB948>65 D<0000003FFC0001C0000003FFFFC003C000001FFFFFF007C00000FFFFFF FC0FC00003FFFC00FF3FC00007FFC0001FFFC0001FFE00000FFFC0003FFC000003FFC000 7FF0000001FFC000FFE0000000FFC001FFC0000000FFC003FFC00000007FC007FF800000 003FC00FFF000000003FC00FFF000000001FC01FFE000000001FC01FFE000000000FC03F FE000000000FC03FFC000000000FC03FFC0000000007C07FFC0000000007C07FFC000000 0007C07FF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FF F8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000 000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FF F80000000000007FF80000000000007FFC0000000000007FFC0000000003C03FFC000000 0003C03FFC0000000003C03FFE0000000003C01FFE0000000007C01FFE0000000007C00F FF0000000007800FFF000000000F8007FF800000000F0003FFC00000001F0001FFC00000 003E0000FFE00000007E00007FF8000000FC00003FFC000001F800001FFF000003F00000 07FFC0000FE0000003FFFC00FF80000000FFFFFFFE000000001FFFFFF80000000003FFFF E000000000003FFE0000003A3B7BB945>67 D69 DI<0000003FFC0001C000000003FFFFC003C00000001FFFFFF007 C0000000FFFFFFFC0FC0000003FFFC00FF3FC0000007FFC0001FFFC000001FFE00000FFF C000003FFC000003FFC000007FF0000001FFC00000FFE0000000FFC00001FFC0000000FF C00003FFC00000007FC00007FF800000003FC0000FFF000000003FC0000FFF000000001F C0001FFE000000001FC0001FFE000000000FC0003FFE000000000FC0003FFC000000000F C0003FFC0000000007C0007FFC0000000007C0007FFC0000000007C0007FF80000000000 0000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000000000 0000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000000000 0000FFF800000000000000FFF800000000000000FFF800000000000000FFF800003FFFFF FF80FFF800003FFFFFFF807FF800003FFFFFFF807FFC00003FFFFFFF807FFC00000003FF C0003FFC00000003FFC0003FFC00000003FFC0003FFE00000003FFC0001FFE00000003FF C0001FFE00000003FFC0000FFF00000003FFC0000FFF00000003FFC00007FF80000003FF C00003FFC0000003FFC00001FFE0000003FFC00000FFE0000003FFC000007FF8000007FF C000003FFC000007FFC000001FFF00000FFFC0000007FFC0001FFFC0000003FFFC00FF3F C0000000FFFFFFFE0FC00000001FFFFFF803C000000003FFFFE000C0000000003FFE0000 0000413B7BB94B>III76 DI<000000FFF800000000000FFFFF80000000007FFFFFF000000001FFC01FFC00 000007FF0007FF0000001FFC0001FFC000003FF000007FE000007FE000003FF00000FFC0 00001FF80001FF8000000FFC0003FF8000000FFE0007FF00000007FF0007FF00000007FF 000FFE00000003FF800FFE00000003FF801FFC00000001FFC01FFC00000001FFC03FFC00 000001FFE03FFC00000001FFE03FFC00000001FFE07FF800000000FFF07FF800000000FF F07FF800000000FFF07FF800000000FFF0FFF800000000FFF8FFF800000000FFF8FFF800 000000FFF8FFF800000000FFF8FFF800000000FFF8FFF800000000FFF8FFF800000000FF F8FFF800000000FFF8FFF800000000FFF8FFF800000000FFF8FFF800000000FFF8FFF800 000000FFF87FF800000000FFF07FFC00000001FFF07FFC00000001FFF07FFC00000001FF F03FFC00000001FFE03FFC00000001FFE03FFE00000003FFE01FFE00000003FFC01FFE00 000003FFC00FFF00000007FF8007FF00000007FF0007FF8000000FFF0003FFC000001FFE 0001FFC000001FFC0000FFE000003FF800007FF000007FF000003FFC0001FFE000001FFF 0007FFC0000007FFC01FFF00000001FFFFFFFC000000007FFFFFF0000000000FFFFF8000 00000000FFF80000003D3B7BB948>79 DI82 D<0007FF000E00003FFFE01E0000FFFFF83E0003 FFFFFE7E0007FC01FFFE000FF0001FFE001FE0000FFE003FC00003FE003F800001FE007F 800000FE007F000000FE007F0000007E00FF0000007E00FF0000003E00FF0000003E00FF 8000003E00FF8000001E00FFC000001E00FFE000001E00FFF000000000FFFC000000007F FFE00000007FFFFE0000007FFFFFF000003FFFFFFE00003FFFFFFF80001FFFFFFFC0000F FFFFFFF00007FFFFFFF80003FFFFFFFC0000FFFFFFFE00003FFFFFFE00000FFFFFFF0000 01FFFFFF0000000FFFFF800000007FFF800000000FFFC000000003FFC000000001FFC000 000000FFC0F00000007FC0F00000007FC0F00000007FC0F00000003FC0F00000003FC0F8 0000003FC0F80000003F80FC0000003F80FC0000007F80FE0000007F00FF0000007F00FF 800000FE00FFE00001FC00FFF80003FC00FFFF801FF800FCFFFFFFE000F83FFFFFC000F0 07FFFE0000E0007FF000002A3B7BB935>I<3FFFFFFFFFFFFF803FFFFFFFFFFFFF803FFF FFFFFFFFFF803FFFFFFFFFFFFF803FF800FFF003FF807FC000FFF0007FC07F8000FFF000 1FC07E0000FFF0000FC07E0000FFF0000FC07C0000FFF00007C07C0000FFF00007C07800 00FFF00003C0780000FFF00003C0780000FFF00003C0780000FFF00003C0F80000FFF000 03E0F00000FFF00001E0F00000FFF00001E0F00000FFF00001E0F00000FFF00001E00000 00FFF0000000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF000 0000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF00000000000 00FFF0000000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF000 0000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF00000000000 00FFF0000000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF000 0000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF00000000000 00FFF0000000000000FFF0000000000000FFF0000000000000FFF0000000000000FFF000 0000000FFFFFFFFF0000000FFFFFFFFF0000000FFFFFFFFF0000000FFFFFFFFF00003B38 7DB742>I87 D<003FFE00000003FFFFE000 000FFFFFF800001FF00FFE00003FF003FF00003FF801FF80003FF800FFC0003FF800FFC0 003FF8007FE0003FF8007FE0001FF0007FE0000FE0007FE0000380007FE0000000007FE0 000000007FE00000003FFFE000000FFFFFE000007FFFFFE00001FFF87FE00007FF807FE0 000FFE007FE0003FF8007FE0003FF0007FE0007FE0007FE000FFE0007FE000FFC0007FE0 00FFC0007FE000FFC0007FE000FFC0007FE000FFC000FFE000FFE001FFE0007FE001FFE0 003FF007FFF8001FFC1FBFFFC00FFFFE1FFFC003FFF80FFFC0003FE003FFC02A257DA42E >97 D<00FF00000000FFFF00000000FFFF00000000FFFF00000000FFFF0000000007FF00 00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 00000003FF0000000003FF0000000003FF0000000003FF01FF800003FF0FFFF00003FF3F FFFC0003FFFE03FF0003FFF000FF8003FFE0007FC003FF80003FE003FF00003FF003FF00 001FF803FF00001FF803FF00001FFC03FF00000FFC03FF00000FFC03FF00000FFE03FF00 000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00 000FFE03FF00000FFE03FF00000FFE03FF00000FFC03FF00000FFC03FF00000FFC03FF00 001FF803FF00001FF803FF00001FF003FF80003FF003FFC0007FE003FFE0007FC003FDF0 01FF8003F8FC07FE0003F03FFFF80003E00FFFE00003C003FF00002F3A7EB935>I<0001 FFC000000FFFFC00007FFFFF0000FF80FF8003FE00FFC007FC01FFC00FF801FFC01FF801 FFC01FF001FFC03FF001FFC03FF000FF807FE0007F007FE0001C007FE0000000FFE00000 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE00000007FE00000007FE00000007FF00000003FF00000003FF00001E01FF80001E01F F80003E00FFC0007C007FE00078003FF001F8000FFC07E00007FFFFC00000FFFF0000001 FF800023257DA42A>I<000000007F800000007FFF800000007FFF800000007FFF800000 007FFF8000000003FF8000000001FF8000000001FF8000000001FF8000000001FF800000 0001FF8000000001FF8000000001FF8000000001FF8000000001FF8000000001FF800000 0001FF8000000001FF8000000001FF8000000001FF8000000001FF800001FF81FF80000F FFF1FF80003FFFFDFF8000FFC07FFF8003FF001FFF8007FC0007FF800FFC0003FF801FF8 0001FF801FF00001FF803FF00001FF803FF00001FF807FE00001FF807FE00001FF807FE0 0001FF80FFE00001FF80FFE00001FF80FFE00001FF80FFE00001FF80FFE00001FF80FFE0 0001FF80FFE00001FF80FFE00001FF80FFE00001FF80FFE00001FF807FE00001FF807FE0 0001FF807FF00001FF803FF00001FF803FF00001FF801FF80003FF800FF80007FF8007FC 000FFF8003FE001FFFC001FF80FDFFFE007FFFF9FFFE001FFFE1FFFE0003FF01FFFE2F3A 7DB935>I<0003FF8000001FFFF000007FFFFC0001FF83FE0003FE007F8007FC003F800F F8003FC01FF8001FE01FF0001FE03FF0000FF03FF0000FF07FE0000FF07FE0000FF87FE0 0007F8FFE00007F8FFE00007F8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFE0000000FFE000 0000FFE0000000FFE00000007FE00000007FE00000007FE00000003FF00000003FF00000 781FF00000780FF80000F80FFC0000F007FC0003F001FF000FE000FFC07FC0007FFFFF00 000FFFFC000001FFE00025257DA42C>I<00001FF0000001FFFC000007FFFF00001FF87F 80003FE0FF8000FFC1FFC000FFC1FFC001FF81FFC001FF81FFC003FF01FFC003FF00FF80 03FF00FF8003FF003E0003FF00000003FF00000003FF00000003FF00000003FF00000003 FF00000003FF00000003FF000000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF000003FF 00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00 000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 0003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000 03FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000FF FFFE0000FFFFFE0000FFFFFE0000FFFFFE0000223A7DB91D>I<000000001F000007FE00 FFC0007FFFE3FFC001FFFFFFEFE007FE07FF8FE00FF801FF1FE01FF000FF8FE03FF000FF CFE03FE0007FC7C03FE0007FC0007FE0007FE0007FE0007FE0007FE0007FE0007FE0007F E0007FE0007FE0007FE0007FE0003FE0007FC0003FE0007FC0003FF000FFC0001FF000FF 80000FF801FF000007FE07FE00000FFFFFF800000F7FFFE000001E07FE0000001E000000 00001E00000000003E00000000003F00000000003F80000000001FC0000000001FFFFFF8 00001FFFFFFF80001FFFFFFFE0000FFFFFFFF80007FFFFFFFC0003FFFFFFFE0007FFFFFF FE001FFFFFFFFF003FC0000FFF007F000000FF80FF0000007F80FE0000007F80FE000000 3F80FE0000003F80FE0000003F80FF0000007F807F0000007F007F800000FF003FC00001 FE001FF00007FC0007FE003FF00001FFFFFFC000007FFFFF00000007FFF000002B377DA5 30>I<00FF00000000FFFF00000000FFFF00000000FFFF00000000FFFF0000000007FF00 00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 00000003FF0000000003FF0000000003FF0000000003FF007FC00003FF03FFF80003FF0F FFFE0003FF1F03FF0003FF3C01FF8003FF7801FF8003FFF000FF8003FFE000FFC003FFC0 00FFC003FFC000FFC003FF8000FFC003FF8000FFC003FF0000FFC003FF0000FFC003FF00 00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF00 00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF00 00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF00 00FFC0FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFF303A7DB935>I<01F0 0007FC000FFE000FFE001FFF001FFF001FFF001FFF001FFF000FFE000FFE0007FC0001F0 0000000000000000000000000000000000000000000000000000000000FF007FFF007FFF 007FFF007FFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF8153B7DBA1B >I<00FF00000000FFFF00000000FFFF00000000FFFF00000000FFFF0000000007FF0000 000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000 000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000 000003FF0000000003FF0000000003FF0000000003FF000FFFE003FF000FFFE003FF000F FFE003FF000FFFE003FF0003FC0003FF0003F00003FF000FE00003FF001F800003FF003F 000003FF007E000003FF00FC000003FF03F8000003FF07E0000003FF0FC0000003FF1FC0 000003FF7FE0000003FFFFF0000003FFFFF8000003FFFFFC000003FFFFFC000003FFCFFE 000003FF0FFF000003FE07FF800003FE03FF800003FE01FFC00003FE00FFE00003FE00FF F00003FE007FF00003FE003FF80003FE001FFC0003FE001FFE0003FE000FFE0003FE000F FF00FFFFF83FFFF8FFFFF83FFFF8FFFFF83FFFF8FFFFF83FFFF82D3A7EB932>107 D<00FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF 0003FF0003FF0003FF0003FF0003FF0003FF00FFFFFCFFFFFCFFFFFCFFFFFC163A7DB91B >I<00FE007FE0000FFC0000FFFE01FFFC003FFF8000FFFE07FFFF00FFFFE000FFFE1F81 FF83F03FF000FFFE3C00FF87801FF00007FE7800FFCF001FF80003FEF000FFDE001FF800 03FFE0007FFC000FFC0003FFC0007FF8000FFC0003FFC0007FF8000FFC0003FF80007FF0 000FFC0003FF80007FF0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF 00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000F FC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF0000 7FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC00 03FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0 000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF00007FE0000FFC0003FF 00007FE0000FFC00FFFFFC1FFFFF83FFFFF0FFFFFC1FFFFF83FFFFF0FFFFFC1FFFFF83FF FFF0FFFFFC1FFFFF83FFFFF04C257DA451>I<00FE007FC000FFFE03FFF800FFFE0FFFFE 00FFFE1F03FF00FFFE3C01FF8007FE7801FF8003FEF000FF8003FFE000FFC003FFC000FF C003FFC000FFC003FF8000FFC003FF8000FFC003FF0000FFC003FF0000FFC003FF0000FF C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF C0FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFF30257DA435>I<0001FFC0 0000000FFFF80000007FFFFF000000FF80FF800003FE003FE00007FC001FF0000FF8000F F8001FF00007FC001FF00007FC003FF00007FE003FE00003FE007FE00003FF007FE00003 FF007FE00003FF00FFE00003FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE00003 FF80FFE00003FF80FFE00003FF80FFE00003FF80FFE00003FF807FE00003FF007FE00003 FF007FE00003FF003FE00003FE003FF00007FE001FF00007FC001FF00007FC000FF8000F F80007FC001FF00003FE003FE00001FF80FFC000007FFFFF0000001FFFFC00000001FFC0 000029257DA430>I<00FF01FF8000FFFF0FFFF000FFFF3FFFFC00FFFFFE07FF00FFFFF0 01FF8003FFE000FFC003FF80007FE003FF00007FF003FF00003FF803FF00003FF803FF00 001FFC03FF00001FFC03FF00001FFC03FF00000FFE03FF00000FFE03FF00000FFE03FF00 000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00000FFE03FF00 000FFE03FF00000FFC03FF00001FFC03FF00001FFC03FF00001FF803FF00003FF803FF00 003FF003FF80007FF003FFC0007FE003FFE000FFC003FFF003FF8003FFFC07FE0003FF3F FFF80003FF0FFFE00003FF03FF000003FF0000000003FF0000000003FF0000000003FF00 00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 00000003FF0000000003FF00000000FFFFFC000000FFFFFC000000FFFFFC000000FFFFFC 0000002F357EA435>I<00FE03F000FFFE0FFE00FFFE3FFF00FFFE7C7F80FFFEF8FFC007 FEF0FFC003FFE0FFC003FFC0FFC003FFC0FFC003FF807F8003FF803F0003FF800C0003FF 80000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00 000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000 0003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000FFFFFE0000 FFFFFE0000FFFFFE0000FFFFFE000022257EA427>114 D<003FF03803FFFEF80FFFFFF8 1FC00FF83F0003F87E0001F87C0000F8FC0000F8FC000078FE000078FF000078FF800000 FFFC0000FFFFE0007FFFFC007FFFFF803FFFFFC01FFFFFF00FFFFFF803FFFFF800FFFFFC 001FFFFC00007FFE000007FEF00001FEF00000FEF80000FEF800007EFC00007EFC00007C FE0000FCFF0000F8FF8001F8FFF007F0FFFFFFC0F8FFFF00E01FF8001F257DA426>I<00 0F0000000F0000000F0000000F0000000F0000001F0000001F0000001F0000001F000000 3F0000003F0000007F000000FF000000FF000001FF000007FF00001FFFFFE0FFFFFFE0FF FFFFE0FFFFFFE003FF000003FF000003FF000003FF000003FF000003FF000003FF000003 FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003FF000003 FF000003FF000003FF007803FF007803FF007803FF007803FF007803FF007803FF007803 FF007803FF00F801FF80F001FF81F000FFC3E0003FFFC0001FFF800003FE001D357EB425 >I<00FF00003FC0FFFF003FFFC0FFFF003FFFC0FFFF003FFFC0FFFF003FFFC007FF0001 FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000 FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000 FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000 FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0001FFC003FF0001FFC003FF0003 FFC003FF0003FFC001FF0007FFC001FF800FFFE000FFC03EFFFF007FFFFCFFFF001FFFF0 FFFF0003FF80FFFF30257DA435>III E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fi cmr5 5 3 /Fi 3 50 df<0030006001C00380030006000E001C001C00380038003800700070007000 F000F000F000F000F000F000F000F000F000F000F0007000700070003800380038001C00 1C000E0006000300038001C0006000300C297B9E16>40 DI<00600001E0000FE000FFE000F1E00001E00001E00001E00001E00001E00001 E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001 E00001E00001E00001E0007FFF807FFF80111C7B9B1C>49 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fj cmex10 10 5 /Fj 5 90 df34 DI 80 D88 DI E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fk cmti10 10 58 /Fk 58 123 df<000000003FFC0000000001FFFF8000000007E007C00000001F8001E000 00003F0001F00000007E0003F0000000FC0007F0000000FC0007F0000001F80007F00000 01F80007E0000003F0000380000003F0000000000003F0000000000003F0000000000007 F0000000000007E0000000000007E0000000000007E0000000000007E000000000000FE0 00000000000FC000000000000FC000000000000FC0000000000FFFFFFFFF00000FFFFFFF FF00000FFFFFFFFE0000001F80007E0000001F80007E0000001F8000FE0000003F8000FC 0000003F0000FC0000003F0000FC0000003F0001FC0000003F0001F80000007F0001F800 00007E0001F80000007E0003F80000007E0003F00000007E0003F0000000FE0003F00000 00FC0007F0000000FC0007E0000000FC0007E0000000FC0007E0000001FC000FE0000001 FC000FC0000001F8000FC1C00001F8000FC1C00001F8001FC1C00001F8001F83C00003F8 001F83800003F0001F83800003F0001F83800003F0001F87000007F0001F87000007E000 1F0F000007E0000F8E000007E000079E000007E00003FC00000FE00000F000000FC00000 0000000FC000000000000FC000000000000F8000000000001F8000000000001F80000000 001C1F00000000007E1F00000000007E3F0000000000FE3E0000000000FE3C0000000000 FE7C0000000000F878000000000078F000000000003FE000000000000F80000000000034 4C82BA2F>12 D<01E003C007F00FE00FF01FE00FF81FF01FF83FF01FF83FF01FF83FF00F F81FF007B00F600030006000300060007000E0006000C000E001C000C0018001C0038001 8003000380070007000E000E001C001C003800380070007000E000E001C000C00180001C 1971B92B>34 D<0000000C0000001C00000038000000F0000001E0000003C00000078000 000F0000001E0000003C0000007C000000F8000000F0000001E0000003E0000007C00000 078000000F8000001F0000001F0000003E0000003E0000007C0000007C000000F8000000 F8000001F0000001F0000003F0000003E0000007E0000007C0000007C000000FC000000F 8000000F8000001F8000001F8000001F0000001F0000003F0000003F0000003E0000003E 0000007E0000007E0000007C0000007C0000007C0000007C000000FC000000F8000000F8 000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8 000000F8000000F800000078000000780000007800000078000000780000003C0000003C 0000003C0000001C0000001E0000001E0000000E00000007000000070000000380000001 C0000001C0000000C000001E5274BD22>40 D<00000C0000000E00000007000000038000 000380000001C0000001E0000001E0000000E0000000F0000000F0000000780000007800 000078000000780000007C0000003C0000003C0000003C0000003C0000003C0000003C00 00003C0000003C0000003C0000003C0000003C0000007C0000007C0000007C0000007C00 00007C0000007C0000007C000000FC000000FC000000F8000000F8000001F8000001F800 0001F0000001F0000003F0000003F0000003E0000003E0000007E0000007E0000007C000 000FC000000F8000000F8000001F8000001F0000001F0000003E0000003E0000007C0000 007C000000F8000000F8000001F0000001F0000003E0000003C0000007C000000F800000 0F0000001F0000003E0000003C00000078000000F0000001E0000003E0000003C0000007 0000000E0000001C00000078000000F0000000C00000001E527FBD22>I<03C007F00FF0 1FF01FF81FF81FF81FF007B0003000700060006000E000C001C00380030007000E001C00 38007000E000C0000D197A8819>44 D<7FFFF87FFFF8FFFFF8FFFFF8FFFFF0150579941E >I<0E003F807F80FF80FF80FF80FF007E003C000909778819>I<000003F80000001FFE00 00007C1F000000F807800001E007C00003C003E000078003E0000F8001E0001F0001F000 1F0001F0003E0001F0007E0001F0007C0003F000FC0003F000FC0003F001F80003F001F8 0003F003F80007F003F00007F003F00007F007F00007F007F00007E007E0000FE00FE000 0FE00FE0000FE00FE0000FE01FC0001FC01FC0001FC01FC0001FC01FC0001FC03F80003F 803F80003F803F80003F803F80003F807F00007F007F00007F007F00007F007F00007E00 7E0000FE007E0000FE007E0000FC00FE0001FC00FE0001F800FE0001F800FC0003F000FC 0003F000FC0003E0007C0007E0007C0007C0007C000F80007C000F80007C001F00003E00 3E00003E007C00001F00F800000F83E0000007FF80000000FE000000243A77B72A>48 D<000000180000003800000078000000F0000001F0000003F0000007F000000FE000001F E000007FE00003FFE0003FEFC0003F8FC0001C1FC000001FC000001F8000001F8000003F 8000003F8000003F0000003F0000007F0000007F0000007E0000007E000000FE000000FE 000000FC000000FC000001FC000001FC000001F8000001F8000003F8000003F8000003F0 000003F0000007F0000007F0000007E0000007E000000FE000000FE000000FC000000FC0 00001FC000001FC000001F8000001F8000003F8000003F8000003F0000007F8000FFFFFF 80FFFFFF80FFFFFF801D3877B72A>I<00000000E000000001F000000003F000000003F0 00000003F000000007F000000007E000000007E000000007E00000000FE00000000FC000 00000FC00000001FC00000001F800000001F800000003F000000003F000000003F000000 007E000000007E000000007C00000000FC00000000F800000001F800000001F000000003 F000000003E000000007E000000007C00000000FC00000000F800000001F800000001F00 0000003E000000003E000000007C00000000F81C000000F83E000001F07E000003E07E00 0003C07E00000780FE00000F80FE00001F00FC00003E00FC00007C01FC00007801FC0000 F001F80001E001F80003C003F8000FFE03F8001FFFC3F0003FFFFBF0007C01FFF040F000 3FFFE0600007FFE0000007FF0000000FE00000000FC00000000FC00000000FC00000001F C00000001F800000001F800000001F800000003F800000003F000000003F000000003F00 0000003F000000003E000000001C000024487DB72A>52 D<000300001800038000F80007 F007F00007FFFFE00007FFFFC00007FFFF00000FFFFE00000FFFF800000EFFE000000E0C 0000001E000000001C000000001C000000001C000000003C000000003800000000380000 00003800000000780000000070000000007000000000707F000000F3FFC00000EF83E000 00FC01F00000F800F80001F000F80001E000FC0001C0007C000000007C000000007E0000 00007E000000007E00000000FE00000000FE00000000FE00000000FE00000001FE000C00 01FC003F0001FC007F0001FC007F0003FC00FF0003F800FE0003F800FE0007F000F80007 F000E00007E000E0000FE000E0001FC000E0001F8000F0003F000070007E00007800FC00 007C01F800003E07F000001FFFC000000FFF00000001F8000000253A77B72A>I<000000 7F00000003FFC000000FFFE000003F81E000007E00F00000F800700003F003F00007E007 F0000FC007F0001F8007F0001F0007E0003F0007C0007E00000000FE00000000FC000000 01F800000001F800000003F800000007F000000007F00000000FE07E00000FE3FF80000F E783E0001FCE01F0001FDC00F8001FF800F8003FF0007C003FE0007C003FC0007E003FC0 007E007F80007E007F80007E007F00007E007F0000FE00FF0000FE00FE0000FE00FE0000 FE00FE0001FE00FE0001FC00FC0001FC00FC0001FC00FC0003FC00FC0003F800FC0003F8 00FC0003F800F80007F000F80007E000F8000FE000F8000FC000F8001F8000FC003F0000 7C003F00007C007C00003E01F800001F03F000000FFFE0000007FF80000001FC00000024 3A76B72A>I<003C007E00FF01FF01FF01FF01FE01FC0070000000000000000000000000 0000000000000000000000000000000000000000000000000E003F807F80FF80FF80FF80 FF007E003C00102477A319>58 D<0000000001C0000000000003C0000000000003C00000 00000007C000000000000FC000000000000FC000000000001FC000000000001FE0000000 00003FE000000000003FE000000000007FE00000000000FFE00000000000EFE000000000 01EFE00000000001CFE000000000038FE000000000038FE000000000070FE00000000007 0FE0000000000E0FE0000000001E0FE0000000001C0FE000000000380FE000000000380F E000000000700FF000000000700FF000000000E007F000000000E007F000000001C007F0 00000003C007F0000000038007F0000000070007F0000000070007F00000000E0007F000 00000E0007F00000001C0007F00000001C0007F0000000380007F00000007FFFFFF00000 007FFFFFF0000000FFFFFFF0000000E00007F8000001C00003F8000001C00003F8000003 800003F8000007800003F8000007000003F800000F000003F800000E000003F800001C00 0003F800001C000003F8000038000003F8000078000003F8000070000003F80000F00000 03F80003F8000003F80007FC000007FC00FFFF8001FFFFF0FFFF8001FFFFF0FFFF8001FF FFF0343C7BBB3E>65 D<0007FFFFFFFC000007FFFFFFFF800007FFFFFFFFC000000FF000 1FF000000FE00007F800000FE00003F800001FE00003FC00001FE00001FC00001FC00001 FE00001FC00001FE00003FC00000FE00003FC00000FE00003F800001FE00003F800001FE 00007F800001FE00007F800001FC00007F000003FC00007F000003F80000FF000007F800 00FF000007F00000FE00000FE00000FE00001FC00001FE00003F800001FE00007F000001 FC0001FE000001FC0007F8000003FFFFFFE0000003FFFFFFC0000003F80007F0000003F8 0001FC000007F80000FE000007F800007F000007F000003F800007F000003F80000FF000 003FC0000FF000001FC0000FE000001FC0000FE000001FC0001FE000001FC0001FE00000 3FC0001FC000003FC0001FC000003FC0003FC000003FC0003FC000007F80003F8000007F 80003F8000007F00007F800000FF00007F800001FE00007F000003FC00007F000003F800 00FF00000FF80000FF00001FE00000FE00003FC00001FE0001FF8000FFFFFFFFFE0000FF FFFFFFF80000FFFFFFFFC0000037397BB83A>I<00000003FE000E0000003FFF801E0000 00FFFFE03C000003FE01F03C00000FF000787C00003FC0003CFC00007F00001FF80000FE 00000FF80003FC00000FF80007F8000007F8000FF0000007F0001FE0000003F0003FC000 0003F0003F80000003F0007F00000003E000FF00000003E001FE00000003E001FC000000 03E003FC00000003C007F800000003C007F800000003C00FF000000003C00FF000000003 801FE000000003801FE000000000001FE000000000003FC000000000003FC00000000000 3FC000000000007FC000000000007F8000000000007F8000000000007F800000000000FF 800000000000FF000000000000FF000000000000FF000000000000FF000000000000FF00 0000003800FF000000003800FF000000007800FE000000007000FF000000007000FF0000 0000F0007F00000000E0007F00000001E0007F00000001C0007F00000003C0003F800000 0780003F8000000700001F8000000E00001FC000001E00000FC000003C00000FE0000078 000007F00001F0000003F80003C0000001FE000F800000007F807E000000003FFFFC0000 00000FFFE00000000000FF00000000373D74BA3B>I<0003FFFFFFFE00000003FFFFFFFF C0000003FFFFFFFFF000000007F8000FF800000007F00003FC00000007F00000FE000000 0FF000007F0000000FF000003F8000000FE000001F8000000FE000001FC000001FE00000 0FC000001FE000000FE000001FC000000FE000001FC0000007E000003FC0000007E00000 3FC0000007F000003F80000007F000003F80000007F000007F80000007F000007F800000 07F000007F00000007F000007F00000007F00000FF00000007F00000FF0000000FF00000 FE0000000FF00000FE0000000FF00001FE0000000FF00001FE0000000FE00001FC000000 1FE00001FC0000001FE00003FC0000001FE00003FC0000001FC00003F80000003FC00003 F80000003FC00007F80000003F800007F80000007F800007F00000007F000007F0000000 7F00000FF0000000FE00000FF0000000FE00000FE0000001FC00000FE0000001F800001F E0000003F800001FE0000007F000001FC0000007E000001FC000000FC000003FC000001F 8000003FC000003F8000003F8000007F0000003F800000FC0000007F800003F80000007F 800007F00000007F00001FC0000000FF0001FF8000007FFFFFFFFE000000FFFFFFFFF000 0000FFFFFFFF800000003C397CB83F>I<0007FFFFFFFFFF0007FFFFFFFFFF0007FFFFFF FFFF00000FF00003FF00000FE000007F00000FE000003E00001FE000003E00001FE00000 1E00001FC000001E00001FC000001E00003FC000001E00003FC000001E00003F8000001E 00003F8000001C00007F8000001C00007F8000001C00007F0003801C00007F0003801C00 00FF0007801C0000FF000780000000FE000700000000FE000F00000001FE000F00000001 FE001F00000001FC003E00000001FC007E00000003FFFFFE00000003FFFFFE00000003FF FFFC00000003F800FC00000007F8007C00000007F8003C00000007F0003800000007F000 380000000FF000780000000FF0007800E0000FE0007000E0000FE0007001E0001FE00070 01C0001FE0000001C0001FC0000003C0001FC000000380003FC000000780003FC0000007 00003F8000000F00003F8000000F00007F8000001E00007F8000003E00007F0000003C00 007F0000007C0000FF000000FC0000FF000001F80000FE000007F80001FE00007FF000FF FFFFFFFFF000FFFFFFFFFFF000FFFFFFFFFFE00038397BB838>I<0007FFFFFFFFFE0007 FFFFFFFFFE0007FFFFFFFFFE00000FF00007FE00000FE00000FE00000FE000007C00001F E000003C00001FE000003C00001FC000003C00001FC000003C00003FC000003C00003FC0 00003C00003F8000003C00003F8000003800007F8000003800007F8000003800007F0000 003800007F000380380000FF000780380000FF000780000000FE000700000000FE000700 000001FE000F00000001FE000F00000001FC001E00000001FC003E00000003FC00FE0000 0003FFFFFE00000003FFFFFC00000003FFFFFC00000007F800FC00000007F8007C000000 07F0007800000007F000780000000FF000780000000FF000780000000FE000700000000F E000700000001FE000F00000001FE000F00000001FC000000000001FC000000000003FC0 00000000003FC000000000003F8000000000003F8000000000007F8000000000007F8000 000000007F0000000000007F000000000000FF000000000000FF000000000000FE000000 000001FF0000000000FFFFFF00000000FFFFFF00000000FFFFFF0000000037397BB836> I<00000003FE000E0000003FFF801E000000FFFFE03C000003FE01F03C00000FF000787C 00003FC0003CFC00007F00001FF80000FE00000FF80003FC00000FF80007F8000007F800 0FF0000007F0001FE0000003F0003FC0000003F0003F80000003F0007F00000003E000FF 00000003E001FE00000003E001FC00000003E003FC00000003C007F800000003C007F800 000003C00FF000000003C00FF000000003801FE000000003801FE000000000001FE00000 0000003FC000000000003FC000000000003FC000000000007FC000000000007F80000000 00007F8000000000007F800000000000FF800000000000FF000000000000FF000007FFFF E0FF000007FFFFE0FF000007FFFFE0FF00000007FC00FF00000003F800FF00000007F800 FF00000007F000FF00000007F000FF00000007F0007F0000000FF0007F0000000FE0007F 0000000FE0007F0000000FE0003F8000001FE0003F8000001FE0001F8000001FC0001FC0 00003FC0000FE000003FC0000FE000007FC00007F00000FF800003F80003EF800001FE00 07C78000007FC03F078000003FFFFC030000000FFFF00000000000FF80000000373D74BA 40>I<0003FFFFF80003FFFFF80003FFFFF8000007F800000007F000000007F00000000F F00000000FF00000000FE00000000FE00000001FE00000001FE00000001FC00000001FC0 0000003FC00000003FC00000003F800000003F800000007F800000007F800000007F0000 00007F00000000FF00000000FF00000000FE00000000FE00000001FE00000001FE000000 01FC00000001FC00000003FC00000003FC00000003F800000003F800000007F800000007 F800000007F000000007F00000000FF00000000FF00000000FE00000000FE00000001FE0 0000001FE00000001FC00000001FC00000003FC00000003FC00000003F800000003F8000 00007F800000007F800000007F00000000FF800000FFFFFF0000FFFFFF0000FFFFFE0000 25397CB820>73 D<000007FFFFF0000007FFFFF0000007FFFFF000000007FC0000000003 F80000000003F80000000007F80000000007F00000000007F00000000007F0000000000F F0000000000FE0000000000FE0000000000FE0000000001FE0000000001FC0000000001F C0000000001FC0000000003FC0000000003F80000000003F80000000003F80000000007F 80000000007F00000000007F00000000007F0000000000FF0000000000FE0000000000FE 0000000000FE0000000001FE0000000001FC0000000001FC0000000001FC0000000003FC 0000000003F80000000003F80000000003F80000000007F80000000007F80000000007F0 0000000007F0000000000FF0000000000FF000003F000FE000007F000FE000007F001FE0 0000FF001FC00000FF001FC00000FF003F800000FC003F800000E0007F000000E000FE00 00007000FC0000007001F80000003803F00000001E0FC00000000FFF0000000001F80000 00002C3B78B82C>I<0007FFFFFC000007FFFFFC000007FFFFF80000000FF8000000000F F0000000000FE0000000001FE0000000001FE0000000001FC0000000001FC0000000003F C0000000003FC0000000003F80000000003F80000000007F80000000007F80000000007F 00000000007F0000000000FF0000000000FF0000000000FE0000000000FE0000000001FE 0000000001FE0000000001FC0000000001FC0000000003FC0000000003FC0000000003F8 0000000003F80000000007F80000000007F80000000007F00000000007F0000000000FF0 000000000FF000000C000FE000001C000FE000001C001FE000003C001FE0000038001FC0 000078001FC0000078003FC0000070003FC00000F0003F800000E0003F800001E0007F80 0003E0007F800003C0007F000007C0007F00000FC000FF00001F8000FF00003F8000FE00 00FF8001FE0007FF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFE002E397BB834>76 D<0007FFF800000007FFF00007FFF80000000FFFF00007FFF80000001FFFE000000FF800 00001FF00000000FF80000003FE00000000FF80000003FE00000001FF80000007FE00000 001FF8000000EFC00000001DF8000000EFC00000001CFC000001CFC00000003CFC000001 DFC00000003CFC0000039F8000000038FC0000071F8000000038FC0000071F8000000078 FC00000E3F8000000078FC00000E3F0000000070FC00001C3F0000000070FC00001C3F00 000000F0FC0000387F00000000F0FC0000707E00000000E0FC0000707E00000000E07E00 00E07E00000001E07E0000E0FE00000001E07E0001C0FC00000001C07E000380FC000000 01C07E000380FC00000003C07E000701FC00000003C07E000701F800000003807E000E01 F800000003807E000E01F800000007807E001C03F800000007807E003803F00000000700 7E003803F000000007003F007003F00000000F003F007007F00000000F003F00E007E000 00000E003F01C007E00000000E003F01C007E00000001E003F03800FE00000001E003F03 800FC00000001C003F07000FC00000001C003F07000FC00000003C003F0E001FC0000000 3C003F1C001F8000000038003F1C001F8000000038001FB8001F8000000078001FB8003F 8000000078001FF0003F0000000070001FE0003F0000000070001FE0003F00000000F000 1FC0007F00000000F0001FC0007E00000001F0001F80007E00000007F8001F8000FE0000 00FFFFC01F007FFFFC0000FFFFC01E007FFFFC0000FFFFC00E007FFFFC00004C397AB84A >I<0003FFF80000FFFFE00003FFF80000FFFFE00003FFFC0000FFFFE0000007FC000007 F800000007FE000003F000000007FE000003E00000000FFE000003C00000000FFF000003 C00000000E7F000003800000000E7F000003800000001E7F800007800000001E3F800007 000000001C3F800007000000001C3FC00007000000003C1FC0000F000000003C1FE0000E 00000000380FE0000E00000000380FE0000E00000000780FF0001E000000007807F0001C 000000007007F0001C000000007007F8001C00000000F003F8003C00000000F003FC0038 00000000E003FC003800000000E001FC003800000001E001FE007800000001E000FE0070 00000001C000FE007000000001C000FF007000000003C0007F00F000000003C0007F00E0 0000000380007F80E00000000380003F80E00000000780003FC1E00000000780001FC1C0 0000000700001FC1C00000000700001FE1C00000000F00000FE3C00000000F00000FE380 0000000E00000FF3800000000E000007F3800000001E000007FF800000001E000007FF00 0000001C000003FF000000001C000003FF000000003C000001FF000000003C000001FE00 00000038000001FE0000000038000000FE0000000078000000FE0000000078000000FC00 000000F80000007C00000003FC0000007C0000007FFFE000003C000000FFFFE000003800 0000FFFFE000003800000043397CB83E>I<00000003FE00000000003FFFC000000000FC 07F000000003E001F80000000F80007C0000003F00003E0000007E00001F000000F80000 1F800001F000000FC00007E000000FC0000FC0000007E0001FC0000007E0001F80000007 F0003F00000003F0007E00000003F000FE00000003F801FC00000003F801FC00000003F8 03F800000003F803F800000003F807F000000003F807F000000003F80FF000000003F80F E000000003F81FE000000007F81FC000000007F83FC000000007F83FC000000007F83FC0 00000007F87F800000000FF07F800000000FF07F800000000FF07F800000000FF0FF0000 00001FE0FF000000001FE0FF000000001FE0FF000000003FC0FF000000003FC0FF000000 003F80FF000000007F80FF000000007F00FF00000000FF00FF00000000FE00FF00000001 FE00FF00000001FC007F00000003F8007F00000007F0007F00000007F0007F0000000FE0 003F0000001FC0003F8000003F80001F8000003F00001FC000007E00000FC00000FC0000 07E00003F0000003F00007E0000001F8000F80000000FC003F000000003F01FC00000000 1FFFE00000000001FF00000000353D74BA40>I<0007FFFFFFF8000007FFFFFFFF000007 FFFFFFFF8000000FF0003FE000000FE0000FF000000FE00003F800001FE00003F800001F E00001FC00001FC00001FC00001FC00001FC00003FC00001FE00003FC00001FE00003F80 0001FE00003F800001FE00007F800001FE00007F800003FC00007F000003FC00007F0000 03FC0000FF000003F80000FF000007F80000FE000007F00000FE00000FE00001FE00000F E00001FE00001FC00001FC00003F800001FC0000FE000003FC0001FC000003FC000FF000 0003FFFFFFC0000003FFFFFE00000007F8000000000007F8000000000007F00000000000 07F000000000000FF000000000000FF000000000000FE000000000000FE000000000001F E000000000001FE000000000001FC000000000001FC000000000003FC000000000003FC0 00000000003F8000000000003F8000000000007F8000000000007F8000000000007F0000 000000007F000000000000FF000000000000FF000000000000FE000000000001FE000000 0000FFFFFC00000000FFFFFC00000000FFFFFC0000000037397BB838>I<0003FFFFFFF0 000003FFFFFFFE000003FFFFFFFF80000007F8003FC0000007F0000FF0000007F00007F0 00000FF00003F800000FF00001FC00000FE00001FC00000FE00001FC00001FE00001FE00 001FE00001FE00001FC00001FE00001FC00001FE00003FC00001FE00003FC00003FC0000 3F800003FC00003F800003FC00007F800007F800007F800007F000007F00000FF000007F 00000FE00000FF00001FC00000FF00003F000000FE0000FE000000FE0001F8000001FE00 0FE0000001FFFFFF80000001FFFFFC00000001FC003F00000003FC000F80000003FC000F C0000003F80007E0000003F80007F0000007F80003F0000007F80003F0000007F00003F0 000007F00003F800000FF00007F800000FF00007F000000FE00007F000000FE00007F000 001FE0000FF000001FE0000FF000001FC0000FF000001FC0000FF000003FC0000FF00000 3FC0001FF000003F80001FE007003F80001FE007007F80001FE00F007F80001FE00E007F 00001FE00E00FF00000FE01C7FFFFE000FE03CFFFFFE0007F078FFFFFE0003F0F0000000 0000FFE000000000003F80383B7CB83D>82 D<0000003FC00E000001FFF01C000007FFFC 1C00001FC07E3C00003F001F7C00007C000FF80000F80007F80001F00003F80003E00003 F80007C00001F00007C00001F0000F800001F0000F800001F0001F800001E0001F000001 E0001F000001E0001F000001E0003F000001C0003F000001C0003F000001C0003F800000 00003F80000000003FC0000000001FE0000000001FFC000000001FFF800000000FFFF000 00000FFFFE00000007FFFF80000003FFFFE0000000FFFFF00000003FFFF800000007FFF8 000000007FFC000000000FFC0000000003FC0000000001FC0000000001FC0000000000FC 0000000000FC00000000007C000E0000007C000E0000007C000E0000007C001E000000FC 001E000000F8001E000000F8001E000000F8003E000001F0003E000001F0003E000003E0 003E000003E0007F000007C0007F00000F80007F80001F00007FC0003E0000F9F000FC00 00F8FC03F80000F07FFFE00000E01FFF800000C003FC0000002F3D7ABA2F>I<07FFFFFF FFFFE007FFFFFFFFFFE00FFFFFFFFFFFE00FF800FF001FE00FC000FE0007C01F8000FE00 07C01F0001FE0003C01E0001FE0003C01C0001FC0003C03C0001FC0003803C0003FC0003 80380003FC000380780003F8000380700003F8000780700007F8000780F00007F8000700 E00007F0000700E00007F0000700E0000FF000070000000FF000000000000FE000000000 000FE000000000001FE000000000001FE000000000001FC000000000001FC00000000000 3FC000000000003FC000000000003F8000000000003F8000000000007F8000000000007F 8000000000007F0000000000007F000000000000FF000000000000FF000000000000FE00 0000000000FE000000000001FE000000000001FE000000000001FC000000000001FC0000 00000003FC000000000003FC000000000003F8000000000003F8000000000007F8000000 000007F8000000000007F0000000000007F000000000000FF000000000000FF000000000 000FE000000000003FF0000000007FFFFFF8000000FFFFFFF8000000FFFFFFF800000033 3971B83B>I<3FFFFF800FFFFE3FFFFF800FFFFE3FFFFF800FFFFE007F8000007F80007F 0000003F00007F0000003E0000FF0000003C0000FF0000003C0000FE000000380000FE00 0000380001FE000000780001FE000000700001FC000000700001FC000000700003FC0000 00F00003FC000000E00003F8000000E00003F8000000E00007F8000001E00007F8000001 C00007F0000001C00007F0000001C0000FF0000003C0000FF000000380000FE000000380 000FE000000380001FE000000780001FE000000700001FC000000700001FC00000070000 3FC000000F00003FC000000E00003F8000000E00003F8000000E00007F8000001E00007F 8000001C00007F0000001C00007F0000001C00007F0000003C0000FF000000380000FE00 0000380000FE000000780000FE000000700000FE000000700000FE000000F00000FE0000 01E00000FE000001C00000FE000003C000007E0000078000007E00000F0000007E00000E 0000003F00003E0000001F80007C0000001F8000F00000000FC003E000000007F01FC000 000001FFFF00000000007FFC00000000001FE000000000373B70B83E>III<0000F800000007FE0000001F871C00003E03FE00007C03FE0000F801FE0001F801 FE0003F000FC0007E000FC000FE000FC000FC001FC001FC001F8001FC001F8003F8001F8 003F8003F8007F8003F0007F0003F0007F0003F0007F0007F000FF0007E000FE0007E000 FE0007E000FE000FE000FE000FC000FC000FC1C0FC000FC1C0FC001FC1C0FC001F83C0FC 001F8380FC003F8380FC003F87807C007F87007C00FF07003E01FF0F003E038F8E001F0F 079E0007FE03FC0001F000F000222677A42A>97 D<003F00001FFF00001FFF00001FFF00 00007F0000007E0000007E0000007E000000FE000000FC000000FC000000FC000001FC00 0001F8000001F8000001F8000003F8000003F0000003F0000003F0000007F0000007E0F8 0007E7FE0007EF0F800FFC07C00FF807C00FF003E00FE003E01FC003F01FC003F01F8003 F01F8003F03F8003F03F0003F03F0003F03F0007F07F0007F07E0007F07E0007F07E000F F0FE000FF0FC000FE0FC000FE0FC001FE0FC001FC0F8001FC0F8003F80F8003F80F8003F 00F8007F00F8007E00F800FC007801F8007C01F0003C03E0003E07C0001E1F80000FFE00 0001F000001C3B77B926>I<00007F000003FFC0000FC1E0001F0070007E007800FC0038 01F801F803F003F807F003F807E003F80FE003F81FC003F01FC000003F8000003F800000 7F8000007F0000007F0000007F000000FF000000FE000000FE000000FE000000FE000000 FC000000FC000000FC000000FC000030FC000038FC0000787C0000F07E0001E03E0003C0 3E000F801F003E000F81F80003FFE00000FF00001D2677A426>I<00000001F8000000FF F8000000FFF8000000FFF800000003F800000003F000000003F000000007F000000007F0 00000007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC000 00001FC00000001F800000001F800000003F800000003F800000F83F000007FE3F00001F 877F00003E03FF00007C03FE0000F801FE0001F801FE0003F000FE0007E000FC000FE000 FC000FC001FC001FC001FC001FC001F8003F8001F8003F8003F8007F8003F8007F0003F0 007F0003F0007F0007F000FF0007F000FE0007E000FE0007E000FE000FE000FE000FE000 FC000FC1C0FC000FC1C0FC001FC1C0FC001FC3C0FC001F8380FC003F8380FC003F87807C 007F87007C00FF07003E01FF0F003E038F8E001F0F079E0007FE03FC0001F000F000253B 77B92A>I<00007F000003FFC0000FC1E0003F00F0007E007800FC007801F8007803F000 7807E000780FE000780FC000F81FC000F03F8001F03F8007E03F801F807F81FF007FFFF8 007FFF00007F000000FF000000FE000000FE000000FE000000FE000000FE000000FC0000 00FC000000FC0000307C0000387C0000787E0000F03E0001E03E0003C01F000F800F003E 000781F80003FFE00000FF00001D2677A426>I<00000007C00000001FF00000003E3800 00007C3C000000F8FC000000F9FC000001F9FC000001F1FC000003F1F8000003F0F00000 03F000000007F000000007E000000007E000000007E000000007E00000000FE00000000F C00000000FC00000000FC00000000FC00000001FC00000001F8000000FFFFFC0001FFFFF C0001FFFFF8000003F800000003F000000003F000000003F000000003F000000007F0000 00007E000000007E000000007E000000007E00000000FE00000000FC00000000FC000000 00FC00000000FC00000001FC00000001F800000001F800000001F800000001F800000003 F800000003F000000003F000000003F000000003F000000007F000000007E000000007E0 00000007E000000007E00000000FE00000000FC00000000FC00000000FC00000001FC000 00001F800000001F800000001F800000001F000000003F0000001C3F0000007E3E000000 7E3E000000FE3C000000FE7C000000FE78000000F8F000000078F00000003FC00000000F 80000000264C82BA19>I<000007C00000003FF0000000FC38E00001F01FF00003E01FF0 0007C00FF0000F800FF0001F8007F0003F0007E0007F0007E0007E000FE000FE000FE000 FC000FC001FC000FC001FC001FC003FC001FC003F8001F8003F8001F8003F8003F8007F8 003F8007F0003F0007F0003F0007F0007F0007F0007F0007E0007E0007E0007E0007E000 FE0007E000FE0007E000FC0003E001FC0003E003FC0003E007FC0001F00FF80000F01FF8 0000787BF800003FF3F800000FC3F000000003F000000007F000000007F000000007E000 000007E00000000FE00000000FC0001C000FC0007E001FC0007E001F8000FE003F0000FE 007E0000FE00FC00007801F800007C07E000001FFF80000003FE00000024367CA426>I< 0003F0000001FFF0000001FFF0000001FFF000000007F000000007E000000007E0000000 07E00000000FE00000000FC00000000FC00000000FC00000001FC00000001F800000001F 800000001F800000003F800000003F000000003F000000003F000000007F000000007E07 F000007E1FFC00007E783E0000FFE01F0000FFC01F8000FF800F8000FF000F8001FE000F 8001FE000FC001FC000FC001F8001F8003F8001F8003F0001F8003F0001F8003F0003F80 07F0003F0007E0003F0007E0003F0007E0007F000FE0007E000FC0007E000FC000FE000F C000FC001FC000FC001F8001FC1C1F8001F81C1F8001F83C3F8003F8383F0003F0383F00 03F0383F0003F0707F0003E0707E0003E0F07E0003E0E07E0003E1C0FE0001E380FC0000 FF003800003C00263B7BB92A>I<0001C00007E00007F0000FF0000FE00007E000038000 000000000000000000000000000000000000000000000000000000000000000000F00003 FC00071E000E1F001C1F001C1F00381F00383F00703F00703F00707F00F07E00E07E00E0 FE0000FC0000FC0001FC0001F80003F80003F80003F00007F00007E00007E0000FE0E00F C0E00FC1E01FC1C01F81C01F81C01F83801F03801F07001F07001F0E000F1C0007F80001 E000143879B619>I<0003F0000001FFF0000001FFF0000001FFF000000007F000000007 E000000007E000000007E00000000FE00000000FC00000000FC00000000FC00000001FC0 0000001F800000001F800000001F800000003F800000003F000000003F000000003F0000 00007F000000007E000F80007E003FE0007E00F0E000FE01C1F000FC0387F000FC0707F0 00FC0E07F001FC1C07E001F83807E001F830038001F870000003F8E0000003F1C0000003 F380000003FF00000007FC00000007FE00000007FFC0000007E7F800000FE1FC00000FC0 7E00000FC07F00000FC03F00001FC03F80001F801F81C01F801F81C01F801F83C03F803F 83803F003F03803F003F03803F003F07807F003F07007E003E07007E001E0E007E001E1E 00FE000F3C00FC0007F800380001E000243B7BB926>107 D<000FC007FFC007FFC007FF C0001FC0001F80001F80003F80003F80003F00003F00007F00007F00007E00007E0000FE 0000FE0000FC0000FC0001FC0001FC0001F80001F80003F80003F80003F00003F00007F0 0007F00007E00007E0000FE0000FE0000FC0000FC0001FC0001FC0001F80001F80003F80 003F80003F00003F00007F00007F00007E0E007E0E00FE0E00FE1E00FC1C00FC1C00FC3C 00FC3800F83800F878007870007CE0001FE0000F8000123B79B915>I<01E000FE0007F0 0007F803FF801FFC000E3C0F07C0783E001E3E3C03E1E01F001C1F7803F3C01F80383FF0 01F7800F80383FE001F7000F80783FC001FE000F80703FC001FE000FC0703F8001FC000F C0703F0003F8001F80F07F0003F8001F80E07E0003F0001F80E07E0003F0001F80007E00 07F0003F8000FE0007F0003F0000FC0007E0003F0000FC0007E0003F0000FC000FE0007F 0001FC000FE0007E0001F8000FC0007E0001F8000FC000FE0001F8001FC000FC0003F800 1FC000FC0003F0001F8001FC1C03F0001F8001F81C03F0003F8001F83C07F0003F8003F8 3807E0003F0003F03807E0003F0003F03807E0007F0003F0700FE0007F0003E0700FC000 7E0003E0F00FC0007E0003E0E00FC000FE0003E1C01FC000FE0001E3C01F8000FC0000FF 000700003800003C003E2679A444>I<01E000FE000007F803FF80000E3C0F07C0001E3E 3C03E0001C1F7803F000383FF001F000383FE001F000783FC001F000703FC001F800703F 8001F800703F0003F000F07F0003F000E07E0003F000E07E0003F000007E0007F00000FE 0007E00000FC0007E00000FC0007E00000FC000FE00001FC000FC00001F8000FC00001F8 001FC00001F8001F800003F8001F800003F0003F838003F0003F038003F0003F078007F0 007F070007E0007E070007E0007E070007E0007E0E000FE0007C0E000FC0007C1E000FC0 007C1C000FC0007C38001FC0003C78001F80001FE000070000078000292679A42F>I<00 007F000003FFC0000FC1F0001F00F8007E007C00FC007C01F8007E03F0003E07F0003F07 E0003F0FE0003F1FC0003F1FC0003F3F80003F3F80007F7F80007F7F00007F7F00007F7F 0000FFFF0000FFFE0000FEFE0000FEFE0001FEFE0001FCFC0001FCFC0003F8FC0003F8FC 0007F0FC0007E0FC000FE07C000FC07E001F803E003F003E007E001F00F8000F83F00003 FFC00000FE0000202677A42A>I<00078007C000001FE03FF000003CF0787C000038F8E0 3E0000787FC03E0000707F801F000070FF001F0000F0FE001F8000E0FE001F8000E0FC00 1F8001E1FC001F8001C1FC001F8001C1F8001F8001C1F8001F800003F8003F800003F800 3F800003F0003F800003F0003F800007F0007F800007F0007F800007E0007F000007E000 7F00000FE000FF00000FE000FE00000FC000FE00000FC001FC00001FC001FC00001FC001 F800001F8003F800001F8003F000003F8007E000003FC00FC000003FC00F8000003FE01F 0000007FE03E0000007F70FC0000007E3FF00000007E0F80000000FE0000000000FE0000 000000FC0000000000FC0000000001FC0000000001FC0000000001F80000000001F80000 000003F80000000003F80000000003F00000000007F000000000FFFFC0000000FFFFC000 0000FFFFC0000000293580A42A>I<0000F8030007FE07001F871F003E03BF007C03FE00 F801FE01F801FE03F000FE07E000FC0FE000FC0FC000FC1FC001FC1FC001F83F8001F83F 8001F87F8003F87F0003F07F0003F07F0003F0FF0007F0FE0007E0FE0007E0FE0007E0FE 000FE0FC000FC0FC000FC0FC000FC0FC001FC0FC001F80FC003F80FC003F807C007F807C 00FF003E01FF003E03BF001F0F7F0007FE7E0001F07E0000007E000000FE000000FC0000 00FC000000FC000001FC000001F8000001F8000001F8000003F8000003F0000007F00001 FFFFC001FFFFC001FFFFC0203577A426>I<03C003F0000FF01FFC001E783C0F001C7C70 0F003C3EE03F80383FC03F80387F803F80787F803F00707F003F00707F001C00F07E0000 00E0FE000000E0FC000000E0FC00000000FC00000001FC00000001F800000001F8000000 01F800000003F800000003F000000003F000000003F000000007F000000007E000000007 E000000007E00000000FE00000000FC00000000FC00000000FC00000001FC00000001F80 0000001F800000001F800000003F800000003F000000000E00000000212679A423>I<00 00FE000007FF80000F83C0003E00E0007C00F00078007000F800F001F803F001F003F001 F003F001F003E003F001C003F8000003FC000003FFC00001FFF80001FFFE0000FFFF0000 7FFF80003FFF80000FFFC00000FFC000003FC000001FC000000FC03E000FC07E000FC0FE 000F80FE000F80FE000F80FC001F00E0001F00F0003E0070007C003800F8001E03E0000F FFC00001FE00001C267AA422>I<0003800007C0000FC0000FC0000FC0000FC0001FC000 1F80001F80001F80003F80003F00003F00003F00007F00007E007FFFFF7FFFFFFFFFFF00 FC0000FC0000FC0001FC0001F80001F80001F80003F80003F00003F00003F00007F00007 E00007E00007E0000FE0000FC0000FC0000FC0001FC0001F801C1F801C1F803C3F80383F 00783F00703F00F03F00E03F01C03E03C01F07800F0F0007FC0001F000183579B31C>I< 00F800000003FE0001C0078F0003E00E0F8007E01E0F8007E01C0F8007E0380F800FE038 1F800FE0781F800FC0701F800FC0703F801FC0F03F001FC0E03F001F80E07F001F80007E 003F80007E003F8000FE003F0000FC003F0000FC007F0001FC007F0001F8007E0001F800 7E0001F800FE0003F800FE0003F000FC0E03F000FC0E03F001FC1E03F001FC1C03F001F8 1C03E001F81C03E001F83C03F003F83803F007F83801F007F07001F01EF8F000F83C78E0 003FF03FC0000FC00F00272679A42D>I<00F0000E0003FC003F00071E007F800E1F007F 801C1F007F803C1F007F80381F003F80383F001F80703F000F80703F000F80707F000F80 F07E000F00E07E000700E0FE00070000FC000F0000FC000E0001FC000E0001F8000E0001 F8001E0003F8001C0003F0001C0003F0001C0003F0003C0007F000380007E000380007E0 00700007E000700007E000700007E000E00007E000E00007E001C00007E003C00003E003 800003F007000001F00E000000F83C0000007FF80000000FC00000212679A426>I<00F0 000000070003FC0003801F80071E0007C03FC00E1F000FC03FC01C1F000FC03FC03C1F00 0FC03FC0381F001FC01FC0383F001F800FC0703F001F8007C0703F001F8007C0707F003F 8007C0F07E003F800780E07E003F000380E0FE003F00038000FC007F00078000FC007F00 070001FC007E00070001F8007E00070001F800FE000F0003F800FE000E0003F000FC000E 0003F000FC000E0003F000FC001E0007F001FC001C0007E001F8001C0007E001F8003C00 07E001F800380007E001F800380007E001F800780007E001F800700007E003F800F00007 E003F800E00003E007F801E00003F00FFC03C00001F01E7C07800000FC3C3E0F0000003F F81FFE0000000FE003F00000322679A437>I<0007E007C0001FF81FF800787C383C00F0 3E703C01E01EE0FE03C01FE0FE03801FC0FE07001FC0FC0F001F80FC0E001F80700E003F 80001E003F00001C003F00001C003F000000007F000000007F000000007E000000007E00 000000FE00000000FE00000000FC00000000FC00000001FC00000001FC00000001F80070 0001F800700003F800F00003F800E01C03F000E07E03F001E07E07F001C0FE07F00380FE 0FF00780FE0EF00F00781CF81E0078387C3C003FF03FF00007C00FC00027267CA427>I< 00F000000003FC0001C0071E0003E00E1F0007E01C1F0007E03C1F0007E0381F000FE038 3F000FC0703F000FC0703F000FC0707F001FC0F07E001F80E07E001F80E0FE001F8000FC 003F8000FC003F0001FC003F0001F8003F0001F8007F0003F8007E0003F0007E0003F000 7E0003F000FE0007F000FC0007E000FC0007E000FC0007E001FC0007E001F80007E001F8 0007E001F80007E003F80007E003F00007E007F00003E00FF00003F01FF00001F87FE000 007FF7E000001FC7E00000000FE00000000FC00000000FC00000001FC0003F001F80007F 003F80007F003F00007F007E00007F007C00007E00FC00007001F800007003E000003807 C000003C1F8000000FFE00000003F0000000233679A428>I<0003C00380000FF0078000 1FF80700003FFC0F00007FFC0E0000FFFE1E0000F83FFC0001F007F80001E000F00001C0 00E00001C001E000000003C000000007800000000F000000001E000000003C0000000078 00000000F000000001E000000003C000000007800000000F000000001E000000003C0000 000078001C0000F0001C0001E0003C0003C00038000380007800078000F8000FF801F000 1FFF07E0003E1FFFE0003C0FFFC000780FFF80007007FF0000F003FC0000E000F0000021 267BA422>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fl cmr9 9 37 /Fl 37 122 df<3C7EFFFFFFFF7E3C08087A8715>46 D<000FE000007FFC0000F83E0003 E00F8007C007C0078003C00F8003E01F0001F01F0001F03F0001F83F0001F83E0000F87E 0000FC7E0000FC7E0000FC7E0000FC7E0000FCFE0000FEFE0000FEFE0000FEFE0000FEFE 0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE0000FEFE 0000FEFE0000FEFE0000FEFE0000FEFE0000FE7E0000FC7E0000FC7E0000FC7E0000FC7E 0000FC3F0001F83F0001F83F0001F81F0001F01F0001F00F8003E007C007C007C007C003 E00F8000F83E00007FFC00000FE0001F347DB126>48 D<00070000000F0000001F000000 7F000007FF0000FFFF0000FFBF0000F83F0000003F0000003F0000003F0000003F000000 3F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000 3F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000 3F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000000 3F0000003F0000003F0000003F0000003F0000003F0000003F0000007F80007FFFFF807F FFFF807FFFFF8019327AB126>I<003FC00000FFF00003FFFC000F80FF001E007F801C00 3FC038001FE070000FE070000FF0600007F0FC0007F0FE0007F8FF0007F8FF0003F8FF00 03F8FF0003F87E0007F83C0007F8000007F8000007F0000007F000000FF000000FE00000 1FC000001FC000003F8000003F0000007E000000FC000001F8000001F0000003E0000007 C000000F8000001F0000003E0000003C00000078001800F0001801E0001803C000300780 00300F0000301C0000701FFFFFF03FFFFFF07FFFFFF0FFFFFFE0FFFFFFE0FFFFFFE01D32 7CB126>I<001FE00000FFFC0001FFFF0007E03F800F001FC01E000FE01C0007F03F0007 F03F8007F83F8003F83FC003F83F8003F83F8003F81F0007F8000007F8000007F0000007 F000000FE000000FC000001FC000003F8000007E000001F800007FE000007FFC0000003F 0000001FC000000FE0000007F0000007F8000003F8000003FC000001FC000001FE000001 FE000001FE7E0001FEFF0001FEFF0001FEFF0001FEFF0001FEFF0001FCFE0003FC780003 FC700007F8380007F03C000FF01F001FE00FE03F8003FFFF0000FFFC00001FE0001F347D B126>I<000001C000000001C000000003C000000007C000000007C00000000FC0000000 1FC00000001FC00000003FC00000007FC00000006FC0000000CFC0000001CFC00000038F C00000030FC00000070FC000000E0FC000000C0FC000001C0FC00000380FC00000300FC0 0000700FC00000E00FC00000C00FC00001800FC00003800FC00003000FC00006000FC000 0E000FC0000C000FC00018000FC00038000FC00030000FC00060000FC000E0000FC000FF FFFFFF80FFFFFFFF80FFFFFFFF8000000FC00000000FC00000000FC00000000FC0000000 0FC00000000FC00000000FC00000000FC00000000FC00000001FE0000007FFFF800007FF FF800007FFFF8021337EB226>I<0C0000C00FC00FC00FFFFF800FFFFF000FFFFE000FFF FC000FFFF0000FFFC0000C1800000C0000000C0000000C0000000C0000000C0000000C00 00000C0000000C0000000C0000000C0FC0000C7FF8000CF07C000FC03F000F001F800F00 0FC00E000FC00C0007E00C0007E0000007F0000003F0000003F0000003F8000003F80000 03F8000003F8180003F87E0003F8FE0003F8FE0003F8FE0003F8FE0003F0FE0007F0F800 07F0600007E0700007E070000FC038001FC03C001F801E007F000F80FE0007FFF80001FF E000003F80001D347CB126>I<0000FE000007FF80001FFFE0003F00F0007C007001F801 F801F003F803E003F807E003F80FC003F80FC001F01F8000001F8000003F0000003F0000 003F0000007F0000007E0000007E07F0007E1FFC00FE381F00FE700F80FEE007C0FFC003 E0FF8003F0FF8001F8FF0001F8FF0001FCFF0000FCFF0000FCFE0000FEFE0000FEFE0000 FEFE0000FEFE0000FE7E0000FE7E0000FE7E0000FE7E0000FE7F0000FE3F0000FC3F0000 FC1F0001FC1F8001F80F8001F00FC003F007C007E003E00FC001F81F8000FFFF00003FFC 00000FE0001F347DB126>I<300000003C0000003FFFFFFF3FFFFFFF3FFFFFFF7FFFFFFE 7FFFFFFE7FFFFFFC700000386000003060000070600000E0C00000C0C00001C0C0000380 000007000000060000000E0000001C00000018000000380000007000000070000000E000 0000E0000001C0000003C0000003C0000003C0000007800000078000000F8000000F8000 000F8000001F8000001F0000001F0000003F0000003F0000003F0000003F0000003F0000 007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000 001C000020347CB126>I<000FE000007FFC0000FFFF0003F01F8007C007C00F0003E00E 0001F01E0000F01C0000F83C0000783C0000783C0000783E0000783E0000783F0000F83F 8000F03FC001F01FF001E01FF803C00FFE078007FF0F0003FFDE0001FFF80000FFF80000 3FFE00003FFF0000F7FFC003E3FFE00780FFF00F007FF81E001FF83E0007FC3C0003FC78 0001FC7800007EF800007EF000003EF000003EF000001EF000001EF000001EF800001EF8 00003C7800003C7C0000783E0000781F0000F00F8003E007F01FC001FFFF00007FFC0000 1FE0001F347DB126>I<000FE000007FF80000FFFE0003F83F0007E00F800FC007C01F80 07E01F8003F03F0003F07F0001F87E0001F87E0001F8FE0001FCFE0000FCFE0000FCFE00 00FCFE0000FCFE0000FEFE0000FEFE0000FEFE0000FEFE0000FE7E0001FE7E0001FE7F00 01FE3F0001FE3F0003FE1F8003FE0F8007FE07C00EFE03E01CFE01F038FE007FF0FE001F C0FC000000FC000001FC000001FC000001F8000001F8000001F0000003F01F0003E03F80 07E03F8007C03F800FC03F801F803F003F001C007E001F01FC000FFFF00003FFC00000FF 00001F347DB126>I<000000E0000000000000E0000000000000E0000000000001F00000 00000001F0000000000003F8000000000003F8000000000003F8000000000007FC000000 000007FC000000000007FC00000000000DFE00000000000CFE00000000000CFE00000000 00187F0000000000187F0000000000187F0000000000303F8000000000303F8000000000 703FC000000000601FC000000000601FC000000000E01FE000000000C00FE000000000C0 0FE000000001800FF0000000018007F0000000018007F0000000030003F8000000030003 F8000000030003F8000000060001FC000000060001FC0000000E0001FE0000000FFFFFFE 0000000FFFFFFE0000001FFFFFFF0000001800007F0000001800007F0000003000007F80 00003000003F8000003000003F8000006000001FC000006000001FC000006000001FC000 00C000000FE00000C000000FE00001C000000FF00001C0000007F00003E0000007F0001F F000000FF800FFFE0001FFFFE0FFFE0001FFFFE0FFFE0001FFFFE033367DB53A>65 DI<000003FE000C0000003F FF801C000000FFFFE01C000003FE01F83C00000FF0003C7C00001FC0000EFC00007F8000 07FC0000FE000003FC0001FC000001FC0003FC000000FC0003F8000000FC0007F0000000 7C000FE00000007C000FE00000003C001FC00000003C001FC00000001C003FC00000001C 003F800000001C007F800000000C007F800000000C007F800000000C007F000000000C00 FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF 000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF00 0003FFFFE07F000003FFFFE07F800003FFFFE07F80000003FE007F80000001FC003F8000 0001FC003FC0000001FC001FC0000001FC001FC0000001FC000FE0000001FC000FF00000 01FC0007F0000001FC0003F8000001FC0003FC000001FC0001FE000003FC0000FF000003 FC00007F800007FC00001FC0000E7C00000FF0001C3C000003FE00F81C000000FFFFF00C 0000003FFFC00000000003FE00000033377CB43C>71 D77 DI<000007FC00000000007FFFC000000001FC07F000000007E000 FC0000000F80003E0000003F00001F8000007E00000FC00000FC000007E00001F8000003 F00003F0000001F80003F0000001F80007E0000000FC000FE0000000FE000FC00000007E 001FC00000007F001FC00000007F003F800000003F803F800000003F807F800000003FC0 7F800000003FC07F000000001FC07F000000001FC0FF000000001FE0FF000000001FE0FF 000000001FE0FF000000001FE0FF000000001FE0FF000000001FE0FF000000001FE0FF00 0000001FE0FF000000001FE0FF000000001FE0FF000000001FE07F000000001FC07F8000 00003FC07F800000003FC07F800000003FC03F800000003F803FC00000007F803FC00000 007F801FC00000007F001FE0000000FF000FE0000000FE0007F0000001FC0007F0000001 FC0003F8000003F80001F8000003F00000FC000007E000007E00000FC000003F00001F80 00001FC0007F00000007E000FC00000001FC07F0000000007FFFC00000000007FC000000 33377CB43C>I82 D87 D<007F80000003FFF000000F80 FC00001C003E00003F003F00003F801F80003F800FC0003F800FC0003F8007E0001F0007 E000000007E000000007E000000007E000000007E0000001FFE000001FFFE00000FF87E0 0003FC07E0000FF007E0001FC007E0003F8007E0007F8007E0007F0007E000FF0007E0C0 FE0007E0C0FE0007E0C0FE0007E0C0FE000FE0C0FE000FE0C0FF001FE0C07F003BE0C03F 8071F1801FC1E1FF8007FFC0FF0000FE003C0022237DA126>97 D<03F0000000FFF00000 00FFF0000000FFF000000007F000000003F000000003F000000003F000000003F0000000 03F000000003F000000003F000000003F000000003F000000003F000000003F000000003 F000000003F000000003F000000003F03F800003F0FFE00003F3C0F80003F7007E0003FE 003F0003FC001F8003F8000FC003F0000FC003F00007E003F00007F003F00007F003F000 03F003F00003F803F00003F803F00003F803F00003F803F00003F803F00003F803F00003 F803F00003F803F00003F803F00003F803F00003F003F00007F003F00007E003F00007E0 03F0000FC003F8000FC003FC001F8003EC003F0003CF007C00038381F8000301FFE00000 007F000025357EB32B>I<0007F800003FFF0000FC07C001F000E003E003F007C007F00F C007F01F8007F03F8007F03F0003E07F0000007F0000007E000000FE000000FE000000FE 000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007F0000007F 0000003F0000183F8000181F8000381FC000300FC0007007E000E003F001C000FC0F8000 3FFE000007F0001D237EA122>I<0000003F0000000FFF0000000FFF0000000FFF000000 007F000000003F000000003F000000003F000000003F000000003F000000003F00000000 3F000000003F000000003F000000003F000000003F000000003F000000003F000000003F 000007F03F00003FFC3F0000FC0F3F0001F003BF0007E001FF000FC000FF001F80007F00 1F80003F003F00003F003F00003F007F00003F007E00003F00FE00003F00FE00003F00FE 00003F00FE00003F00FE00003F00FE00003F00FE00003F00FE00003F00FE00003F00FE00 003F007E00003F007F00003F007F00003F003F00003F001F80007F001F80007F000FC000 FF0007E001FF8003F007BFFC00F81E3FFC003FFC3FFC000FE03F0026357DB32B>I<000F E000007FFC0000F83F0003F00F8007E00FC00FC007E01F8003E01F8003F03F0003F03F00 01F07F0001F87E0001F87E0001F8FE0001F8FE0001F8FFFFFFF8FFFFFFF8FE000000FE00 0000FE000000FE000000FE0000007E0000007F0000007F0000003F0000183F0000181F80 00380F8000300FC0007007E000E001F003C000FC0F00003FFE000007F0001D237EA122> I<0001FC000007FF00001F0780003E0FC0007C1FC000FC1FC001F81FC001F81FC003F807 0003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000 0003F0000003F0000003F00000FFFFF000FFFFF000FFFFF00003F0000003F0000003F000 0003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000 0003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F000 0003F0000003F0000003F0000003F0000007F800007FFFE0007FFFE0007FFFE0001A357F B417>I<03F0000000FFF0000000FFF0000000FFF000000007F000000003F000000003F0 00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 000003F000000003F000000003F000000003F000000003F000000003F01FC00003F07FF0 0003F1E0FC0003F3807C0003F7007E0003FE007E0003FC003F0003FC003F0003F8003F00 03F8003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003 F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0 003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0007F8007F80FFFFC7 FFFCFFFFC7FFFCFFFFC7FFFC26347EB32B>104 D<07800FC01FE01FE01FE01FE00FC007 80000000000000000000000000000000000000000007E0FFE0FFE0FFE00FE007E007E007 E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007 E007E007E007E00FF0FFFFFFFFFFFF10337EB215>I<07E0FFE0FFE0FFE00FE007E007E0 07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0 07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0 07E007E007E007E007E00FF0FFFFFFFFFFFF10347EB315>108 D<03F01FE000FF0000FF F07FF803FFC000FFF1E07C0F03E000FFF3803E1C01F00007F7003F3801F80003FE003F70 01F80003FC001FE000FC0003FC001FE000FC0003F8001FC000FC0003F8001FC000FC0003 F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F80 00FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003 F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F80 00FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003 F0001F8000FC0007F8003FC001FE00FFFFC7FFFE3FFFF0FFFFC7FFFE3FFFF0FFFFC7FFFE 3FFFF03C217EA041>I<03F01FC000FFF07FF000FFF1E0FC00FFF3807C0007F7007E0003 FE007E0003FC003F0003FC003F0003F8003F0003F8003F0003F0003F0003F0003F0003F0 003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F000 3F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F 0003F0003F0003F0003F0007F8007F80FFFFC7FFFCFFFFC7FFFCFFFFC7FFFC26217EA02B >I<0007F00000003FFE000000FC1F800001F007C00003C001E00007C001F0000F8000F8 001F00007C001F00007C003F00007E003E00003E007E00003F007E00003F007E00003F00 FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE00003F80FE 00003F807E00003F007E00003F007E00003F003F00007E003F00007E001F00007C001F80 00FC000FC001F80007C001F00003F007E00000FC1F8000003FFE00000007F0000021237E A126>I<03E07C00FFE1FF00FFE38F80FFE71FC007EE1FC003EC1FC003EC1FC003FC0F80 03F8000003F8000003F8000003F0000003F0000003F0000003F0000003F0000003F00000 03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000 03F0000003F0000003F0000007F80000FFFFE000FFFFE000FFFFE0001A217FA01E>114 D<00FF060007FFCE001F00FE003C003E0078001E0078000E00F0000E00F0000600F00006 00F8000600F8000600FE000000FF8000007FFC00003FFFC0003FFFF0000FFFF80007FFFC 0000FFFE00000FFF000000FF0000003F80C0001F80C0000F80E0000780E0000780E00007 80F0000780F0000700F8000F00FC000E00FE001C00F7807800E1FFE000C07F800019237E A11E>I<00300000300000300000300000300000700000700000700000F00000F00001F0 0001F00003F00007F0001FFFFEFFFFFEFFFFFE03F00003F00003F00003F00003F00003F0 0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00303F00303F0 0303F00303F00303F00303F00303F00303F00701F80601F80600FC0E007E1C001FF80007 E0182F7FAD1E>I<03F0003F00FFF00FFF00FFF00FFF00FFF00FFF0007F0007F0003F000 3F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F 0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F0003F00 03F0003F0003F0003F0003F0003F0003F0003F0003F0007F0003F0007F0003F0007F0003 F000FF0001F000FF0001F801FF8000F803BFFC007E073FFC001FFE3FFC0007F83F002622 7EA02B>I119 D<7FFF807FF87FFF807FF87FFF807FF807F8001FC003F8000F8001F800070001F8000600 00FC000C0000FC000C0000FE001C00007E001800007E001800003F003000003F00300000 3F807000001F806000001FC0E000000FC0C000000FC0C0000007E180000007E180000007 F380000003F300000003FB00000001FE00000001FE00000000FC00000000FC00000000FC 00000000780000000078000000003000000000300000000060000000006000000000E000 000000C000000000C0000000018000007801800000FC03000000FC03000000FC06000000 FC0E000000701C00000078380000001FF00000000FC000000025307F9F29>121 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fm cmsy6 6 1 /Fm 1 4 df<006000007000006000006000406020E06070F861F07E67E01FFF8007FE00 00F00007FE001FFF807E67E0F861F0E0607040602000600000600000700000600014157B 9620>3 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fn cmmi5 5 6 /Fn 6 110 df<7F80007F80000F80000F00000F00000F00000F00001E00001E00001E00 001E00003C7C003DFF003F87803E03C07C01C07801C07801C07801C0F003C0F003C0F003 C0F00780F00780F00F00701E00383C001FF0000FC000121D7C9C1A>98 D<007000F800F800F000E00000000000000000000000000F801FC031E061E061E0C3C003 C00780078007800F000F081E181E181E301E700FE007800D1D7D9C16>105 D<0001800003C00007C00007C0000380000000000000000000000000000000000000007C 0001FE00038F00070F00060F000C0F00000F00000F00001E00001E00001E00001E00003C 00003C00003C00003C0000780000780000780000780070F000F8F000F9E000F3C000FF80 007E000012257E9C18>I<1FE0001FE00003E00003C00003C00003C00003C00007800007 80000780000780000F00F80F01FC0F070C0F0C1C1E383C1E607C1FC07C1FE0383FF8003C 7C003C1E003C1E04781E0C781E0C781E18780F18F00FF06003E0161D7C9C1F>I<1FC03F C007C007800780078007800F000F000F000F001E001E001E001E003C003C003C003C0078 00780078007880F180F180F180F3007E003C000A1D7C9C14>I<0F01F807E0003F87FE1F F80033CE1F387C0063D80F603C00C3F00FC03C00C3E00F803C0003C00F003C0003C00F00 3C0007801E00780007801E00780007801E00780007801E00F0400F003C00F0C00F003C01 E0C00F003C01E1800F003C01E3801E007800FF000C0030007C002A127D9133>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fo cmr7 7 10 /Fo 10 62 df0 D<0006000C00180030006000E001C00380038007000F000E001E001E001C003C003C003C 0078007800780078007800F800F000F000F000F000F000F000F000F000F000F000F000F8 00780078007800780078003C003C003C001C001E001E000E000F0007000380038001C000 E0006000300018000C00060F3B7AAB1A>40 DI< 00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000 00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000 00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000 00000E00000000000E000000FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE000000E000000 00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000 00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000 00000E00000000000E00000000000E00000000000E00000000000E00000000000E000000 00000E0000002B2B7DA333>43 D<003F800001FFF00003E0F80007803C000F001E001E00 0F003E000F803E000F803C0007807C0007C07C0007C07C0007C07C0007C0FC0007E0FC00 07E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC00 07E0FC0007E0FC0007E0FC0007E07C0007C07C0007C07C0007C03E000F803E000F803E00 0F801F001F000F001E0007803C0003E0F80001FFF000003F80001B277EA521>48 D<00380000780001F8001FF800FEF800E0F80000F80000F80000F80000F80000F80000F8 0000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8 0000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80001FC 00FFFFF8FFFFF815267BA521>I<00FF000003FFE0000E03F0001800F80030007C006000 7E0078003F00FC003F00FE001F80FE001F80FE001F80FE001F807C001F8000001F800000 1F0000003F0000003E0000007E0000007C000000F8000001F0000003E0000003C0000007 8000000E0000001C0000003800000070018000E001800180018003000300060003000C00 03001FFFFF003FFFFF007FFFFE00FFFFFE00FFFFFE0019267DA521>I<00003800000038 00000078000000F8000001F8000001F8000003F8000007F8000006F800000CF800001CF8 000018F8000030F8000070F8000060F80000C0F80001C0F8000180F8000300F8000700F8 000E00F8000C00F8001C00F8003800F8003000F8006000F800E000F800FFFFFFE0FFFFFF E00000F8000000F8000000F8000000F8000000F8000000F8000000F8000001FC00003FFF E0003FFFE01B277EA621>52 D<000FE000003FF80000F81C0001E0060003C01F0007803F 000F003F001F003F001E003F003E001E003E0000007C0000007C0000007C0400007C3FC0 00FCFFF000FDC07800FF003C00FF003E00FE001E00FE001F00FE001F00FC001F80FC001F 80FC001F80FC001F807C001F807C001F807C001F807C001F803C001F003E001F001E001E 001E003E000F003C000780780003C1F00001FFC000007F000019277DA521>54 D61 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fp cmmi7 7 21 /Fp 21 120 df<387CFEFFFF7F3B0303030606060C1838702008127A8614>59 D<003FFFFFFFF0003FFFFFFFF00001FC0007F00001F80001F00001F80000F00003F80000 600003F80000600003F00000600003F00000600007F00000600007F00000600007E00000 600007E0018060000FE0038000000FE0030000000FC0030000000FC0070000001FC00700 00001FC01E0000001FFFFE0000001FFFFE0000003F801E0000003F800C0000003F000C00 00003F000C0000007F001C0000007F00180000007E00180000007E0000000000FE000000 0000FE0000000000FC0000000000FC0000000001FC0000000001FC0000000001F8000000 0001F80000000003F800000000FFFFF0000000FFFFF00000002C287DA72A>70 D86 D<003FFFE00FFFC0003FFFE00FFFC00001FF0001FC000000FE0001F0000000FE0001 C00000007F0003800000007F0007000000003F000E000000003F801C000000001F803800 0000001FC070000000001FC0E0000000000FE1C0000000000FE3800000000007F7000000 000007FE000000000003FC000000000003F8000000000001FC000000000001FC00000000 0001FE000000000003FE0000000000077F00000000000E7F00000000001C3F0000000000 183F8000000000301F8000000000601FC000000000C01FC000000001800FE00000000300 0FE0000000060007F00000000C0007F0000000380003F8000000700003F8000000F00001 FC000001E00001FC00000FF00003FE0000FFFC001FFFE000FFFC001FFFE00032287DA736 >88 DI<01F0 003FF0003FF00003E00003E00007E00007E00007C00007C0000FC0000FC0000F80000F80 001F80001F9F001F3FC01FE0E03FC0F03F00783F00783E00787E007C7E007C7C007C7C00 7CFC007CFC00F8F800F8F800F8F800F8F001F0F001F0F001E0F003E0F003C0F00780700F 00781E003C3C001FF00007C00016297CA71D>98 D<000FE0003FF800F81C01E00E03803E 07807E0F007E1E007C3E007C3C00007C00007C0000F80000F80000F80000F80000F00000 F00000F00000F00004F0000C7800187800303C00E01E07C00FFF0003F800171B7C991E> I<000000F800001FF800001FF8000001F0000001F0000003F0000003F0000003E0000003 E0000007E0000007E0000007C0000007C000000FC0001F8FC0007FCF8000F0EF8003C03F 8007803F800F001F000F001F001E003F003E003F003C003E007C003E007C007E00F8007E 00F8007C00F8007C00F800FC00F000FC00F000F830F000F830F000F830F001F060F001F0 607803F060780EF0C03C1CF9801FF07F8007C01E001D297CA723>I<000FC0007FF000F0 3803C01C07801C0F001C1F001C1E001C3E00387C00707C07E07FFF80FFFC00F80000F800 00F80000F80000F00000F00000F0000478000C7800183800303C00E01E07C00FFF0003F8 00161B7C991F>I<000E00001F00003F00003F00003E00001C0000000000000000000000 000000000000000000000003E00007F0000C7800187C00307C00307C00607C0060F800C0 F800C0F80001F00001F00001F00003E00003E00007C00007C00007C1800F81800F81801F 03001F03001F06000F0C000F1C0007F00003E00011287DA617>105 D<0000070000000F8000001F8000001F8000001F0000000E000000000000000000000000 00000000000000000000000000000000000003E0000007F800000C3C0000183C0000303E 0000603E0000C03E0000C03E0001807C0001807C0000007C0000007C000000F8000000F8 000000F8000000F8000001F0000001F0000001F0000001F0000003E0000003E0000003E0 000003E0000007C0000007C0000007C0000007C000000F8000000F8000380F80007C1F00 00FC1F0000FC3E0000F87C000070F800007FE000001F800000193380A61B>I<003E0000 07FE000007FE0000007C0000007C000000FC000000FC000000F8000000F8000001F80000 01F8000001F0000001F0000003F0000003F0078003E01FC003E0386007E061E007E0C3E0 07C187E007C307E00FC607C00FCC03800FB800000FE000001FF000001FFE00001F3F8000 1F0FC0003F07E0003F03E0003E03E0603E03E0607E03E0607E03C0C07C03C0C07C03C180 FC03C180FC01E300F800FE0070007C001B297CA723>I<007C0FFC0FFC00F800F801F801 F801F001F003F003F003E003E007E007E007C007C00FC00FC00F800F801F801F801F001F 003F003F003E003E007E007E007C187C187C18F830F830F820786078C03F800F000E297E A715>I<07801FC007E0000FE07FF01FF80018F0E0F8783C0030F1807CE03E0030FB007D 801E0060FE003F001E0060FC003F001E0060F8003E001E00C1F8007C003E00C1F0007C00 3E0001F0007C003E0001F0007C003E0003E000F8007C0003E000F8007C0003E000F8007C 0003E000F800F80007C001F000F80007C001F000F83007C001F001F03007C001F001F030 0F8003E003E0600F8003E003E0600F8003E003E0C00F8003E001E1801F0007C001E3801F 0007C000FF000E000380007C00341B7D993B>I<07801FC0000FE07FF00018F0E0F80030 F1807C0030FB007C0060FE003C0060FC003C0060F8003C00C1F8007C00C1F0007C0001F0 007C0001F0007C0003E000F80003E000F80003E000F80003E001F00007C001F00007C001 F06007C003E06007C003E0600F8007C0C00F8007C0C00F8007C1800F8003C3001F0003C7 001F0001FE000E0000F800231B7D9929>I<07803E000FE0FF8018F3C18030F703C030FE 07C060FC0FC060F80FC060F80F80C1F00700C1F0000001F0000001F0000003E0000003E0 000003E0000003E0000007C0000007C0000007C0000007C000000F8000000F8000000F80 00000F8000001F0000001F0000000E0000001A1B7D991F>114 D<000FE0007FF800F03C 01C00E03C01E07803E07803E07803C0F80180FE00007FF0007FFC003FFE001FFF000FFF8 0007F80001F83C00F87E00787E0078FC00F0F800F07001E07003C03C0F801FFE0007F800 171B7C991F>I<001C00003E00003E00007C00007C00007C00007C0000F80000F80000F8 0000F80001F000FFFFE0FFFFE001F00003E00003E00003E00003E00007C00007C00007C0 0007C0000F80000F80000F80000F80001F00001F00601F00601F00C03E00C03E01803E03 001E06001F1C000FF80003E00013267EA419>I<03E000000007F00038000C78007C0018 7C007C00307C00F800307C00F800607C00F80060F800F800C0F801F000C0F801F00001F0 01F00001F001F00001F003E00003E003E00003E003E00003E003E00007C007C00007C007 C18007C007C18007C007C18007C00F830007C00F830003C01F830003E037860001F0E7CE 0000FFC3FC00003F00F000211B7D9927>I<03E001C007F003E00C7807E0187C07E0307C 03E0307C01E0607C01E060F800E0C0F800C0C0F800C001F000C001F000C001F0018003E0 018003E0018003E0030007C0030007C0030007C0060007C0060007C00C0007C00C0003C0 180003E0300001F0E00000FFC000003F00001B1B7D9921>I<03E00000038007F0007007 800C7800F80FC0187C00F80FC0307C01F007C0307C01F003C0607C01F003C060F801F001 C0C0F803E00180C0F803E0018001F003E0018001F003E0018001F007C0030003E007C003 0003E007C0030003E007C0030007C00F80060007C00F80060007C00F800C0007C00F800C 0007C00F80080007C00F80180003C01F80300003E01FC0700001F073E0E00000FFE1FF80 00001F807F00002A1B7D9930>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fq cmmi10 10 43 /Fq 43 121 df<0007F0000000001FFC000030007FFE00007000FFFF00006003FFFF8000 E007FFFFC000C007F01FC001C00F8007E001801F0001E003801C0000F003003800007007 00380000700600700000300E00600000380C00600000181C00E000001818000000001C18 000000000C38000000000C30000000000C70000000000C60000000000CE0000000000CC0 000000000CC0000000000DC0000000000D80000000000D80000000000F80000000000F00 000000000F00000000000E00000000000E00000000000E00000000000C00000000000C00 000000000C00000000001C00000000001C00000000001800000000003800000000003800 000000003800000000003800000000007000000000007000000000007000000000007000 00000000E00000000000E00000000000E00000000000E00000000001C00000000001C000 00000001C000000000018000002C377FA42B>13 D<00003FF00001FFF0000FFFE0003FC0 00007F000000FC000003F8000007F0000007E000000FE000001FC000001FC000003F8000 003F8000007FFFFE007FFFFF007FFFFF007F000000FF000000FE000000FE000000FE0000 00FE000000FE0000007E0000007E0000007E0000007E0000003E0000003F0000001F0000 000F8000600FC000E003E003C001F01F00007FFC00000FE0001C257DA322>15 D<000000000C0000000000001C0000000000001800000000000018000000000000180000 000000003800000000000030000000000000300000000000003000000000000070000000 000000600000000000006000000000000060000000000000E0000000000000C000000000 0000C0000000000000C0000000000001C000000000000180000000000001800000000000 0180000000F80003800F0003FE0003001F80070F0003003F800E0F8003003FC01C0F8007 003FC0180F8006003FC0380F8006001FC0300F8006000FC0701F800E0007C0601F800C00 07C0601F800C0003C0E03F800C000380C03F001C000380C07F0018000380007E00180003 80007E001800030000FE003800030000FC003000030000FC003000070001FC0030000600 01F8007000060001F80060000E0001F80060001C0003F8006000180003F000E000380003 F000C000300003F000C000700003F000C000E00003F001C001C00001F8018003800001F8 018007000001F801800E000000FC03801C0000007E0300780000003F0301E00000000FE3 0F8000000003FFFE00000000003FF0000000000006000000000000060000000000000E00 00000000000C0000000000000C0000000000000C0000000000001C000000000000180000 000000001800000000000018000000000000380000000000003000000000000030000000 00000030000000000000700000000000006000000000324B7EB936>32 D<1C007F00FF80FF80FF80FF80FF807F001C000909798817>58 D<1C007F00FF80FF80FF C0FFC0FFC07FC01CC000C000C000C000C001C00180018003800300070006000E001C0038 00700060000A19798817>I<0000000000038000000000000FC000000000003FC0000000 0000FF800000000003FE00000000000FF800000000003FE00000000000FF800000000003 FE00000000000FF800000000003FE00000000000FF800000000003FE00000000000FF800 000000003FE00000000000FF800000000003FE00000000000FF800000000003FE0000000 0000FF800000000003FE00000000000FF800000000003FE000000000007F800000000000 FE000000000000FE0000000000007F8000000000003FE000000000000FF8000000000003 FE000000000000FF8000000000003FE000000000000FF8000000000003FE000000000000 FF8000000000003FE000000000000FF8000000000003FE000000000000FF800000000000 3FE000000000000FF8000000000003FE000000000000FF8000000000003FE00000000000 0FF8000000000003FE000000000000FF8000000000003FC000000000000FC00000000000 0380323279AD41>I<0000000C0000001E0000003E0000003E0000003C0000007C000000 7C00000078000000F8000000F8000000F0000001F0000001F0000001E0000003E0000003 E0000003C0000007C0000007C00000078000000F8000000F8000000F0000001F0000001F 0000001E0000003E0000003E0000003C0000007C0000007C00000078000000F8000000F8 000000F0000001F0000001F0000001E0000003E0000003E0000007C0000007C000000780 00000F8000000F8000000F0000001F0000001F0000001E0000003E0000003E0000003C00 00007C0000007C00000078000000F8000000F8000000F0000001F0000001F0000001E000 0003E0000003E0000003C0000007C0000007C00000078000000F8000000F8000000F0000 001F0000001F0000001E0000003E0000003E0000003C0000007C0000007C000000780000 00F8000000F8000000F0000000600000001F537BBD2A>I<60000000000000FC00000000 0000FF0000000000007FC000000000001FF0000000000007FC000000000001FF00000000 00007FC000000000001FF0000000000007FC000000000001FF0000000000007FC0000000 00001FF0000000000007FC000000000001FF0000000000007FC000000000001FF0000000 000007FC000000000001FF0000000000007FC000000000001FF0000000000007FC000000 000001FF0000000000007F8000000000001FC000000000001FC000000000007F80000000 0001FF000000000007FC00000000001FF000000000007FC00000000001FF000000000007 FC00000000001FF000000000007FC00000000001FF000000000007FC00000000001FF000 000000007FC00000000001FF000000000007FC00000000001FF000000000007FC0000000 0001FF000000000007FC00000000003FF000000000007FC00000000000FF000000000000 FC00000000000070000000000000323279AD41>I<000000000060000000000000700000 00000000F0000000000001F0000000000001F0000000000003F0000000000003F0000000 000007F000000000000FF000000000000FF000000000001FF800000000001FF800000000 0033F8000000000073F8000000000063F80000000000C3F80000000000C3F80000000001 83F8000000000183F8000000000303F8000000000603F8000000000603FC000000000C03 FC000000000C01FC000000001801FC000000003001FC000000003001FC000000006001FC 000000006001FC00000000C001FC00000001C001FC000000018001FC000000030001FE00 0000030001FE000000060000FE0000000E0000FE0000000C0000FE000000180000FE0000 001FFFFFFE0000003FFFFFFE0000003FFFFFFE000000600000FE000000C00000FE000000 C00000FF000001800000FF0000018000007F0000030000007F0000060000007F00000600 00007F00000C0000007F00000C0000007F0000180000007F0000380000007F0000700000 007F0000F00000007F8001F80000007F8007F8000000FF80FFFF80003FFFFFFFFF80007F FFFFFFFF80007FFFFF383C7DBB3E>65 D<0003FFFFFFFF00000007FFFFFFFFE0000007FF FFFFFFF800000007F80007FE00000007F00000FF00000007F000003F8000000FF000001F C000000FF000000FC000000FE000000FE000000FE0000007F000001FE0000003F000001F E0000003F000001FC0000003F800001FC0000001F800003FC0000001F800003FC0000001 FC00003F80000001FC00003F80000001FC00007F80000001FC00007F80000001FC00007F 00000001FC00007F00000001FC0000FF00000001FC0000FF00000003FC0000FE00000003 FC0000FE00000003FC0001FE00000003FC0001FE00000003F80001FC00000007F80001FC 00000007F80003FC00000007F80003FC00000007F00003F80000000FF00003F80000000F F00007F80000000FE00007F80000001FE00007F00000001FC00007F00000001FC0000FF0 0000003F80000FF00000003F80000FE00000007F00000FE00000007E00001FE0000000FE 00001FE0000001FC00001FC0000001F800001FC0000003F000003FC0000007E000003FC0 00000FC000003F8000001F8000003F8000007F0000007F800000FE0000007F800003FC00 00007F00000FF0000000FF00007FC00000FFFFFFFFFF000000FFFFFFFFFC000000FFFFFF FFC00000003E397DB845>68 D<0003FFFFFFFFFFF00007FFFFFFFFFFF00007FFFFFFFFFF F0000007F800003FF0000007F0000007F0000007F0000003E000000FF0000001E000000F F0000000E000000FE0000000E000000FE0000000E000001FE0000000E000001FE0000000 E000001FC0000000E000001FC0000000C000003FC0000000C000003FC0000000C000003F 80003000C000003F80003000C000007F80007000C000007F800070000000007F00006000 0000007F0000E000000000FF0000E000000000FF0001E000000000FE0003C000000000FE 000FC000000001FFFFFFC000000001FFFFFFC000000001FFFFFF8000000001FC000F8000 000003FC00078000000003FC00078000000003F800030000000003F800030000000007F8 00070000000007F800070003000007F000060003000007F00006000700000FF000060006 00000FF00000000600000FE00000000E00000FE00000000C00001FE00000001C00001FE0 0000001800001FC00000003800001FC00000003800003FC00000007000003FC0000000F0 00003F80000001E000003F80000001E000007F80000007E000007F8000000FC000007F00 00003FC00000FF000003FF8000FFFFFFFFFFFF8000FFFFFFFFFFFF8000FFFFFFFFFFFF00 003C397DB83D>I<0003FFFFFFFFFFE00007FFFFFFFFFFE00007FFFFFFFFFFE0000007F8 00003FE0000007F000000FE0000007F0000003C000000FF0000003C000000FF0000001C0 00000FE0000001C000000FE0000001C000001FE0000001C000001FE0000001C000001FC0 000001C000001FC00000018000003FC00000018000003FC00000018000003F8000000180 00003F800060018000007F8000E0018000007F8000E0000000007F0000C0000000007F00 00C000000000FF0001C000000000FF0001C000000000FE00038000000000FE0007800000 0001FE001F8000000001FFFFFF8000000001FFFFFF0000000001FFFFFF0000000003FC00 1F0000000003FC000F0000000003F8000E0000000003F8000E0000000007F8000E000000 0007F8000E0000000007F0000C0000000007F0000C000000000FF0001C000000000FF000 1C000000000FE00000000000000FE00000000000001FE00000000000001FE00000000000 001FC00000000000001FC00000000000003FC00000000000003FC00000000000003F8000 00000000003F800000000000007F800000000000007F800000000000007F000000000000 00FF800000000000FFFFFFC000000000FFFFFFC000000000FFFFFFC0000000003B397DB8 35>I<00000000FF8000E00000000FFFF000E00000007FFFFC01C0000001FF803E03C000 0007FC000F07C000000FE000038FC000003FC00001DF8000007F000000FF800001FE0000 00FF800003F80000007F800007F00000003F00000FE00000003F00001FC00000003F0000 3F800000001F00007F800000001E0000FF000000001E0000FE000000001E0001FE000000 001E0003FC000000001C0003F8000000001C0007F8000000001C000FF0000000001C000F F00000000018001FF00000000018001FE00000000000001FE00000000000003FC0000000 0000003FC00000000000003FC00000000000007FC00000000000007F800000000000007F 800000000000007F80000000000000FF80000000000000FF00000000000000FF0000007F FFFE00FF000000FFFFFE00FF000000FFFFFE00FF000000007FC000FF000000003F8000FF 000000007F8000FF000000007F0000FF000000007F00007F000000007F00007F00000000 FF00007F00000000FE00007F80000000FE00003F80000000FE00003F80000001FE00001F C0000001FE00001FC0000001FC00000FE0000003FC00000FF0000007FC000007F0000007 FC000003FC00001EF8000001FE00003CF80000007F8000F0780000003FF007E078000000 0FFFFF803000000003FFFE0000000000003FE0000000003B3D7DBA41>I<0003FFF80000 00003FFF800007FFF8000000007FFF800007FFFC000000007FFF80000007FC00000000FF 8000000006FC00000001BF0000000006FC00000001BF000000000EFC000000037F000000 000EFC000000037E000000000CFC000000067E000000000CFC0000000C7E000000001C7E 0000000CFE000000001C7E00000018FC00000000187E00000030FC00000000187E000000 30FC00000000387E00000061FC00000000387E00000061F800000000307E000000C1F800 000000307E00000181F800000000703F00000183F800000000703F00000303F000000000 603F00000603F000000000603F00000603F000000000E03F00000C07F000000000E03F00 000C07E000000000C03F00001807E000000000C03F00003007E000000001C01F8000300F E000000001C01F8000600FC000000001801F8000C00FC000000001801F8000C00FC00000 0003801F8001801FC000000003801F8003001F8000000003001F8003001F800000000300 0FC006001F8000000007000FC006003F8000000007000FC00C003F0000000006000FC018 003F0000000006000FC018003F000000000E000FC030007F000000000E000FC060007E00 0000000C000FC060007E000000000C0007E0C0007E000000001C0007E0C000FE00000000 1C0007E18000FC00000000180007E30000FC00000000180007E30000FC00000000380007 E60001FC00000000380007EC0001F800000000300007EC0001F800000000300003F80001 F800000000700003F80003F800000000700003F00003F000000000F00003E00003F00000 0007FC0003E00007F8000000FFFFE003C007FFFFF00000FFFFE0038007FFFFF00000FFFF E0018007FFFFF0000051397CB851>77 D<00000001FF00000000001FFFF000000000FE01 FC00000003F0007E00000007C0001F8000001F80000FC000003E000007E00000FC000003 F00001F8000003F00003F0000001F80007E0000001F8000FC0000000FC001F80000000FC 003F00000000FE007F000000007E00FE000000007E00FC000000007F01FC000000007F03 F8000000007F03F8000000007F07F0000000007F07F0000000007F0FF0000000007F0FE0 000000007F1FE000000000FF1FE000000000FF3FC000000000FF3FC000000000FF3FC000 000000FF7F8000000001FE7F8000000001FE7F8000000001FE7F8000000001FEFF800000 0003FCFF0000000003FCFF0000000003FCFF0000000007F8FF0000000007F8FF00000000 0FF0FF000000000FF0FF000000000FE0FF000000001FE0FF000000001FC0FF000000003F 807F000000007F807F000000007F007F00000000FE007F00000001FC003F80000001F800 3F80000003F8001F80000007F0001FC000000FE0000FC000001F800007E000003F000007 F000007E000003F00001F8000001FC0003F00000007E000FC00000003F807F0000000007 FFF80000000000FF80000000383D7CBA3F>79 D<0003FFFFFFFF00000007FFFFFFFFE000 0007FFFFFFFFF800000007F80007FC00000007F00000FE00000007F000007F0000000FF0 00003F8000000FF000001FC000000FE000001FC000000FE000001FC000001FE000001FE0 00001FE000001FE000001FC000001FE000001FC000001FE000003FC000001FE000003FC0 00003FC000003F8000003FC000003F8000003FC000007F8000007F8000007F8000007F80 00007F0000007F0000007F000000FE000000FF000001FC000000FF000001F8000000FE00 0007F0000000FE00000FE0000001FE00003FC0000001FE0001FF00000001FFFFFFFC0000 0001FFFFFFE000000003FC00000000000003FC00000000000003F800000000000003F800 000000000007F800000000000007F800000000000007F000000000000007F00000000000 000FF00000000000000FF00000000000000FE00000000000000FE00000000000001FE000 00000000001FE00000000000001FC00000000000001FC00000000000003FC00000000000 003FC00000000000003F800000000000003F800000000000007F800000000000007F8000 00000000007F00000000000000FF800000000000FFFFFF0000000000FFFFFF0000000000 FFFFFF00000000003B397DB835>I<0003FFFFFFF800000007FFFFFFFF80000007FFFFFF FFE000000007F8001FF800000007F00003FC00000007F00000FE0000000FF000007F0000 000FF000007F0000000FE000003F8000000FE000003F8000001FE000003FC000001FE000 003FC000001FC000003FC000001FC000003FC000003FC000003FC000003FC000007F8000 003F8000007F8000003F8000007F8000007F800000FF0000007F800000FE0000007F0000 01FC0000007F000003F8000000FF000007F0000000FF00000FE0000000FE00001F800000 00FE00007F00000001FE0007F800000001FFFFFFE000000001FFFFFF0000000001FC000F C000000003FC0003F000000003FC0001F800000003F80000FC00000003F80000FE000000 07F80000FE00000007F800007E00000007F000007E00000007F000007F0000000FF00000 FF0000000FF00000FE0000000FE00000FE0000000FE00000FE0000001FE00001FE000000 1FE00001FE0000001FC00001FE0000001FC00001FE0000003FC00001FE0000003FC00003 FE0000003F800003FC0060003F800003FC0060007F800003FC00E0007F800003FC00C000 7F000003FC01C000FF800001FC0180FFFFFF0001FC0380FFFFFF0000FE0700FFFFFF0000 7E0E0000000000001FFC00000000000007F0003B3B7DB83F>82 D<0000001FE003800000 00FFFC0300000003FFFE070000000FE01F8F0000003F0007DF0000007E0001FE000000F8 0000FE000001F00000FE000003E000007E000003E000007C000007C000003C00000F8000 003C00000F8000003C00001F8000003800001F0000003800001F0000003800001F000000 3800003F0000003000003F0000003000003F8000003000003F8000000000003FC0000000 00003FE000000000001FF000000000001FFE00000000001FFFE0000000000FFFFE000000 0007FFFFC000000003FFFFF000000001FFFFF800000000FFFFFC000000001FFFFE000000 0003FFFF00000000003FFF000000000003FF800000000000FF8000000000007F80000000 00003F8000000000001F8000000000001F8000000000001F80000C0000001F80000C0000 000F80000C0000000F80001C0000001F80001C0000001F00001C0000001F00001C000000 1F00003C0000003E00003C0000003E00003C0000007C00003E000000F800007E000000F8 00007F000001F000007F800003E000007FC0000FC00000F9F0001F800000F0FE00FE0000 00E03FFFF8000000E00FFFE0000000C001FF00000000313D7CBA33>I<7FFFFC00003FFF C0FFFFFC00007FFFC0FFFFFC00007FFFC003FF00000007FC0001FE00000003E00001FE00 000003C00001FE00000003800000FE00000003000000FE00000007000000FE0000000600 0000FE0000000C000000FE0000000C000000FE00000018000000FF00000030000000FF00 0000300000007F000000600000007F000000E00000007F000000C00000007F0000018000 00007F000001800000007F000003000000007F800006000000007F800006000000003F80 000C000000003F80001C000000003F800018000000003F800030000000003F8000300000 00003F800060000000003FC000C0000000003FC000C0000000001FC00180000000001FC0 0380000000001FC00300000000001FC00600000000001FC00600000000001FC00C000000 00001FE01800000000001FE01800000000000FE03000000000000FE07000000000000FE0 6000000000000FE0C000000000000FE0C000000000000FE18000000000000FE300000000 00000FF300000000000007F600000000000007FE00000000000007FC00000000000007F8 00000000000007F800000000000007F000000000000007E000000000000007E000000000 000003C000000000000003C00000000000000380000000000000030000000000003A3B7C B830>86 D<7FFFFC01FFFFF800FFFF80FFFFFC01FFFFF800FFFF80FFFFFC01FFFFF000FF FF8003FF000007FC00000FF80003FC000007F8000003E00001FC000007F8000003C00001 FC000003F8000003800001FC000003F8000003000001FC000003F8000007000001FC0000 03F8000006000001FC000007F800000C000001FC000007F800000C000001FC00000FF800 0018000001FC00000FF8000018000001FC00001BF8000030000001FC00001BF800006000 0001FC000033F8000060000001FE000073F80000C0000001FE000063F80000C0000000FE 0000C3F8000180000000FE0000C3FC000180000000FE000183FC000300000000FE000181 FC000700000000FE000301FC000600000000FE000701FC000C00000000FE000601FC000C 00000000FE000C01FC001800000000FE000C01FC001800000000FE001801FC0030000000 00FE001801FC007000000000FE003001FC006000000000FE003001FC00C000000000FE00 6001FC00C000000000FF00E001FC018000000000FF00C001FC0180000000007F018001FC 0300000000007F018001FE0300000000007F030001FE0600000000007F030000FE0E0000 0000007F060000FE0C00000000007F0E0000FE1800000000007F0C0000FE180000000000 7F180000FE3000000000007F180000FE3000000000007F300000FE6000000000007F3000 00FEE000000000007F600000FEC000000000007F600000FF8000000000007FC00000FF80 00000000007F800000FF0000000000007F800000FF0000000000003F000000FE00000000 00003F000000FE0000000000003E0000007C0000000000003E000000780000000000003C 000000780000000000003C00000070000000000000380000007000000000000030000000 600000000000513B7CB84E>I<0001FFFFF8007FFFF00001FFFFF800FFFFF00001FFFFF8 00FFFFE0000003FF80000FFC00000003FE00000FE000000001FE0000078000000001FE00 000F0000000000FF00000E0000000000FF00001C00000000007F00003800000000007F80 007000000000007F8000E000000000003FC001C000000000003FC0038000000000001FC0 030000000000001FE0060000000000001FE00C0000000000000FF0180000000000000FF0 3000000000000007F06000000000000007F8C000000000000007F9C000000000000003FF 8000000000000003FF0000000000000001FE0000000000000001FE0000000000000001FE 0000000000000000FF0000000000000000FF0000000000000000FF0000000000000001FF 80000000000000037F80000000000000063FC00000000000000E3FC00000000000001C1F E0000000000000381FE0000000000000700FE0000000000000E00FF0000000000000C00F F00000000000018007F80000000000030007F80000000000060003F800000000000C0003 FC0000000000180003FC0000000000300001FE0000000000700001FE0000000000E00000 FE0000000001C00000FF0000000003800000FF00000000070000007F800000000E000000 7F800000001E0000003F800000007E0000007FC0000003FF000000FFE000007FFFE0001F FFFFC000FFFFE0001FFFFFC000FFFFE0001FFFFF800044397EB845>II<0000FFFFFFFFFC0000FFFFFF FFFC0001FFFFFFFFFC0001FFE00007F80001FE00000FF00003F800001FE00003F000003F C00003E000007F800003C000007F000007800000FF000007000001FE000007000003FC00 000E000007F800000E00000FF000000C00001FE000001C00003FC000001800003F800000 1800007F800000180000FF000000000001FE000000000003FC000000000007F800000000 000FF000000000000FE000000000001FE000000000003FC000000000007F800000000000 FF000000000001FE000000000003FC000000000007F8000000000007F000000000000FF0 00000000001FE000000000003FC000000000007F80000C000000FF00000C000001FE0000 0C000001FC00001C000003FC000018000007F800001800000FF000003800001FE0000030 00003FC000007000007F800000700000FF000000F00000FE000000E00001FE000001E000 03FC000003E00007F8000007C0000FF000000FC0001FE000001FC0003FC000007F80007F 800007FF80007FFFFFFFFF8000FFFFFFFFFF8000FFFFFFFFFF000036397BB839>I<0000 7E00000003FF8000000FC1C380001F00EFC0007E007FC000FC003FC001F8003FC003F000 1F8007F0001F8007E0001F800FE0003F801FC0003F001FC0003F003F80003F003F80007F 007F80007E007F00007E007F00007E007F0000FE00FF0000FC00FE0000FC00FE0000FC00 FE0001FC00FE0001F800FC0001F80CFC0001F80CFC0003F80CFC0003F01CFC0003F018FC 0007F0187C0007F0387E000FF0303E001FF0303E007BF0701F00E1F0E00F83C0F9C003FF 007F8000FC001F0026267DA42C>97 D<003F00001FFF00001FFF00001FFF0000007F0000 007E0000007E0000007E000000FE000000FC000000FC000000FC000001FC000001F80000 01F8000001F8000003F8000003F0000003F0000003F0000007F0000007E0FC0007E3FF00 07E707C00FFE03E00FF801F00FF001F80FE000F81FC000F81FC000FC1F8000FC1F8000FC 3F8000FC3F0000FC3F0000FC3F0001FC7F0001FC7E0001FC7E0001FC7E0003FCFE0003FC FC0003F8FC0003F8FC0007F8FC0007F0F80007F0F8000FE0F8000FE0F8000FC0F8001F80 F8003F8078003F007C007E007C00FC003C01F8001E03F0000F07C00007FF000001FC0000 1E3B7CB924>I<00003FC00001FFF00007E03C000F800E003F0007007E001F00FC007F01 F800FF03F000FF07E000FF0FE000FF0FC000FE1FC000383F8000003F8000007F8000007F 0000007F0000007F000000FF000000FE000000FE000000FE000000FE000000FC000000FC 000000FC000000FC000003FC0000077E0000067E00000E3E00003C3F0000701F0000E00F 8007C007C03F0001FFF800003FC00020267DA424>I<000000003F0000001FFF0000001F FF0000001FFF000000007F000000007E000000007E00000000FE00000000FE00000000FC 00000000FC00000001FC00000001FC00000001F800000001F800000003F800000003F800 000003F000000003F000000007F000000007F000007E07E00003FF87E0000FC1CFE0001F 00EFE0007E007FC000FC003FC001F8003FC003F0001FC007F0001F8007E0001F800FE000 3F801FC0003F801FC0003F003F80003F003F80007F007F80007F007F00007E007F00007E 007F0000FE00FF0000FE00FE0000FC00FE0000FC00FE0001FC00FE0001FC00FC0001F80C FC0001F80CFC0003F80CFC0003F81CFC0003F018FC0007F0187C0007F0387E000FF0303E 001FF0303E007BF0701F00E1F0E00F83C0F9C003FF007F8000FC001F00283B7DB92B>I< 00003FC00001FFF00007E078001F801C007E001E00FC000E01F8000E03F0000E07F0000E 0FE0000E0FC0001E1FC0001C1FC0003C3F8000F83F8003E07F803FC07FFFFE007FFFE000 7F000000FF000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000 7E0000037E0000077E0000063E00000E3E00003C1F0000700F8000E00F8007C003E03F00 01FFF800003FC00020267DA427>I<000007E00000001FF80000007C1C380001F80EFC00 03F007FC0007E003FC000FC003FC001F8001FC003F0001F8007F0001F8007E0003F800FE 0003F800FE0003F001FC0003F001FC0007F003FC0007F003F80007E003F80007E003F800 0FE007F8000FE007F0000FC007F0000FC007F0001FC007F0001FC007E0001F8007E0001F 8007E0003F8007E0003F8007E0003F0003E0007F0003F000FF0001F001FF0001F003FE00 00F8077E00007C1EFE00001FF8FE000007E0FC00000000FC00000001FC00000001FC0000 0001F800000001F800000003F8001E0003F0003F0003F0007F8007F0007F8007E000FF80 0FC000FF001F8000FE003F00007C007E00003C01F800001FFFE0000003FF00000026367F A428>103 D<0000E00003F80003F80007F80007F80007F80007F00001C0000000000000 00000000000000000000000000000000000000000000000000000000F80003FE00070F00 0E0F801C0F80180F80380F80300F80701F80601F80603F80E03F00C03F00C07F00007E00 007E0000FE0000FC0001FC0001FC0001F80003F80003F00003F00007F01807E01807E038 0FE0300FC0300FC0700F80600F80E00F80C00F81C00F838007870003FE0000F80015397E B71D>105 D<0003F0000001FFF0000001FFF0000001FFF000000007F000000007E00000 0007E000000007E00000000FE00000000FC00000000FC00000000FC00000001FC0000000 1F800000001F800000001F800000003F800000003F000000003F000000003F000000007F 000000007E0007C0007E001FF0007E00783800FE00E0F800FC01C1FC00FC0383FC00FC07 07FC01FC0E07FC01F81C07F801F83803F001F87001E003F8E0000003F1C0000003F38000 0003F700000007FE00000007FE00000007FFE0000007E7F800000FE0FE00000FC07F0000 0FC03F80000FC01F80001FC01FC0001F800FC0301F800FC0301F800FC0703F801FC0603F 001F80603F001F80603F001F80E07F001F80C07E001F81C07E000F81807E000F8380FE00 078700FC0003FE00380000F800263B7CB92B>107 D<000FC003FFC007FFC007FFC0001F C0001F80001F80003F80003F80003F00003F00007F00007F00007E00007E0000FE0000FE 0000FC0000FC0001FC0001FC0001F80001F80003F80003F80003F00003F00007F00007F0 0007E00007E0000FE0000FE0000FC0000FC0001FC0001FC0001F80001F80003F80003F80 003F00003F00007F00007F00007E03007E0300FE0700FE0600FC0600FC0600FC0E00FC0C 00FC1C00FC18007C38003C70001FE000078000123B7DB919>I<03E0007F0000FE000007 F801FFE003FFC0000E3C0781F00F03E0001C3E1E00F83C01F000383F3800FC7001F80030 3F7000FCE001F800303FE0007DC000F800703FC0007F8000F800603F80007F0000F80060 3F80007F0000F800E03F0000FE0001F800C07F0000FE0001F800C07E0000FC0001F800C0 7E0000FC0001F800007E0001FC0003F80000FE0001FC0003F00000FC0001F80003F00000 FC0001F80003F00000FC0003F80007F00001FC0003F80007E00001F80003F00007E00001 F80003F0000FE00001F80007F0000FC00003F80007F0000FC00003F00007E0001FC06003 F00007E0001F806003F0000FE0003F80E007F0000FE0003F00C007E0000FC0003F00C007 E0000FC0003F01C007E0001FC0003E01800FE0001FC0003E03800FC0001F80003E03000F C0001F80003E07000FC0003F80003E0E001FC0003F80001E1C001F80003F00000FF80007 00000E000003E00043267EA449>I<03E0007F000007F801FFE0000E3C0781F0001C3E1E 00F800383F3800FC00303F7000FC00303FE0007C00703FC0007C00603F80007C00603F80 007C00E03F0000FC00C07F0000FC00C07E0000FC00C07E0000FC00007E0001FC0000FE00 01F80000FC0001F80000FC0001F80000FC0003F80001FC0003F00001F80003F00001F800 07F00001F80007E00003F80007E00003F0000FE03003F0000FC03003F0001FC07007F000 1F806007E0001F806007E0001F80E007E0001F00C00FE0001F01C00FC0001F01800FC000 1F03800FC0001F07001FC0000F0E001F800007FC0007000001F0002C267EA432>I<0000 1FC0000000FFF8000007E07E00000F801F00003F000F80007E000FC000FC0007C001F800 07E003F00007E007E00003F00FE00003F00FC00003F01FC00003F03F800007F03F800007 F07F800007F07F000007F07F000007F07F00000FF0FF00000FF0FE00000FE0FE00000FE0 FE00001FE0FE00001FC0FE00001FC0FC00003F80FC00003F00FC00007F00FC00007E007E 0000FC007E0001F8003E0003F0003F0007E0001F000FC0000F801F000007E07E000001FF F00000003F80000024267DA428>I<000F8003F000001FE00FFC000039F03C1F000070F8 700F8000E0FDE007C000C0FF8007C000C0FF0007E001C0FE0003E00180FE0003F00180FC 0003F00381FC0003F00301FC0003F00301F80003F00301F80003F00003F80007F00003F8 0007F00003F00007F00003F00007F00007F0000FF00007F0000FF00007E0000FE00007E0 000FE0000FE0001FE0000FE0001FC0000FC0001FC0000FC0003F80001FC0003F80001FC0 007F00001F80007E00001F8000FE00003F8000FC00003FC001F800003FC003F000003FE0 07E000007F700F8000007F383F0000007E1FFC0000007E07E0000000FE0000000000FE00 00000000FC0000000000FC0000000001FC0000000001FC0000000001F80000000001F800 00000003F80000000003F80000000003F00000000007F000000000FFFFC0000000FFFFC0 000000FFFFC00000002C3583A42A>I<03E001F80007F807FE000E3C1E07001C3E381F00 183F703F80383FE07F80303FC0FF80703F80FF80603F80FF00603F007E00603F003C00E0 7F000000C07E000000C07E000000007E00000000FE00000000FC00000000FC00000000FC 00000001FC00000001F800000001F800000001F800000003F800000003F000000003F000 000003F000000007F000000007E000000007E000000007E00000000FE00000000FC00000 000FC00000000FC00000001FC00000001F80000000070000000021267EA425>114 D<0000FF000003FFC0000F80F0003E00380078001C0078003C00F000FC01F001FC01E001 FC01E001FC01E001FC03F000F003F8000003FC000001FFE00001FFFC0001FFFF0000FFFF 80007FFFC0001FFFE00003FFE000003FF0000007F0000003F01E0001F07F0001F07F0001 F0FF0001E0FF0001E0FF0001E0FE0003C0F80003C0E000078070000F0038003E001E00F8 0007FFE00001FF00001E267CA427>I<0001C0000003E0000007E0000007E0000007E000 0007E000000FE000000FC000000FC000000FC000001FC000001F8000001F8000001F8000 003F8000003F00007FFFFF807FFFFF80FFFFFF80007E0000007E0000007E000000FE0000 00FC000000FC000000FC000001FC000001F8000001F8000001F8000003F8000003F00000 03F0000003F0000007F0000007E0000007E0000007E000000FE000000FC006000FC00600 0FC00E001FC00C001F801C001F8018001F8038001F8070001F8060001F80E0000F81C000 0787800003FE000000F8000019357EB31E>I<00F80000000003FE00003800070F00007C 000E0F8000FC001C0F8000FC00180F8000FC00380F8001FC00300F8001FC00701F8001F8 00601F8001F800601F8003F800E03F8003F800C03F0003F000C07F0003F000007E0007F0 00007E0007F00000FE0007E00000FC0007E00000FC000FE00001FC000FE00001F8000FC0 0001F8000FC00001F8001FC00003F8001FC00003F0001F80C003F0001F80C003F0003F80 C003F0003F81C003F0003F018003F0003F018003F0007F038003F000FF030001F000FF03 0001F001FF070000F8079F0E00007C0E0F1C00003FFC07F8000007F001F0002A267EA430 >I<00F80003C003FE0007E0070F000FE00E0F800FF01C0F800FF0180F800FF0380F8007 F0300F8003F0701F8001F0601F8001F0601F8000F0E03F8000E0C03F0000E0C07F0000E0 007E0000E0007E0000C000FE0000C000FC0000C000FC0001C001FC00018001F800018001 F800038001F800030003F800030003F000070003F000060003F0000E0003F0000C0003F0 001C0003F000180003F000380003F000700001F000E00001F801C00000FC038000007E0F 0000001FFE00000007F0000024267EA428>I<00F800000000F003FE0000E001F8070F00 01F003F80E0F8003F003FC1C0F8003F003FC180F8003F003FC380F8007F001FC300F8007 E000FC701F8007E0007C601F8007E0007C601F800FE0003CE03F800FE00038C03F000FC0 0038C07F000FC00038007E001FC00038007E001FC0003000FE001F80003000FC001F8000 3000FC003F80007001FC003F80006001F8003F00006001F8003F00006001F8003F0000E0 03F8007F0000C003F0007E0000C003F0007E0001C003F0007E00018003F0007E00038003 F0007E00030003F0007E00070003F000FE00060003F000FE000E0001F001FE001C0001F8 01BF00380000FC039F807000007E0F0FC0E000001FFC03FFC0000003F0007F000036267E A43B>I<0007E001F000001FF807FC0000783E0E0F0000E01F1C1F0001C01F383F800380 0FF07F8003000FE0FF8007000FE0FF800E000FC0FF000C000FC07E000C001FC03C001C00 1F80000018001F80000018001F80000000003F80000000003F80000000003F0000000000 3F00000000007F00000000007F00000000007E00000000007E0000000000FE0000000000 FE0000000000FC000C000000FC000C000001FC001C001E01FC0018003F01F80018007F81 F80038007F83F8007000FF83F8006000FF07F800E000FE0E7C01C0007C1C7C0380007838 3E0F00001FF00FFC000007C003F0000029267EA42F>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fr cmbx12 12 36 /Fr 36 121 df<000003C000000007C00000001FC00000007FC0000003FFC000003FFFC0 00FFFFFFC000FFFFFFC000FFFFFFC000FFFFFFC000FFC3FFC0000003FFC0000003FFC000 0003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC00000 03FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003 FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FF C0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0 000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000 0003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC00000 03FFC0000003FFC0000003FFC0000003FFC000FFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFF FFFFFCFFFFFFFFFC264177C038>49 D<0000FFE00000000FFFFE0000003FFFFF800000FF FFFFE00003FFFFFFF80007FC03FFFE000FE0007FFF001F80003FFF803F00000FFFC07F00 0007FFC07FC00007FFE07FF00003FFE0FFF00001FFF0FFF80001FFF0FFF80001FFF8FFF8 0000FFF8FFF80000FFF8FFF80000FFF8FFF80000FFF87FF00000FFF83FE00000FFF81FC0 0000FFF800000000FFF800000000FFF000000001FFF000000001FFF000000001FFE00000 0003FFE000000003FFC000000007FF800000000FFF000000000FFF000000001FFC000000 003FF8000000003FF0000000007FE000000000FFC000000001FF0000000003FE00000000 07FC000000000FF0000000001FE0000000003F80000000007F0000780000FE0000780001 FC0000780003F80000F80007E00000F0000FC00000F0001F800000F0003F000000F0007C 000001F000F8000003F001FFFFFFFFF003FFFFFFFFE007FFFFFFFFE00FFFFFFFFFE01FFF FFFFFFE03FFFFFFFFFE07FFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFC0FFFFFFFFFFC0FFFF FFFFFFC0FFFFFFFFFFC02D417BC038>I<0000FFF000000007FFFF0000001FFFFFC00000 7FFFFFF00000FF007FF80003F8003FFE0007E0001FFF0007E0000FFF000FF80007FF800F FE0007FF801FFE0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01F FF0007FFC01FFF0007FFC00FFE0007FFC007FC0007FF8003F8000FFF800000000FFF0000 00001FFF000000001FFE000000003FFC000000007FF800000000FFF000000001FFE00000 000FFF80000007FFFE00000007FFF800000007FFFF00000007FFFFC000000000FFF00000 00003FFC000000000FFE000000000FFF8000000007FF8000000003FFC000000003FFE000 000003FFE000000001FFF000000001FFF000000001FFF800000001FFF800000001FFF80F C00001FFF83FF00001FFF87FF80001FFF87FF80001FFF8FFFC0001FFF8FFFC0001FFF8FF FC0001FFF0FFFC0001FFF0FFFC0003FFF0FFFC0003FFE07FF80003FFE07FF00007FFC07F E00007FFC03F80000FFF801FF0001FFF000FFE00FFFE0007FFFFFFF80001FFFFFFF00000 7FFFFFC000001FFFFE00000001FFE000002D427BC038>I<000000003F0000000000003F 0000000000007F000000000000FF000000000001FF000000000003FF000000000003FF00 0000000007FF00000000000FFF00000000001FFF00000000003FFF00000000003FFF0000 0000007FFF0000000000FFFF0000000001F7FF0000000003E7FF0000000007E7FF000000 0007C7FF000000000F87FF000000001F07FF000000003E07FF000000007E07FF00000000 7C07FF00000000F807FF00000001F007FF00000003E007FF00000007E007FF00000007C0 07FF0000000F8007FF0000001F0007FF0000003E0007FF0000007C0007FF0000007C0007 FF000000F80007FF000001F00007FF000003E00007FF000007C00007FF00000FC00007FF 00000F800007FF00001F000007FF00003E000007FF00007C000007FF0000FC000007FF00 00FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80 0000000FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF000000 00000FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF00000000 000FFF00000000000FFF000000007FFFFFFF8000007FFFFFFF8000007FFFFFFF8000007F FFFFFF8000007FFFFFFF8031417DC038>I<07C01FF03FF87FFCFFFEFFFEFFFEFFFEFFFE FFFEFFFE7FFC3FF81FF007C0000000000000000000000000000000000000000000000000 0000000007C01FF03FF87FFCFFFEFFFEFFFEFFFEFFFEFFFEFFFE7FFC3FF81FF007C00F2C 78AB1F>58 D<000000001F8000000000000000001F8000000000000000003FC000000000 000000003FC000000000000000007FE000000000000000007FE000000000000000007FE0 0000000000000000FFF00000000000000000FFF00000000000000001FFF8000000000000 0001FFF80000000000000001FFF80000000000000003FFFC0000000000000003FFFC0000 000000000007FFFE0000000000000007FFFE0000000000000007FFFE000000000000000F FFFF000000000000000F9FFF000000000000001F9FFF800000000000001F1FFF80000000 0000001F0FFF800000000000003F0FFFC00000000000003E07FFC00000000000007E07FF E00000000000007C07FFE00000000000007C03FFE0000000000000FC03FFF00000000000 00F801FFF0000000000001F801FFF8000000000001F001FFF8000000000001F000FFF800 0000000003F000FFFC000000000003E0007FFC000000000007E0007FFE000000000007C0 007FFE000000000007C0003FFE00000000000FC0003FFF00000000000F80001FFF000000 00001F80001FFF80000000001F00000FFF80000000001F00000FFF80000000003F00000F FFC0000000003E000007FFC0000000007E000007FFE0000000007FFFFFFFFFE000000000 7FFFFFFFFFE000000000FFFFFFFFFFF000000000FFFFFFFFFFF000000001FFFFFFFFFFF8 00000001F0000000FFF800000001F0000000FFF800000003F0000000FFFC00000003E000 00007FFC00000007E00000007FFE00000007C00000003FFE00000007C00000003FFE0000 000F800000003FFF0000000F800000001FFF0000001F800000001FFF8000001F00000000 0FFF8000003F000000000FFFC000003E000000000FFFC000007E0000000007FFC000FFFF FF00000FFFFFFFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFF FFF0FFFFFF00000FFFFFFFF04C457CC455>65 DI69 DI73 D82 D<0000FFE0001C000007FFFE003C00003FFFFF807C00 00FFFFFFE0FC0001FFFFFFF9FC0003FF801FFFFC0007FC0001FFFC000FF800007FFC001F F000003FFC003FE000000FFC003FC0000007FC007FC0000003FC007F80000003FC007F80 000001FC007F80000000FC00FF80000000FC00FF800000007C00FF800000007C00FFC000 00007C00FFC00000007C00FFE00000003C00FFF00000003C00FFF80000003C00FFFC0000 0000007FFE00000000007FFFE0000000007FFFFE000000003FFFFFF00000003FFFFFFF00 00001FFFFFFFE000001FFFFFFFFC00000FFFFFFFFE000007FFFFFFFF800003FFFFFFFFC0 0001FFFFFFFFE000007FFFFFFFF000001FFFFFFFF8000007FFFFFFFC000000FFFFFFFC00 00000FFFFFFE00000000FFFFFE0000000007FFFF00000000007FFF00000000003FFF0000 0000000FFF800000000007FF800000000003FF80F000000003FF80F000000001FF80F000 000001FF80F000000000FF80F000000000FF80F800000000FF80F800000000FF80F80000 0000FF00FC00000000FF00FC00000000FF00FE00000001FF00FF00000001FE00FF800000 03FE00FFC0000003FC00FFE0000007FC00FFF800000FF800FFFF00003FF000FFFFF800FF E000FE7FFFFFFFC000FC1FFFFFFF0000F807FFFFFC0000F000FFFFF00000E00007FF8000 0031467AC43E>I<3FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03F FFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFE000FFF8003FFE07FE0000FFF80003FF07F C0000FFF80001FF07F00000FFF800007F07F00000FFF800007F07E00000FFF800003F07C 00000FFF800001F07C00000FFF800001F07C00000FFF800001F07800000FFF800000F078 00000FFF800000F07800000FFF800000F07800000FFF800000F0F800000FFF800000F8F0 00000FFF80000078F000000FFF80000078F000000FFF80000078F000000FFF80000078F0 00000FFF800000780000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000000000FFF8000000000 00000FFF800000000000000FFF800000000000000FFF800000000007FFFFFFFFFF000000 07FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFFFF000045 437CC24E>I86 DI<0001FFE0000000001FFFFE00000000 7FFFFF80000001FFFFFFE0000003FE007FF8000007FC001FFC000007FE000FFE00000FFF 0007FF00000FFF0007FF00000FFF0003FF80000FFF0003FF80000FFF0003FF80000FFF00 01FFC00007FE0001FFC00003FC0001FFC00000F00001FFC00000000001FFC00000000001 FFC00000000001FFC00000000001FFC000000003FFFFC0000000FFFFFFC0000007FFFFFF C000003FFFF1FFC00000FFFC01FFC00003FFE001FFC0000FFF8001FFC0001FFE0001FFC0 003FFC0001FFC0003FF80001FFC0007FF80001FFC0007FF00001FFC000FFF00001FFC000 FFE00001FFC000FFE00001FFC000FFE00001FFC000FFE00003FFC000FFE00003FFC000FF F00007FFC0007FF8000FFFC0007FF8001FFFF0003FFE003EFFFFC01FFF80FC7FFFC007FF FFF87FFFC003FFFFE01FFFC0007FFF8007FFC0000FFC00000000322F7DAD36>97 D<007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC000000000 FFFFC00000000003FFC00000000001FFC00000000001FFC00000000001FFC00000000001 FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 0000000001FFC00000000001FFC00000000001FFC00000000001FFC00FF8000001FFC0FF FF800001FFC3FFFFE00001FFCFFFFFF80001FFDFC03FFC0001FFFF000FFE0001FFFC0003 FF0001FFF80001FF8001FFF00001FFC001FFE00000FFE001FFC00000FFE001FFC000007F F001FFC000007FF001FFC000007FF801FFC000003FF801FFC000003FF801FFC000003FF8 01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01 FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FF C000003FFC01FFC000003FFC01FFC000003FF801FFC000003FF801FFC000007FF801FFC0 00007FF001FFC000007FF001FFC000007FF001FFC00000FFE001FFE00000FFC001FFF000 01FFC001FFF80003FF8001FF7C0007FF0001FE3E000FFE0001FC1FC07FFC0001F80FFFFF F00001F003FFFFC00001E000FFFF00000000001FF0000036467DC43E>I<00003FFC0000 0001FFFFC000000FFFFFF000003FFFFFFC00007FF003FE0000FFC001FF0003FF8003FF00 07FF0007FF8007FE0007FF800FFE0007FF801FFC0007FF801FFC0007FF803FF80007FF80 3FF80003FF007FF80001FE007FF8000078007FF0000000007FF000000000FFF000000000 FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000 FFF000000000FFF000000000FFF000000000FFF000000000FFF0000000007FF800000000 7FF8000000007FF8000000003FF8000000003FFC000003C03FFC000003C01FFE000007C0 0FFE000007800FFF00000F8007FF80001F0003FFC0003E0001FFF0007C00007FFC03F800 003FFFFFF000000FFFFFC0000003FFFF000000003FF800002A2F7CAD32>I<0000000003 FE0000000007FFFE0000000007FFFE0000000007FFFE0000000007FFFE0000000007FFFE 00000000001FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00 000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0000 0000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE000000 00000FFE00000000000FFE00000000000FFE0000003FE00FFE000003FFFC0FFE00000FFF FF8FFE00003FFFFFCFFE0000FFF807FFFE0001FFC001FFFE0003FF80007FFE0007FF0000 3FFE000FFE00001FFE000FFC00000FFE001FFC00000FFE003FF800000FFE003FF800000F FE003FF800000FFE007FF800000FFE007FF000000FFE007FF000000FFE00FFF000000FFE 00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00 FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FF F000000FFE007FF000000FFE007FF000000FFE007FF000000FFE007FF800000FFE003FF8 00000FFE003FF800000FFE001FFC00001FFE001FFC00001FFE000FFE00003FFE0007FE00 007FFE0003FF0000FFFF0001FFC003FFFFFC00FFF01FEFFFFC007FFFFF8FFFFC001FFFFE 0FFFFC0007FFF80FFFFC00007FC00FF80036467CC43E>I<00003FF800000003FFFF8000 000FFFFFE000003FFFFFF000007FF83FF80000FFC007FC0001FF8003FE0003FF0001FF00 07FE0000FF800FFC0000FF801FFC00007FC01FF800007FC03FF800003FE03FF800003FE0 7FF800003FE07FF000003FE07FF000003FF07FF000001FF0FFF000001FF0FFF000001FF0 FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFF000000000FFF000000000 FFF000000000FFF000000000FFF0000000007FF0000000007FF0000000007FF800000000 7FF8000000003FF8000000003FF8000000F01FFC000000F01FFC000001F00FFE000001E0 07FF000003E003FF800007C001FFC0000F8000FFF0003F00007FFE01FE00001FFFFFFC00 0007FFFFF0000001FFFFC00000001FFE00002C2F7DAD33>I<000000FF8000000FFFE000 007FFFF00001FFFFF80003FF8FFC000FFE0FFE001FFC1FFE001FF81FFE003FF81FFE007F F01FFE007FF01FFE007FF00FFC00FFE00FFC00FFE003F000FFE000C000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 0000FFE0000000FFE00000FFFFFFF800FFFFFFF800FFFFFFF800FFFFFFF800FFFFFFF800 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF E0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 0000FFE0000000FFE0000000FFE0000000FFE0000000FFE000007FFFFFE0007FFFFFE000 7FFFFFE0007FFFFFE0007FFFFFE00027467DC522>I<0000FFE0007E00000FFFFE03FF80 003FFFFF8FFF8000FFFFFFFFFFC001FFC07FFF3FC003FF001FF83FC007FE000FFC3FC00F FC0007FE1F801FFC0007FF0F001FF80003FF00001FF80003FF00003FF80003FF80003FF8 0003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF800 03FF80003FF80003FF80001FF80003FF00001FF80003FF00001FFC0007FF00000FFC0007 FE000007FE000FFC000003FF001FF8000001FFC07FF0000003FFFFFFE0000003FFFFFF80 0000078FFFFE0000000780FFE00000000F8000000000000F8000000000000F8000000000 000F8000000000000FC000000000000FE000000000000FF000000000000FFFFFFFC00000 0FFFFFFFFC000007FFFFFFFF800007FFFFFFFFE00003FFFFFFFFF00001FFFFFFFFFC0000 FFFFFFFFFC0003FFFFFFFFFE000FFFFFFFFFFF001FF000007FFF003FC0000007FF007F80 000001FF807F80000000FF80FF00000000FF80FF000000007F80FF000000007F80FF0000 00007F80FF000000007F80FF80000000FF807F80000000FF007FC0000001FF003FE00000 03FE001FF0000007FC000FFE00003FF80007FFC001FFF00001FFFFFFFFC000007FFFFFFF 0000000FFFFFF8000000007FFF00000032427DAC38>I<007FC000000000FFFFC0000000 00FFFFC000000000FFFFC000000000FFFFC000000000FFFFC00000000003FFC000000000 01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 0000000001FFC00000000001FFC007FE000001FFC03FFF800001FFC0FFFFE00001FFC1FF FFF80001FFC7F03FFC0001FFCF801FFC0001FFDF000FFE0001FFDE000FFE0001FFFC000F FE0001FFF80007FF0001FFF00007FF0001FFF00007FF0001FFE00007FF0001FFE00007FF 0001FFE00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FF FFFE37457CC43E>I<007C0001FF0003FF8007FFC007FFC00FFFE00FFFE00FFFE00FFFE0 0FFFE007FFC007FFC003FF8001FF00007C00000000000000000000000000000000000000 000000000000000000000000007FC07FFFC07FFFC07FFFC07FFFC07FFFC003FFC001FFC0 01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF18467CC520>I<007FC000000000FFFFC000000000FFFFC000000000FFFFC00000 0000FFFFC000000000FFFFC00000000003FFC00000000001FFC00000000001FFC0000000 0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001 FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF C00000000001FFC0007FFFE001FFC0007FFFE001FFC0007FFFE001FFC0007FFFE001FFC0 007FFFE001FFC0000FE00001FFC0001FC00001FFC0003F000001FFC0007E000001FFC000 FC000001FFC003F8000001FFC007E0000001FFC00FC0000001FFC01F80000001FFC07F00 000001FFC0FE00000001FFC1FC00000001FFC3FE00000001FFC7FE00000001FFDFFF0000 0001FFFFFF80000001FFFFFFC0000001FFFFFFC0000001FFF9FFE0000001FFE1FFF00000 01FFC0FFF8000001FF807FF8000001FF803FFC000001FF803FFE000001FF801FFF000001 FF800FFF000001FF8007FF800001FF8007FFC00001FF8003FFE00001FF8001FFE00001FF 8000FFF00001FF8000FFF80001FF80007FFC0001FF80003FFC00FFFFFF03FFFFF8FFFFFF 03FFFFF8FFFFFF03FFFFF8FFFFFF03FFFFF8FFFFFF03FFFFF835457DC43B>107 D<007FC000FFFFC000FFFFC000FFFFC000FFFFC000FFFFC00003FFC00001FFC00001FFC0 0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 0001FFC000FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8019457CC420>I<007F8007 FE00000FFC0000FFFF803FFFC0007FFF8000FFFF80FFFFF001FFFFE000FFFF81FFFFF803 FFFFF000FFFF87F01FFC0FE03FF800FFFF8FC00FFE1F801FFC0003FF9F000FFF3E001FFE 0001FF9E0007FF3C000FFE0001FFBC0007FF78000FFE0001FFF80003FFF00007FF0001FF F80003FFF00007FF0001FFF00003FFE00007FF0001FFE00003FFC00007FF0001FFE00003 FFC00007FF0001FFE00003FFC00007FF0001FFC00003FF800007FF0001FFC00003FF8000 07FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF00 01FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC0 0003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF 800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007 FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001 FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC000 03FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF80 0007FF00FFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFF FEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFE572D7CAC5E>I<007F8007FE00 00FFFF803FFF8000FFFF80FFFFE000FFFF81FFFFF800FFFF87F03FFC00FFFF8F801FFC00 03FF9F000FFE0001FF9E000FFE0001FFBC000FFE0001FFF80007FF0001FFF00007FF0001 FFF00007FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF 0001FFC00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFFFF83FFFFFE FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE372D7CAC3E>I<00001FFC00000000 01FFFFC000000007FFFFF00000001FFFFFFC0000007FF80FFF000000FFC001FF800001FF 8000FFC00003FE00003FE00007FE00003FF0000FFC00001FF8000FF800000FF8001FF800 000FFC001FF800000FFC003FF800000FFE003FF0000007FE007FF0000007FF007FF00000 07FF007FF0000007FF007FF0000007FF00FFF0000007FF80FFF0000007FF80FFF0000007 FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF 80FFF0000007FF80FFF0000007FF807FF0000007FF007FF0000007FF007FF0000007FF00 7FF0000007FF003FF800000FFE003FF800000FFE001FF800000FFC001FFC00001FFC000F FC00001FF80007FE00003FF00007FE00003FF00003FF8000FFE00001FFC001FFC000007F F80FFF0000003FFFFFFE0000000FFFFFF800000001FFFFC0000000001FFC000000312F7D AD38>I<007FC00FF80000FFFFC0FFFF8000FFFFC3FFFFE000FFFFCFFFFFF800FFFFDFC0 3FFC00FFFFFF001FFE0003FFFC0007FF0001FFF80003FF8001FFF00003FFC001FFE00001 FFE001FFC00001FFE001FFC00000FFF001FFC00000FFF001FFC000007FF801FFC000007F F801FFC000007FF801FFC000007FF801FFC000003FFC01FFC000003FFC01FFC000003FFC 01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01 FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000007FF801FF C000007FF801FFC000007FF801FFC000007FF001FFC00000FFF001FFC00000FFF001FFC0 0001FFE001FFE00001FFC001FFF00003FFC001FFF80007FF8001FFFC000FFF0001FFFE00 1FFE0001FFDFC07FFC0001FFCFFFFFF00001FFC3FFFFC00001FFC0FFFF000001FFC01FF0 000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000 0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000 01FFC00000000001FFC00000000001FFC000000000FFFFFF80000000FFFFFF80000000FF FFFF80000000FFFFFF80000000FFFFFF8000000036407DAC3E>I<007F807F00FFFF81FF E0FFFF83FFF0FFFF8FFFF8FFFF8F8FFCFFFF9F1FFE03FFBE1FFE01FFBC1FFE01FFF81FFE 01FFF81FFE01FFF01FFE01FFF00FFC01FFE007F801FFE001E001FFE0000001FFE0000001 FFE0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FF C0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0 000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC000 0001FFC0000001FFC00000FFFFFFE000FFFFFFE000FFFFFFE000FFFFFFE000FFFFFFE000 272D7DAC2E>114 D<001FFC038000FFFF878003FFFFFF800FFFFFFF801FF003FF803FC0 00FF803F80003F807F00001F807E00001F80FE00000F80FE00000F80FE00000780FF0000 0780FF00000780FF80000780FFE0000000FFFE0000007FFFF000007FFFFF00003FFFFFC0 003FFFFFF0001FFFFFFC000FFFFFFE0003FFFFFF0001FFFFFF80007FFFFF80000FFFFFC0 00003FFFC0000003FFE0000000FFE0F000003FE0F000003FE0F800001FE0F800000FE0F8 00000FE0FC00000FE0FC00000FE0FE00000FC0FF00001FC0FF00001FC0FF80003F80FFE0 007F00FFF803FE00FFFFFFFC00FCFFFFF800F03FFFE000E007FE0000232F7CAD2C>I<00 01E000000001E000000001E000000001E000000001E000000003E000000003E000000003 E000000003E000000007E000000007E00000000FE00000000FE00000001FE00000001FE0 0000003FE00000007FE0000000FFE0000003FFE000000FFFFFFF80FFFFFFFF80FFFFFFFF 80FFFFFFFF80FFFFFFFF8000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF E0000000FFE0000000FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000FFE0 01E000FFE001E000FFE001E000FFE001E000FFE003E000FFF003C0007FF003C0007FF007 C0003FF80F80001FFC1F00000FFFFF000007FFFC000001FFF80000003FE00023407EBE2C >I<007FC00001FF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF 00FFFFC003FFFF0003FFC0000FFF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC0000FFF0001FFC0000FFF0001FFC0001F FF0001FFC0001FFF0001FFC0003FFF0000FFC0003FFF0000FFE0007FFF80007FE001F7FF FE007FF807E7FFFE003FFFFFC7FFFE000FFFFF07FFFE0003FFFE07FFFE00007FF007FC00 372E7CAC3E>I119 DI E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fs cmsy10 10 15 /Fs 15 111 df<7FFFFFFFFFFF80FFFFFFFFFFFFC0FFFFFFFFFFFFC07FFFFFFFFFFF8032 04799641>0 D<1C007F00FF80FF80FF80FF80FF807F001C000909799917>I<7FFFFFFFFF FFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF800000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000007FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFF FFFFFFFFF800000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000007FFFFFFFFF FFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF836287BA841>17 D<00000FFFFFFF800000FFFFFFFFC00003FFFFFFFFC0000FFFFFFFFF80001FF800000000 007F800000000000FE000000000001F8000000000003F0000000000007E000000000000F C000000000000F8000000000001F0000000000001F0000000000003E0000000000003E00 00000000007C0000000000007C00000000000078000000000000F8000000000000F80000 00000000F0000000000000F0000000000000F0000000000000F0000000000000F0000000 000000F0000000000000F0000000000000F0000000000000F8000000000000F800000000 0000780000000000007C0000000000007C0000000000003E0000000000003E0000000000 001F0000000000001F0000000000000F8000000000000FC0000000000007E00000000000 03F0000000000001F8000000000000FE0000000000007F8000000000001FF80000000000 0FFFFFFFFF800003FFFFFFFFC00000FFFFFFFFC000000FFFFFFF80000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000001FFFFFFFFFFF803FFFFFFFFFFFC03FFFFFFFFF FFC01FFFFFFFFFFF80324479B441>I<00000000000180000000000007C000000000001F C000000000007F800000000001FF000000000007FC00000000001FF000000000007FC000 00000001FF000000000007FC00000000001FF000000000007FC00000000001FF00000000 0007FC00000000001FF000000000007FC00000000001FF000000000007FC00000000001F F000000000007FC00000000001FF000000000007FC00000000003FF000000000007FC000 00000000FF000000000000FE0000000000007F8000000000003FE000000000000FF80000 00000003FE000000000000FF8000000000003FE000000000000FF8000000000003FE0000 00000000FF8000000000003FE000000000000FF8000000000003FE000000000000FF8000 000000003FE000000000000FF8000000000003FE000000000000FF8000000000003FE000 000000000FF8000000000003FE000000000000FF8000000000003FC000000000000FC000 000000000380000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000007FFFFFFF FFFF80FFFFFFFFFFFFC0FFFFFFFFFFFFC07FFFFFFFFFFF80324479B441>20 D<60000000000000F8000000000000FE0000000000007F8000000000003FE00000000000 0FF8000000000003FE000000000000FF8000000000003FE000000000000FF80000000000 03FE000000000000FF8000000000003FE000000000000FF8000000000003FE0000000000 00FF8000000000003FE000000000000FF8000000000003FE000000000000FF8000000000 003FE000000000000FF8000000000003FE000000000000FF8000000000003FC000000000 001FC000000000007F800000000001FF000000000007FC00000000001FF000000000007F C00000000001FF000000000007FC00000000001FF000000000007FC00000000001FF0000 00000007FC00000000001FF000000000007FC00000000001FF000000000007FC00000000 001FF000000000007FC00000000001FF000000000007FC00000000001FF000000000007F C00000000000FF000000000000FC00000000000070000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000007FFFFFFFFFFF80FFFFFFFFFFFFC0FFFFFFFFFF FFC07FFFFFFFFFFF80324479B441>I<0000780000000000000000780000000000000000 780000000000000000780000000000000000F80000000000000000F00000000000000000 F00000000000000001F00000000000000001E00000000000000003E00000000000000007 C00000000000000007C0000000000000000F80000000000000001F00000000000000003F 00000000000000007E0000000000000000FC0000000000000001F80000000000000003F0 000000000000000FE0000000000000003FFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFF3FFFFFFFFFFFFFFFFE0FE00000000000000003F00000000000000001F8 0000000000000000FC00000000000000007E00000000000000003F00000000000000001F 00000000000000000F800000000000000007C00000000000000007C00000000000000003 E00000000000000001E00000000000000001F00000000000000000F00000000000000000 F00000000000000000F80000000000000000780000000000000000780000000000000000 78000000000000000078000000000000482C7BAA53>32 D<0000000000001E0000000000 0000001E00000000000000001E00000000000000001E00000000000000001F0000000000 0000000F00000000000000000F00000000000000000F8000000000000000078000000000 00000007C00000000000000003E00000000000000003E00000000000000001F000000000 00000000F80000000000000000FC00000000000000007E00000000000000003F00000000 000000001F80000000000000000FC00000000000000007F07FFFFFFFFFFFFFFFFCFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFC0000000000000007F0000000 000000000FC0000000000000001F80000000000000003F00000000000000007E00000000 00000000FC0000000000000000F80000000000000001F00000000000000003E000000000 00000003E00000000000000007C0000000000000000780000000000000000F8000000000 0000000F00000000000000000F00000000000000001F00000000000000001E0000000000 0000001E00000000000000001E00000000000000001E0000482C7BAA53>I<000FF00000 0007F000003FFE0000003FFE0000FFFF800000FFFF0003FFFFC00003F807C007F07FF000 07C001E00F801FF8000F8000F00F0007FC003E0000701E0003FE007C0000383C0001FF00 7800001C380000FF80F000001C7000007FC1F000000E7000003FE3E000000E6000001FF3 C00000066000001FF780000006E000000FFF80000007C0000007FF00000003C0000003FE 00000003C0000003FE00000003C0000001FF00000003C0000000FF80000003C00000007F C0000003C00000007FC0000003C0000000FFE0000003E0000001FFF000000760000001EF F800000660000003CFF800000670000007C7FC00000E7000000F83FE00000E3800000F01 FF00001C3800001E00FF80003C1C00003E007FC000780E00007C003FE000F00F0001F000 1FF801F0078003E0000FFE0FE003E01FC00003FFFFC000FFFF000001FFFF00007FFC0000 007FFC00000FE00000000FF00048267BA453>49 D<00001FFFFE0000FFFFFF0003FFFFFF 000FFFFFFE001FF00000007F80000000FE00000001F800000003F000000007E00000000F C00000000F800000001F000000001F000000003E000000003E000000007C000000007C00 0000007800000000F800000000F800000000F000000000F000000000FFFFFFFFFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFEF000000000F000000000F800000000F80000000078000000 007C000000007C000000003E000000003E000000001F000000001F000000000F80000000 0FC000000007E000000003F000000001F800000000FE000000007F800000001FF0000000 0FFFFFFE0003FFFFFF0000FFFFFF00001FFFFE283279AD37>I<600000000018F0000000 003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000 003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000 003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000 003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000 003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000 003CF0000000003CF0000000003CF0000000003CF0000000003CF0000000003CF8000000 007CF8000000007C7C00000000F87C00000000F83E00000001F03F00000003F01F800000 07E00FC000000FC007F000003F8003FE0001FF0000FFC00FFC00007FFFFFF800001FFFFF E0000003FFFF000000007FF800002E347CB137>91 D<000001F800000FF800003F800000 FC000001F8000003F0000007E0000007E000000FE000000FC000000FC000000FC000000F C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F C000000FC000000FC000000FC000001FC000001F8000003F8000007F000000FE000003F8 00007FE00000FF0000007FE0000003F8000000FE0000007F0000003F8000001F8000001F C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FE0000007 E0000007E0000003F0000001F8000000FC0000003F8000000FF8000001F81D537ABD2A> 102 DI<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F060045377BD17> 106 D<60000000F0000000F8000000F8000000780000007C0000007C0000003C0000003E 0000003E0000001E0000001F0000001F0000000F0000000F8000000F8000000780000007 C0000007C0000003C0000003E0000003E0000001E0000001F0000001F0000000F0000000 F8000000F8000000780000007C0000007C0000003C0000003E0000003E0000001E000000 1F0000001F0000000F0000000F8000000F8000000780000007C0000007C0000003E00000 03E0000001E0000001F0000001F0000000F0000000F8000000F8000000780000007C0000 007C0000003C0000003E0000003E0000001E0000001F0000001F0000000F0000000F8000 000F8000000780000007C0000007C0000003C0000003E0000003E0000001E0000001F000 0001F0000000F0000000F8000000F8000000780000007C0000007C0000003C0000003E00 00003E0000001E0000000C1F537BBD2A>110 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Ft cmr10 10 84 /Ft 84 128 df0 D<00000FF800FC0000007FFF07FF000001F807DF83C00007E001FF0FC0001F8007FE1FE0 003F000FFC1FE0007E000FFC1FE0007E000FF81FE000FC000FF81FE000FC000FF0078001 F80007F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F8 0003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F800 03F0000001F80003F0000001F80003F00000FFFFFFFFFFF800FFFFFFFFFFF800FFFFFFFF FFF80001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0 000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F000 0001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F00000 01F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001 F80003F0000001F80003F0000001F80003F0000001F80003F0000001F80003F0000001F8 0003F0000001F80003F0000001F80003F0000001F80003F0000003FC0007F800007FFFE0 FFFFF0007FFFE0FFFFF0007FFFE0FFFFF000333B7FBA30>11 D<00000FF8000000007FFE 00000001F80780000007E001C000001F8000E000003F0007E000007E000FF000007E000F F00000FC000FF00000FC000FF00001F8000FF00001F80007E00001F80001800001F80000 000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000 000001F80000000001F80000000001F80003F000FFFFFFFFF000FFFFFFFFF000FFFFFFFF F00001F8000FF00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00003FC0007 F8007FFFE0FFFFC07FFFE0FFFFC07FFFE0FFFFC02A3B7FBA2E>I<00000FFC000000007F FF70000001F803F0000007E007F000001F800FF000003F000FF000007E000FF000007E00 0FF00000FC000FF00000FC0007F00001F80003F00001F80003F00001F80003F00001F800 03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 03F00001F80003F00001F80003F00001F80003F000FFFFFFFFF000FFFFFFFFF000FFFFFF FFF00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00003FC00 07F8007FFFE0FFFFC07FFFE0FFFFC07FFFE0FFFFC02A3B7FBA2E>I<00000FF0001FF000 0000007FFE00FFFC00000001F80F83F00F00000007E001CFC0038000001F8000FF0001C0 00003F0007FE000FC000007E000FFC001FE000007E000FFC001FE00000FC000FF8001FE0 0000FC000FF8001FE00001F8000FF0001FE00001F80007F0000FC00001F80003F0000300 0001F80003F00000000001F80003F00000000001F80003F00000000001F80003F0000000 0001F80003F00000000001F80003F00000000001F80003F00000000001F80003F0000000 0001F80003F00000000001F80003F00007E000FFFFFFFFFFFFFFE000FFFFFFFFFFFFFFE0 00FFFFFFFFFFFFFFE00001F80003F0001FE00001F80003F00007E00001F80003F00007E0 0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 0001F80003F00007E00001F80003F00007E00001F80003F00007E00001F80003F00007E0 0001F80003F00007E00001F80003F00007E00003FC0007F8000FF0007FFFE0FFFFC1FFFF 807FFFE0FFFFC1FFFF807FFFE0FFFFC1FFFF80413B7FBA45>I<7800FC00FC00FE00FF00 7F801F800FC007E003F000F00078003C001E00060F0F77B92A>18 D<1C007F00FF80FF80FF80FF80FF80FF80FF80FF807F007F007F007F007F007F007F007F 007F007F007F003E003E003E003E003E003E003E003E003E003E003E001C001C001C001C 001C001C001C001C001C001C001C00000000000000000000000000000000001C007F00FF 80FF80FF80FF80FF807F001C00093C79BB17>33 D<1C001C007F007F00FF80FF80FF80FF 80FFC0FFC0FFC0FFC0FFC0FFC07FC07FC01CC01CC000C000C000C000C000C000C000C000 C001C001C00180018001800180038003800300030007000700060006000E000E001C001C 003800380070007000600060001A197DB92A>I<007C00000000600001FF00000000F000 07C380000001F0000F81C0000003F0000F00E0000007E0001E007800000FC0003E003C00 001FC0003C003F00007F80007C001BE003FF00007C0018FFFFBF00007800181FFC3E0000 F8001C00007C0000F8000C0000FC0000F8000C0000F80000F8000C0001F00000F8000C00 03F00000F8000C0003E00000F8000C0007C00000F8000C000FC00000F8000C000F800000 F8000C001F000000F8001C003F000000780018003E0000007C0018007C0000007C001800 FC0000003C003800F80000003E003001F00000001E007003F00000000F00E003E0000000 0F81C007C000000007C3800FC000000001FF000F80000000007C001F000000000000003F 0007C0000000003E001FF0000000007C003C3800000000FC00F81C00000000F800F00E00 000001F001E00600000003F003E00700000003E003C00300000007C007C0038000000FC0 07C0018000000F8007C0018000001F00078001C000003F000F8000C000003E000F8000C0 00007C000F8000C00000FC000F8000C00000F8000F8000C00001F0000F8000C00003F000 0F8000C00003E0000F8000C00007C0000F8000C0000FC0000F8000C0000F8000078001C0 001F000007C00180003F000007C00180003E000007C00380007C000003C0030000FC0000 03E0070000F8000001E0060001F0000000F00E0003F0000000F81C0003E00000003C3800 03C00000001FF000018000000007C0003A437BBD45>37 D<1C007F00FF80FF80FFC0FFC0 FFC07FC01CC000C000C000C000C001C00180018003800300070006000E001C0038007000 60000A1979B917>39 D<0000600000E00001C0000380000700000E00001E00003C000078 0000780000F00001E00001E00003C00003C00007C0000780000F80000F00000F00001F00 001E00001E00003E00003E00003E00007C00007C00007C00007C00007C00007C0000F800 00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800 00F80000F80000F80000F80000F800007C00007C00007C00007C00007C00007C00003E00 003E00003E00001E00001E00001F00000F00000F00000F800007800007C00003C00003C0 0001E00001E00000F000007800007800003C00001E00000E000007000003800001C00000 E0000060135278BD20>II<000000300000000000007800000000000078000000000000 780000000000007800000000000078000000000000780000000000007800000000000078 000000000000780000000000007800000000000078000000000000780000000000007800 000000000078000000000000780000000000007800000000000078000000000000780000 000000007800000000000078000000000000780000000000007800000000000078000000 000000780000007FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF800 000078000000000000780000000000007800000000000078000000000000780000000000 007800000000000078000000000000780000000000007800000000000078000000000000 780000000000007800000000000078000000000000780000000000007800000000000078 000000000000780000000000007800000000000078000000000000780000000000007800 00000000007800000000000078000000000000780000000000003000000036367BAF41> 43 D<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000C000C001C00180018003 800300070006000E001C003800700060000A19798817>II<1C007F00FF80FF80FF80FF80FF807F001C000909798817>I<0003 F80000001FFF0000007E0FC00000F803E00001E000F00003C000780007C0007C000F8000 3E000F80003E001F00001F001F00001F003F00001F803F00001F803F00001F807E00000F C07E00000FC07E00000FC07E00000FC07E00000FC07E00000FC0FE00000FE0FE00000FE0 FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE 00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00 000FE0FE00000FE0FE00000FE07E00000FC07E00000FC07E00000FC07E00000FC07F0000 1FC03F00001F803F00001F803F00001F801F00001F001F80003F000F80003E000F80003E 0007C0007C0003E000F80001F001F00000F803E000007E0FC000001FFF00000003F80000 233A7DB72A>48 D<0001C0000003C0000007C000001FC00000FFC000FFFFC000FFFFC000 FF1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000 001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000 001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000 001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000 001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000 003FE0007FFFFFF07FFFFFF07FFFFFF01C3879B72A>I<000FF00000007FFE000001FFFF 800003E03FE0000F000FF0000E0007F8001C0003FC00380001FE00300001FE00700000FF 00600000FF00FC0000FF00FF00007F80FF80007F80FF80007F80FF80007F80FF80007F80 FF80007F807F00007F801C00007F800000007F80000000FF00000000FF00000000FF0000 0001FE00000001FC00000003FC00000003F800000007F000000007E00000000FE0000000 1FC00000003F800000003F000000007C00000000F800000001F000000003E000000007C0 0000000F800000000F000000001E000180003C000180007800018000F000038001E00003 0003C000030007800003000E000007000FFFFFFF001FFFFFFF003FFFFFFF007FFFFFFE00 FFFFFFFE00FFFFFFFE00FFFFFFFE0021387CB72A>I<0007F80000003FFF0000007FFFC0 0001F80FF00003C007F800078003FC000E0001FC000F0001FE001FE000FE001FF000FF00 1FF000FF001FF000FF001FF000FF001FF000FF000FE000FF0007C000FF00000000FE0000 0001FE00000001FE00000001FC00000003F800000003F800000007F000000007E0000000 0F800000007E0000001FFC0000001FFF800000000FE000000007F000000001FC00000001 FE00000000FF000000007F800000007F800000007FC00000007FC00000003FC00000003F E00000003FE01E00003FE07F80003FE0FFC0003FE0FFC0003FE0FFC0003FE0FFC0003FE0 FFC0003FC0FF80007FC07F80007F807E00007F80700000FF00380001FE001E0001FE000F 8003F80007F00FF00001FFFFC000007FFF0000000FF80000233A7DB72A>I<0000003800 00000038000000007800000000F800000000F800000001F800000003F800000007F80000 0007F80000000FF80000001FF80000001BF800000033F800000073F800000063F8000000 C3F8000001C3F800000183F800000303F800000703F800000603F800000C03F800001C03 F800001803F800003003F800007003F800006003F80000C003F80001C003F800038003F8 00030003F800070003F8000E0003F8000C0003F800180003F800380003F800300003F800 600003F800E00003F800FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8000003F800000003F80000 0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 03F800000003F800000007FC000003FFFFF80003FFFFF80003FFFFF825397EB82A>I<06 00000C000780003C0007F003F80007FFFFF80007FFFFF00007FFFFE00007FFFF800007FF FF000007FFFC0000067FE000000600000000060000000006000000000600000000060000 00000600000000060000000006000000000600000000060000000006000000000607F800 00063FFE000006780F800007E007E000078003F000070001F800060001F800060000FC00 000000FE00000000FE00000000FF000000007F000000007F000000007F800000007F8000 00007F800000007F803E00007F807F00007F80FF80007F80FF80007F80FF80007F80FF80 007F80FF00007F00FE0000FF00E00000FF00600000FE00700000FE00300001FC00380001 F8001C0003F8001E0007F0000F800FE00007E03F800001FFFF0000007FFC0000001FE000 00213A7CB72A>I<00003FC0000001FFF0000007FFFC00000FE03E00003F800700007E00 1F0000FC003F8001F8007F8003F0007F8003F0007F8007E0007F800FE0003F000FC0001E 001FC00000001FC00000003F800000003F800000003F800000007F800000007F00000000 7F01FC00007F07FF8000FF1E07E000FF3801F000FF7000F800FF6000FC00FFE0007E00FF C0003F00FFC0003F00FF80003F80FF80003FC0FF80001FC0FF80001FC0FF00001FE0FF00 001FE0FF00001FE0FF00001FE0FF00001FE07F00001FE07F00001FE07F00001FE07F0000 1FE07F00001FE03F80001FE03F80001FC03F80001FC01F80001FC01F80003F801FC0003F 800FC0003F0007E0007F0007E000FE0003F000FC0001F801F80000FE07F000003FFFC000 001FFF00000003FC0000233A7DB72A>I<300000000038000000003E000000003FFFFFFF E03FFFFFFFE03FFFFFFFE03FFFFFFFC07FFFFFFFC07FFFFFFF807FFFFFFF007000000600 6000000E006000001C006000001800E000003800C000007000C00000E000C00000C00000 0001C00000000380000000030000000007000000000E000000000C000000001C00000000 3800000000380000000070000000007000000000F000000001E000000001E000000003E0 00000003E000000003C000000007C000000007C00000000FC00000000FC00000000FC000 00001F800000001F800000001F800000003F800000003F800000003F800000003F800000 003F800000007F800000007F800000007F800000007F800000007F800000007F80000000 7F800000007F800000007F800000003F000000001E000000233B7BB82A>I<0003F80000 001FFF0000007FFFC00000FC07F00001E001F80003C000FC000780007C000700003E000F 00001E000E00001F001E00000F001E00000F001E00000F001F00000F001F00000F001F80 000F001F80001F001FE0001E000FF0003E000FFC003C000FFE00780007FF80F00007FFC1 E00003FFF3C00001FFFF000000FFFE0000003FFF0000001FFFC000001FFFE000007FFFF8 0000F0FFFC0003E07FFE0007801FFF000F000FFF801F0003FF803E0001FFC03C00007FC0 7C00003FC07800000FE0F8000007E0F0000007E0F0000003E0F0000003E0F0000001E0F0 000001E0F0000001E0F8000001C078000001C078000003C07C000003803E000007001F00 000F000F80001E0007E0007C0003F803F00000FFFFE000003FFF80000007FC0000233A7D B72A>I<0003F80000001FFF0000007FFFC00000FC07E00003F803F00007F001F8000FE0 00FC000FC0007E001FC0007E003F80003F003F80003F007F80003F807F00003F807F0000 3F80FF00001FC0FF00001FC0FF00001FC0FF00001FC0FF00001FC0FF00001FC0FF00001F E0FF00001FE0FF00001FE0FF00001FE0FF00001FE07F00003FE07F00003FE07F80003FE0 3F80003FE01F80007FE01F80007FE00FC000FFE007E000DFE003E001DFE001F0039FE000 FC0F1FE0003FFC1FC00007F01FC00000001FC00000003FC00000003F800000003F800000 003F800000003F000000007F000F00007E001F80007E003FC000FC003FC000FC003FC001 F8003FC003F0003F8007E0001F000FC0001C001F80000F807F000007FFFC000001FFF000 00003FC00000233A7DB72A>I<1C007F00FF80FF80FF80FF80FF807F001C000000000000 000000000000000000000000000000000000000000000000000000000000001C007F00FF 80FF80FF80FF80FF807F001C00092479A317>I<1C007F00FF80FF80FF80FF80FF807F00 1C0000000000000000000000000000000000000000000000000000000000000000000000 00001C007F00FF00FF80FF80FF80FF807F801D8001800180018001800380030003000700 060006000E001C001800380070006000093479A317>I<7FFFFFFFFFFFF8FFFFFFFFFFFF FCFFFFFFFFFFFFFC7FFFFFFFFFFFF8000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000007FFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF836167B 9F41>61 D<000003FF00000000001FFFE000000000FC00FC00000001E0001E0000000780 00078000001E000001E000003800000070000070000000380000E00000001C0001C00000 000E000380000000070003000000000300070001FC0003800E0007FF0001C00C001F03C0 00C01C007E00E000E01800FC007000603801F8003800703001F0001C00303003F0000FE0 307007E00007E0386007E00007E018600FC00007E018600FC00007E018E00FC00007E01C C01F800007E00CC01F800007E00CC01F800007E00CC01F800007E00CC01F800007E00CC0 1F800007E00CC01F800007E00CC01F800007E00CC01F800007E00CC01F800007E00CE00F C00007E00C600FC00007E00C600FC00007E00C6007E00007E01C7007E00007E0183003F0 000FE0183001F0001FE0183801F8003FE0381800FC0077E0301C007E00E3F0700C001F03 C1F0E00E0007FF00FFC0070001FC003F00030000000000000380000000000001C0000000 000000E00000000000007000000000000038000000007C001E00000003FC00078000001F F00001E00000FF800000FC003FFC0000001FFFFF8000000003FFE00000363C7BBA41>64 D<0000003800000000000038000000000000380000000000007C0000000000007C000000 0000007C000000000000FE000000000000FE000000000000FE000000000001FF00000000 0001FF000000000001FF0000000000037F8000000000037F8000000000077FC000000000 063FC000000000063FC0000000000E3FE0000000000C1FE0000000000C1FE0000000001C 1FF000000000180FF000000000180FF000000000380FF8000000003007F8000000003007 F8000000007007FC000000006003FC000000006003FC00000000C003FE00000000C001FE 00000000C001FE000000018001FF000000018000FF000000018000FF000000030000FF80 00000300007F8000000300007F8000000600007FC0000007FFFFFFC0000007FFFFFFC000 000FFFFFFFE000000C00001FE000000C00001FE000001800000FF000001800000FF00000 1800000FF0000030000007F8000030000007F8000030000007F8000060000003FC000060 000003FC0000E0000003FC0000E0000001FE0001E0000001FE0003F0000001FF000FFC00 0007FF80FFFF8000FFFFFEFFFF8000FFFFFEFFFF8000FFFFFE373C7DBB3E>II<000001FF80018000000FFFE0038000007FFFF803800001FF807E07800003 FC000F0F80000FF000039F80001FE00001DF80003F800000FF80007F0000007F8000FE00 00003F8001FE0000003F8003FC0000001F8007F80000000F8007F80000000F800FF00000 0007800FF000000007801FE000000007801FE000000003803FE000000003803FC0000000 03807FC000000001807FC000000001807FC000000001807F800000000180FF8000000000 00FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000 FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF 800000000000FF8000000000007F8000000000007FC000000001807FC000000001807FC0 00000001803FC000000001803FE000000001801FE000000003801FE000000003000FF000 000003000FF0000000070007F8000000070007F8000000060003FC0000000E0001FE0000 001C0000FE0000001800007F0000003800003F8000007000001FE00000E000000FF00003 C0000003FC000F80000001FF803F000000007FFFFC000000000FFFF00000000001FF8000 00313D7BBA3C>IIII<000000FF8000C000000FFFF001C000003FFFFC 01C00000FF803F03C00003FC000787C0000FF00003CFC0001FE00000EFC0003FC000007F C0007F8000003FC000FF0000001FC001FE0000001FC003FC0000000FC007F800000007C0 07F800000007C00FF000000003C00FF000000003C01FE000000003C01FE000000001C03F E000000001C03FC000000001C07FC000000000C07FC000000000C07FC000000000C07FC0 00000000C0FF800000000000FF800000000000FF800000000000FF800000000000FF8000 00000000FF800000000000FF800000000000FF800000000000FF800000000000FF800000 000000FF800000000000FF800000FFFFFFFF800000FFFFFF7FC00000FFFFFF7FC0000000 7FE07FC00000003FC07FC00000003FC03FC00000003FC03FE00000003FC01FE00000003F C01FE00000003FC00FF00000003FC00FF00000003FC007F80000003FC007F80000003FC0 03FC0000003FC001FE0000003FC000FF0000007FC0007F8000007FC0003FC00000FFC000 1FE00000EFC0000FF80003C7C00003FE000783C00000FFC03F01C000003FFFFC00C00000 0FFFF00000000000FF800000383D7CBA41>III<003FFFFFE0003FFFFFE0003FFFFFE000001FFC00000007F8 00000007F800000007F800000007F800000007F800000007F800000007F800000007F800 000007F800000007F800000007F800000007F800000007F800000007F800000007F80000 0007F800000007F800000007F800000007F800000007F800000007F800000007F8000000 07F800000007F800000007F800000007F800000007F800000007F800000007F800000007 F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8 00000007F800000007F8003F0007F8007F8007F800FFC007F800FFC007F800FFC007F800 FFC007F800FFC00FF000FF800FF0007F000FE00070001FE00038001FC0001C003F80000E 007F00000781FC000001FFF00000007F800000233B7DB82B>IIIII< 000003FF00000000001FFFE000000000FE01FC00000001F8007E00000007E0001F800000 0FC0000FC000003F800007F000007F000003F80000FE000001FC0001FC000000FE0001F8 0000007E0003F80000007F0007F00000003F8007F00000003F800FE00000001FC00FE000 00001FC01FE00000001FE01FC00000000FE03FC00000000FF03FC00000000FF03FC00000 000FF07FC00000000FF87F8000000007F87F8000000007F87F8000000007F8FF80000000 07FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007 FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FCFF8000000007FC FF8000000007FC7F8000000007F87FC00000000FF87FC00000000FF87FC00000000FF83F C00000000FF03FC00000000FF01FE00000001FE01FE00000001FE01FE00000001FE00FF0 0000003FC007F00000003F8007F80000007F8003F80000007F0001FC000000FE0001FC00 0000FE0000FE000001FC00007F000003F800003F800007F000001FC0000FE0000007E000 1F80000003F8007F00000000FE01FC000000001FFFE00000000003FF000000363D7BBA41 >II82 D<000FF800C0003FFE01C000FFFF81C003F807E3C007E000F7C00FC0007FC01F8000 3FC03F00001FC03E00000FC07E000007C07E000007C07C000003C0FC000003C0FC000001 C0FC000001C0FC000001C0FE000000C0FE000000C0FE000000C0FF000000C0FF80000000 7FC00000007FE00000007FF80000003FFF8000001FFFF800001FFFFF80000FFFFFE00007 FFFFF80003FFFFFE0000FFFFFF00003FFFFF800007FFFFC000007FFFC0000007FFE00000 007FE00000003FF00000001FF00000000FF000000007F800000007F8C0000003F8C00000 03F8C0000001F8C0000001F8C0000001F8E0000001F8E0000001F8E0000001F0F0000001 F0F0000003F0F8000003E0FC000007E0FE000007C0FF00000FC0FF80001F80FBF0003F00 F0FE00FE00E03FFFF800E00FFFE000C001FF0000253D7CBA2E>I<3FFFFFFFFFFFE03FFF FFFFFFFFE03FFFFFFFFFFFE03FC003FF001FE03E0001FE0003E07C0001FE0001F0780001 FE0000F0700001FE000070700001FE000070700001FE000070600001FE000030600001FE 000030600001FE000030600001FE000030E00001FE000038C00001FE000018C00001FE00 0018C00001FE000018C00001FE000018000001FE000000000001FE000000000001FE0000 00000001FE000000000001FE000000000001FE000000000001FE000000000001FE000000 000001FE000000000001FE000000000001FE000000000001FE000000000001FE00000000 0001FE000000000001FE000000000001FE000000000001FE000000000001FE0000000000 01FE000000000001FE000000000001FE000000000001FE000000000001FE000000000001 FE000000000001FE000000000001FE000000000001FE000000000001FE000000000001FE 000000000001FE000000000001FE000000000001FE000000000001FE000000000001FE00 0000000007FF800000001FFFFFFFE000001FFFFFFFE000001FFFFFFFE00035397DB83C> III< FFFFFC07FFFFF001FFFFFFFFFC07FFFFF001FFFFFFFFFC07FFFFF001FFFF07FF80001FFE 00001FF803FE00000FF8000007E001FE000007F8000003C001FE000007F80000038001FF 000007F80000038000FF000003FC0000030000FF000003FC0000030000FF800003FC0000 0700007F800001FE00000600007F800001FE00000600007FC00001FE00000600003FC000 03FF00000C00003FC00003FF00000C00003FE00003FF00000C00001FE00007FF80001800 001FE000067F80001800001FE000067F80001800000FF0000E7FC0003000000FF0000C3F C0003000000FF0000C3FC00030000007F8001C3FE00060000007F800181FE00060000007 F800181FE00060000003FC00181FF000C0000003FC00300FF000C0000003FC00300FF000 C0000001FE00300FF80180000001FE006007F80180000001FE006007F80180000000FF00 6007F80300000000FF00C003FC0300000000FF00C003FC0300000000FF80C003FC070000 00007F818001FE06000000007F818001FE06000000007FC18001FE0E000000003FC30000 FF0C000000003FC30000FF0C000000003FE30000FF1C000000001FE600007F9800000000 1FE600007F98000000001FF600007F98000000000FFC00003FF0000000000FFC00003FF0 000000000FFC00003FF00000000007FC00003FE00000000007F800001FE00000000007F8 00001FE00000000003F800001FC00000000003F000000FC00000000003F000000FC00000 000001F000000F800000000001E0000007800000000001E0000007800000000000E00000 07000000000000C0000003000000503B7EB855>I89 D91 D<0180018003800380070007000E000E001C001C001800180038 00380030003000700070006000600060006000E000E000C000C000C000C000C000C000C0 00C000CE00CE00FF80FF80FFC0FFC0FFC0FFC0FFC0FFC07FC07FC07FC07FC03F803F800E 000E001A1974B92A>II<001FE0000000FFFC000003E03F000007000F80000F8007E0001FC003F0001FE003 F0001FE001F8001FE001F8001FE000FC000FC000FC00078000FC00000000FC00000000FC 00000000FC00000000FC0000007FFC000007FFFC00003FE0FC0000FE00FC0003F800FC00 0FF000FC001FC000FC003FC000FC007F8000FC007F0000FC007F0000FC0CFE0000FC0CFE 0000FC0CFE0000FC0CFE0001FC0CFE0001FC0CFF0003FC0C7F00077C0C7F80063E183FC0 1E3E180FE0781FF003FFF00FE0007F8007C026277DA52A>97 D<03F0000000FFF0000000 FFF0000000FFF00000000FF000000003F000000003F000000003F000000003F000000003 F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 00000003F000000003F000000003F000000003F000000003F01FE00003F07FF80003F1E0 3E0003F3801F8003F7000FC003FE0007E003FC0003F003F80001F803F00001F803F00000 FC03F00000FC03F00000FE03F00000FE03F000007E03F000007F03F000007F03F000007F 03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F03 F000007E03F00000FE03F00000FE03F00000FC03F00001FC03F80001F803F80003F003FC 0003F003EE0007E003C6000FC003C7801F000381E07E000300FFF80000001FC000283B7E B92E>I<0003FC00001FFF80007E03E001F8007003F000F807E001FC0FC003FC0FC003FC 1F8003FC3F8003FC3F0001F87F0000F07F0000007F0000007E000000FE000000FE000000 FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007E000000 7F0000007F0000003F0000063F8000061F80000E1FC0000C0FC0001C07E0003803F00070 01F800E0007C07C0001FFF000007F8001F277DA525>I<0000000FC0000003FFC0000003 FFC0000003FFC00000003FC00000000FC00000000FC00000000FC00000000FC00000000F C00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC0 0000000FC00000000FC00000000FC00000000FC00003F80FC0001FFF0FC0007E078FC000 F801EFC003F0007FC007E0003FC00FC0001FC00FC0001FC01F80000FC03F80000FC03F00 000FC07F00000FC07F00000FC07E00000FC0FE00000FC0FE00000FC0FE00000FC0FE0000 0FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC07E00000F C07F00000FC07F00000FC03F00000FC03F00000FC01F80001FC01F80001FC00FC0003FC0 07E0007FC003F000EFF001F801CFFF007C078FFF001FFE0FFF0007F80FC0283B7DB92E> I<0007F800001FFF00007C0FC001F803E003F001F007E001F80FC000F81F80007C1F8000 7C3F00007E3F00003E7F00003E7F00003F7E00003FFE00003FFE00003FFE00003FFFFFFF FFFFFFFFFFFE000000FE000000FE000000FE000000FE0000007E0000007E0000007F0000 007F0000003F0000033F8000031F8000070FC0000607C0000E07E0001C01F0003800F800 70007E03E0001FFF800003FC0020277EA525>I<00007E000003FF80000FC1E0001F87E0 003F0FF0007E0FF0007E0FF000FC0FF000FC0FF001F803C001F8000001F8000001F80000 01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 01F80000FFFFFC00FFFFFC00FFFFFC0001F8000001F8000001F8000001F8000001F80000 01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 01F8000001F8000001F8000001F8000001F8000001F8000003FC00007FFFF8007FFFF800 7FFFF8001C3B7FBA19>I<00000003F0000FF00FF8003FFC3C3C00F81F707C01F00FE07C 03E007C07C07C003E0100FC003F0000FC003F0001F8001F8001F8001F8001F8001F8001F 8001F8001F8001F8001F8001F8001F8001F8001F8001F8000FC003F0000FC003F00007C0 03E00003E007C00003F00F800003F81F0000073FFC0000060FF000000E000000000E0000 00000E000000000E000000000F000000000F000000000FC000000007FFFFC00007FFFFF8 0003FFFFFE0001FFFFFF8003FFFFFFC00F80007FE01F00000FF03E000003F07C000001F0 7C000001F8F8000000F8F8000000F8F8000000F8F8000000F8F8000000F8FC000001F87C 000001F03E000003E03F000007E00F80000F8007E0003F0001FC01FC00007FFFF0000007 FF000026387EA52A>I<03F000000000FFF000000000FFF000000000FFF0000000000FF0 0000000003F00000000003F00000000003F00000000003F00000000003F00000000003F0 0000000003F00000000003F00000000003F00000000003F00000000003F00000000003F0 0000000003F00000000003F00000000003F00000000003F00000000003F00FF0000003F0 3FFC000003F0F03F000003F1C01F800003F3800FC00003F7000FC00003FE000FC00003FC 0007E00003FC0007E00003F80007E00003F80007E00003F80007E00003F00007E00003F0 0007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F0 0007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F0 0007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F0 0007E00003F00007E00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF80293A 7EB92E>I<0380000FE0001FF0001FF0001FF0001FF0001FF0000FE00003800000000000 000000000000000000000000000000000000000000000000000003F000FFF000FFF000FF F00007F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003 F00003F00003F00003F00003F00003F00007F800FFFFC0FFFFC0FFFFC012387EB717>I< 0001C00007F0000FF8000FF8000FF8000FF8000FF80007F00001C0000000000000000000 0000000000000000000000000000000000000000000001F800FFF800FFF800FFF80007F8 0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 0001F80001F83C01F87E01F8FF01F0FF03F0FF03F0FF03E0FE07C07C07C03C0F000FFE00 03F800154984B719>I<03F0000000FFF0000000FFF0000000FFF00000000FF000000003 F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0 00000003F000000003F000000003F000000003F000000003F000000003F000000003F000 000003F000000003F000000003F001FFFC03F001FFFC03F001FFFC03F0007FC003F0007F 0003F0007C0003F000700003F000E00003F001C00003F003800003F007000003F01E0000 03F038000003F078000003F0FC000003F1FC000003F3FE000003F73F000003FE3F800003 F81F800003F00FC00003F00FE00003F007E00003F003F00003F001F80003F001FC0003F0 00FC0003F0007E0003F0007F0003F0003F0003F0003F8003F0001FC007F8003FF0FFFFC0 FFFFFFFFC0FFFFFFFFC0FFFF283A7EB92C>I<03F000FFF000FFF000FFF0000FF00003F0 0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0 0007F800FFFFC0FFFFC0FFFFC0123A7EB917>I<03F00FF0001FE000FFF03FFC007FF800 FFF0F03F01E07E00FFF1C01F83803F000FF3800FC7001F8003F7000FCE001F8003FE000F DC001F8003FC0007F8000FC003FC0007F8000FC003F80007F0000FC003F80007F0000FC0 03F80007F0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007 E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC0 03F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007 E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC0 03F00007E0000FC003F00007E0000FC003F00007E0000FC003F00007E0000FC007F8000F F0001FE0FFFFC1FFFF83FFFFFFFFC1FFFF83FFFFFFFFC1FFFF83FFFF40257EA445>I<03 F00FF00000FFF03FFC0000FFF0F03F0000FFF1C01F80000FF3800FC00003F7000FC00003 FE000FC00003FC0007E00003FC0007E00003F80007E00003F80007E00003F80007E00003 F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003 F00007E00003F00007E00003F00007E00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FF FFC1FFFF8029257EA42E>I<0003FE0000000FFF8000003E03E00000F800F80001F0007C 0003E0003E0007C0001F000F80000F801F80000FC01F000007C03F000007E03F000007E0 7E000003F07E000003F07E000003F07E000003F0FE000003F8FE000003F8FE000003F8FE 000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F87E000003F07E00 0003F07F000007F03F000007E03F000007E01F80000FC00F80000F800FC0001F8007E000 3F0003F0007E0000F800F800007E03F000001FFFC0000003FE000025277EA52A>I<03F0 1FE000FFF07FF800FFF1E07E00FFF3801F8007F7000FC003FE0007E003FC0003F003F800 03F803F00001F803F00001FC03F00000FC03F00000FE03F00000FE03F00000FE03F00000 7F03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F03F000007F 03F000007F03F000007F03F00000FE03F00000FE03F00000FE03F00001FC03F00001FC03 F80003F803F80003F003FC0007F003FE000FE003F6000FC003F7803F0003F1E07E0003F0 FFF80003F01FC00003F000000003F000000003F000000003F000000003F000000003F000 000003F000000003F000000003F000000003F000000003F000000007F8000000FFFFC000 00FFFFC00000FFFFC0000028357EA42E>I<0003F800C0001FFE01C0007E0781C000FC01 C3C003F000E3C007F00077C00FE00037C00FC0003FC01FC0001FC03F80001FC03F80000F C07F00000FC07F00000FC07F00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0 FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC0FE00000FC07F00000FC07F 00000FC07F00000FC03F00000FC03F80001FC01F80001FC01FC0003FC00FC0003FC007E0 007FC003F000EFC001F801CFC0007E078FC0001FFE0FC00007F80FC00000000FC0000000 0FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000F C00000000FC00000000FC00000001FE0000003FFFF000003FFFF000003FFFF28357DA42C >I<07E01F00FFE07FC0FFE1E3E0FFE387F00FE707F003E607F003EE07F003EC03E003FC 008003F8000003F8000003F8000003F8000003F0000003F0000003F0000003F0000003F0 000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0 000003F0000003F0000003F0000003F0000003F0000003F0000007F80000FFFFF000FFFF F000FFFFF0001C257EA421>I<00FF030003FFE7000F80FF001E003F003C001F0078000F 0070000700F0000700F0000700F0000300F8000300F8000300FC000300FF0000007FE000 007FFF00003FFFE0001FFFF8000FFFFC0003FFFE0000FFFF000007FF8000007F8000001F 80C0000FC0C00007C0C00007C0E00003C0E00003C0E00003C0F00003C0F0000380F80007 80FC000780FC000F00FF001E00F3C07C00E1FFF000C03F80001A277DA521>I<00180000 001800000018000000180000001800000038000000380000003800000078000000780000 0078000000F8000001F8000003F8000007F800001FFFFF00FFFFFF00FFFFFF0001F80000 01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800C0 01F800C001F800C001F800C001F800C001F800C001F800C001F800C001F800C000FC01C0 00FC0180007C0380007E0300003F0700000FFE000001F8001A347FB220>I<03F00007E0 00FFF001FFE000FFF001FFE000FFF001FFE0000FF0001FE00003F00007E00003F00007E0 0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 0003F00007E00003F00007E00003F00007E00003F00007E00003F00007E00003F00007E0 0003F00007E00003F00007E00003F0000FE00003F0000FE00003F0000FE00003F0001FE0 0001F0001FE00001F8003FE00000F80077F80000FC00E7FF80003F03C7FF80001FFF87FF 800003FC07E00029267EA42E>IIIII<3FFFFFFC3F FFFFFC3F8003FC3E0003F83C0007F038000FE030000FE070001FC070003F8060007F8060 007F006000FE006001FC006001FC000003F8000007F0000007F000000FE000001FC00000 3F8000003F8000007F000600FE000600FE000601FC000603F8000607F8000E07F0000E0F E0000C1FC0001C1FC0001C3F80003C7F00007CFF0003FCFFFFFFFCFFFFFFFC1F247EA325 >II<1C001C007F007F00FF80FF80FF80FF80 FF80FF80FF80FF80FF80FF807F007F001C001C00190978B72A>127 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fu cmsy7 7 4 /Fu 4 51 df0 D<00380000380000380000380000380060380CF8383EFC387EFE38FE3FBBF807FFC001FF 00007C0001FF0007FFC03FBBF8FE38FEFC387EF8383E60380C0038000038000038000038 0000380017197B9A22>3 D<00E001F003F803F803F807F007F007F007E007E00FE00FC0 0FC00FC01F801F801F001F003F003E003E003E007C007C007C007800F800F800F0001000 0D1E7D9F13>48 D<0001FFFF000FFFFF003FFFFF00FF000001F8000003E0000007800000 0F0000001E0000001C0000003C00000038000000780000007000000070000000F0000000 E0000000E0000000FFFFFFFFFFFFFFFFFFFFFFFFE0000000E0000000F000000070000000 7000000078000000380000003C0000001C0000001E0000000F0000000780000003E00000 01F8000000FF0000003FFFFF000FFFFF0001FFFF20277AA12D>50 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fv cmcsc10 10 29 /Fv 29 119 df<0000300000700000E00003C0000780000F00000E00001E00003C000078 0000F80000F00001E00001E00003C00003C00007C0000780000F80000F00001F00001F00 001E00003E00003E00003E00003C00007C00007C00007C00007C00007C0000780000F800 00F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F800 00F80000F80000F800007800007C00007C00007C00007C00007C00003C00003E00003E00 003E00001E00001F00001F00000F00000F800007800007C00003C00003C00001E00001E0 0000F00000F800007800003C00001E00000E00000F000007800003C00000E00000700000 30145277BD24>40 DI<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000C000C0 01C00180018003800300070006000E001C003800700060000A1977881B>44 DI<0000000E000000000000000E00 0000000000000E000000000000001F000000000000001F000000000000003F8000000000 00003F800000000000003F800000000000007FC00000000000007FC00000000000007FC0 000000000000DFE0000000000000DFE0000000000001DFF00000000000018FF000000000 00018FF00000000000030FF800000000000307F800000000000307F800000000000607FC 00000000000603FC00000000000E03FE00000000000C01FE00000000000C01FE00000000 001C01FF00000000001800FF00000000001800FF00000000003000FF800000000030007F 800000000030007F800000000060003FC00000000060003FC000000000E0003FE0000000 00C0001FE000000000C0001FE00000000180001FF00000000180000FF00000000180000F F000000003FFFFFFF800000003FFFFFFF800000007FFFFFFFC00000006000003FC000000 06000003FC0000000C000003FE0000000C000001FE0000000C000001FE00000018000001 FF00000018000000FF00000018000000FF000000300000007F800000300000007F800000 700000007FC00000600000003FC00000E00000003FC00000F00000003FE00003F0000000 3FE0000FFC0000007FF800FFFF80000FFFFFE0FFFF80000FFFFFE0FFFF80000FFFFFE03B 3C7CBB44>65 DI68 D<0000007FC0003000000007FFF800700000003FFFFE0070 000000FFC01F80F0000003FE0003E1F0000007F80000F3F000001FE000007BF000003FC0 00003FF000007F8000001FF00000FF0000000FF00001FE00000007F00003FC00000003F0 0003FC00000003F00007F800000001F0000FF000000000F0000FF000000000F0001FE000 000000F0001FE00000000070003FE00000000070003FC00000000070003FC00000000030 007FC00000000030007FC00000000030007FC00000000030007F80000000000000FF8000 0000000000FF80000000000000FF80000000000000FF80000000000000FF800000000000 00FF80000000000000FF80000000000000FF80000000000000FF80000000000000FF8000 0000000000FF8000007FFFFFC07F8000007FFFFFC07FC000007FFFFFC07FC00000003FF8 007FC00000000FF0003FC00000000FF0003FC00000000FF0003FE00000000FF0001FE000 00000FF0001FF00000000FF0000FF00000000FF0000FF00000000FF00007F80000000FF0 0003FC0000000FF00003FC0000000FF00001FE0000000FF00000FF0000001FF000007F80 00001FF000003FC000003FF000001FF000007BF0000007F80000F1F0000003FE0001E0F0 000000FFE00FC0700000003FFFFF003000000007FFFC0000000000007FE00000003A3D7A BA47>71 D73 D82 D<0007F80030003FFF007000FFFFE07003F807F0F007E00079F00FC0003FF01F80000FF0 1F000007F03E000003F07E000001F07E000001F07C000000F0FC000000F0FC00000070FC 00000070FC00000070FE00000030FE00000030FE00000030FF00000030FF800000007FC0 0000007FE00000007FF80000003FFF8000001FFFFC00001FFFFFC0000FFFFFF00007FFFF FC0001FFFFFF0000FFFFFF80003FFFFFC00007FFFFE000003FFFE0000003FFF00000007F F00000001FF80000000FF800000007F800000003FC00000003FCC0000001FCC0000001FC C0000000FCC0000000FCC0000000FCE0000000FCE0000000FCE0000000F8F0000000F8F0 000001F8F8000001F0FC000003F0FE000003E0FF000007C0FFC0000FC0F9F0001F80F0FF 007E00E03FFFFC00E00FFFF000C000FF8000263D7ABA33>I87 D89 D<00000700000000000700000000000F80000000000F80000000000F80000000001FC000 0000001FC0000000001FC00000000037E00000000037E00000000077F00000000063F000 00000063F000000000C1F800000000C1F800000001C1FC0000000180FC0000000180FC00 000003007E00000003007E00000003007E00000006003F00000006003F0000000E003F80 00000C001F8000000C001F80000018000FC0000018000FC000003FFFFFE000003FFFFFE0 0000300007E00000600003F00000600003F00000600003F00000C00001F80000C00001F8 0001C00001FC0001800000FC0003800000FC0003C00000FE0007C00000FE001FE00001FF 80FFF8000FFFF8FFF8000FFFF82D2C7DAB33>97 D<00003FC0060001FFF80E000FE03E1E 001F00071E007E0003BE00F80001FE01F00000FE03E000007E07E000003E0FC000003E1F C000001E1F8000001E3F8000000E3F0000000E7F0000000E7F000000067F00000006FE00 000006FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 0000FE00000000FE00000000FE000000007F000000067F000000067F000000063F000000 063F8000000E1F8000000C1FC000000C0FC000001C07E000001803E000003801F0000070 00F80000E0007E0001C0001F000780000FE03E000001FFF80000003FC000272D7BAB31> 99 DII<00003FE003000001FFF807000007 E01E0F00001F00078F00007E0001DF0000FC0000FF0001F800007F0003F000003F0007E0 00001F000FC000001F001FC000000F001F8000000F003F80000007003F00000007007F00 000007007F00000003007F0000000300FE0000000300FE0000000000FE0000000000FE00 00000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE00 003FFFF8FE00003FFFF87F000000FF807F0000003F007F0000003F003F0000003F003F80 00003F001F8000003F001FC000003F000FC000003F0007E000003F0003F000003F0001F8 00007F0000FC00007F00007E0000FF00001F0001CF000007E00F87000001FFFE03000000 3FF000002D2D7BAB35>103 DII107 DI110 D112 D114 D<007F006001FFE0E00780F9E00E00 1FE01C0007E0380003E0780003E0700001E0F00000E0F00000E0F00000E0F0000060F800 0060F8000060FC000000FE0000007F0000007FC000003FFE00003FFFE0001FFFF80007FF FE0003FFFF0000FFFF80000FFFC00000FFC000000FE0000007E0000003F0000001F00000 01F0C00001F0C00000F0C00000F0C00000F0E00000F0E00000E0F00001E0F00001E0F800 03C0FC000780FF000F00F3E01E00E0FFF800C01FE0001C2D7BAB26>I<7FFFFFFFFFC07F FFFFFFFFC07E003FC00FC078001F8003C070001F8001C070001F8000C060001F8000C0E0 001F8000E0E0001F8000E0C0001F800060C0001F800060C0001F800060C0001F800060C0 001F80006000001F80000000001F80000000001F80000000001F80000000001F80000000 001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000 001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000 001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000 001F80000000001F80000000001F80000000007FE00000001FFFFF8000001FFFFF80002B 2B7DAA31>III E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fw cmbx12 14.4 22 /Fw 22 118 df<00000000001F00000000000000000000003F8000000000000000000000 7FC0000000000000000000007FC000000000000000000000FFE000000000000000000000 FFE000000000000000000000FFE000000000000000000001FFF000000000000000000001 FFF000000000000000000003FFF800000000000000000003FFF800000000000000000003 FFF800000000000000000007FFFC00000000000000000007FFFC00000000000000000007 FFFC0000000000000000000FFFFE0000000000000000000FFFFE0000000000000000001F FFFF0000000000000000001FFFFF0000000000000000001FFFFF0000000000000000003F FFFF8000000000000000003F7FFF8000000000000000007F7FFFC000000000000000007E 7FFFC000000000000000007E3FFFC00000000000000000FE3FFFE00000000000000000FC 1FFFE00000000000000001FC1FFFF00000000000000001F81FFFF00000000000000001F8 0FFFF00000000000000003F80FFFF80000000000000003F007FFF80000000000000007F0 07FFFC0000000000000007E007FFFC0000000000000007E003FFFC000000000000000FE0 03FFFE000000000000000FC001FFFE000000000000001FC001FFFF000000000000001F80 01FFFF000000000000001F8000FFFF000000000000003F8000FFFF800000000000003F00 007FFF800000000000007F00007FFFC00000000000007E00007FFFC00000000000007E00 003FFFC0000000000000FE00003FFFE0000000000000FC00001FFFE0000000000001FC00 001FFFF0000000000001F800001FFFF0000000000001F800000FFFF0000000000003F800 000FFFF8000000000003F0000007FFF8000000000007F0000007FFFC000000000007E000 0007FFFC000000000007E0000003FFFC00000000000FFFFFFFFFFFFE00000000000FFFFF FFFFFFFE00000000001FFFFFFFFFFFFF00000000001FFFFFFFFFFFFF00000000001FFFFF FFFFFFFF00000000003F80000000FFFF80000000003F000000007FFF80000000007F0000 00007FFFC0000000007F000000007FFFC0000000007E000000003FFFC000000000FE0000 00003FFFE000000000FC000000001FFFE000000001FC000000001FFFF000000001FC0000 00001FFFF000000001F8000000000FFFF000000003F8000000000FFFF800000003F00000 000007FFF800000007F00000000007FFFC00000007F00000000007FFFC00000007E00000 000003FFFC0000000FE00000000003FFFE0000000FC00000000003FFFE0000001FC00000 000001FFFF000000FFFC0000000001FFFF0000FFFFFFF800000FFFFFFFFFE0FFFFFFF800 000FFFFFFFFFE0FFFFFFF800000FFFFFFFFFE0FFFFFFF800000FFFFFFFFFE0FFFFFFF800 000FFFFFFFFFE05B547BD366>65 D<0000000001FFFC000001C0000000007FFFFFC00003 C000000007FFFFFFF80007C00000003FFFFFFFFE001FC0000000FFFFFFFFFF803FC00000 03FFFFE003FFC07FC000000FFFFC00003FF0FFC000003FFFE000000FF9FFC000007FFF80 000003FFFFC00001FFFE00000000FFFFC00003FFF8000000007FFFC00007FFF000000000 3FFFC0000FFFE0000000001FFFC0001FFFC0000000000FFFC0003FFF800000000007FFC0 007FFF000000000003FFC000FFFE000000000001FFC000FFFE000000000001FFC001FFFC 000000000000FFC003FFF8000000000000FFC003FFF80000000000007FC007FFF0000000 0000007FC00FFFF00000000000003FC00FFFF00000000000003FC01FFFE0000000000000 1FC01FFFE00000000000001FC01FFFE00000000000001FC03FFFC00000000000001FC03F FFC00000000000000FC03FFFC00000000000000FC07FFFC00000000000000FC07FFFC000 00000000000FC07FFFC000000000000000007FFF8000000000000000007FFF8000000000 00000000FFFF800000000000000000FFFF800000000000000000FFFF8000000000000000 00FFFF800000000000000000FFFF800000000000000000FFFF800000000000000000FFFF 800000000000000000FFFF800000000000000000FFFF800000000000000000FFFF800000 000000000000FFFF800000000000000000FFFF800000000000000000FFFF800000000000 000000FFFF8000000000000000007FFF8000000000000000007FFF800000000000000000 7FFFC000000000000000007FFFC000000000000000007FFFC000000000000007C03FFFC0 00000000000007C03FFFC000000000000007C03FFFC000000000000007C01FFFE0000000 00000007C01FFFE000000000000007C01FFFE00000000000000FC00FFFF0000000000000 0F800FFFF00000000000000F8007FFF00000000000001F8003FFF80000000000001F8003 FFF80000000000001F0001FFFC0000000000003F0000FFFE0000000000007E0000FFFE00 00000000007E00007FFF000000000000FC00003FFF800000000001F800001FFFC0000000 0003F800000FFFE00000000007F0000007FFF0000000000FE0000003FFFC000000001FC0 000001FFFE000000007F800000007FFF80000000FF000000003FFFE0000007FE00000000 0FFFFE00001FF80000000003FFFFE001FFF00000000000FFFFFFFFFFC000000000003FFF FFFFFF00000000000007FFFFFFFC000000000000007FFFFFE00000000000000001FFFC00 000000525479D261>67 D76 D80 D82 D<00007FFF000000000007FFFFF0000000003FFFFFFE00000000FFFFFFFF80000001FFE0 0FFFC0000003FE0001FFF0000007FF0000FFF8000007FF80003FFC00000FFF80003FFE00 000FFFC0001FFE00000FFFC0001FFF00000FFFC0000FFF80000FFFC0000FFF80000FFFC0 000FFF800007FF800007FFC00007FF800007FFC00003FF000007FFC00001FE000007FFC0 000000000007FFC0000000000007FFC0000000000007FFC0000000000007FFC000000000 0007FFC0000000000007FFC0000000007FFFFFC00000000FFFFFFFC0000000FFFFFFFFC0 000007FFFF87FFC000003FFFF007FFC000007FFF8007FFC00001FFFC0007FFC00003FFF0 0007FFC00007FFE00007FFC0000FFFC00007FFC0001FFF800007FFC0003FFF000007FFC0 007FFF000007FFC0007FFE000007FFC0007FFE000007FFC000FFFC000007FFC000FFFC00 0007FFC000FFFC000007FFC000FFFC000007FFC000FFFC00000FFFC000FFFC00000FFFC0 00FFFE00001FFFC0007FFE00001DFFC0007FFE00003DFFC0003FFF000079FFE0001FFF80 00F1FFF8000FFFC003E1FFFFE007FFF81FC0FFFFF003FFFFFF807FFFF000FFFFFF001FFF F0001FFFFC0007FFE00001FFE0000000003C387CB641>97 D<003FF0000000000000FFFF F0000000000000FFFFF0000000000000FFFFF0000000000000FFFFF0000000000000FFFF F000000000000003FFF000000000000000FFF000000000000000FFF000000000000000FF F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FF F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FF F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FF F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FF F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FF F001FFE000000000FFF00FFFFE00000000FFF03FFFFFC0000000FFF0FFFFFFF0000000FF F3FF01FFF8000000FFF7F8003FFE000000FFFFE0000FFF000000FFFF800007FF800000FF FF000003FFC00000FFFE000001FFE00000FFFC000001FFF00000FFF8000000FFF80000FF F8000000FFF80000FFF80000007FFC0000FFF80000007FFC0000FFF80000007FFE0000FF F80000007FFE0000FFF80000007FFF0000FFF80000003FFF0000FFF80000003FFF0000FF F80000003FFF0000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FF F80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FF F80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FF F80000003FFF8000FFF80000003FFF0000FFF80000003FFF0000FFF80000003FFF0000FF F80000003FFF0000FFF80000007FFE0000FFF80000007FFE0000FFF80000007FFE0000FF F80000007FFC0000FFF8000000FFFC0000FFF8000000FFF80000FFFC000001FFF00000FF FC000001FFF00000FFFE000003FFE00000FFFF000007FFC00000FFFF80000FFF800000FF CFC0001FFF000000FF87F0007FFC000000FF03FE03FFF8000000FE00FFFFFFE0000000FC 007FFFFF80000000F8001FFFFC00000000000003FFC000000041547BD24B>I<00000000 0001FF80000000000007FFFF80000000000007FFFF80000000000007FFFF800000000000 07FFFF80000000000007FFFF800000000000001FFF8000000000000007FF800000000000 0007FF8000000000000007FF8000000000000007FF8000000000000007FF800000000000 0007FF8000000000000007FF8000000000000007FF8000000000000007FF800000000000 0007FF8000000000000007FF8000000000000007FF8000000000000007FF800000000000 0007FF8000000000000007FF8000000000000007FF8000000000000007FF800000000000 0007FF8000000000000007FF8000000000000007FF8000000000000007FF800000000000 0007FF8000000001FFE007FF800000001FFFFC07FF80000000FFFFFF07FF80000003FFFF FFC7FF8000000FFFE03FE7FF8000001FFF0007F7FF8000007FFC0001FFFF800000FFF800 00FFFF800001FFF000003FFF800003FFE000001FFF800007FFC000001FFF800007FFC000 000FFF80000FFF8000000FFF80001FFF8000000FFF80001FFF0000000FFF80003FFF0000 000FFF80003FFF0000000FFF80003FFF0000000FFF80007FFE0000000FFF80007FFE0000 000FFF80007FFE0000000FFF80007FFE0000000FFF8000FFFE0000000FFF8000FFFE0000 000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE0000 000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE0000000FFF8000FFFE0000 000FFF8000FFFE0000000FFF8000FFFE0000000FFF80007FFE0000000FFF80007FFE0000 000FFF80007FFE0000000FFF80003FFF0000000FFF80003FFF0000000FFF80003FFF0000 000FFF80001FFF0000000FFF80001FFF0000000FFF80000FFF8000000FFF80000FFF8000 001FFF800007FFC000003FFF800003FFC000003FFF800001FFE000007FFF800000FFF000 01FFFF8000007FF80003FFFFE000003FFE000FEFFFFF80000FFFC07FCFFFFF800007FFFF FF8FFFFF800001FFFFFE0FFFFF8000003FFFF80FFFFF80000003FFC00FFE000041547CD2 4B>100 D<000003FFC0000000003FFFFC00000001FFFFFF00000007FFFFFFC000000FFF 81FFE000003FFC007FF800007FF8003FFC0000FFF0001FFE0001FFE0000FFE0003FFC000 07FF0007FFC00007FF800FFF800003FF800FFF800003FFC01FFF800001FFC01FFF000001 FFC03FFF000001FFE03FFF000001FFE07FFF000000FFE07FFE000000FFE07FFE000000FF F07FFE000000FFF0FFFE000000FFF0FFFE000000FFF0FFFE000000FFF0FFFE000000FFF0 FFFFFFFFFFFFF0FFFFFFFFFFFFF0FFFFFFFFFFFFF0FFFFFFFFFFFFE0FFFE0000000000FF FE0000000000FFFE0000000000FFFE0000000000FFFE0000000000FFFE00000000007FFE 00000000007FFE00000000007FFF00000000003FFF00000000003FFF00000000003FFF00 000000E01FFF00000001F01FFF80000003F00FFF80000003F007FFC0000007E007FFC000 0007E003FFE000000FC001FFF000001FC000FFF800003F80007FFC0000FF00001FFE0003 FE00000FFFC03FF8000003FFFFFFF0000000FFFFFFC00000001FFFFE0000000001FFF000 0034387CB63D>I<0000003FFC00000003FFFF0000000FFFFFC000003FFFFFE00000FFF8 1FF00001FFC03FF80003FF807FF80007FF00FFFC000FFE00FFFC001FFC00FFFC001FFC00 FFFC003FF800FFFC003FF800FFFC003FF8007FF8007FF0007FF8007FF0003FF0007FF000 0FC0007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000 0000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF000 0000007FF0000000007FF0000000FFFFFFFFE000FFFFFFFFE000FFFFFFFFE000FFFFFFFF E000FFFFFFFFE000007FF8000000007FF8000000007FF8000000007FF8000000007FF800 0000007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF800 0000007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF800 0000007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF800 0000007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF800 0000007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF800 0000007FF8000000007FF8000000007FF8000000007FF8000000007FF8000000007FF800 0000007FF8000000007FF80000007FFFFFFE00007FFFFFFE00007FFFFFFE00007FFFFFFE 00007FFFFFFE00002E547CD329>I<00003FFF0000FF000003FFFFF007FFC0000FFFFFFC 1FFFE0003FFFFFFF7FFFE0007FFC0FFFFF9FF000FFE001FFF83FF001FFC000FFE03FF003 FF80007FF01FF007FF00003FF81FE00FFF00003FFC0FC00FFF00003FFC07801FFE00001F FE00001FFE00001FFE00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003F FE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001F FF00003FFE00001FFF00001FFE00001FFE00001FFE00001FFE00000FFF00003FFC00000F FF00003FFC000007FF00003FF8000003FF80007FF0000001FFC000FFE0000000FFE001FF C0000000FFFC0FFF80000001FFFFFFFF00000003EFFFFFFC00000003C3FFFFF000000007 C03FFF0000000007C000000000000007C00000000000000FC00000000000000FC0000000 0000000FC00000000000000FE00000000000000FE00000000000000FF80000000000000F FE0000000000000FFFFFFFFF00000007FFFFFFFFF8000007FFFFFFFFFF000007FFFFFFFF FFC00003FFFFFFFFFFE00001FFFFFFFFFFF00000FFFFFFFFFFF800007FFFFFFFFFFC0000 7FFFFFFFFFFE0001FFFFFFFFFFFF0007FFFFFFFFFFFF000FFE000003FFFF801FF8000000 3FFF803FF000000007FF807FE000000003FFC07FE000000001FFC0FFC000000001FFC0FF C000000000FFC0FFC000000000FFC0FFC000000000FFC0FFC000000000FFC0FFC0000000 00FFC0FFE000000001FFC07FE000000001FF807FF000000003FF803FF000000003FF001F F800000007FE000FFE0000001FFC0007FF8000007FF80003FFE00001FFF00001FFFE001F FFE000007FFFFFFFFF8000000FFFFFFFFC00000001FFFFFFE0000000000FFFFC0000003C 4F7CB543>I<003FF0000000000000FFFFF0000000000000FFFFF0000000000000FFFFF0 000000000000FFFFF0000000000000FFFFF000000000000003FFF000000000000000FFF0 00000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF0 00000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF0 00000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF0 00000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF0 00000000000000FFF000000000000000FFF000000000000000FFF000000000000000FFF0 00000000000000FFF000000000000000FFF0001FFC00000000FFF000FFFFC0000000FFF0 03FFFFF0000000FFF00FFFFFF8000000FFF01FE07FFC000000FFF03F001FFE000000FFF0 7C001FFF000000FFF0F0000FFF000000FFF1E0000FFF800000FFF3C0000FFF800000FFF7 800007FF800000FFF7800007FFC00000FFFF000007FFC00000FFFE000007FFC00000FFFE 000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC 000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8 000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8 000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8 000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8 000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8 000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8 000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8 000007FFC00000FFF8000007FFC00000FFF8000007FFC000FFFFFFF807FFFFFFC0FFFFFF F807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC042537B D24B>I<007F000000FF800003FFE00007FFF00007FFF0000FFFF8000FFFF8000FFFF800 0FFFF8000FFFF8000FFFF8000FFFF80007FFF00007FFF00003FFE00000FF8000007F0000 000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000003FF000FFFFF000FFFFF000FFFFF000FFFFF000 FFFFF00001FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF000 00FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF000 00FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF000 00FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF000 00FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF000FFFFFFE0 FFFFFFE0FFFFFFE0FFFFFFE0FFFFFFE01B547BD325>I<003FF000FFFFF000FFFFF000FF FFF000FFFFF000FFFFF00001FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000FFF00000 FFF00000FFF00000FFF000FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF0FFFFFFF01C537BD225 >108 D<003FF0001FFC000000FFE00000FFFFF000FFFFC00007FFFE0000FFFFF003FFFF F0001FFFFF8000FFFFF00FFFFFF8007FFFFFC000FFFFF01FE07FFC00FF03FFE000FFFFF0 3F001FFE01F800FFF00003FFF07C001FFF03E000FFF80000FFF0F0000FFF0780007FF800 00FFF1E0000FFF8F00007FFC0000FFF3C0000FFF9E00007FFC0000FFF7800007FFBC0000 3FFC0000FFF7800007FFFC00003FFE0000FFFF000007FFF800003FFE0000FFFE000007FF F000003FFE0000FFFE000007FFF000003FFE0000FFFC000007FFE000003FFE0000FFFC00 0007FFE000003FFE0000FFFC000007FFE000003FFE0000FFFC000007FFE000003FFE0000 FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003F FE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC0 00003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF80000 07FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FF F8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE 0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000 003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007 FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8 000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE00 00FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC00000 3FFE0000FFF8000007FFC000003FFE0000FFF8000007FFC000003FFE00FFFFFFF807FFFF FFC03FFFFFFEFFFFFFF807FFFFFFC03FFFFFFEFFFFFFF807FFFFFFC03FFFFFFEFFFFFFF8 07FFFFFFC03FFFFFFEFFFFFFF807FFFFFFC03FFFFFFE67367BB570>I<003FF0001FFC00 0000FFFFF000FFFFC00000FFFFF003FFFFF00000FFFFF00FFFFFF80000FFFFF01FE07FFC 0000FFFFF03F001FFE000003FFF07C001FFF000000FFF0F0000FFF000000FFF1E0000FFF 800000FFF3C0000FFF800000FFF7800007FF800000FFF7800007FFC00000FFFF000007FF C00000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC000007FF C00000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF8000007FF C00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FF C00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FF C00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FF C00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FF C00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FF C00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FF C00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FF C000FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFF FFC0FFFFFFF807FFFFFFC042367BB54B>I<000001FFE000000000001FFFFE0000000000 FFFFFFC000000003FFFFFFF00000000FFF807FFC0000001FFC000FFE0000007FF80007FF 800000FFF00003FFC00001FFE00001FFE00003FFC00000FFF00003FF8000007FF00007FF 8000007FF8000FFF0000003FFC000FFF0000003FFC001FFF0000003FFE001FFF0000003F FE003FFE0000001FFF003FFE0000001FFF003FFE0000001FFF007FFE0000001FFF807FFE 0000001FFF807FFE0000001FFF807FFE0000001FFF80FFFE0000001FFFC0FFFE0000001F FFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE 0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001FFFC0FFFE0000001F FFC0FFFE0000001FFFC07FFE0000001FFF807FFE0000001FFF807FFE0000001FFF803FFE 0000001FFF003FFF0000003FFF003FFF0000003FFF001FFF0000003FFE001FFF0000003F FE000FFF0000003FFC000FFF8000007FFC0007FF8000007FF80003FFC00000FFF00001FF E00001FFE00000FFF00003FFC000007FF80007FF8000003FFE001FFF0000000FFF807FFC 00000007FFFFFFF800000000FFFFFFC0000000003FFFFF000000000001FFE00000003A38 7CB643>I<003FF001FFE0000000FFFFF00FFFFE000000FFFFF03FFFFFC00000FFFFF0FF FFFFF00000FFFFF3FF01FFF80000FFFFF7F8007FFE000003FFFFE0001FFF000000FFFF80 000FFF800000FFFF000007FFC00000FFFE000007FFE00000FFFC000003FFF00000FFF800 0001FFF80000FFF8000001FFF80000FFF8000000FFFC0000FFF8000000FFFC0000FFF800 0000FFFE0000FFF80000007FFE0000FFF80000007FFF0000FFF80000007FFF0000FFF800 00007FFF0000FFF80000007FFF0000FFF80000003FFF8000FFF80000003FFF8000FFF800 00003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF800 00003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF80000003FFF8000FFF800 00003FFF8000FFF80000003FFF8000FFF80000003FFF0000FFF80000007FFF0000FFF800 00007FFF0000FFF80000007FFF0000FFF80000007FFE0000FFF8000000FFFE0000FFF800 0000FFFE0000FFF8000000FFFC0000FFF8000001FFFC0000FFF8000001FFF80000FFFC00 0003FFF00000FFFC000003FFF00000FFFE000007FFE00000FFFF00000FFFC00000FFFF80 001FFF800000FFFFC0003FFF000000FFFFF000FFFC000000FFFBFE07FFF8000000FFF8FF FFFFE0000000FFF87FFFFF80000000FFF81FFFFC00000000FFF803FFC000000000FFF800 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800 000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF800 0000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF8 0000000000FFFFFFF80000000000414D7BB54B>I<007FE003FE00FFFFE00FFF80FFFFE0 3FFFE0FFFFE07FFFF0FFFFE0FE1FF8FFFFE1F83FFC03FFE3E03FFE00FFE3C07FFE00FFE7 807FFE00FFEF807FFE00FFEF007FFE00FFEE007FFE00FFFE003FFC00FFFC003FFC00FFFC 001FF800FFFC000FF000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 00000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF0 00000000FFF000000000FFF000000000FFF000000000FFF0000000FFFFFFFC0000FFFFFF FC0000FFFFFFFC0000FFFFFFFC0000FFFFFFFC00002F367CB537>114 D<0003FFF00F00003FFFFE1F0000FFFFFFFF0003FFFFFFFF0007FF003FFF000FF80007FF 001FE00001FF003FC00000FF003F8000007F007F8000007F007F0000003F007F0000003F 00FF0000001F00FF0000001F00FF8000001F00FF8000001F00FFC000001F00FFF0000000 00FFFC00000000FFFFC00000007FFFFF0000007FFFFFF800003FFFFFFF00003FFFFFFFC0 001FFFFFFFF0000FFFFFFFF80007FFFFFFFC0003FFFFFFFE0000FFFFFFFF00003FFFFFFF 80000FFFFFFFC00000FFFFFFC0000007FFFFE00000003FFFE000000007FFF000000001FF F0780000007FF0F80000003FF0F80000001FF0FC0000001FF0FC0000000FF0FC0000000F F0FE0000000FF0FE0000000FE0FF0000000FE0FF8000001FE0FF8000001FC0FFC000001F C0FFE000003F80FFF800007F00FFFE0001FE00FFFFC00FFC00FF7FFFFFF800FC1FFFFFE0 00F807FFFF8000F000FFF800002C387CB635>I<00003E00000000003E00000000003E00 000000003E00000000003E00000000003E00000000007E00000000007E00000000007E00 000000007E0000000000FE0000000000FE0000000001FE0000000001FE0000000001FE00 00000003FE0000000007FE0000000007FE000000000FFE000000001FFE000000003FFE00 000000FFFE00000001FFFE0000000FFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFF FF00FFFFFFFFFF00003FFE000000003FFE000000003FFE000000003FFE000000003FFE00 0000003FFE000000003FFE000000003FFE000000003FFE000000003FFE000000003FFE00 0000003FFE000000003FFE000000003FFE000000003FFE000000003FFE000000003FFE00 0000003FFE000000003FFE000000003FFE000000003FFE000000003FFE000000003FFE00 0000003FFE000000003FFE000000003FFE000000003FFE000000003FFE0007C0003FFE00 07C0003FFE0007C0003FFE0007C0003FFE0007C0003FFE0007C0003FFE0007C0003FFE00 07C0003FFE0007C0003FFE0007C0003FFE0007C0001FFE000F80001FFF000F80001FFF00 0F80000FFF001F00000FFF801F000007FFC03E000003FFF0FC000001FFFFF80000007FFF F00000001FFFE000000003FF80002A4D7ECB34>I<003FF8000001FFC000FFFFF80007FF FFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FF FFC00003FFF800001FFFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007 FFC00000FFF8000007FFC00000FFF800000FFFC00000FFF800000FFFC00000FFF800000F FFC00000FFF800001FFFC00000FFF800001FFFC000007FF800003FFFC000007FF800003B FFC000007FF800007BFFC000003FFC0000F3FFC000003FFC0001E3FFF000001FFE0007C3 FFFFC0000FFFC03F83FFFFC00007FFFFFF03FFFFC00001FFFFFE03FFFFC000007FFFF803 FFFFC0000007FFE003FF000042377BB54B>I E %EndDVIPSBitmapFont end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: A4 %%EndSetup %%Page: 1 1 1 0 bop 30 333 4050 34 v 576 566 a Fw(Random)46 b(Algorithms)f(for)g (the)h(Lo)t(op)e(Cutset)i(Problem)p 30 748 4050 9 v 1069 1135 a Fv(Ann)31 b(Becker,)g(Reuven)h(Bar-Yehud)n(a,)f(D)n(an)g(Geiger) 3041 1105 y Fu(\003)1496 1227 y Ft(Computer)c(Science)h(Departmen)n(t) 1712 1320 y(T)-7 b(ec)n(hnion,)27 b(ISRAEL)1341 1413 y Fs(f)p Ft(an)n(yuta,reuv)n(en,dang)p Fs(g)p Ft(@cs.tec)n(hnion.ac.il) 791 1808 y Fr(Abstract)196 2050 y Ft(W)-7 b(e)36 b(sho)n(w)f(ho)n(w)f (to)i(\014nd)g(a)f(minim)n(um)h(lo)r(op)f(cut-)196 2142 y(set)g(in)g(a)f(Ba)n(y)n(esian)f(net)n(w)n(ork)g(with)i(high)f(proba-) 196 2235 y(bilit)n(y)-7 b(.)41 b(Finding)30 b(suc)n(h)e(a)h(lo)r(op)g (cutset)g(is)g(the)g(\014rst)196 2328 y(step)c(in)f(P)n(earl's)f(metho) r(d)i(of)f(conditioning)g(for)g(in-)196 2420 y(ference.)39 b(Our)28 b(random)g(algorithm)f(for)h(\014nding)g(a)196 2513 y(lo)r(op)19 b(cutset,)j(called)d Fv(Repea)-6 b(tedW)n(GuessI)p Ft(,)20 b(out-)196 2606 y(puts)i(a)f(minim)n(um)i(lo)r(op)e(cutset,)i (after)f Fq(O)r Ft(\()p Fq(c)7 b Fs(\001)g Ft(6)1646 2575 y Fp(k)1686 2606 y Fq(k)s(n)p Ft(\))196 2719 y(steps,)22 b(with)f(probabilit)n(y)f(at)g(least)h(1)5 b Fs(\000)g Ft(\(1)g Fs(\000)1594 2686 y Fo(1)p 1576 2700 70 4 v 1576 2748 a(6)1609 2732 y Fn(k)1655 2719 y Ft(\))1687 2689 y Fp(c)p Fo(6)1750 2663 y Fn(k)1791 2719 y Ft(,)196 2811 y(where)38 b Fq(c)i(>)g Ft(1)e(is)g(a)g(constan)n(t)f(sp)r (eci\014ed)i(b)n(y)f(the)196 2904 y(user,)28 b Fq(k)k Ft(is)c(the)h(size)g(of)f(a)g(minim)n(um)i(w)n(eigh)n(t)d(lo)r(op)196 2997 y(cutset,)33 b(and)e Fq(n)h Ft(is)f(the)h(n)n(um)n(b)r(er)f(of)g (v)n(ertices.)48 b(W)-7 b(e)196 3089 y(also)19 b(sho)n(w)g(empirically) g(that)i(a)e(v)-5 b(arian)n(t)19 b(of)h(this)h(al-)196 3182 y(gorithm,)i(called)f Fv(WRA)p Ft(,)h(often)g(\014nds)g(a)f(lo)r (op)g(cut-)196 3275 y(set)j(that)g(is)g(closer)f(to)g(the)i(minim)n(um) f(lo)r(op)g(cutset)196 3367 y(than)c(the)h(ones)f(found)g(b)n(y)g(the)h (b)r(est)g(deterministic)196 3460 y(algorithms)k(kno)n(wn.)30 3776 y Fr(1)112 b(In)m(tro)s(duction)30 3976 y Ft(All)30 b(exact)f(inference)h(algorithms)e(for)h(the)h(computation)f(of)30 4068 y(a)36 b(p)r(osterior)g(probabilit)n(y)g(in)h(general)e(Ba)n(y)n (esian)g(net)n(w)n(orks)30 4161 y(ha)n(v)n(e)26 b(t)n(w)n(o)g (conceptual)h(phases.)36 b(One)27 b(phase)f(handles)h(op)r(er-)30 4254 y(ations)k(on)h(the)h(graphical)d(structure)i(itself)g(and)g(the)h (other)30 4346 y(p)r(erforms)19 b(probabilistic)f(computations.)33 b(F)-7 b(or)19 b(example,)i(the)30 4439 y(clique)26 b(tree)f(algorithm) f(requires)h(us)g(to)h(\014rst)f(\014nd)h(a)g(\\go)r(o)r(d")30 4532 y(clique)38 b(tree)g(and)g(then)h(p)r(erform)f(probabilistic)g (computa-)30 4624 y(tions)25 b(on)f(the)h(clique)g(tree)g([LS88)o(].)36 b(P)n(earl's)23 b(metho)r(d)i(of)g(con-)30 4717 y(ditioning)h(requires) f(us)h(\014rst)g(to)g(\014nd)h(a)e(\\go)r(o)r(d")g(lo)r(op)h(cutset)30 4810 y(and)38 b(then)g(p)r(erform)g(a)f(calculation)h(for)f(eac)n(h)g (lo)r(op)h(cutset)30 4902 y([P)n(e86)n(,)24 b(P)n(e88)n(].)36 b(Finally)-7 b(,)24 b(Shac)n(h)n(ter's)e(algorithm)h(requires)f(us)30 4995 y(to)e(\014nd)i(a)e(\\go)r(o)r(d")f(sequence)h(of)g (transformations)f(and)i(then,)30 5088 y(for)27 b(eac)n(h)g (transformation,)f(to)h(compute)h(some)f(conditional)30 5180 y(probabilit)n(y)g(tables)g([Sh86)o(].)30 5323 y(In)g(the)g(three) g(algorithms)e(just)j(men)n(tioned)f(the)g(\014rst)g(phase)30 5415 y(is)34 b(to)f(\014nd)i(a)e(go)r(o)r(d)g(discrete)h(structure,)h (namely)-7 b(,)35 b(a)e(clique)30 5508 y(tree,)f(a)f(cutset,)i(or)d(a)h (sequence)g(of)h(transformations.)46 b(The)30 5601 y(go)r(o)r(dness)23 b(of)i(the)g(structure)f(dep)r(ends)h(on)f(a)g(c)n(hosen)f(param-)30 5693 y(eter)j(that,)g(if)h(selected)f(appropriately)-7 b(,)25 b(reduces)g(the)i(proba-)p 30 5773 499 4 v 168 5818 a Fm(\003)200 5850 y Fl(On)e(sabbatical)i(at)f(Microsoft)i (Researc)n(h.)2130 1808 y Ft(bilistic)g(computations)e(done)i(in)f(the) h(second)f(phase.)36 b(Find-)2130 1901 y(ing)30 b(a)f(structure)g(that) h(optimizes)g(the)g(selected)g(parameter)2130 1993 y(is)24 b(usually)g(NP-hard)e(and)i(th)n(us)g(heuristic)g(metho)r(ds)h(are)e (ap-)2130 2086 y(plied)39 b(to)f(\014nd)h(a)f(reasonable)f(structure.) 69 b(Most)38 b(metho)r(ds)2130 2179 y(in)27 b(the)h(past)f(had)g(no)f (guaran)n(tee)g(of)h(p)r(erformance)f(and)g(p)r(er-)2130 2271 y(formed)20 b(v)n(ery)e(badly)i(when)g(presen)n(ted)g(with)g(an)g (appropriate)2130 2364 y(example.)36 b(Bec)n(k)n(er)23 b(and)h(Geiger)g(o\013ered)h(an)f(algorithm)g(that)2130 2457 y(\014nds)f(a)g(lo)r(op)g(cutset)g(for)g(whic)n(h)g(the)h (logarithm)e(of)h(the)g(state)2130 2549 y(space)i(is)h(guaran)n(teed)f (to)h(b)r(e)g(a)g(constan)n(t)g(factor)f(o\013)h(the)h(op-)2130 2642 y(timal)40 b(v)-5 b(alue)39 b([BG94)o(,)g(BG96)o(].)73 b(Bafna)38 b(et)i(al.)f(and)g(F)-7 b(ujito)2130 2735 y(dev)n(elop)r(ed)27 b(similar)g(algorithms)f([BBF95)o(,)i(F)-7 b(u96)o(].)2130 2877 y(While)29 b(the)f(appro)n(ximation)f(algorithms)g (for)g(the)i(lo)r(op)f(cut-)2130 2970 y(set)e(problem)f(are)g(quite)h (useful,)h(it)f(is)g(w)n(orth)n(while)f(to)h(in)n(v)n(est)2130 3062 y(in)j(\014nding)g(a)g(minim)n(um)g(lo)r(op)g(cutset,)g(rather)f (than)h(an)g(ap-)2130 3155 y(pro)n(ximation,)35 b(b)r(ecause)f(the)h (cost)f(of)g(\014nding)h(suc)n(h)f(a)g(lo)r(op)2130 3248 y(cutset)20 b(is)f(amortized)g(o)n(v)n(er)f(the)i(man)n(y)f(iterations) f(of)i(the)g(con-)2130 3340 y(ditioning)28 b(metho)r(d.)38 b(In)28 b(fact,)g(one)g(ma)n(y)f(in)n(v)n(est)g(an)h(e\013ort)f(of)2130 3433 y(complexit)n(y)21 b(exp)r(onen)n(tial)g(in)h(the)g(size)g(of)g (the)g(lo)r(op)f(cutset)h(or)2130 3526 y(ev)n(en)28 b(larger)e(in)i (\014nding)h(a)e(minim)n(um)i(lo)r(op)f(cutset)g(b)r(ecause)2130 3618 y(the)e(second)e(phase)h(of)g(the)h(conditioning)f(algorithm,)f (whic)n(h)2130 3711 y(is)38 b(rep)r(eated)f(for)g(man)n(y)g (iterations,)j(uses)d(a)g(pro)r(cedure)g(of)2130 3804 y(suc)n(h)31 b(complexit)n(y)-7 b(.)47 b(The)31 b(same)g (considerations)e(apply)i(also)2130 3896 y(to)c(constrain)n(t)g (satisfaction)g(problems)g([De90)o(].)2130 4039 y(In)34 b(this)h(pap)r(er)f(w)n(e)g(describ)r(e)g(sev)n(eral)e(random)h (algorithms)2130 4131 y(that)41 b(compute)g(a)g(lo)r(op)g(cutset.)77 b(As)41 b(in)h([BGNR94)o(],)j(our)2130 4224 y(solution)24 b(is)h(based)f(on)h(a)f(reduction)g(to)h(the)g Fk(Weighte)l(d)j(F)-6 b(e)l(e)l(d-)2130 4317 y(b)l(ack)36 b(V)-6 b(ertex)35 b(Set)g(\(WFVS\))g(Pr)l(oblem)p Ft(,)i(de\014ned)e(b)r(elo)n(w.)56 b(A)2130 4409 y(feedbac)n(k)33 b(v)n(ertex)f(set)h Fq(F)45 b Ft(is)33 b(a)g(set)g(of)g(v)n(ertices)f(of)h(an)g(undi-)2130 4502 y(rected)40 b(graph)g Fq(G)45 b Ft(=)f(\()p Fq(V)5 b(;)14 b(E)5 b Ft(\))41 b(suc)n(h)f(that)h(b)n(y)f(remo)n(ving)f Fq(F)2130 4595 y Ft(from)c Fq(G)p Ft(,)j(along)d(with)h(all)g(the)g (edges)f(inciden)n(t)h(with)g Fq(F)12 b Ft(,)37 b(a)2130 4687 y(set)26 b(of)g(trees)g(is)g(obtained.)36 b(The)27 b(w)n(eigh)n(ted)e(feedbac)n(k)h(v)n(ertex)2130 4780 y(set)33 b(\(WFVS\))h(problem)e(is)g(to)g(\014nd)h(a)g(feedbac)n(k)f(v) n(ertex)f(set)2130 4881 y Fq(F)47 b Ft(of)36 b(a)e(v)n(ertex-w)n(eigh)n (ted)g(graph)g(\()p Fq(G;)14 b(w)r Ft(\),)38 b Fq(w)h Ft(:)d Fq(V)55 b Fs(!)36 b Ft(I)-14 b(R)4002 4845 y Fo(+)4057 4881 y Ft(,)2130 4974 y(suc)n(h)31 b(that)2505 4911 y Fj(P)2593 4999 y Fp(v)r Fu(2)p Fp(F)2742 4974 y Fq(w)r Ft(\()p Fq(v)s Ft(\))i(is)e(minimized.)50 b(When)32 b Fq(w)r Ft(\()p Fq(v)s Ft(\))f Fs(\021)e Ft(1,)2130 5066 y(this)f(problem)f(is)h(called)f(the)h(FVS)g(problem.)37 b(The)28 b(decision)2130 5159 y(v)n(ersion)f(asso)r(ciated)g(with)i (the)g(FVS)g(problem)f(is)g(kno)n(wn)g(to)2130 5252 y(b)r(e)i (NP-Complete)f([GJ79)n(,)h(pp.)g(191{192].)39 b(Note)30 b(that)f(also)2130 5344 y(the)h(problem)e(of)i(\014nding)f(a)g(minim)n (um)h(lo)r(op)f(cutset)g(is)h(NP-)2130 5437 y(complete)e([SC90)o(].) 2130 5579 y(Our)j(random)f(algorithm)g(for)h(\014nding)h(a)f(FVS,)h (called)f Fv(Re-)2130 5672 y(pea)-6 b(tedW)n(GuessI)p Ft(,)39 b(outputs)f(a)g(minim)n(um)h(w)n(eigh)n(t)e(FVS,)2130 5765 y(after)c Fq(O)r Ft(\()p Fq(c)24 b Fs(\001)e Ft(6)2576 5735 y Fp(k)2617 5765 y Fq(k)s(n)p Ft(\))33 b(steps,)j(with)e (probabilit)n(y)f(at)g(least)g(1)22 b Fs(\000)p eop %%Page: 2 2 2 1 bop 30 384 a Ft(\(1)26 b Fs(\000)248 351 y Fo(1)p 230 365 70 4 v 230 414 a(6)263 397 y Fn(k)309 384 y Ft(\))341 354 y Fp(c)p Fo(6)404 329 y Fn(k)445 384 y Ft(,)42 b(where)c Fq(c)k(>)f Ft(1)d(is)h(a)f(constan)n(t)g(sp)r(eci\014ed)h(b)n(y)30 477 y(the)28 b(user,)g Fq(k)j Ft(is)d(the)h(size)e(of)i(a)e(minim)n(um) i(w)n(eigh)n(t)e(FVS,)i(and)30 569 y Fq(n)37 b Ft(is)f(the)h(n)n(um)n (b)r(er)g(of)f(v)n(ertices.)63 b(F)-7 b(or)37 b(un)n(w)n(eigh)n(ted)e (graphs)30 662 y(w)n(e)g(presen)n(t)g(an)g(algorithm)g(that)g(\014nds)h (a)f(minim)n(um)h(FVS)30 755 y(of)46 b(a)f(graph)g Fq(G)p Ft(,)50 b(after)c Fq(O)r Ft(\(4)976 724 y Fp(k)1017 755 y Fq(k)s(n)p Ft(\))g(steps,)k(with)c(probabil-)30 868 y(it)n(y)38 b(at)g(least)g(1)25 b Fs(\000)g Ft(\(1)h Fs(\000)857 835 y Fo(1)p 839 849 V 839 897 a(4)872 881 y Fn(k)918 868 y Ft(\))950 838 y Fp(c)p Fo(4)1013 813 y Fn(k)1053 868 y Ft(.)69 b(In)39 b(comparison,)g(sev)n(eral)30 960 y(deterministic)33 b(algorithms)f(for)h(\014nding)g(a)g(minim)n(um) g(FVS)30 1053 y(are)c(describ)r(ed)g(in)h(the)g(literature.)42 b(One)29 b(has)g(a)h(complexit)n(y)30 1146 y Fq(O)r Ft(\(\(2)p Fq(k)25 b Ft(+)20 b(1\))428 1116 y Fp(k)469 1146 y Fq(n)519 1116 y Fo(2)556 1146 y Ft(\))32 b([DF95])f(and)h(others)e(ha)n(v)n(e)h (a)g(complexit)n(y)30 1238 y Fq(O)r Ft(\(\(17)p Fq(k)289 1208 y Fo(4)326 1238 y Ft(\)!)p Fq(n)p Ft(\))d([Bo90)o(,)g(DF92)o(].)30 1381 y(A)21 b(\014nal)g(v)-5 b(arian)n(t)19 b(of)i(our)f(random)f (algorithms,)i(called)f(WRA,)30 1473 y(has)31 b(the)h(b)r(est)f(p)r (erformance)g(b)r(ecause)g(it)g(utilizes)h(informa-)30 1566 y(tion)44 b(from)g(previous)f(runs.)85 b(This)45 b(algorithm)d(is)i(harder)30 1659 y(to)32 b(analyze)f(and)h(its)g(in)n (v)n(estigation)f(is)h(mostly)f(exp)r(erimen-)30 1751 y(tal.)47 b(W)-7 b(e)31 b(sho)n(w)f(empirically)h(that)g(the)g(actual)g (run)g(time)g(of)30 1844 y(WRA)f(is)f(comparable)e(to)i(a)g(Mo)r (di\014ed)g(Greedy)f(Algorithm)30 1937 y(\(MGA\),)j(devised)e(b)n(y)h (Bec)n(k)n(er)e(and)h(Geiger)g([BG96)o(],)h(whic)n(h)30 2029 y(is)20 b(the)h(b)r(est)g(a)n(v)-5 b(ailable)20 b(deterministic)g(algorithm)g(for)g(\014nding)30 2122 y(close)33 b(to)g(optimal)h(lo)r(op)f(cutsets,)i(and)f(y)n(et,)h(the)f (output)g(of)30 2215 y(WRA)26 b(is)f(often)h(closer)e(to)h(the)h(minim) n(um)g(lo)r(op)f(cutest)h(than)30 2307 y(the)i(output)g(of)g(MGA.)30 2450 y(The)i(rest)g(of)g(the)h(pap)r(er)e(is)h(organized)f(as)g(follo)n (ws.)44 b(In)30 b(Sec-)30 2542 y(tion)f(2)g(w)n(e)g(outline)g(the)h (metho)r(d)f(of)g(conditioning,)g(explain)30 2635 y(the)35 b(related)f(lo)r(op)h(cutset)g(problem)f(and)g(describ)r(e)h(the)g(re-) 30 2728 y(duction)25 b(from)f(the)i(lo)r(op)e(cutset)h(problem)f(to)h (the)g(W)-7 b(eigh)n(ted)30 2820 y(F)g(eedbac)n(k)31 b(V)-7 b(ertex)32 b(Set)g(\(WFVS\))i(Problem.)48 b(In)33 b(Section)e(3)30 2913 y(w)n(e)40 b(presen)n(t)h(three)f(random)g (algorithms)g(for)g(the)h(WFVS)30 3006 y(problem)30 b(and)h(their)g (analysis.)45 b(In)31 b(Section)g(4)f(w)n(e)g(compare)30 3098 y(exp)r(erimen)n(tally)c(WRA)i(and)f(MGA)g(wrt)g(p)r(erformance)f (and)30 3191 y(run)h(time.)30 3418 y Fr(2)112 b(Bac)m(kground:)51 b(The)37 b(lo)s(op)g(cutset)198 3526 y(problem)30 3720 y Ft(P)n(earl's)17 b(metho)r(d)i(of)g(conditioning)f(is)h(one)f(of)h (the)g(b)r(est)g(kno)n(wn)30 3812 y(inference)49 b(metho)r(ds)h(for)f (Ba)n(y)n(esian)e(net)n(w)n(orks.)101 b(It)49 b(is)g(a)30 3905 y(metho)r(d)43 b(of)f(c)n(hoice)g(in)h(some)e(genetic)i(link)-5 b(age)41 b(programs)30 3998 y([Ot91)o(,)e(BGS98)o(].)70 b(A)38 b(short)g(o)n(v)n(erview)f(of)h(the)h(metho)r(d)g(of)30 4090 y(conditioning,)31 b(and)g(de\014nitions)g(related)f(to)g(Ba)n(y)n (esian)f(net-)30 4183 y(w)n(orks,)36 b(are)e(giv)n(en)g(b)r(elo)n(w.)60 b(See)35 b([P)n(e88)o(])g(for)g(more)f(details.)30 4276 y(W)-7 b(e)28 b(then)g(de\014ne)g(the)g(lo)r(op)f(cutset)h(problem.)30 4418 y(Let)h Fq(P)12 b Ft(\()p Fq(u)325 4430 y Fo(1)362 4418 y Fq(;)i(:)g(:)g(:)g(;)g(u)595 4430 y Fp(n)640 4418 y Ft(\))29 b(b)r(e)h(a)f(probabilit)n(y)f(distribution)i(where)30 4511 y(eac)n(h)19 b Fq(u)257 4523 y Fp(i)304 4511 y Ft(dra)n(ws)g(v)-5 b(alues)19 b(from)g(a)h(\014nite)g(set)g(called)f(the)i Fk(domain)30 4603 y Ft(of)41 b Fq(u)186 4615 y Fp(i)213 4603 y Ft(.)76 b(A)41 b(directed)g(graph)f Fq(D)i Ft(with)g(no)e (directed)h(cycles)30 4696 y(is)f(called)g(a)g Fk(Bayesian)j(network)f (of)g Fq(P)52 b Ft(if)41 b(there)f(is)g(a)f(1{1)30 4789 y(mapping)24 b(b)r(et)n(w)n(een)g Fs(f)p Fq(u)775 4801 y Fo(1)811 4789 y Fq(;)14 b(:)g(:)g(:)f(;)h(u)1043 4801 y Fp(n)1088 4789 y Fs(g)24 b Ft(and)f(v)n(ertices)g(in)i Fq(D)r Ft(,)f(suc)n(h)30 4881 y(that)c Fq(u)250 4893 y Fp(i)296 4881 y Ft(is)f(asso)r(ciated)f(with)i(v)n(ertex)f Fq(i)g Ft(and)g Fq(P)31 b Ft(can)19 b(b)r(e)h(written)30 4974 y(as)27 b(follo)n(ws:)274 5188 y Fq(P)12 b Ft(\()p Fq(u)419 5200 y Fo(1)456 5188 y Fq(;)i(:)g(:)g(:)f(;)h(u)688 5200 y Fp(n)733 5188 y Ft(\))23 b(=)909 5085 y Fp(n)877 5110 y Fj(Y)876 5286 y Fp(i)p Fo(=1)997 5188 y Fq(P)12 b Ft(\()p Fq(u)1142 5200 y Fp(i)1193 5188 y Fs(j)23 b Fq(u)1287 5200 y Fp(i)1310 5208 y Fi(1)1346 5188 y Fq(;)14 b(:)g(:)g(:)g(;)g(u)1579 5200 y Fp(i)1602 5211 y Fn(j)r Fi(\()p Fn(i)p Fi(\))1704 5188 y Ft(\))138 b(\(1\))30 5430 y(where)24 b Fq(i)296 5442 y Fo(1)333 5430 y Fq(;)14 b(:)g(:)g(:)f(;)h(i)546 5445 y Fp(j)s Fo(\()p Fp(i)p Fo(\))681 5430 y Ft(are)23 b(the)i(source)e(v)n(ertices)g(of)i(the)g (incom-)30 5522 y(ing)i(edges)g(to)h(v)n(ertex)e Fq(i)i Ft(in)f Fq(D)r Ft(.)30 5665 y(Supp)r(ose)34 b(no)n(w)g(that)h(some)f(v) -5 b(ariables)33 b Fs(f)p Fq(v)1377 5677 y Fo(1)1414 5665 y Fq(;)14 b(:)g(:)g(:)g(;)g(v)1639 5677 y Fp(l)1664 5665 y Fs(g)34 b Ft(among)30 5757 y Fs(f)p Fq(u)120 5769 y Fo(1)156 5757 y Fq(;)14 b(:)g(:)g(:)g(;)g(u)389 5769 y Fp(n)433 5757 y Fs(g)36 b Ft(are)g(assigned)f(sp)r(eci\014c)h(v)-5 b(alues)36 b Fs(f)p Fh(v)1641 5769 y Fo(1)1678 5757 y Fq(;)14 b(:)g(:)g(:)g(;)g Fh(v)1913 5769 y Fp(l)1938 5757 y Fs(g)30 5850 y Ft(resp)r(ectiv)n(ely)-7 b(.)98 b(The)48 b Fk(up)l(dating)h(pr)l(oblem)h Ft(is)e(to)g(compute)2130 383 y(the)h(probabilit)n(y)e Fq(P)12 b Ft(\()p Fq(u)2884 395 y Fp(i)2969 383 y Fs(j)57 b Fq(v)3089 395 y Fo(1)3184 383 y Ft(=)h Fh(v)3357 395 y Fo(1)3394 383 y Fq(;)14 b(:)g(:)g(:)g(;)g(v)3619 395 y Fp(l)3702 383 y Ft(=)57 b Fh(v)3874 395 y Fp(l)3900 383 y Ft(\))49 b(for)2130 476 y Fq(i)23 b Ft(=)f(1)p Fq(;)14 b(:)g(:)g(:)f(;)h(n)p Ft(.)2130 618 y(A)26 b Fk(tr)l(ail)g Ft(in)f(a)g(Ba)n(y)n(esian)e(net)n (w)n(ork)h(is)h(a)g(subgraph)f(whose)h(un-)2130 711 y(derlying)h(graph) g(is)g(a)h(simple)f(path.)37 b(A)27 b(v)n(ertex)f Fq(b)g Ft(is)h(called)f(a)2130 803 y Fk(sink)i Ft(with)f(resp)r(ect)g(to)g(a)g (trail)g Fq(t)g Ft(if)h(there)f(exist)g(t)n(w)n(o)f(consec-)2130 896 y(utiv)n(e)31 b(edges)f Fq(a)f Fs(!)g Fq(b)i Ft(and)g Fq(b)d Fs( )h Fq(c)i Ft(on)g Fq(t)p Ft(.)47 b(A)31 b(trail)g Fq(t)g Ft(is)g Fk(active)2130 989 y(by)f(a)h(set)e(of)i(vertic)l(es)f Fq(Z)k Ft(if)28 b(\(1\))g(ev)n(ery)f(sink)g(with)i(resp)r(ect)e(to)2130 1081 y Fq(t)e Ft(either)g(is)g(in)g Fq(Z)31 b Ft(or)24 b(has)g(a)h(descendan)n(t)f(in)i Fq(Z)k Ft(and)25 b(\(2\))g(ev)n(ery) 2130 1174 y(other)i(v)n(ertex)f(along)h Fq(t)g Ft(is)g(outside)h Fq(Z)6 b Ft(.)36 b(Otherwise,)27 b(the)h(trail)2130 1267 y(is)f(said)h(to)f(b)r(e)h Fk(blo)l(cke)l(d)j(\(d-sep)l(ar)l(ate)l(d\)) e Ft(b)n(y)e Fq(Z)6 b Ft(.)2130 1409 y(V)-7 b(erma)58 b(and)g(P)n(earl)e([VP88)o(])j(ha)n(v)n(e)e(pro)n(v)n(ed)g(that)h(if)h Fq(D)2130 1502 y Ft(is)66 b(a)g(Ba)n(y)n(esian)e(net)n(w)n(ork)h(of)h Fq(P)12 b Ft(\()p Fq(u)3379 1514 y Fo(1)3416 1502 y Fq(;)i(:)g(:)g(:)g (;)g(u)3649 1514 y Fp(n)3694 1502 y Ft(\))66 b(and)g(all)2130 1594 y(trails)51 b(b)r(et)n(w)n(een)i(a)e(v)n(ertex)h(in)g Fs(f)p Fq(r)3283 1606 y Fo(1)3320 1594 y Fq(;)14 b(:)g(:)g(:)g(;)g(r) 3542 1606 y Fp(l)3568 1594 y Fs(g)52 b Ft(and)g(a)f(v)n(er-)2130 1687 y(tex)37 b(in)g Fs(f)p Fq(s)2467 1699 y Fo(1)2504 1687 y Fq(;)14 b(:)g(:)g(:)f(;)h(s)2727 1699 y Fp(k)2768 1687 y Fs(g)37 b Ft(are)f(blo)r(c)n(k)n(ed)g(b)n(y)g Fs(f)p Fq(t)3500 1699 y Fo(1)3537 1687 y Fq(;)14 b(:)g(:)g(:)g(;)g(t) 3752 1699 y Fp(m)3815 1687 y Fs(g)p Ft(,)39 b(then)2130 1780 y(the)65 b(corresp)r(onding)d(sets)i(of)g(v)-5 b(ariables)63 b Fs(f)p Fq(u)3681 1792 y Fp(r)3712 1800 y Fi(1)3747 1780 y Fq(;)14 b(:)g(:)g(:)g(;)g(u)3980 1792 y Fp(r)4011 1801 y Fn(l)4038 1780 y Fs(g)2130 1872 y Ft(and)50 b Fs(f)p Fq(u)2404 1884 y Fp(s)2435 1892 y Fi(1)2471 1872 y Fq(;)14 b(:)g(:)g(:)g(;)g(u)2704 1884 y Fp(s)2735 1893 y Fn(k)2775 1872 y Fs(g)50 b Ft(are)g(indep)r(enden)n(t)h(conditioned)f (on)2130 1965 y Fs(f)p Fq(u)2220 1977 y Fp(t)2245 1985 y Fi(1)2281 1965 y Fq(;)14 b(:)g(:)g(:)f(;)h(u)2513 1977 y Fp(t)2538 1985 y Fn(m)2597 1965 y Fs(g)p Ft(.)36 b(F)-7 b(urthermore,)25 b(Geiger)g(and)h(P)n(earl)f(pro)n(v)n(ed)2130 2058 y(a)34 b(con)n(v)n(erse)f(to)i(this)g(theorem)f([GP90)o(].)58 b(Both)35 b(results)f(are)2130 2150 y(presen)n(ted)27 b(and)g(extended)h(in)g([GVP90)o(].)2130 2293 y(Using)21 b(the)h(close)e(relationship)g(b)r(et)n(w)n(een)h(blo)r(c)n(k)n(ed)g (trails)f(and)2130 2385 y(conditional)32 b(indep)r(endence,)j(Kim)e (and)g(P)n(earl)e([KP83)n(])i(de-)2130 2478 y(v)n(elop)r(ed)41 b(an)g(algorithm)g Fv(upd)n(a)-6 b(te-tree)44 b Ft(that)e(solv)n(es)e (the)2130 2571 y(up)r(dating)31 b(problem)f(on)g(Ba)n(y)n(esian)e(net)n (w)n(orks)h(in)h(whic)n(h)h(ev-)2130 2663 y(ery)f(t)n(w)n(o)g(v)n (ertices)f(are)h(connected)g(with)h(at)g(most)f(one)h(trail)2130 2756 y(\(singly-connected\).)81 b(P)n(earl)41 b(then)i(solv)n(ed)f(the) h(up)r(dating)2130 2849 y(problem)38 b(on)f(an)n(y)h(Ba)n(y)n(esian)e (net)n(w)n(ork)g(as)i(follo)n(ws)f([P)n(e86)n(].)2130 2941 y(First,)28 b(a)f(set)h(of)f(v)n(ertices)g Fq(S)32 b Ft(is)c(selected)g(suc)n(h)f(that)h(an)n(y)f(t)n(w)n(o)2130 3034 y(v)n(ertices)i(in)h(the)h(net)n(w)n(ork)e(are)g(connected)h(b)n (y)g(at)g(most)f(one)2130 3127 y Fk(active)39 b Ft(trail)e(in)h Fq(S)29 b Fs([)d Fq(Z)6 b Ft(,)40 b(where)d Fq(Z)43 b Ft(is)37 b(an)n(y)g(subset)h(of)f(v)n(er-)2130 3219 y(tices.)69 b(Then,)42 b Fv(upd)n(a)-6 b(te-tree)40 b Ft(is)f(applied)f(once)g(for) g(eac)n(h)2130 3312 y(com)n(bination)24 b(of)h(v)-5 b(alue)24 b(assignmen)n(ts)g(to)h(the)g(v)-5 b(ariables)23 b(cor-)2130 3405 y(resp)r(onding)e(to)g Fq(S)5 b Ft(,)23 b(and,)f(\014nally)-7 b(,)23 b(the)f(results)f(are)f(com)n(bined.)2130 3497 y(This)39 b(algorithm)f(is)h(called)g(the)g(metho)r(d)h(of)f Fk(c)l(onditioning)2130 3590 y Ft(and)34 b(its)g(complexit)n(y)f(gro)n (ws)f(exp)r(onen)n(tially)h(with)h(the)g(size)2130 3683 y(of)23 b Fq(S)5 b Ft(.)35 b(The)24 b(set)f Fq(S)28 b Ft(is)23 b(called)g(a)g Fk(lo)l(op)k(cutset)p Ft(.)35 b(Note)23 b(that)h(when)2130 3775 y(the)29 b(domain)f(size)g(of)h(the)g (v)-5 b(ariables)27 b(v)-5 b(aries,)28 b(then)h Fv(upd)n(a)-6 b(te-)2130 3868 y(tree)26 b Ft(is)f(called)g(a)g(n)n(um)n(b)r(er)g(of)g (times)h(equal)e(to)h(the)h(pro)r(duct)2130 3961 y(of)f(the)g(domain)f (sizes)h(of)f(the)h(v)-5 b(ariables)24 b(whose)g(corresp)r(ond-)2130 4053 y(ing)31 b(v)n(ertices)e(participate)h(in)h(the)g(lo)r(op)g (cutset.)46 b(If)31 b(w)n(e)g(tak)n(e)2130 4146 y(the)k(logarithm)f(of) h(the)g(domain)f(size)h(\(n)n(um)n(b)r(er)f(of)h(v)-5 b(alues\))2130 4239 y(as)34 b(the)g(w)n(eigh)n(t)g(of)g(a)g(v)n(ertex,) h(then)g(\014nding)g(a)f(lo)r(op)g(cutset)2130 4331 y(suc)n(h)d(that)g (the)g(sum)g(of)g(its)h(v)n(ertices)d(w)n(eigh)n(ts)i(is)f(minim)n(um) 2130 4424 y(optimizes)20 b(P)n(earl's)f(up)r(dating)h(algorithm)g(in)g (the)h(case)f(where)2130 4516 y(the)28 b(domain)f(sizes)g(ma)n(y)g(v)-5 b(ary)e(.)2130 4659 y(W)g(e)24 b(no)n(w)g(giv)n(e)f(an)h(alternativ)n (e)f(de\014nition)h(for)f(a)h(lo)r(op)g(cutset)2130 4752 y Fq(S)33 b Ft(and)28 b(then)g(pro)n(vide)f(a)h(probabilistic)f (algorithm)g(for)h(\014nd-)2130 4844 y(ing)38 b(it.)69 b(This)39 b(de\014nition)f(is)g(b)r(orro)n(w)n(ed)f(from)g([BGNR94].) 2130 4937 y(The)30 b(underlying)f(graph)g Fq(G)h Ft(of)g(a)f(directed)h (graph)f Fq(D)j Ft(is)e(the)2130 5030 y(undirected)d(graph)f(formed)h (b)n(y)g(ignoring)f(the)i(directions)e(of)2130 5122 y(the)38 b(edges)g(in)g Fq(D)r Ft(.)69 b(A)38 b Fk(cycle)46 b Ft(in)38 b Fq(G)h Ft(is)f(a)f(path)h(whose)g(t)n(w)n(o)2130 5215 y(terminal)29 b(v)n(ertices)g(coincide.)43 b(A)30 b Fk(lo)l(op)h Ft(in)f Fq(D)i Ft(is)e(a)f(subgraph)2130 5308 y(of)35 b Fq(D)i Ft(whose)d(underlying)h(graph)e(is)i(a)g(cycle.) 59 b(A)35 b(v)n(ertex)f Fq(v)2130 5400 y Ft(is)28 b(a)g Fk(sink)g Ft(with)h(resp)r(ect)f(to)g(a)f(lo)r(op)h(\000)g(if)h(the)f (t)n(w)n(o)f(edges)h(ad-)2130 5493 y(jacen)n(t)i(to)f Fq(v)34 b Ft(in)c(\000)f(are)g(directed)h(in)n(to)g Fq(v)s Ft(.)43 b(Ev)n(ery)29 b(lo)r(op)g(m)n(ust)2130 5585 y(con)n(tain)g(at)g (least)f(one)h(v)n(ertex)f(that)i(is)f(not)g(a)g(sink)g(with)h(re-)2130 5678 y(sp)r(ect)25 b(to)f(that)g(lo)r(op.)36 b(Eac)n(h)23 b(v)n(ertex)g(that)i(is)f(not)g(a)g(sink)h(with)2130 5771 y(resp)r(ect)h(to)f(a)h(lo)r(op)g(\000)f(is)h(called)g(an)f Fk(al)t(lowe)l(d)31 b(vertex)d(with)g(r)l(e-)p eop %%Page: 3 3 3 2 bop 30 383 a Fk(sp)l(e)l(ct)36 b(to)g Ft(\000.)57 b(A)35 b Fk(lo)l(op)i(cutset)d Ft(of)g(a)g(directed)g(graph)g Fq(D)i Ft(is)e(a)30 476 y(set)e(of)g(v)n(ertices)e(that)j(con)n(tains)d (at)i(least)g(one)f(allo)n(w)n(ed)f(v)n(er-)30 568 y(tex)j(with)g(resp) r(ect)g(to)g(eac)n(h)f(lo)r(op)g(in)h Fq(D)r Ft(.)53 b(The)33 b(w)n(eigh)n(t)f(of)g(a)30 661 y(set)g(of)f(v)n(ertices)f Fq(X)38 b Ft(is)32 b(denoted)f(b)n(y)g Fq(w)r Ft(\()p Fq(X)7 b Ft(\))32 b(and)g(is)f(equal)g(to)30 691 y Fj(P)118 779 y Fp(v)r Fu(2)p Fp(X)275 754 y Fq(w)r Ft(\()p Fq(v)s Ft(\))j(where)e Fq(w)r Ft(\()p Fq(x)p Ft(\))h(=)e(log\()p Fs(j)p Fq(x)p Fs(j)p Ft(\))j(and)f Fs(j)p Fq(x)p Fs(j)g Ft(is)f(the)h(size)30 846 y(of)e(the)h(domain)f(asso)r(ciated)f(with)i (v)n(ertex)f Fq(x)p Ft(.)48 b(A)32 b Fk(minimum)30 939 y(lo)l(op)37 b(cutset)d Ft(of)h(a)f(w)n(eigh)n(ted)f(directed)i(graph)e Fq(D)k Ft(is)d(a)g(lo)r(op)30 1032 y(cutset)e Fq(F)344 1001 y Fu(\003)414 1032 y Ft(of)f Fq(D)j Ft(for)d(whic)n(h)g Fq(w)r Ft(\()p Fq(F)1145 1001 y Fu(\003)1184 1032 y Ft(\))h(is)f(minim) n(um)i(o)n(v)n(er)c(all)30 1124 y(lo)r(op)23 b(cutsets)h(of)f Fq(G)p Ft(.)36 b(The)24 b Fk(L)l(o)l(op)j(Cutset)e(Pr)l(oblem)31 b Ft(is)24 b(de\014ned)30 1217 y(as)j(\014nding)i(a)f(minim)n(um)g(lo)r (op)g(cutset)h(of)f(a)f(giv)n(en)h(w)n(eigh)n(ted)30 1310 y(directed)f(graph)g Fq(D)r Ft(.)30 1452 y(The)k(approac)n(h)e(w)n (e)h(tak)n(e)g(is)h(to)f(reduce)g(the)h(w)n(eigh)n(ted)f(lo)r(op)30 1545 y(cutset)42 b(problem)f(to)h(the)g(w)n(eigh)n(ted)f(feedbac)n(k)g (v)n(ertex)g(set)30 1637 y(problem,)c(as)e(done)g(b)n(y)g([BGNR94].)60 b(W)-7 b(e)36 b(no)n(w)f(de\014ne)h(the)30 1730 y(w)n(eigh)n(ted)23 b(feedbac)n(k)g(v)n(ertex)g(set)h(problem)g(and)f(then)i(the)f(re-)30 1823 y(duction.)30 1965 y(Let)49 b Fq(G)59 b Ft(=)f(\()p Fq(V)5 b(;)14 b(E)5 b Ft(\))50 b(b)r(e)f(an)g(undirected)g(graph,)k (and)c(let)30 2066 y Fq(w)c Ft(:)e Fq(V)62 b Fs(!)43 b Ft(I)-14 b(R)513 2030 y Fo(+)608 2066 y Ft(b)r(e)39 b(a)g(w)n(eigh)n(t)g(function)h(on)f(the)h(v)n(ertices)30 2159 y(of)c Fq(G)p Ft(.)62 b(A)36 b Fk(fe)l(e)l(db)l(ack)j(vertex)d (set)44 b Ft(of)36 b Fq(G)g Ft(is)f(a)h(subset)g(of)f(v)n(er-)30 2252 y(tices)28 b Fq(F)36 b Fs(\022)23 b Fq(V)47 b Ft(suc)n(h)27 b(that)i(eac)n(h)e(cycle)g(in)i Fq(G)f Ft(passes)f(through)30 2344 y(at)33 b(least)f(one)h(v)n(ertex)f(in)h Fq(F)12 b Ft(.)53 b(In)34 b(other)e(w)n(ords,)h(a)g(feedbac)n(k)30 2437 y(v)n(ertex)c(set)h Fq(F)42 b Ft(is)30 b(a)g(set)g(of)g(v)n (ertices)f(of)h Fq(G)g Ft(suc)n(h)g(that)g(b)n(y)g(re-)30 2530 y(mo)n(ving)35 b Fq(F)48 b Ft(from)35 b Fq(G)p Ft(,)j(along)d (with)h(all)g(the)g(edges)f(inciden)n(t)30 2622 y(with)f Fq(F)12 b Ft(,)35 b(w)n(e)e(obtain)g(a)g(set)g(of)g(trees)g(\(i.e.,)i (a)e(forest\).)54 b(The)30 2715 y(w)n(eigh)n(t)26 b(of)i(a)e(set)h(of)h (v)n(ertices)e Fq(X)33 b Ft(is)27 b(denoted)g(\(as)g(b)r(efore\))g(b)n (y)30 2808 y Fq(w)r Ft(\()p Fq(X)7 b Ft(\))33 b(and)g(is)f(equal)h(to) 850 2745 y Fj(P)938 2832 y Fp(v)r Fu(2)p Fp(X)1095 2808 y Fq(w)r Ft(\()p Fq(v)s Ft(\).)53 b(A)33 b Fk(minimum)i(fe)l(e)l(d-)30 2900 y(b)l(ack)h(vertex)g(set)d Ft(of)h(a)g(w)n(eigh)n(ted)f(graph)g Fq(G)i Ft(with)f(a)g(w)n(eigh)n(t)30 2993 y(function)29 b Fq(w)i Ft(is)d(a)g(feedbac)n(k)g(v)n(ertex)f(set)h Fq(F)1387 2963 y Fu(\003)1454 2993 y Ft(of)g Fq(G)g Ft(for)g(whic)n(h) 30 3085 y Fq(w)r Ft(\()p Fq(F)188 3055 y Fu(\003)227 3085 y Ft(\))h(is)g(minim)n(um)g(o)n(v)n(er)e(all)h(feedbac)n(k)g(v)n (ertex)g(sets)g(of)h Fq(G)p Ft(.)30 3178 y(The)34 b Fk(Weighte)l(d)j(F) -6 b(e)l(e)l(db)l(ack)36 b(V)-6 b(ertex)34 b(Set)h(\(WFVS\))g(Pr)l (oblem)30 3271 y Ft(is)25 b(de\014ned)g(as)f(\014nding)h(a)f(minim)n (um)h(feedbac)n(k)g(v)n(ertex)e(set)i(of)30 3363 y(a)g(giv)n(en)g(w)n (eigh)n(ted)f(graph)h Fq(G)g Ft(ha)n(ving)g(a)g(w)n(eigh)n(t)f (function)i Fq(w)r Ft(.)30 3506 y(The)e(reduction)g(is)g(as)f(follo)n (ws.)35 b(Giv)n(en)23 b(a)h(w)n(eigh)n(ted)f(directed)30 3599 y(graph)h(\()p Fq(D)r(;)14 b(w)r Ft(\))26 b(\(e.g.,)f(a)g(Ba)n(y)n (esian)e(net)n(w)n(ork\),)h(w)n(e)h(de\014ne)g(the)30 3691 y Fk(splitting)37 b Ft(w)n(eigh)n(ted)28 b(undirected)h(graph)f Fq(D)1420 3703 y Fp(s)1484 3691 y Ft(with)h(a)g(w)n(eigh)n(t)30 3784 y(function)j Fq(w)418 3796 y Fp(s)486 3784 y Ft(as)g(follo)n(ws.) 48 b(Split)33 b(eac)n(h)e(v)n(ertex)g Fq(v)k Ft(in)d Fq(D)i Ft(in)n(to)30 3877 y(t)n(w)n(o)28 b(v)n(ertices)f Fq(v)529 3889 y Fg(in)613 3877 y Ft(and)i Fq(v)816 3889 y Fg(out)937 3877 y Ft(in)g Fq(D)1104 3889 y Fp(s)1167 3877 y Ft(suc)n(h)g(that)f(all)h(incoming)30 3969 y(edges)22 b(to)g Fq(v)j Ft(in)e Fq(D)i Ft(b)r(ecome)d(undirected)g(inciden)n(t)h (edges)f(with)30 4062 y Fq(v)70 4074 y Fg(in)153 4062 y Ft(in)29 b Fq(D)320 4074 y Fp(s)355 4062 y Ft(,)f(and)f(all)h (outgoing)f(edges)g(from)g Fq(v)k Ft(in)d Fq(D)i Ft(b)r(ecome)30 4154 y(undirected)23 b(inciden)n(t)g(edges)f(with)h Fq(v)1188 4166 y Fg(out)1304 4154 y Ft(in)g Fq(D)1465 4166 y Fp(s)1500 4154 y Ft(.)35 b(In)23 b(addition,)30 4247 y(connect)f Fq(v)369 4259 y Fg(in)446 4247 y Ft(and)g Fq(v)642 4259 y Fg(out)757 4247 y Ft(in)g Fq(D)917 4259 y Fp(s)974 4247 y Ft(b)n(y)g(an)g(undirected)g(edge.)35 b(No)n(w)30 4340 y(set)h Fq(w)227 4352 y Fp(s)263 4340 y Ft(\()p Fq(v)335 4352 y Fg(in)391 4340 y Ft(\))i(=)f Fs(1)f Ft(and)g Fq(w)911 4352 y Fp(s)947 4340 y Ft(\()p Fq(v)1019 4352 y Fg(out)1112 4340 y Ft(\))i(=)f Fq(w)r Ft(\()p Fq(v)s Ft(\).)64 b(F)-7 b(or)36 b(a)g(set)g(of)30 4432 y(v)n(ertices)18 b Fq(X)25 b Ft(in)19 b Fq(D)573 4444 y Fp(s)608 4432 y Ft(,)i(w)n(e)d(de\014ne)h Fq( )s Ft(\()p Fq(X)7 b Ft(\))19 b(as)f(the)h(set)g(obtained)f(b)n(y)30 4525 y(replacing)k(eac)n(h)g(v)n (ertex)g Fq(v)850 4537 y Fg(in)929 4525 y Ft(or)g Fq(v)1066 4537 y Fg(out)1182 4525 y Ft(in)h Fq(X)30 b Ft(b)n(y)22 b(the)i(resp)r(ectiv)n(e)30 4618 y(v)n(ertex)j Fq(v)k Ft(in)c Fq(D)j Ft(from)d(whic)n(h)h(these)f(v)n(ertices)g(originated.) 30 4760 y(Our)g(algorithm)f(can)i(no)n(w)f(b)r(e)h(easily)e(stated.)30 4938 y Fh(Algorithm)k(RLC)30 5201 y(Input:)79 b Fk(A)30 b(Bayesian)h(network)f Fq(D)30 5294 y Fh(Output:)79 b Fk(A)29 b(lo)l(op)i(cutset)e(of)i Fq(D)168 5387 y Ft(1.)37 b(Construct)27 b(the)h(splitting)g(graph)e Fq(D)1433 5399 y Fp(s)346 5479 y Ft(with)i(w)n(eigh)n(t)f(function)h Fq(w)1182 5491 y Fp(s)1218 5479 y Ft(;)168 5572 y(2.)37 b(Apply)28 b(WRA)g(on)g(\()p Fq(D)972 5584 y Fp(s)1007 5572 y Fq(;)14 b(w)1103 5584 y Fp(s)1139 5572 y Ft(\))28 b(to)f(obtain)346 5665 y(a)g(feedbac)n(k)g(v)n(ertex)g(set)g Fq(F)12 b Ft(;)168 5757 y(3.)37 b(Output)28 b Fq( )s Ft(\()p Fq(F)12 b Ft(\).)2130 383 y(It)35 b(is)g(immediately)h(seen)e (that)i(if)f Fv(WRA)g Ft(outputs)g(a)g(feed-)2130 476 y(bac)n(k)40 b(v)n(ertex)g(set)h Fq(F)53 b Ft(of)41 b Fq(D)3028 488 y Fp(s)3105 476 y Ft(whose)f(w)n(eigh)n(t)g(is)h(minim)n (um)2130 568 y(with)27 b(high)f(probabilit)n(y)-7 b(,)26 b(then)g Fq( )s Ft(\()p Fq(F)12 b Ft(\))27 b(is)f(a)g(lo)r(op)g(cutset) h(of)f Fq(D)2130 661 y Ft(with)e(minim)n(um)g(w)n(eigh)n(t)f(with)h (the)g(same)g(probabilit)n(y)-7 b(.)34 b(This)2130 754 y(observ)-5 b(ation)29 b(holds)h(b)r(ecause)g(there)g(is)g(an)g(ob)n (vious)f(one-to-)2130 846 y(one)f(and)g(on)n(to)f(corresp)r(ondence)g (b)r(et)n(w)n(een)h(lo)r(ops)f(in)i Fq(D)h Ft(and)2130 939 y(cycles)23 b(in)i Fq(D)2527 951 y Fp(s)2586 939 y Ft(and)f(b)r(ecause)f(WRA)i(nev)n(er)e(c)n(ho)r(oses)g(a)g(v)n(ertex) 2130 1032 y(that)28 b(has)f(an)g(in\014nite)i(w)n(eigh)n(t.)2130 1267 y Fr(3)112 b(Algorithms)35 b(for)i(the)g(WFVS)h(problem)2130 1467 y Ft(Recall)19 b(that)h(a)f(feedbac)n(k)g(v)n(ertex)f(set)i(of)f Fq(G)h Ft(is)f(a)g(subset)h(of)f(v)n(er-)2130 1559 y(tices)28 b Fq(F)36 b Fs(\022)23 b Fq(V)47 b Ft(suc)n(h)27 b(that)i(eac)n(h)e (cycle)g(in)i Fq(G)f Ft(passes)f(through)2130 1652 y(at)37 b(least)f(one)g(v)n(ertex)g(in)h Fq(F)12 b Ft(.)64 b(In)37 b(Section)g(3.1)f(w)n(e)g(address)2130 1745 y(the)c(problem)f(of)h (\014nding)g(a)f(FVS)h(with)h(a)e(minim)n(um)h(n)n(um-)2130 1837 y(b)r(er)c(of)h(v)n(ertices)e(and)h(in)h(Sections)f(3.2)g(and)g (3.3)f(w)n(e)h(address)2130 1930 y(the)c(problem)f(of)h(\014nding)g(a)f (FVS)i(with)f(a)f(minim)n(um)i(w)n(eigh)n(t.)2130 2023 y(Throughout,)g(w)n(e)g(allo)n(w)f Fq(G)h Ft(to)h(ha)n(v)n(e)e (parallel)g(edges.)35 b(If)26 b(t)n(w)n(o)2130 2115 y(v)n(ertices)40 b Fq(u)g Ft(and)h Fq(v)j Ft(ha)n(v)n(e)39 b(parallel)h(edges)g(b)r(et)n (w)n(een)g(them,)2130 2208 y(then)28 b(ev)n(ery)e(FVS)j(of)e Fq(G)h Ft(includes)g(either)f Fq(u)p Ft(,)h Fq(v)s Ft(,)g(or)e(b)r (oth.)2130 2421 y Fh(3.1)94 b(The)33 b(basic)e(algorithms)2130 2594 y Ft(In)d(this)g(section)f(w)n(e)h(presen)n(t)f(a)g(random)g (algorithm)f(for)i(the)2130 2687 y(FVS)d(problem.)36 b(First)24 b(w)n(e)g(in)n(tro)r(duce)h(some)f(additional)g(ter-)2130 2780 y(minology)33 b(and)g(notation.)55 b(Let)34 b Fq(G)g Ft(=)f(\()p Fq(V)5 b(;)14 b(E)5 b Ft(\))34 b(b)r(e)g(an)g(undi-)2130 2872 y(rected)29 b(graph.)40 b(The)29 b(degree)f(of)h(a)g(v)n(ertex)f Fq(v)33 b Ft(in)c Fq(G)p Ft(,)h(denoted)2130 2965 y(b)n(y)36 b Fq(d)p Ft(\()p Fq(v)s Ft(\),)k(is)d(the)g(n)n(um)n(b)r(er)f(of)h(v)n (ertices)e(adjacen)n(t)h(to)h Fq(v)s Ft(.)64 b(A)2130 3058 y Fk(self-lo)l(op)40 b Ft(is)d(an)h(edge)f(with)i(t)n(w)n(o)e (endp)r(oin)n(ts)h(at)f(the)i(same)2130 3150 y(v)n(ertex.)44 b(A)31 b Fk(le)l(af)g Ft(is)f(a)g(v)n(ertex)f(with)i(degree)e(less)h (or)g(equal)f(1,)2130 3243 y(a)24 b Fk(linkp)l(oint)i Ft(is)e(a)h(v)n(ertex)e(with)i(degree)f(2)g(and)h(a)f Fk(br)l(anchp)l(oint)2130 3336 y Ft(is)39 b(a)f(v)n(ertex)f(with)j (degree)d(strictly)i(higher)f(than)g(2.)70 b(The)2130 3428 y(cardinalit)n(y)26 b(of)i(a)f(set)h Fq(X)34 b Ft(is)27 b(denoted)h(b)n(y)f Fs(j)p Fq(X)7 b Fs(j)p Ft(.)2130 3571 y(A)28 b(graph)f(is)g(called)h Fk(rich)h Ft(if)f(ev)n(ery)e(v)n (ertex)h(is)h(a)f(branc)n(hp)r(oin)n(t)2130 3663 y(and)i(it)g(has)g(no) f(self-lo)r(ops.)40 b(Giv)n(en)29 b(a)g(graph)e Fq(G)p Ft(,)j(b)n(y)f(rep)r(eat-)2130 3756 y(edly)20 b(remo)n(ving)f(all)h (lea)n(v)n(es,)h(and)f(b)n(ypassing)f(ev)n(ery)g(linkp)r(oin)n(t)2130 3849 y(with)k(an)g(edge,)g(a)f(graph)g Fq(G)2993 3819 y Fu(0)3040 3849 y Ft(is)g(obtained)h(suc)n(h)f(that)h(the)g(size)2130 3941 y(of)30 b(a)g(minim)n(um)h(FVS)g(in)g Fq(G)3031 3911 y Fu(0)3085 3941 y Ft(and)f(in)h Fq(G)f Ft(are)g(equal)f(and)i (ev-)2130 4034 y(ery)h(minim)n(um)i(FVS)g(of)f Fq(G)3014 4004 y Fu(0)3070 4034 y Ft(is)g(a)g(minim)n(um)h(WFVS)g(of)f Fq(G)p Ft(.)2130 4127 y(Since)k(ev)n(ery)e(v)n(ertex)g(in)n(v)n(olv)n (ed)h(in)g(a)g(self-lo)r(op)g(b)r(elongs)g(to)2130 4219 y(ev)n(ery)22 b(FVS,)j(w)n(e)e(can)h(transform)e Fq(G)3264 4189 y Fu(0)3312 4219 y Ft(to)h(a)h(ric)n(h)f(graph)f Fq(G)3931 4189 y Fp(r)3992 4219 y Ft(b)n(y)2130 4312 y(adding)h(the)h(v)n(ertices)e(in)n(v)n(olv)n(ed)g(in)i(self)g(lo)r (ops)e(to)i(the)g(output)2130 4405 y(of)k(the)g(algorithm.)2130 4547 y(Our)j(algorithm)f(is)i(based)f(on)g(the)h(observ)-5 b(ation)30 b(that)i(if)g(w)n(e)2130 4640 y(pic)n(k)h(an)g(edge)g(at)g (random)f(from)h(a)g(ric)n(h)f(graph)g(there)h(is)g(a)2130 4732 y(probabilit)n(y)e(of)g(at)h(least)f(1)p Fq(=)p Ft(2)g(that)h(at)f(least)g(one)h(endp)r(oin)n(t)2130 4825 y(of)k(the)g(edge)g(b)r(elongs)f(to)h(an)n(y)f(giv)n(en)g(FVS)i Fq(F)12 b Ft(.)62 b(A)36 b(precise)2130 4918 y(form)n(ulation)30 b(of)g(this)h(claim)f(is)h(giv)n(en)e(b)n(y)h(Lemma)h(1)f(whose)2130 5010 y(pro)r(of)d(app)r(ears)f(implicitly)j(in)f([V)-7 b(o68)o(,)27 b(Lemma)h(4].)2130 5199 y Fh(Lemma)i(1)41 b Fk(L)l(et)e Fq(G)i Ft(=)g(\()p Fq(V)5 b(;)14 b(E)5 b Ft(\))40 b Fk(b)l(e)g(a)g(rich)h(gr)l(aph,)i Fq(F)52 b Fk(b)l(e)40 b(a)2130 5291 y(fe)l(e)l(db)l(ack)j(vertex)e(set)g(of)h Fq(G)g Fk(and)g Fq(X)50 b Ft(=)44 b Fq(V)i Fs(n)26 b Fq(F)12 b Fk(.)74 b(L)l(et)41 b Fq(E)4017 5303 y Fp(X)2130 5384 y Fk(denote)36 b(the)h(set)e(of)i(e)l(dges)g(in)f Fq(E)41 b Fk(whose)c(endp)l(oints)g(ar)l(e)f(al)t(l)2130 5476 y(vertic)l(es)f(in)f Fq(X)41 b Fk(and)35 b Fq(E)2878 5488 y Fp(F)r(;X)3039 5476 y Fk(denote)g(the)f(set)g(of)h(e)l(dges)g (in)g Fq(G)2130 5569 y Fk(that)f(c)l(onne)l(ct)g(vertic)l(es)h(in)f Fq(F)47 b Fk(with)35 b(vertic)l(es)g(in)f Fq(X)7 b Fk(.)52 b(Then,)2130 5662 y Fs(j)p Fq(E)2214 5674 y Fp(X)2277 5662 y Fs(j)24 b(\024)e(j)p Fq(E)2495 5674 y Fp(F)r(;X)2622 5662 y Fs(j)p Fk(.)2130 5850 y Fh(Pro)s(of.)107 b Ft(The)33 b(graph)d(obtained)i(b)n(y)g(deleting)g(a)g(feedbac)n(k)p eop %%Page: 4 4 4 3 bop 30 383 a Ft(v)n(ertex)19 b(set)i Fq(F)32 b Ft(of)20 b(a)g(graph)f Fq(G)p Ft(\()p Fq(V)5 b(;)14 b(E)5 b Ft(\))22 b(is)e(a)g(forest)f(with)i(v)n(ertices)30 476 y Fq(X)29 b Ft(=)23 b Fq(V)35 b Fs(n)16 b Fq(F)c Ft(.)37 b(Hence,)27 b Fs(j)p Fq(E)835 488 y Fp(X)899 476 y Fs(j)c Fq(<)f Fs(j)p Fq(X)7 b Fs(j)p Ft(.)36 b(Ho)n(w)n(ev)n(er,)25 b(eac)n(h)h(v)n(ertex)30 568 y(in)i Fq(X)34 b Ft(is)27 b(a)g(branc)n(hp)r(oin)n(t)g(in)h Fq(G)p Ft(,)g(and)g(so,)293 765 y(3)14 b Fs(j)p Fq(X)7 b Fs(j)44 b(\024)636 686 y Fj(X)626 864 y Fp(v)r Fu(2)p Fp(X)779 765 y Fq(d)p Ft(\()p Fq(v)s Ft(\))j(=)f Fs(j)p Fq(E)1171 777 y Fp(F)r(;X)1298 765 y Fs(j)41 b Ft(+)h(2)14 b Fs(j)p Fq(E)1609 777 y Fp(X)1671 765 y Fs(j)p Fq(:)30 1033 y Ft(Th)n(us,)27 b Fs(j)p Fq(E)347 1045 y Fp(X)411 1033 y Fs(j)c(\024)g(j)p Fq(E)629 1045 y Fp(F)r(;X)756 1033 y Fs(j)p Ft(.)37 b Ff(2)30 1176 y Ft(Lemma)20 b(1)h(implies)f(that)h(when)g(pic)n(king)f (an)g(edge)h(at)f(random)30 1268 y(from)h(a)h(ric)n(h)f(graph,)h(it)g (is)g(at)f(least)h(as)f(lik)n(ely)g(to)h(pic)n(k)f(an)h(edge)30 1361 y(in)30 b Fq(E)190 1373 y Fp(F)r(;X)346 1361 y Ft(than)f(an)g (edge)g(in)h Fq(E)1009 1373 y Fp(X)1072 1361 y Ft(.)42 b(Consequen)n(tly)-7 b(,)30 b(selecting)30 1453 y(a)24 b(v)n(ertex)e(at)i(random)f(from)h(a)f(randomly)g(selected)h(edge)g (has)30 1546 y(a)30 b(probabilit)n(y)g(of)h(at)g(least)f(1)p Fq(=)p Ft(4)g(to)h(b)r(elong)f(to)h(a)f(minim)n(um)30 1639 y(FVS.)19 b(This)g(idea)f(yields)g(a)h(simple)f(algorithm)g(to)g (\014nd)h(a)f(FVS.)30 1853 y Fh(ALGORITHM)32 b(SingleGuess\(G,k\))30 2030 y(Input:)79 b Fk(A)n(n)29 b(undir)l(e)l(cte)l(d)h(gr)l(aph)h Fq(G)1191 2042 y Fo(0)468 2122 y Fk(and)g(an)e(inte)l(ger)h Fq(k)c(>)d Ft(0)p Fk(.)30 2215 y Fh(Output:)79 b Fk(A)29 b(fe)l(e)l(db)l(ack)j(vertex)d(set)g Fq(F)42 b Fk(of)31 b(size)f Fs(\024)23 b Fq(k)s Fk(,)468 2307 y(or)31 b("F)-6 b(ail")30 b(otherwise.)168 2400 y Fh(F)-8 b(or)60 b Fq(i)23 b Ft(=)f(1)p Fq(;)14 b(:)g(:)g(:)f(;)h(k)346 2493 y Ft(1.)36 b(Reduce)28 b Fq(G)804 2505 y Fp(i)p Fu(\000)p Fo(1)945 2493 y Ft(to)f(a)g(ric)n(h)g(graph)g Fq(G)1580 2505 y Fp(i)468 2585 y Ft(while)h(placing)f(self)h(lo)r(op)f(v)n(ertices)g(in) g Fq(F)12 b Ft(.)346 2678 y(2.)36 b Fh(If)28 b Fq(G)605 2690 y Fp(i)661 2678 y Ft(is)g(the)g(empt)n(y)f(graph)g Fh(Return)k Fq(F)346 2771 y Ft(3.)36 b(Pic)n(k)27 b(an)g(edge)g Fq(e)c Ft(=)g(\()p Fq(u;)14 b(v)s Ft(\))28 b(at)f(random)g(from)g Fq(E)1970 2783 y Fp(i)346 2863 y Ft(4.)36 b(Pic)n(k)27 b(a)g(v)n(ertex)g Fq(v)994 2875 y Fp(i)1049 2863 y Ft(at)h(random)f (from)g(\()p Fq(u;)14 b(v)s Ft(\))346 2956 y(5.)36 b Fq(F)f Fs( )23 b Fq(F)31 b Fs([)19 b(f)p Fq(v)881 2968 y Fp(i)908 2956 y Fs(g)346 3049 y Ft(6.)36 b Fq(V)42 b Fs( )23 b Fq(V)38 b Fs(n)18 b(f)p Fq(v)871 3061 y Fp(i)898 3049 y Fs(g)168 3141 y Fh(Return)28 b Ft("F)-7 b(ail")30 3411 y(Due)22 b(to)f(Lemma)f(1,)j(when)e Fv(SingleGuess)g Ft(terminates)g(with)30 3503 y(a)27 b(FVS)h(of)f(size)g Fq(k)s Ft(,)h(there)f(is)g(a)g(probabilit)n(y)f(of)h(at)h(least)f(1)p Fq(=)p Ft(4)1941 3473 y Fp(k)30 3596 y Ft(that)h(the)g(output)g(is)f(a) h(minim)n(um)g(FVS.)30 3739 y(Note)f(that)g(steps)g(1)g(and)g(2)f(in)i Fv(SingleGuess)e Ft(determine)h(a)30 3831 y(v)n(ertex)i Fq(v)34 b Ft(b)n(y)29 b(\014rst)h(selecting)g(an)g(arbitrary)e(edge)i (and)g(then)30 3924 y(selecting)22 b(an)g(arbitrary)f(endp)r(oin)n(t)i (of)f(this)h(edge.)35 b(An)23 b(equiv-)30 4017 y(alen)n(t)39 b(w)n(a)n(y)f(of)h(ac)n(hieving)g(the)g(same)g(selection)g(rule)g(is)g (to)30 4109 y(c)n(ho)r(ose)f(a)i(v)n(ertex)e(with)j(probabilit)n(y)d (prop)r(ortional)g(to)i(its)30 4202 y(degree:)494 4348 y Fq(p)p Ft(\()p Fq(v)s Ft(\))23 b(=)887 4292 y Fq(d)p Ft(\()p Fq(v)s Ft(\))p 764 4329 399 4 v 764 4343 a Fj(P)851 4430 y Fp(u)p Fu(2)p Fp(V)1007 4405 y Fq(d)p Ft(\()p Fq(u)p Ft(\))1195 4348 y(=)1324 4292 y Fq(d)p Ft(\()p Fq(v)s Ft(\))p 1293 4329 214 4 v 1293 4405 a(2)18 b Fs(\001)g(j)p Fq(E)5 b Fs(j)30 4554 y Ft(T)-7 b(o)25 b(see)g(the)g(equiv)-5 b(alence)25 b(of)g(these)h(t)n(w)n(o)e(selection)h(metho)r(ds,)30 4646 y(de\014ne)i(\000\()p Fq(v)s Ft(\))h(to)f(b)r(e)h(a)e(set)h(of)g (edges)g(whose)f(one)h(endp)r(oin)n(t)g(is)30 4739 y Fq(v)s Ft(,)h(and)f(note)h(that)g(for)f(graphs)f(without)i(self-lo)r (ops,)111 4967 y Fq(p)p Ft(\()p Fq(v)s Ft(\))23 b(=)413 4888 y Fj(X)371 5070 y Fp(e)p Fu(2)p Fo(\000\()p Fp(v)r Fo(\))589 4967 y Fq(p)p Ft(\()p Fq(v)s Fs(j)p Fq(e)p Ft(\))c Fs(\001)g Fq(p)p Ft(\()p Fq(e)p Ft(\))k(=)1126 4911 y(1)p 1126 4948 42 4 v 1126 5024 a(2)1234 4888 y Fj(X)1192 5070 y Fp(e)p Fu(2)p Fo(\000\()p Fp(v)r Fo(\))1410 4967 y Fq(p)p Ft(\()p Fq(e)p Ft(\))g(=)1707 4911 y Fq(d)p Ft(\()p Fq(v)s Ft(\))p 1676 4948 214 4 v 1676 5024 a(2)18 b Fs(\001)g(j)p Fq(E)5 b Fs(j)30 5244 y Ft(This)37 b(equiv)-5 b(alen)n(t)37 b(phrasing)e(of)i(the)h(selection)e(criterion)g(is)30 5337 y(easier)25 b(to)h(extend)h(to)f(the)h(w)n(eigh)n(ted)f(case)f (and)i(will)f(b)r(e)h(used)30 5430 y(in)h(the)g(follo)n(wing)e (sections.)30 5572 y(An)35 b(algorithm)e(for)h(\014nding)h(a)f(minim)n (um)h(FVS)g(with)g(high)30 5665 y(probabilit)n(y)-7 b(,)28 b(whic)n(h)h(w)n(e)f(call)g Fv(Repea)-6 b(tedGuess)p Ft(,)31 b(can)e(no)n(w)30 5757 y(b)r(e)39 b(describ)r(ed)f(as)g(follo)n (ws:)58 b(Start)38 b(with)h Fq(k)45 b Ft(=)c(1.)69 b(Rep)r(eat)30 5850 y Fv(SingleGuess)28 b Fq(c)18 b Fs(\001)h Ft(4)709 5820 y Fp(k)777 5850 y Ft(times)29 b(where)e Fq(c)d(>)f Ft(1)k(is)h(a)g(parameter)2130 383 y(de\014ned)i(b)n(y)f(the)h(user.)43 b(If)30 b(in)g(one)f(of)g(the)h(iterations)f(a)g(FVS)2130 476 y(of)e(size)g Fs(\024)c Fq(k)30 b Ft(is)d(found,)g(then)h(output)g (this)f(FVS,)h(otherwise,)2130 568 y(increase)e Fq(k)31 b Ft(b)n(y)c(one)g(and)h(con)n(tin)n(ue.)2130 711 y Fh(ALGORITHM)k(Rep) s(eatedGuess\(G,c\))2130 881 y(Input:)79 b Fk(A)n(n)29 b(undir)l(e)l(cte)l(d)h(gr)l(aph)h Fq(G)2568 974 y Fk(and)g(a)f(c)l (onstant)f Fq(c)23 b(>)f Ft(1)p Fk(.)2130 1067 y Fh(Output:)79 b Fk(A)29 b(fe)l(e)l(db)l(ack)j(vertex)d(set)g Fq(F)12 b Fk(.)2268 1159 y Fh(F)-8 b(or)28 b Fq(k)e Ft(=)d(1)p Fq(;)14 b(:)g(:)g(:)f(;)h Fs(j)p Fq(V)19 b Fs(j)2446 1258 y Fh(Rep)s(eat)27 b Fq(c)18 b Fs(\001)h Ft(4)2910 1228 y Fp(k)2978 1258 y Fh(times)2568 1350 y Ft(1.)37 b Fq(F)e Fs( )28 b Fv(SingleGuess\()p Fq(G;)14 b(k)s Fv(\))2568 1443 y Ft(2.)37 b Fh(If)28 b Fq(F)40 b Ft(is)27 b(not)h("F)-7 b(ail")26 b Fh(then)32 b(Return)g Fq(F)2446 1536 y Fh(End)27 b Fs(f)p Ft(Rep)r(eat)p Fs(g)2268 1628 y Fh(End)h Fs(f)p Ft(F)-7 b(or)p Fs(g)2130 1799 y Ft(The)29 b(main)h(claims)e(ab)r(out)i(these)f(algorithms)f(are)g(giv)n(en)g(b)n (y)2130 1892 y(the)g(follo)n(wing)f(theorem.)2130 2069 y Fh(Theorem)j(2)42 b Fk(L)l(et)d Fq(G)h Fk(b)l(e)g(an)g(undir)l(e)l (cte)l(d)g(gr)l(aph)h(and)g Fq(c)g Fs(\025)2130 2162 y Ft(1)d Fk(b)l(e)h(a)f(c)l(onstant.)64 b(Then,)42 b Fv(SingleGuess\()p Fq(G;)14 b(k)s Fv(\))39 b Fk(outputs)2130 2255 y(a)f(FVS)f(whose)i(exp)l(e)l(cte)l(d)f(size)g(is)g(no)g(mor)l(e)g (than)g Ft(4)p Fq(k)s Fk(,)h(and)2130 2347 y Fv(Repea)-6 b(tedGuess\()p Fq(G;)14 b(c)p Fv(\))35 b Fk(outputs,)e(after)g Fq(O)r Ft(\(4)3677 2317 y Fp(k)3718 2347 y Fq(k)s(n)p Ft(\))f Fk(steps,)2130 2460 y(a)22 b(minimum)f(FVS)h(with)g(pr)l(ob)l (ability)i(at)d(le)l(ast)h Ft(1)q Fs(\000)q Ft(\(1)q Fs(\000)3858 2428 y Fo(1)p 3840 2442 70 4 v 3840 2490 a(4)3873 2473 y Fn(k)3919 2460 y Ft(\))3951 2430 y Fp(c)p Fo(4)4014 2405 y Fn(k)4055 2460 y Fk(,)2130 2553 y(wher)l(e)37 b Fq(k)i Fk(is)d(the)g(size)h(of)g(a)f(minimum)g(FVS)g(and)g Fq(n)g Fk(is)h(the)2130 2646 y(numb)l(er)29 b(of)i(vertic)l(es.)2130 2823 y Ft(The)c(claims)f(ab)r(out)h(the)h(probabilit)n(y)e(of)g (success)g(and)h(n)n(um-)2130 2916 y(b)r(er)f(of)h(steps)f(follo)n(w)g (immediately)h(from)f(the)h(fact)g(that)g(the)2130 3009 y(probabilit)n(y)e(of)h(success)f(of)h(SingleGuess)f(is)h(at)g(least)f (\(1)p Fq(=)p Ft(4\))4040 2978 y Fp(k)2130 3101 y Ft(and)k(that,)i(in)f (case)e(of)i(success,)f Fq(O)r Ft(\(4)3319 3071 y Fp(k)3360 3101 y Ft(\))h(iterations)f(are)f(p)r(er-)2130 3194 y(formed)e(eac)n(h) g(taking)g Fq(O)r Ft(\()p Fq(k)s(n)p Ft(\))i(steps.)36 b(The)27 b(pro)r(of)f(ab)r(out)h(the)2130 3287 y(exp)r(ected)f(size)f (of)h(a)f(single)g(guess)g(is)g(presen)n(ted)g(in)h(the)g(next)2130 3379 y(section.)2130 3522 y(Theorem)43 b(2)g(sho)n(ws)f(that)i(eac)n(h) e(guess)h(pro)r(duces)f(a)h(FVS)2130 3614 y(whic)n(h,)37 b(on)e(the)g(a)n(v)n(erage,)f(is)h(not)g(to)r(o)g(far)g(from)f(the)i (mini-)2130 3707 y(m)n(um,)29 b(and)f(that)h(after)f(enough)g (iterations,)g(the)h(algorithm)2130 3800 y(con)n(v)n(erges)j(to)i(the)h (minim)n(um)h(with)f(high)f(probabilit)n(y)-7 b(.)57 b(In)2130 3892 y(the)47 b(w)n(eigh)n(ted)g(case,)j(discussed)d(next,)52 b(w)n(e)46 b(managed)g(to)2130 3985 y(ac)n(hiev)n(e)18 b(eac)n(h)h(of)h(these)f(t)n(w)n(o)g(guaran)n(tees)f(in)h(a)h(separate) e(algo-)2130 4078 y(rithm,)27 b(but)g(w)n(e)f(w)n(ere)g(unable)g(to)g (ac)n(hiev)n(e)f(b)r(oth)i(guaran)n(tees)2130 4170 y(in)h(a)f(single)g (algorithm.)2130 4375 y Fh(3.2)94 b(The)33 b(w)m(eigh)m(ted)e (algorithms)2130 4546 y Ft(W)-7 b(e)32 b(no)n(w)f(turn)h(to)g(the)g(w)n (eigh)n(ted)f(FVS)h(problem)g(\(WFVS\))2130 4639 y(of)j(size)f Fq(k)k Ft(whic)n(h)d(is)g(to)f(\014nd)i(a)e(feedbac)n(k)h(v)n(ertex)e (set)i Fq(F)47 b Ft(of)2130 4731 y(a)30 b(v)n(ertex-w)n(eigh)n(ted)e (graph)h(\()p Fq(G;)14 b(w)r Ft(\),)32 b Fq(w)f Ft(:)c Fq(V)46 b Fs(!)28 b Ft(I)-14 b(R)3744 4695 y Fo(+)3799 4731 y Ft(,)31 b(of)f(size)2130 4824 y(less)d(or)g(equal)g Fq(k)j Ft(suc)n(h)e(that)g Fq(w)r Ft(\()p Fq(F)12 b Ft(\))28 b(is)g(minimized.)2130 4966 y(Note)37 b(that)g(for)f(the)h(w)n(eigh)n (ted)f(FVS)i(problem)e(w)n(e)h(cannot)2130 5059 y(replace)c(eac)n(h)h (linkp)r(oin)n(t)h Fq(v)j Ft(with)d(an)f(edge,)i(since)e(if)h Fq(v)j Ft(has)2130 5152 y(w)n(eigh)n(t)c(ligh)n(ter)f(than)h(its)h (branc)n(hp)r(oin)n(t)e(neigh)n(b)r(ors)g(then)i Fq(v)2130 5244 y Ft(can)27 b(participate)g(in)h(a)f(minim)n(um)i(w)n(eigh)n(t)d (FVS)j(of)e(size)g Fq(k)s Ft(.)2130 5387 y(A)36 b(graph)e(is)h(called)g Fk(br)l(anchy)44 b Ft(if)36 b(it)g(has)f(no)g(endp)r(oin)n(ts,)i(no) 2130 5479 y(self)21 b(lo)r(ops,)h(and,)g(in)f(addition,)i(eac)n(h)d (linkp)r(oin)n(t)h(is)g(connected)2130 5572 y(only)k(to)g(branc)n(hp)r (oin)n(ts)g([BGNR94)o(].)36 b(Giv)n(en)26 b(a)f(graph)f Fq(G)p Ft(,)i(b)n(y)2130 5665 y(rep)r(eatedly)g(remo)n(ving)e(all)i (lea)n(v)n(es,)f(and)h(b)n(ypassing)f(with)h(an)2130 5757 y(edge)e(ev)n(ery)e(linkp)r(oin)n(t)j(that)f(has)f(a)h(neigh)n(b)r (or)f(with)h(equal)g(or)2130 5850 y(ligh)n(ter)35 b(w)n(eigh)n(t,)i(a)e (graph)g Fq(G)3081 5820 y Fu(0)3140 5850 y Ft(is)h(obtained)f(suc)n(h)h (that)g(the)p eop %%Page: 5 5 5 4 bop 30 383 a Ft(w)n(eigh)n(t)39 b(of)h(a)g(minim)n(um)g(w)n(eigh)n (t)g(FVS)g(\(of)g(size)g Fq(k)s Ft(\))g(in)g Fq(G)1956 353 y Fu(0)30 476 y Ft(and)30 b(in)h Fq(G)g Ft(are)f(equal)g(and)h(ev)n (ery)e(minim)n(um)i(WFVS)h(of)e Fq(G)1956 446 y Fu(0)30 568 y Ft(is)35 b(a)f(minim)n(um)i(WFVS)g(of)f Fq(G)p Ft(.)60 b(Since)35 b(ev)n(ery)f(v)n(ertex)g(with)30 661 y(a)39 b(self-lo)r(op)f(b)r(elongs)h(to)g(ev)n(ery)f(FVS,)i(w)n(e)e (can)h(transform)30 754 y Fq(G)95 724 y Fu(0)156 754 y Ft(to)f(a)g(branc)n(h)n(y)e(graph)h(without)h(self-lo)r(ops)f(b)n(y)h (adding)30 846 y(the)28 b(v)n(ertices)e(in)n(v)n(olv)n(ed)g(in)h(self)h (lo)r(ops)f(to)g(the)h(output)f(of)h(the)30 939 y(algorithm.)30 1081 y(T)-7 b(o)43 b(address)f(the)i(WFVS)h(problem)e(w)n(e)g(o\013er)g (t)n(w)n(o)g(sligh)n(t)30 1174 y(mo)r(di\014cations)54 b(to)g(the)h(algorithm)e Fv(SingleGuess)h Ft(pre-)30 1267 y(sen)n(ted)38 b(in)h(the)g(previous)e(section.)69 b(The)39 b(\014rst)f(algorithm,)30 1359 y(whic)n(h)g(w)n(e)g(call)g Fv(SingleW)n(GuessI)p Ft(,)f(is)h(iden)n(tical)g(to)g Fv(Sin-)30 1452 y(gleGuess)i Ft(except)f(that)h(in)f(eac)n(h)g (iteration)g(w)n(e)g(mak)n(e)f(a)30 1545 y(reduction)23 b(to)h(a)f(branc)n(h)n(y)g(graph)f(instead)i(of)g(a)f(reduction)g(to)30 1637 y(a)i(ric)n(h)g(graph.)35 b(It)25 b(c)n(ho)r(oses)f(a)h(v)n(ertex) f(with)i(probabilit)n(y)e(pro-)30 1730 y(p)r(ortional)f(to)i(the)g (degree)e(using)h Fq(p)p Ft(\()p Fq(v)s Ft(\))g(=)e Fq(d)p Ft(\()p Fq(v)s Ft(\))p Fq(=)1558 1668 y Fj(P)1646 1755 y Fp(u)p Fu(2)p Fp(V)1802 1730 y Fq(d)p Ft(\()p Fq(u)p Ft(\).)30 1823 y(Note)27 b(that)h(this)f(probabilit)n(y)f(do)r(es)h (not)g(tak)n(e)f(the)i(w)n(eigh)n(t)e(of)30 1915 y(a)k(v)n(ertex)g(in)n (to)g(accoun)n(t.)45 b(A)31 b(second)f(algorithm,)g(whic)n(h)g(w)n(e)30 2008 y(call)j Fv(SingleW)n(GuessI)r(I)p Ft(,)f(c)n(ho)r(oses)g(a)h(v)n (ertex)f(with)i(proba-)30 2101 y(bilit)n(y)i(prop)r(ortional)f(to)h (the)h(ratio)e(of)h(its)g(degree)f(o)n(v)n(er)g(its)30 2193 y(w)n(eigh)n(t,)568 2336 y Fq(p)p Ft(\()p Fq(v)s Ft(\))24 b(=)848 2280 y Fq(d)p Ft(\()p Fq(v)s Ft(\))p 839 2317 170 4 v 839 2393 a Fq(w)r Ft(\()p Fq(v)s Ft(\))1018 2336 y Fq(=)1082 2257 y Fj(X)1074 2435 y Fp(u)p Fu(2)p Fp(V)1244 2280 y Fq(d)p Ft(\()p Fq(u)p Ft(\))p 1235 2317 174 4 v 1235 2393 a Fq(w)r Ft(\()p Fq(u)p Ft(\))1418 2336 y Fq(:)433 b Ft(\(2\))30 2674 y Fh(ALGORITHM)32 b(SingleW)m(GuessI\(G,k\))30 2845 y(Input:)79 b Fk(A)n(n)29 b(undir)l(e)l(cte)l(d)h(weighte)l(d)h(gr)l(aph)g Fq(G)1524 2857 y Fo(0)365 2937 y Fk(and)f(an)g(inte)l(ger)f Fq(k)d(>)d Ft(0)p Fk(.)30 3030 y Fh(Output:)79 b Fk(A)29 b(fe)l(e)l(db)l(ack)j (vertex)d(set)g Fq(F)42 b Fk(of)31 b(size)f Fs(\024)23 b Fq(k)s Fk(,)365 3123 y(or)30 b("F)-6 b(ail")30 b(otherwise.)168 3215 y Fh(F)-8 b(or)60 b Fq(i)23 b Ft(=)f(1)p Fq(;)14 b(:)g(:)g(:)f(;)h(k)268 3308 y Ft(1.)36 b(Reduce)28 b Fq(G)726 3320 y Fp(i)p Fu(\000)p Fo(1)866 3308 y Ft(to)g(a)f(branc)n(h) n(y)f(graph)h Fq(G)1654 3320 y Fp(i)1682 3308 y Ft(\()p Fq(V)1762 3320 y Fp(i)1790 3308 y Fq(;)14 b(E)1888 3320 y Fp(i)1916 3308 y Ft(\))365 3400 y(while)27 b(placing)g(self)h(lo)r (op)f(v)n(ertices)g(in)h Fq(F)12 b Ft(.)268 3493 y(2.)36 b Fh(If)28 b Fq(G)527 3505 y Fp(i)583 3493 y Ft(is)f(the)h(empt)n(y)g (graph)e Fh(Return)32 b Fq(F)268 3586 y Ft(3.)k(Pic)n(k)27 b(a)g(v)n(ertex)f Fq(v)915 3598 y Fp(i)966 3586 y Fs(2)e Fq(V)1093 3598 y Fp(i)1149 3586 y Ft(at)j(random)g(with)365 3678 y(probabilit)n(y)f Fq(p)831 3690 y Fp(i)859 3678 y Ft(\()p Fq(v)s Ft(\))d(=)g Fq(d)1120 3690 y Fp(i)1148 3678 y Ft(\()p Fq(v)s Ft(\))p Fq(=)1311 3616 y Fj(P)1399 3703 y Fp(u)p Fu(2)p Fp(V)1522 3711 y Fn(i)1566 3678 y Fq(d)1609 3690 y Fp(i)1637 3678 y Ft(\()p Fq(u)p Ft(\))268 3776 y(4.)36 b Fq(F)f Fs( )23 b Fq(F)30 b Fs([)19 b(f)p Fq(v)802 3788 y Fp(i)830 3776 y Fs(g)268 3869 y Ft(5.)36 b Fq(V)42 b Fs( )23 b Fq(V)37 b Fs(n)18 b(f)p Fq(v)792 3881 y Fp(i)820 3869 y Fs(g)168 3962 y Fh(Return)28 b Ft("F)-7 b(ail")30 4225 y(The)25 b(second)f(algorithm)g(uses)g(Eq)h(2)f (for)h(computing)f Fq(p)p Ft(\()p Fq(v)s Ft(\))i(in)30 4318 y(Line)j(1.)42 b(These)28 b(t)n(w)n(o)h(algorithms)f(ha)n(v)n(e)g (remark)-5 b(ably)27 b(di\013er-)30 4410 y(en)n(t)34 b(guaran)n(tees)f(of)h(p)r(erformance.)56 b(V)-7 b(ersion)34 b(I)g(guaran)n(tees)30 4503 y(that)28 b(c)n(ho)r(osing)d(a)i(v)n(ertex) f(that)i(b)r(elongs)e(to)i(an)n(y)e(giv)n(en)g(FVS)30 4596 y(is)31 b(larger)e(than)i(1)p Fq(=)p Ft(6,)g(ho)n(w)n(ev)n(er,)e (the)j(exp)r(ected)f(w)n(eigh)n(t)g(of)f(a)30 4688 y(FVS)35 b(pro)r(duced)f(b)n(y)g(v)n(ersion)f(I)i(cannot)f(b)r(e)h(b)r(ounded)f (b)n(y)g(a)30 4781 y(constan)n(t)27 b(times)h(the)g(w)n(eigh)n(t)f(of)h (a)f(minim)n(um)i(WFVS.)g(V)-7 b(er-)30 4874 y(sion)26 b(I)r(I)g(guaran)n(tees)e(that)i(the)h(exp)r(ected)f(w)n(eigh)n(t)f(of) h(its)g(out-)30 4966 y(put)34 b(is)f(b)r(ounded)g(b)n(y)g(6)g(times)g (the)h(w)n(eigh)n(t)f(of)g(a)f(minim)n(um)30 5059 y(WFVS,)41 b(ho)n(w)n(ev)n(er,)h(the)e(probabilit)n(y)f(of)i(con)n(v)n(erging)c (to)j(a)30 5152 y(minim)n(um)31 b(after)f(an)n(y)f(\014xed)h(n)n(um)n (b)r(er)g(of)h(iterations)e(can)h(b)r(e)30 5244 y(arbitrarily)20 b(small.)34 b(W)-7 b(e)22 b(\014rst)f(demonstrate)g(via)g(an)h(example) 30 5337 y(the)32 b(negativ)n(e)f(claims.)50 b(The)33 b(p)r(ositiv)n(e)e(claims)h(are)f(phrased)30 5430 y(more)c(precisely)f (in)i(Theorem)f(3)g(and)h(pro)n(v)n(en)e(thereafter.)30 5572 y(Consider)h(the)i(graph)e(sho)n(wn)g(in)i(Figure)e(1)h(with)g (three)g(v)n(er-)30 5665 y(tices)k Fq(a)p Ft(,)p Fq(b)g Ft(and)f Fq(c)p Ft(,)i(and)f(corresp)r(onding)e(w)n(eigh)n(ts)h Fq(w)r Ft(\()p Fq(a)p Ft(\))h(=)d(6,)30 5757 y Fq(w)r Ft(\()p Fq(b)p Ft(\))35 b(=)e(3)p Fq(\017)h Ft(and)g Fq(w)r Ft(\()p Fq(c)p Ft(\))h(=)e(3)p Fq(m)p Ft(,)i(with)g(three)f (parallel)f(edges)30 5850 y(b)r(et)n(w)n(een)h Fq(a)h Ft(and)f Fq(b)p Ft(,)i(and)e(three)g(parallel)f(edges)h(b)r(et)n(w)n (een)g Fq(b)p 3 setlinewidth np 2723 1035 484 243.43 296.56 arc st 3 setlinewidth np 2723 270 484 63.43 116.56 arc st 3 setlinewidth np 3385 1035 484 243.43 296.56 arc st 3 setlinewidth np 3385 270 484 63.43 116.56 arc st 3 setlinewidth np 2389 642 112 0.00 360.00 arc st 3 setlinewidth np 3057 642 112 0.00 360.00 arc st 3 setlinewidth np 3719 642 112 0.00 360.00 arc st 3 setlinewidth np 2506 653 a 2939 653 li st 3 setlinewidth np 3179 653 a 3607 653 li st 2358 683 a Fe(c)635 b(a)3694 688 y(b)2149 479 y Fd(w)s Fe(\()p Fd(c)p Fe(\))27 b(=)g(3)p Fd(\017)2853 474 y(w)s Fe(\()p Fd(a)p Fe(\))g(=)g(6)3459 469 y Fd(w)s Fe(\()p Fd(b)p Fe(\))h(=)f(3)p Fd(m)2314 1084 y Ft(Figure)g(1:)37 b(The)27 b(minim)n(um)i(WFVS)f Fq(F)3560 1054 y Fu(\003)3621 1084 y Ft(=)23 b Fs(f)p Fq(a)p Fs(g)p Ft(.)2130 1374 y(and)32 b Fq(c)p Ft(.)51 b(The)32 b(minim)n(um)h(WFVS)g Fq(F)3302 1344 y Fu(\003)3372 1374 y Ft(with)g(size)f(1)g(consists)2130 1467 y(of)h(v)n(ertex)f Fq(a)p Ft(.)54 b(According)32 b(to)h(V)-7 b(ersion)32 b(I)r(I,)i(the)f(probabilit)n(y)2130 1559 y(of)28 b(c)n(ho)r(osing)e(v)n(ertex)g Fq(a)i Ft(is)f(\(Eq.)h (2\):)2665 1737 y Fq(p)p Ft(\()p Fq(a)p Ft(\))23 b(=)3219 1681 y Fq(\017)p 2935 1718 601 4 v 2935 1794 a Ft(\(1)c(+)f(1)p Fq(=m)p Ft(\))f Fs(\001)i Fq(\017)f Ft(+)g(1)2130 1937 y(So)31 b(if)h Fq(\017)f Ft(is)g(arbitrarily)f(small)g(and)i Fq(m)f Ft(is)g(su\016cien)n(tly)g(large,)2130 2030 y(then)26 b(the)g(probabilit)n(y)e(of)i(c)n(ho)r(osing)e(v)n(ertex)g Fq(a)i Ft(is)f(arbitrarily)2130 2122 y(small.)36 b(Th)n(us,)24 b(the)h(probabilit)n(y)f(of)h(c)n(ho)r(osing)e(a)h(v)n(ertex)f(from) 2130 2215 y(some)18 b Fq(F)2394 2185 y Fu(\003)2451 2215 y Ft(b)n(y)h(the)g(criterion)f Fq(d)p Ft(\()p Fq(v)s Ft(\))p Fq(=w)r Ft(\()p Fq(v)s Ft(\),)23 b(as)18 b(done)h(b)n(y)g(V)-7 b(ersion)2130 2308 y(I)r(I,)40 b(can)g(b)r(e)g(arbitrarily)e(small.)73 b(If,)44 b(on)39 b(the)i(other)e(hand,)2130 2400 y(V)-7 b(ersion)24 b(I)g(is)h(used,)g(then)g(the)g(probabilit)n(y)e(of)h(c)n (ho)r(osing)g Fq(a;)14 b(b)p Ft(,)2130 2493 y(or)30 b Fq(c)h Ft(is)f(1)p Fq(=)p Ft(2)p Fq(;)14 b Ft(1)p Fq(=)p Ft(4)p Fq(;)g Ft(1)p Fq(=)p Ft(4,)28 b(resp)r(ectiv)n(ely)-7 b(.)45 b(Th)n(us,)32 b(the)f(exp)r(ected)2130 2586 y(w)n(eigh)n(t)39 b(of)g(the)h(\014rst)f(v)n(ertex)f(to)h(b)r(e)h(c)n(hosen)f(is)g(3)p Fq(=)p Ft(4)25 b Fs(\001)h Ft(\()p Fq(\017)g Ft(+)2130 2678 y Fq(m)d Ft(+)f(4\),)36 b(while)e(the)h(w)n(eigh)n(t)e(of)i(a)e (minim)n(um)i(WFVS)g(is)f(6.)2130 2771 y(Consequen)n(tly)-7 b(,)36 b(if)g Fq(m)f Ft(is)g(su\016cien)n(tly)g(large,)g(the)h(exp)r (ected)2130 2863 y(w)n(eigh)n(t)18 b(of)g(a)g(WFVS)i(found)f(b)n(y)f(V) -7 b(ersion)18 b(I)g(can)g(b)r(e)h(arbitrarily)2130 2956 y(larger)26 b(than)h(a)h(minim)n(um)g(WFVS.)2130 3099 y(The)47 b(algorithm)f(for)g(rep)r(eated)h(guesses,)j(whic)n(h)d(w)n(e) f(call)2130 3191 y Fv(Repea)-6 b(tedW)n(GuessI)71 b Ft(is)e(as)g(follo) n(ws:)121 b(rep)r(eat)69 b Fv(Sin-)2130 3284 y(gleW)n(GuessI)32 b Fq(c)22 b Fs(\001)h Ft(6)2818 3254 y Fp(k)2891 3284 y Ft(times,)35 b(where)e Fq(k)j Ft(is)d(the)g(n)n(um)n(b)r(er)g(of)2130 3377 y(v)n(ertices)18 b(\(size\))i(of)f(a)g(minim)n(um)h(WFVS)h(w)n(e)e (seek.)33 b(If)20 b(no)f(FVS)2130 3469 y(is)g(found)h(of)f(size)g Fs(\024)k Fq(k)s Ft(,)e(the)e(algorithm)g(outputs)g(that)h(the)f(size) 2130 3562 y(of)26 b(a)g(minim)n(um)h(WFVS)g(is)f(larger)e(than)i Fq(k)j Ft(with)e(high)f(prob-)2130 3655 y(abilit)n(y)-7 b(,)34 b(otherwise,)f(it)g(outputs)g(the)h(ligh)n(test)e(FVS)i(of)e (size)2130 3747 y(less)h(or)f(equal)h Fq(k)j Ft(among)d(those)g (explored.)53 b(The)33 b(follo)n(wing)2130 3840 y(theorem)27 b(summarizes)g(the)h(main)f(claims.)2130 4011 y Fh(Theorem)j(3)42 b Fk(L)l(et)23 b Fq(G)h Fk(b)l(e)f(a)h(weighte)l(d)h(undir)l(e)l(cte)l (d)f(gr)l(aph)g(and)2130 4103 y Fq(c)f Fs(\025)g Ft(1)29 b Fk(b)l(e)h(a)g(c)l(onstant.)2130 4196 y(a\))i(The)h(algorithm)g Fv(Repea)-6 b(tedW)n(GuessI\()p Fq(G;)14 b(c)p Fv(\))33 b Fk(outputs,)2130 4288 y(after)c Fq(O)r Ft(\(6)2466 4258 y Fp(k)2507 4288 y Fq(k)s(n)p Ft(\))g Fk(steps,)g(a)g(minimum)g (FVS)f(with)h(pr)l(ob)l(ability)2130 4402 y(at)h(le)l(ast)g Ft(1)18 b Fs(\000)g Ft(\(1)g Fs(\000)2765 4369 y Fo(1)p 2747 4383 70 4 v 2747 4431 a(6)2780 4415 y Fn(k)2826 4402 y Ft(\))2858 4371 y Fp(c)p Fo(6)2921 4346 y Fn(k)2962 4402 y Fk(,)30 b(wher)l(e)g Fq(k)j Fk(is)d(the)g(size)g(of)h(a)f(mini-) 2130 4494 y(mum)24 b(weight)h(FVS)f(of)h Fq(G)g Fk(and)g Fq(n)f Fk(is)h(the)f(numb)l(er)g(of)h(vertic)l(es.)2130 4587 y(b\))56 b(The)h(algorithm)h Fv(SingleW)n(GuessI)r(I\()p Fq(G)p Fv(\))d Fk(outputs)h(a)2130 4679 y(fe)l(e)l(db)l(ack)38 b(vertex)d(set)h(whose)h(exp)l(e)l(cte)l(d)f(weight)h(is)g(no)f(mor)l (e)2130 4772 y(than)30 b(six)f(times)h(the)g(weight)h(of)f(the)g (minimum)g(WFVS.)2130 4943 y Ft(The)e(pro)r(of)f(of)g(eac)n(h)g(part)g (requires)f(a)i(preliminary)e(lemma.)2130 5114 y Fh(Lemma)k(4)41 b Fk(L)l(et)34 b Fq(G)e Ft(=)f(\()p Fq(V)5 b(;)14 b(E)5 b Ft(\))35 b Fk(b)l(e)g(a)g(br)l(anchy)g(gr)l(aph,)i Fq(F)47 b Fk(b)l(e)2130 5206 y(a)37 b(fe)l(e)l(db)l(ack)g(vertex)f(set) g(of)h Fq(G)f Fk(and)h Fq(X)k Ft(=)34 b Fq(V)42 b Fs(n)23 b Fq(F)12 b Fk(.)58 b(L)l(et)36 b Fq(E)4017 5218 y Fp(X)2130 5299 y Fk(denote)g(the)h(set)e(of)i(e)l(dges)g(in)f Fq(E)41 b Fk(whose)c(endp)l(oints)g(ar)l(e)f(al)t(l)2130 5391 y(vertic)l(es)f(in)f Fq(X)41 b Fk(and)35 b Fq(E)2878 5403 y Fp(F)r(;X)3039 5391 y Fk(denote)g(the)f(set)g(of)h(e)l(dges)g (in)g Fq(G)2130 5484 y Fk(that)f(c)l(onne)l(ct)g(vertic)l(es)h(in)f Fq(F)47 b Fk(with)35 b(vertic)l(es)g(in)f Fq(X)7 b Fk(.)52 b(Then,)2130 5577 y Fs(j)p Fq(E)2214 5589 y Fp(X)2277 5577 y Fs(j)24 b(\024)e Ft(2)c Fs(\001)h(j)p Fq(E)2597 5589 y Fp(F)r(;X)2724 5577 y Fs(j)p Fk(.)2130 5757 y Fh(Pro)s(of.)148 b Ft(Let)39 b Fq(X)2773 5727 y Fp(b)2844 5757 y Ft(b)r(e)f(the)h(set)f(of)h(branc)n(hp)r(oin)n(ts)e(in)i Fq(X)7 b Ft(.)2130 5850 y(W)-7 b(e)33 b(replace)e(ev)n(ery)f(linkp)r (oin)n(t)j(in)f Fq(X)39 b Ft(b)n(y)32 b(an)f(edge)h(b)r(et)n(w)n(een)p eop %%Page: 6 6 6 5 bop 30 383 a Ft(its)40 b(neigh)n(b)r(ors,)j(and)d(denote)g(the)h (resulting)e(set)i(of)f(edges)30 476 y(b)r(et)n(w)n(een)33 b(v)n(ertices)f(in)h Fq(X)840 446 y Fp(b)906 476 y Ft(b)n(y)f Fq(E)1092 446 y Fp(b)1087 504 y(X)1146 488 y Fn(b)1214 476 y Ft(and)h(b)r(et)n(w)n(een)g(v)n(ertices)30 583 y(in)c Fq(X)204 553 y Fp(b)265 583 y Ft(and)f Fq(F)40 b Ft(b)n(y)29 b Fq(E)703 553 y Fp(b)698 612 y(F)r(;X)821 595 y Fn(b)855 583 y Ft(.)39 b(The)29 b(pro)r(of)f(of)g(Lemma)g(1)g (sho)n(ws)30 689 y(that)705 783 y Fs(j)p Fq(E)794 748 y Fp(b)789 807 y(X)848 790 y Fn(b)883 783 y Fs(j)23 b(\024)g(j)p Fq(E)1106 748 y Fp(b)1101 807 y(F)r(;X)1224 790 y Fn(b)1259 783 y Fs(j)p Fq(:)30 935 y Ft(Since)31 b(ev)n(ery)f(linkp)r(oin)n(t)h (in)g Fq(X)38 b Ft(has)30 b(b)r(oth)i(neigh)n(b)r(ors)d(in)j(the)30 1028 y(set)c Fq(X)236 998 y Fp(b)287 1028 y Fs([)18 b Fq(F)12 b Ft(,)28 b(the)g(follo)n(wing)f(holds:)302 1204 y Fs(j)p Fq(E)386 1216 y Fp(X)450 1204 y Fs(j)c(\024)g Ft(2)18 b Fs(\001)g(j)p Fq(E)774 1170 y Fp(b)769 1229 y(X)828 1212 y Fn(b)863 1204 y Fs(j)28 b Ft(and)f Fs(j)p Fq(E)1159 1216 y Fp(F)r(;X)1286 1204 y Fs(j)c Ft(=)g Fs(j)p Fq(E)1509 1170 y Fp(b)1504 1229 y(F)r(;X)1627 1212 y Fn(b)1661 1204 y Fs(j)p Fq(:)30 1394 y Ft(Hence,)28 b Fs(j)p Fq(E)384 1406 y Fp(X)447 1394 y Fs(j)23 b(\024)g Ft(2)18 b Fs(\001)h(j)p Fq(E)767 1406 y Fp(F)r(;X)894 1394 y Fs(j)p Ft(.)37 b Ff(2)30 1537 y Ft(An)k(immediate)f(consequence) f(of)h(Lemma)g(4)g(is)g(that)h(the)30 1629 y(probabilit)n(y)29 b(of)g(randomly)g(c)n(ho)r(osing)f(an)h(edge)g(that)h(has)f(at)30 1722 y(least)c(one)g(endp)r(oin)n(t)h(that)g(b)r(elongs)f(to)g(a)h(FVS) g(is)f(greater)f(or)30 1815 y(equal)35 b(1)p Fq(=)p Ft(3.)59 b(Th)n(us,)37 b(selecting)e(a)g(v)n(ertex)g(at)g(random)f(from)30 1907 y(a)28 b(randomly)f(selected)h(edge)g(has)g(a)g(probabilit)n(y)f (of)h(at)g(least)30 2000 y(1)p Fq(=)p Ft(6)20 b(to)h(b)r(elong)h(to)f (a)g(FVS.)h(Consequen)n(tly)-7 b(,)22 b(if)g(the)g(algorithm)30 2093 y(terminates)k(after)g Fq(c)16 b Fs(\001)g Ft(6)768 2062 y Fp(k)835 2093 y Ft(iterations,)26 b(with)h(a)f(WFVS)h(of)f(size) 30 2201 y Fq(k)s Ft(,)f(there)g(is)f(a)g(probabilit)n(y)g(of)h(at)f (least)g(1)13 b Fs(\000)g Ft(\(1)g Fs(\000)1606 2168 y Fo(1)p 1588 2182 70 4 v 1588 2231 a(6)1621 2214 y Fn(k)1668 2201 y Ft(\))1700 2171 y Fp(c)p Fo(6)1763 2146 y Fn(k)1828 2201 y Ft(that)30 2294 y(the)39 b(output)g(is)g(a)f(minim)n(um)h(WFVS)g (of)g(size)f(at)h(most)f Fq(k)s Ft(.)30 2386 y(This)28 b(pro)n(v)n(es)d(part)i(\(a\))h(of)g(Theorem)e(3.)30 2529 y(The)i(second)f(part)g(requires)f(the)i(follo)n(wing)f(lemma.)30 2713 y Fh(Lemma)j(5)41 b Fk(L)l(et)27 b Fq(G)i Fk(b)l(e)f(a)g(br)l (anchy)h(gr)l(aph)g(and)g Fq(F)40 b Fk(b)l(e)28 b(a)g(FVS)30 2806 y(of)j Fq(G)p Fk(.)39 b(Then,)620 2922 y Fj(X)613 3100 y Fp(v)r Fu(2)p Fp(V)761 3001 y Fq(d)p Ft(\()p Fq(v)s Ft(\))24 b Fs(\024)e Ft(6)1083 2922 y Fj(X)1078 3100 y Fp(v)r Fu(2)p Fp(F)1223 3001 y Fq(d)p Ft(\()p Fq(v)s Ft(\))p Fq(:)30 3317 y Fh(Pro)s(of.)35 b Ft(Denote)23 b(b)n(y)f Fq(d)757 3329 y Fp(Y)815 3317 y Ft(\()p Fq(v)s Ft(\))h(the)g(n)n(um)n(b)r(er)g(of)f(edges)g(b)r(et)n(w)n(een)30 3410 y(a)27 b(v)n(ertex)g Fq(v)k Ft(and)c(a)g(set)h(of)f(v)n(ertices)g Fq(Y)19 b Ft(.)37 b(Then,)180 3526 y Fj(X)173 3704 y Fp(v)r Fu(2)p Fp(V)321 3605 y Fq(d)p Ft(\()p Fq(v)s Ft(\))24 b(=)592 3526 y Fj(X)583 3704 y Fp(v)r Fu(2)p Fp(X)735 3605 y Fq(d)p Ft(\()p Fq(v)s Ft(\))c(+)993 3526 y Fj(X)988 3704 y Fp(v)r Fu(2)p Fp(F)1133 3605 y Fq(d)p Ft(\()p Fq(v)s Ft(\))k(=)432 3759 y Fj(X)423 3937 y Fp(v)r Fu(2)p Fp(X)575 3838 y Fq(d)618 3850 y Fp(X)682 3838 y Ft(\()p Fq(v)s Ft(\))19 b(+)901 3759 y Fj(X)891 3937 y Fp(v)r Fu(2)p Fp(X)1044 3838 y Fq(d)1087 3850 y Fp(F)1142 3838 y Ft(\()p Fq(v)s Ft(\))g(+)1357 3759 y Fj(X)1351 3937 y Fp(v)r Fu(2)p Fp(F)1496 3838 y Fq(d)p Ft(\()p Fq(v)s Ft(\))p Fq(:)30 4098 y Ft(Due)28 b(to)g(Lemma)f(4,)149 4215 y Fj(X)140 4393 y Fp(v)r Fu(2)p Fp(X)293 4293 y Fq(d)336 4305 y Fp(X)399 4293 y Ft(\()p Fq(v)s Ft(\))d(=)f(2)p Fs(j)p Fq(E)744 4305 y Fp(X)807 4293 y Fs(j)g(\024)f Ft(4)p Fs(j)p Fq(E)1066 4305 y Fp(F)r(;X)1193 4293 y Fs(j)h Ft(=)g(4)1391 4215 y Fj(X)1383 4393 y Fp(v)r Fu(2)p Fp(X)1535 4293 y Fq(d)1578 4305 y Fp(F)1633 4293 y Ft(\()p Fq(v)s Ft(\))p Fq(:)111 b Ft(\(3\))30 4555 y(Consequen)n(tly)-7 b(,)320 4672 y Fj(X)313 4850 y Fp(v)r Fu(2)p Fp(V)460 4750 y Fq(d)p Ft(\()p Fq(v)s Ft(\))24 b Fs(\024)f Ft(4)787 4672 y Fj(X)778 4850 y Fp(v)r Fu(2)p Fp(X)930 4750 y Fq(d)973 4762 y Fp(F)1028 4750 y Ft(\()p Fq(v)s Ft(\)+)488 4904 y Fj(X)479 5082 y Fp(v)r Fu(2)p Fp(X)632 4983 y Fq(d)675 4995 y Fp(F)730 4983 y Ft(\()p Fq(v)s Ft(\))c(+)945 4904 y Fj(X)939 5082 y Fp(v)r Fu(2)p Fp(F)1084 4983 y Fq(d)p Ft(\()p Fq(v)s Ft(\))24 b Fs(\024)f Ft(6)1407 4904 y Fj(X)1402 5082 y Fp(v)r Fu(2)p Fp(F)1546 4983 y Fq(d)p Ft(\()p Fq(v)s Ft(\))30 5244 y(as)k(claimed.)37 b Ff(2)30 5387 y Ft(W)-7 b(e)22 b(can)f(no)n(w)g(pro)n(v)n(e)e(part)i (\(b\))i(of)e(Theorem)g(3)g(analyzing)f(the)30 5479 y(p)r(erformance)28 b(of)h Fv(SingleW)n(GuessI)r(I\(G\))p Ft(.)g(Recall)f(that)i Fq(V)1952 5491 y Fp(i)30 5572 y Ft(is)i(the)h(set)g(of)f(v)n(ertices)f (in)i(graph)e Fq(G)1212 5584 y Fp(i)1273 5572 y Ft(in)h(iteration)g Fq(i)p Ft(,)h Fq(d)1844 5584 y Fp(i)1872 5572 y Ft(\()p Fq(v)s Ft(\))30 5665 y(is)j(the)g(degree)e(of)i(v)n(ertex)f Fq(v)k Ft(in)d Fq(G)1151 5677 y Fp(i)1179 5665 y Ft(,)i(and)e Fq(v)1450 5677 y Fp(i)1513 5665 y Ft(is)g(the)g(v)n(ertex)30 5757 y(c)n(hosen)26 b(in)h(iteration)f Fq(i)p Ft(.)37 b(F)-7 b(urthermore,)26 b(recall)g(that)h Fq(p)1762 5769 y Fp(i)1789 5757 y Ft(\()p Fq(v)s Ft(\))h(is)30 5850 y(the)g(probabilit)n(y)f(to)g(c)n(ho)r(ose)f(v)n(ertex)h Fq(v)k Ft(in)d(iteration)f Fq(i)p Ft(.)2130 383 y(The)38 b(exp)r(ected)g(w)n(eigh)n(t)f Fq(E)3001 395 y Fp(i)3029 383 y Ft(\()p Fq(w)r Ft(\()p Fq(v)s Ft(\)\))43 b(=)3408 321 y Fj(P)3496 408 y Fp(v)r Fu(2)p Fp(V)3615 416 y Fn(i)3660 383 y Fq(w)r Ft(\()p Fq(v)s Ft(\))26 b Fs(\001)g Fq(p)3945 395 y Fp(i)3972 383 y Ft(\()p Fq(v)s Ft(\))2130 476 y(of)37 b(a)g(c)n(hosen)g(v)n(ertex)f(in)i(iteration)f Fq(i)g Ft(is)g(denoted)g(with)h Fq(a)4029 488 y Fp(i)4057 476 y Ft(.)2130 568 y(Th)n(us,)25 b(due)f(to)g(the)g(linearit)n(y)f(of)h (the)h(exp)r(ectation)f(op)r(erator,)2130 675 y Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)12 b Ft(\)\))33 b(=)2579 613 y Fj(P)2667 633 y Fp(k)2667 700 y(i)p Fo(=1)2792 675 y Fq(a)2836 687 y Fp(i)2864 675 y Ft(,)h(assuming)e Fs(j)p Fq(F)12 b Fs(j)31 b Ft(=)g Fq(k)s Ft(.)52 b(W)-7 b(e)33 b(de\014ne)f(a)2130 768 y(normalization)26 b(constan)n(t)h(for)g (iteration)g Fq(i)g Ft(as)g(follo)n(ws:)2738 1013 y Fq(\015)2781 1025 y Fp(i)2832 1013 y Ft(=)2920 871 y Fj(")2983 934 y(X)2968 1112 y Fp(u)p Fu(2)p Fp(V)3091 1120 y Fn(i)3141 957 y Fq(d)3184 969 y Fp(i)3212 957 y Ft(\()p Fq(u)p Ft(\))p 3141 994 183 4 v 3146 1070 a Fq(w)r Ft(\()p Fq(u)p Ft(\))3334 871 y Fj(#)3383 888 y Fu(\000)p Fo(1)2130 1295 y Ft(Then,)h Fq(p)2412 1307 y Fp(i)2439 1295 y Ft(\()p Fq(v)s Ft(\))c(=)f Fq(\015)2701 1307 y Fp(i)2747 1295 y Fs(\001)2798 1255 y Fp(d)2833 1263 y Fn(i)2859 1255 y Fo(\()p Fp(v)r Fo(\))p 2798 1276 149 4 v 2804 1324 a Fp(w)r Fo(\()p Fp(v)r Fo(\))2984 1295 y Ft(and)2365 1540 y Fq(a)2409 1552 y Fp(i)2460 1540 y Ft(=)2560 1461 y Fj(X)2547 1639 y Fp(v)r Fu(2)p Fp(V)2666 1647 y Fn(i)2707 1540 y Fq(w)r Ft(\()p Fq(v)s Ft(\))d Fs(\001)2946 1484 y Fq(d)2989 1496 y Fp(i)3017 1484 y Ft(\()p Fq(v)s Ft(\))p 2946 1521 179 4 v 2951 1597 a Fq(w)r Ft(\()p Fq(v)s Ft(\))3153 1540 y Fs(\001)f Fq(\015)3238 1552 y Fp(i)3289 1540 y Ft(=)j Fq(\015)3419 1552 y Fp(i)3465 1540 y Fs(\001)3520 1461 y Fj(X)3507 1639 y Fp(v)r Fu(2)p Fp(V)3626 1647 y Fn(i)3666 1540 y Fq(d)3709 1552 y Fp(i)3737 1540 y Ft(\()p Fq(v)s Ft(\))2130 1796 y(Let)27 b Fq(F)2343 1766 y Fu(\003)2408 1796 y Ft(b)r(e)g(a)f(minim)n(um)i(FVS)f(of)g Fq(G)g Ft(and)f Fq(F)3559 1766 y Fu(\003)3547 1818 y Fp(i)3624 1796 y Ft(b)r(e)h(minim)n(um)2130 1889 y(w)n(eigh)n(t)39 b(FVS)h(of)f(the)h(graph)f Fq(G)3181 1901 y Fp(i)3209 1889 y Ft(.)72 b(The)40 b(exp)r(ected)g(w)n(eigh)n(t)2130 1982 y Fq(E)2191 1994 y Fp(i)2219 1982 y Ft(\()p Fq(w)r Ft(\()p Fq(v)s Ft(\))p Fs(j)p Fq(v)28 b Fs(2)23 b Fq(F)2653 1951 y Fu(\003)2641 2003 y Fp(i)2692 1982 y Ft(\)\))k(of)h(a)f(v)n (ertex)f(c)n(hosen)g(from)h Fq(F)3724 1951 y Fu(\003)3712 2003 y Fp(i)3790 1982 y Ft(in)g(itera-)2130 2074 y(tion)h Fq(i)f Ft(is)g(denoted)h(with)g Fq(b)2979 2086 y Fp(i)3006 2074 y Ft(.)37 b(W)-7 b(e)28 b(ha)n(v)n(e,)2425 2260 y Fq(b)2461 2272 y Fp(i)2511 2260 y Ft(=)2622 2182 y Fj(X)2599 2360 y Fp(v)r Fu(2)p Fp(F)2730 2340 y Fc(\003)2721 2381 y Fn(i)2779 2260 y Fq(w)r Ft(\()p Fq(v)s Ft(\))20 b Fs(\001)e Fq(p)3050 2272 y Fp(i)3078 2260 y Ft(\()p Fq(v)s Ft(\))23 b(=)g Fq(\015)3339 2272 y Fp(i)3385 2260 y Fs(\001)3450 2182 y Fj(X)3427 2360 y Fp(v)r Fu(2)p Fp(F)3558 2340 y Fc(\003)3549 2381 y Fn(i)3606 2260 y Fq(d)3649 2272 y Fp(i)3677 2260 y Ft(\()p Fq(v)s Ft(\))2130 2534 y(By)k(Lemma)h(5,)f Fq(a)2693 2546 y Fp(i)2720 2534 y Fq(=b)2798 2546 y Fp(i)2848 2534 y Fs(\024)c Ft(6)k(for)g(ev)n(ery)f Fq(i)p Ft(.)2130 2677 y(Recall)33 b(that)g(b)n(y)f(de\014nition)i Fq(F)3131 2646 y Fu(\003)3119 2697 y Fo(2)3202 2677 y Ft(is)e(the)i(minim)n(um)f(FVS)h(in)2130 2769 y(the)h(branc)n(h)n(y)e (graph)g Fq(G)2910 2781 y Fo(2)2982 2769 y Ft(obtained)h(from)h Fq(G)3599 2781 y Fo(1)3659 2769 y Fs(n)23 b(f)p Fq(v)3806 2781 y Fo(1)3843 2769 y Fs(g)p Ft(.)57 b(W)-7 b(e)2130 2862 y(get,)2321 3029 y Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)2577 2995 y Fu(\003)2616 3029 y Ft(\)\))24 b Fs(\025)f Fq(E)2853 3041 y Fo(1)2890 3029 y Ft(\()p Fq(w)r Ft(\()p Fq(v)s Ft(\))p Fs(j)p Fq(v)28 b Fs(2)c Fq(F)3325 2995 y Fu(\003)3313 3050 y Fo(1)3363 3029 y Ft(\)\))19 b(+)f Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)3785 2995 y Fu(\003)3773 3050 y Fo(2)3824 3029 y Ft(\)\))2130 3196 y(b)r(ecause)30 b(the)g(righ)n(t)g(hand)g(side)g(is)g(the)g(exp)r(ected)h(w)n(eigh)n(t) e(of)2130 3289 y(the)22 b(output)f Fq(F)33 b Ft(assuming)21 b(the)g(algorithm)f(\014nds)i(a)e(minim)n(um)2130 3382 y(FVS)j(on)g Fq(G)2491 3394 y Fo(2)2551 3382 y Ft(and)g(just)g(needs)g (to)f(select)h(one)f(additional)g(v)n(er-)2130 3474 y(tex,)27 b(while)f(the)h(left)g(hand)f(side)g(is)g(the)h(unrestricted)e(exp)r (ec-)2130 3567 y(tation.)37 b(By)27 b(rep)r(eating)g(this)h(argumen)n (t)e(w)n(e)i(get,)2345 3819 y Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)2601 3784 y Fu(\003)2640 3819 y Ft(\)\))24 b Fs(\025)f Fq(b)2852 3831 y Fo(1)2907 3819 y Ft(+)18 b Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)3246 3784 y Fu(\003)3234 3839 y Fo(2)3285 3819 y Ft(\)\))24 b Fs(\025)f(\001)14 b(\001)g(\001)22 b(\025)3710 3715 y Fp(k)3668 3740 y Fj(X)3674 3917 y Fp(i)p Fo(=1)3802 3819 y Fq(b)3838 3831 y Fp(i)2130 4070 y Ft(Using)2363 4008 y Fj(P)2451 4095 y Fp(i)2492 4070 y Fq(a)2536 4082 y Fp(i)2564 4070 y Fq(=)2620 4008 y Fj(P)2707 4095 y Fp(i)2748 4070 y Fq(b)2784 4082 y Fp(i)2835 4070 y Fs(\024)g Ft(max)3077 4082 y Fp(i)3118 4070 y Fq(a)3162 4082 y Fp(i)3190 4070 y Fq(=b)3268 4082 y Fp(i)3318 4070 y Fs(\024)g Ft(6,)28 b(w)n(e)f(obtain)2646 4237 y Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)12 b Ft(\)\))25 b Fs(\024)e Ft(6)18 b Fs(\001)g Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)3436 4203 y Fu(\003)3476 4237 y Ft(\)\))p Fq(:)2130 4405 y Ft(Hence,)28 b Fq(E)5 b Ft(\()p Fq(w)r Ft(\()p Fq(F)12 b Ft(\)\))25 b Fs(\024)d Ft(6)c Fs(\001)h Fq(w)r Ft(\()p Fq(F)3092 4374 y Fu(\003)3131 4405 y Ft(\))28 b(as)f(claimed.)36 b Ff(2)2130 4547 y Ft(The)42 b(pro)r(of)f(that)h Fv(SingleGuess\()p Fq(G;)14 b(k)s Fv(\))42 b Ft(outputs)g(a)f(FVS)2130 4640 y(whose)30 b(exp)r(ected)h(size)g(is)g(no)f(more)h(than)g(4)p Fq(k)i Ft(\(Theorem)d(2\))2130 4732 y(where)36 b Fq(k)j Ft(is)e(the)f(size)g(of)h(a)f(minim)n(um)h(FVS)g(is)f(analogous)2130 4825 y(to)47 b(the)g(pro)r(of)g(of)g(Theorem)f(3)h(in)g(the)h(follo)n (wing)e(sense.)2130 4918 y(W)-7 b(e)36 b(assign)f(a)h(w)n(eigh)n(t)f(1) h(to)g(all)g(v)n(ertices)f(and)h(replace)f(the)2130 5010 y(reference)40 b(to)g(Lemma)g(5)h(b)n(y)f(a)g(reference)g(to)g(the)h (follo)n(w-)2130 5103 y(ing)h(claim:)67 b(If)43 b Fq(F)55 b Ft(is)42 b(a)g(FVS)i(of)e(a)g(ric)n(h)g(graph)g Fq(G)p Ft(,)47 b(then)2130 5133 y Fj(P)2218 5221 y Fp(v)r Fu(2)p Fp(V)2369 5196 y Fq(d)p Ft(\()p Fq(v)s Ft(\))28 b Fs(\024)e Ft(4)2694 5133 y Fj(P)2781 5221 y Fp(v)r Fu(2)p Fp(F)2930 5196 y Fq(d)p Ft(\()p Fq(v)s Ft(\).)45 b(The)30 b(pro)r(of)f(of)h(this) g(claim)f(is)2130 5288 y(iden)n(tical)e(to)g(the)g(pro)r(of)g(of)g (Lemma)f(5)h(except)g(that)g(instead)2130 5381 y(of)h(using)f(Lemma)g (4)g(w)n(e)h(use)f(Lemma)g(1.)2130 5586 y Fh(3.3)94 b(The)33 b(practical)g(algorithm)2130 5757 y Ft(In)k(previous)f(sections)g(w)n (e)g(presen)n(ted)g(sev)n(eral)f(algorithms)2130 5850 y(for)29 b(\014nding)h(minim)n(um)g(FVS)g(with)h(high)e(probabilit)n(y) -7 b(.)42 b(The)p eop %%Page: 7 7 7 6 bop 30 383 a Ft(description)44 b(of)h(these)f(algorithms)f(w)n(as)h (geared)f(to)n(w)n(ards)30 476 y(analysis,)32 b(rather)g(than)g(as)g(a) g(prescription)f(to)h(a)g(program-)30 568 y(mer.)67 b(In)38 b(particular,)h Fv(SingleW)n(GuessI\(G,k\))d Ft(discards)30 661 y(all)g(the)i(w)n(ork)d(done)h(for)h(\014nding)f(a)h(FVS)g(whenev)n (er)f(more)30 754 y(than)28 b Fq(k)i Ft(v)n(ertices)d(are)g(c)n(hosen.) 36 b(This)28 b(feature)f(allo)n(w)n(ed)g(us)g(to)30 846 y(regard)35 b(eac)n(h)h(call)h(to)f Fv(SingleW)n(GuessI\(G,k\))g Ft(made)g(b)n(y)30 939 y Fv(Repea)-6 b(tedW)n(GuessI)27 b Ft(as)f(an)g(indep)r(enden)n(t)h(pro)r(cess.)35 b(F)-7 b(ur-)30 1032 y(thermore,)31 b(there)g(is)g(a)g(small)g(probabilit)n(y) f(for)h(a)g(v)n(ery)f(long)30 1124 y(run)d(ev)n(en)g(when)g(the)h(size) f(of)g(the)g(minim)n(um)h(FVS)g(is)f(small.)30 1267 y(W)-7 b(e)37 b(no)n(w)f(sligh)n(tly)g(mo)r(dify)h Fv(Repea)-6 b(tedW)n(GuessI)38 b Ft(to)f(ob-)30 1359 y(tain)52 b(an)g(algorithm,)57 b(termed)52 b(WRA,)h(whic)n(h)e(do)r(es)h(not)30 1452 y(su\013er)c(from)f(these)h(de\014ciencies.)98 b(The)48 b(new)g(algorithm)30 1545 y(w)n(orks)42 b(as)i(follo)n(ws.)85 b(Rep)r(eat)45 b Fv(SingleW)n(GuessI\()p Fq(G;)14 b Fs(j)p Fq(V)k Fs(j)p Fv(\))30 1647 y Ft(for)33 b Fq(min)p Ft(\()p Fk(Max)p Fq(;)14 b(c)22 b Fs(\001)g Ft(6)684 1617 y Fp(w)r Fo(\()p Fp(F)9 b Fo(\))840 1647 y Ft(\))34 b(iterations,)f(where)g Fq(w)r Ft(\()p Fq(F)12 b Ft(\))35 b(is)e(the)30 1740 y(w)n(eigh)n(t)38 b(of)h(the)g(ligh)n(test)g(WFVS)h(found)f(so)f(far)h (and)g Fk(Max)30 1833 y Ft(is)32 b(some)f(sp)r(eci\014ed)h(constan)n(t) f(determining)g(the)h(maxim)n(um)30 1925 y(n)n(um)n(b)r(er)27 b(of)h(iterations)f(of)g Fv(SingleW)n(GuessI)p Ft(.)30 2104 y Fh(ALGORITHM)32 b(WRA\()p Fq(G;)14 b(c;)g Fk(Max)p Fh(\))30 2283 y(Input:)79 b Fk(A)n(n)29 b(undir)l(e)l(cte)l(d)h (weighte)l(d)h(gr)l(aph)g Fq(G)p Ft(\()p Fq(V)5 b(;)14 b(E)5 b Ft(\))468 2376 y Fk(and)31 b(c)l(onstants)e(Max)h(and)g Fq(c)23 b(>)g Ft(1)30 2469 y Fh(Output:)79 b Fk(A)29 b(fe)l(e)l(db)l(ack)j(vertex)d(set)g Fq(F)168 2561 y(F)35 b Fs( )p Fv(SingleW)n(GuessI)c(\()p Fq(G;)14 b Fs(j)p Fq(V)19 b Fs(j)p Fv(\))168 2663 y Fq(M)32 b Fs( )23 b Fq(min)p Ft(\()p Fk(Max)p Fq(;)14 b(c)k Fs(\001)h Ft(6)901 2633 y Fp(w)r Fo(\()p Fp(F)9 b Fo(\))1057 2663 y Ft(\))168 2756 y Fq(i)23 b Fs( )g Ft(1;)168 2848 y Fh(While)k Fq(i)22 b Fs(\024)h Fq(M)36 b Fh(do)346 2941 y Ft(1.)g Fq(F)512 2911 y Fu(0)559 2941 y Fs( )p Fv(SingleW)n(GuessI\()p Fq(G;)14 b Fs(j)p Fq(V)k Fs(j)p Fv(\))346 3034 y Ft(2.)36 b Fh(If)28 b Fq(w)r Ft(\()p Fq(F)698 3003 y Fu(0)723 3034 y Ft(\))23 b Fs(\024)g Fq(w)r Ft(\()p Fq(F)12 b Ft(\))28 b Fh(then)468 3126 y Fq(F)35 b Fs( )23 b Fq(F)727 3096 y Fu(0)751 3126 y Ft(;)468 3228 y Fq(M)32 b Fs( )23 b Fq(min)p Ft(\()p Fk(Max)p Fq(;)14 b(c)k Fs(\001)h Ft(6)1201 3198 y Fp(w)r Fo(\()p Fp(F)9 b Fo(\))1357 3228 y Ft(\))346 3320 y(3.)36 b Fq(i)23 b Fs( )g Fq(i)18 b Ft(+)g(1;)168 3413 y Fh(End)28 b Fs(f)p Ft(While)p Fs(g)168 3506 y Ft(Return)g Fq(F)30 3803 y Fh(Theorem)i(6)42 b Fk(If)37 b(Max)h Fs(\025)e Fq(c)p Ft(6)991 3772 y Fp(k)1031 3803 y Fk(,)k(wher)l(e)e Fq(k)i Fk(is)e(the)g(size)f(of)i(a)30 3895 y(minimum)c(WFVS)f(of)i(an)g(undir)l(e)l(cte)l(d)f(weighte)l(d)h (gr)l(aph)g Fq(G)p Fk(,)30 3988 y(then)i(WRA\()p Fq(G;)14 b(c;)g Fk(Max)o(\))38 b(outputs)f(a)h(minimum)g(WFVS)f(of)30 4101 y Fq(G)30 b Fk(with)g(pr)l(ob)l(ability)i(at)e(le)l(ast)g Ft(1)18 b Fs(\000)g Ft(\(1)g Fs(\000)1340 4068 y Fo(1)p 1322 4082 70 4 v 1322 4131 a(6)1355 4114 y Fn(k)1401 4101 y Ft(\))1433 4071 y Fp(c)p Fo(6)1496 4046 y Fn(k)1537 4101 y Fk(.)30 4291 y Ft(The)28 b(pro)r(of)f(is)g(an)g(immediate)h (corollary)d(of)j(Theorem)f(3.)30 4434 y(The)d(c)n(hoise)f(of)g Fk(Max)h Ft(and)g Fq(c)g Ft(dep)r(end)g(on)g(the)g(application.)35 b(A)30 4526 y(decision-theoretic)j(approac)n(h)g(for)i(selecting)f(suc) n(h)g(v)-5 b(alues)30 4619 y(for)27 b(an)n(y-time)g(algorithms)f(is)i (discussed)f(in)h([BH90)o(].)30 4857 y Fr(4)112 b(Exp)s(erimen)m(tal)36 b(results)30 5059 y Ft(The)c(exp)r(erimen)n(ts)g(compared)e(the)j (outputs)f(of)g(WRA)h(vis-)30 5152 y(\022)-42 b(a-vis)36 b(a)h(greedy)f(algorithm)h(GA)g(and)h(a)e(mo)r(di\014ed)i(greedy)30 5244 y(algorithm)25 b(MGA)i([BG96)o(])f(based)f(on)h(randomly)f (generated)30 5337 y(graphs)38 b(and)g(on)h(some)g(real)f(graphs)f(con) n(tributed)i(b)n(y)g(the)30 5430 y(Hugin)28 b(group)e(\(www.h)n (ugin.com\).)30 5572 y(The)19 b(random)f(graphs)f(are)h(divided)h(in)n (to)g(three)f(sets.)34 b(Graphs)30 5665 y(with)40 b(15)e(v)n(ertices)g (and)h(25)f(edges)g(where)h(the)g(n)n(um)n(b)r(er)g(of)30 5757 y(v)-5 b(alues)38 b(asso)r(ciated)f(with)i(eac)n(h)e(v)n(ertex)h (is)g(randomly)f(c)n(ho-)30 5850 y(sen)29 b(b)r(et)n(w)n(een)g(2)g(and) h(6,)f(2)g(and)g(8,)g(and)h(b)r(et)n(w)n(een)f(2)g(and)g(10.)p 2140 345 1931 4 v 2138 437 4 93 v 2189 410 a Fs(j)p Fq(V)19 b Fs(j)p 2351 437 V 106 w(j)p Fq(E)5 b Fs(j)p 2575 437 V 106 w Ft(v)-5 b(alues)p 2894 437 V 2911 437 V 155 w(size)p 3218 437 V 3235 437 V 155 w(MGA)p 3537 437 V 100 w(WRA)p 3846 437 V 100 w(Eq.)p 4069 437 V 2140 441 1931 4 v 2138 533 4 93 v 2204 506 a(15)p 2351 533 V 135 w(25)p 2575 533 V 167 w(2{6)p 2894 533 V 2911 533 V 203 w(3{6)p 3218 533 V 3235 533 V 217 w(12)p 3537 533 V 222 w(81)p 3846 533 V 202 w(7)p 4069 533 V 2140 537 1931 4 v 2138 629 4 93 v 2204 602 a(15)p 2351 629 V 135 w(25)p 2575 629 V 167 w(2{8)p 2894 629 V 2911 629 V 203 w(3{6)p 3218 629 V 3235 629 V 238 w(7)p 3537 629 V 243 w(89)p 3846 629 V 202 w(4)p 4069 629 V 2140 633 1931 4 v 2138 725 4 93 v 2204 698 a(15)p 2351 725 V 135 w(25)p 2575 725 V 146 w(2{10)p 2894 725 V 2911 725 V 182 w(3{6)p 3218 725 V 3235 725 V 238 w(6)p 3537 725 V 243 w(90)p 3846 725 V 202 w(4)p 4069 725 V 2140 729 1931 4 v 2138 821 4 93 v 2204 794 a(25)p 2351 821 V 135 w(55)p 2575 821 V 167 w(2{6)p 2894 821 V 2911 821 V 183 w(7{12)p 3218 821 V 3235 821 V 216 w(3)p 3537 821 V 243 w(95)p 3846 821 V 202 w(2)p 4069 821 V 2140 825 1931 4 v 2138 917 4 93 v 2204 890 a(25)p 2351 917 V 135 w(55)p 2575 917 V 167 w(2{8)p 2894 917 V 2911 917 V 183 w(7{12)p 3218 917 V 3235 917 V 216 w(3)p 3537 917 V 243 w(97)p 3846 917 V 202 w(0)p 4069 917 V 2140 921 1931 4 v 2138 1013 4 93 v 2204 986 a(25)p 2351 1013 V 135 w(55)p 2575 1013 V 146 w(2{10)p 2894 1013 V 2911 1013 V 162 w(7{12)p 3218 1013 V 3235 1013 V 216 w(0)p 3537 1013 V 222 w(100)p 3846 1013 V 181 w(0)p 4069 1013 V 2140 1017 1931 4 v 2138 1109 4 93 v 2204 1081 a(55)p 2351 1109 V 114 w(125)p 2575 1109 V 125 w(2{10)p 2894 1109 V 2911 1109 V 141 w(17{22)p 3218 1109 V 3235 1109 V 195 w(0)p 3537 1109 V 222 w(100)p 3846 1109 V 181 w(0)p 4069 1109 V 2140 1113 1931 4 v 2138 1205 4 93 v 2351 1205 V 2575 1205 V 2894 1205 V 2911 1205 V 3218 1205 V 3235 1205 V 3346 1177 a(31)p 3537 1205 V 201 w(652)p 3846 1205 V 160 w(17)p 4069 1205 V 2140 1209 1931 4 v 2130 1399 a(Figure)30 b(2:)42 b(Num)n(b)r(er)30 b(of)g(graphs)f(in)i(whic)n(h)f(MGA)h(or)e (WRA)2130 1492 y(yield)g(a)g(smaller)f(lo)r(op)g(cutset.)41 b(Eac)n(h)28 b(line)h(is)g(based)g(on)f(100)2130 1584 y(graphs.)2130 1902 y(Graphs)e(with)i(25)e(v)n(ertices)f(and)i(55)f (edges)g(where)h(the)g(n)n(um-)2130 1994 y(b)r(er)i(of)g(v)-5 b(alues)29 b(asso)r(ciated)f(with)i(eac)n(h)e(v)n(ertex)g(is)h (randomly)2130 2087 y(c)n(hosen)h(b)r(et)n(w)n(een)g(2)g(and)g(6,)h(2)f (and)h(8,)f(and)h(b)r(et)n(w)n(een)f(2)g(and)2130 2180 y(10.)43 b(Graphs)29 b(with)h(55)f(v)n(ertices)f(and)i(125)e(edges)h (where)h(the)2130 2272 y(n)n(um)n(b)r(er)k(of)g(v)-5 b(alues)34 b(asso)r(ciated)e(with)j(eac)n(h)e(v)n(ertex)g(is)h(ran-) 2130 2365 y(domly)27 b(c)n(hosen)g(b)r(et)n(w)n(een)g(2)g(and)h(10.)36 b(Eac)n(h)26 b(instance)h(of)h(the)2130 2458 y(three)23 b(classes)g(is)g(based)g(on)g(100)f(random)h(graphs)f(generated)2130 2550 y(as)30 b(describ)r(ed)g(b)n(y)g([SC90)o(].)45 b(The)31 b(total)f(n)n(um)n(b)r(er)g(of)g(random)2130 2643 y(graphs)c(w)n(e)h (used)h(is)f(700.)2130 2786 y(The)f(results)g(are)g(summarized)f(in)i (the)g(table)f(b)r(elo)n(w.)36 b(WRA)2130 2878 y(is)22 b(run)h(with)g Fk(Max)g Ft(=)g(300)e(and)i Fq(c)g Ft(=)f(1.)35 b(The)23 b(t)n(w)n(o)e(algorithms,)2130 2971 y(MGA)27 b(and)g(WRA,)g(output)g(lo)r(op)f(cutsets)h(of)f(the)h(same)f(size)2130 3063 y(in)34 b(only)e(17)h(graphs)f(and)h(when)g(the)h(algorithms)e (disagree,)2130 3156 y(then)j(in)g(95\045)f(of)g(these)h(graphs)e(WRA)j (p)r(erformed)e(b)r(etter)2130 3249 y(than)28 b(MGA.)2130 3391 y(The)k(actual)g(run)f(time)i(of)f Fq(W)12 b(R)q(A)p Ft(\()p Fq(G;)i Ft(1)p Fq(;)g Ft(300\))31 b(is)h(ab)r(out)f(300)2130 3484 y(times)49 b(slo)n(w)n(er)f(than)h(GA)h(\(or)f(MGA\))h(on)f Fq(G)p Ft(.)102 b(On)49 b(the)2130 3577 y(largest)38 b(random)g(graph)f(w)n(e)i(used,)j(it)d(to)r(ok)g(4.5)f(min)n(utes.) 2130 3669 y(Most)30 b(of)h(the)g(time)g(is)f(sp)r(end)h(in)g(the)g (last)f(impro)n(v)n(emen)n(t)f(of)2130 3762 y(WRA.)h(Considerable)e (run)i(time)g(can)f(b)r(e)h(sa)n(v)n(ed)e(b)n(y)h(letting)2130 3854 y Fk(Max)23 b Ft(=)g(5.)35 b(F)-7 b(or)21 b(all)h(700)f(graphs,)g (WRA\(G,1,5\))i(has)f(already)2130 3947 y(obtained)28 b(a)g(b)r(etter)h(lo)r(op)f(cutset)g(than)h(MGA.)g(The)f(largest)2130 4040 y(impro)n(v)n(emen)n(t,)j(with)i Fk(Max)d Ft(=)f(300,)i(w)n(as)g (from)g(a)g(w)n(eigh)n(t)g(of)2130 4132 y(58.0)18 b(\()p Fq(l)r(og)2436 4144 y Fo(2)2492 4132 y Ft(scale\))h(to)g(a)g(w)n(eigh)n (t)f(of)h(35.9.)33 b(The)20 b(impro)n(v)n(emen)n(ts)2130 4225 y(in)i(this)g(case)f(w)n(ere)f(obtained)i(in)g(iterations)e(1,)j (2,)f(36,)g(83,)g(189)2130 4318 y(with)33 b(resp)r(ectiv)n(e)f(w)n (eigh)n(ts)f(of)i(46.7,)f(38.8,)h(37.5,)f(37.3,)g(35.9)2130 4410 y(and)j(resp)r(ectiv)n(e)f(sizes)h(of)g(22,)h(18,)g(17,)g(18,)g (and)f(17)f(no)r(des.)2130 4503 y(On)26 b(the)h(a)n(v)n(erage,)d(after) i(300)g(iterations,)f(the)i(impro)n(v)n(emen)n(t)2130 4596 y(for)32 b(the)h(larger)e(100)h(graphs)f(w)n(as)h(from)g(a)h(w)n (eigh)n(t)f(of)g(52)g(to)2130 4688 y(39)g(and)g(from)g(size)g(22)f(to)i (20.)50 b(The)33 b(impro)n(v)n(emen)n(t)e(for)h(the)2130 4781 y(smaller)21 b(600)g(graphs)g(w)n(as)g(from)g(a)h(w)n(eigh)n(t)f (of)h(15)g(to)f(12.2)g(and)2130 4874 y(from)27 b(size)h(9)f(to)g(6.7.) 2130 5016 y(The)h(second)e(exp)r(erimen)n(t)i(compared)e(b)r(et)n(w)n (een)h(GA,)h(MGA)2130 5109 y(and)20 b(WRA)g(on)f(four)h(real)f(Ba)n(y)n (esian)e(net)n(w)n(orks)h(sho)n(wing)h(that)2130 5201 y(WRA)36 b(outp)r(erformed)e(b)r(oth)h(GA)g(and)g(MGA)h(after)e(a)g (sin-)2130 5294 y(gle)23 b(call)g(to)g Fv(SingleW)n(GuessI)p Ft(.)f(The)h(w)n(eigh)n(t)g(of)g(the)h(output)2130 5387 y(con)n(tin)n(ued)d(to)h(decrease)f(logarithmically)f(with)i(the)g(n)n (um)n(b)r(er)2130 5479 y(of)30 b(iterations.)43 b(W)-7 b(e)31 b(rep)r(ort)e(the)i(results)e(with)i Fk(Max)c Ft(=)g(1000)2130 5572 y(and)j Fq(c)d Ft(=)g(1.)43 b(Run)31 b(time)f(w)n(as)f(b)r(et)n(w)n(een)h(3)g(min)n(utes)g(for)f(W)-7 b(a-)2130 5665 y(ter)25 b(and)f(15)g(min)n(utes)h(for)f(Munin1)h(on)f (a)h(P)n(en)n(tium)f(133)g(with)2130 5757 y(32M)i(RAM.)i(The)f(results) f(also)g(indicate)h(that)g(P)n(earl's)e(con-)2130 5850 y(ditioning)33 b(algorithm)f(can)g(not)i(run)e(on)h(these)g(graphs)f (due)p eop %%Page: 8 8 8 7 bop 48 345 1914 4 v 46 424 4 80 v 130 401 a Fl(Name)p 404 424 V 421 424 V 153 w Fb(j)p Fa(V)17 b Fb(j)p 636 424 V 111 w(j)p Fa(E)t Fb(j)p 851 424 V 106 w(j)p Fa(F)983 369 y Fm(\003)1019 401 y Fb(j)p 1088 424 V 1105 424 V 145 w Fl(GA)p 1380 424 V 128 w(MGA)p 1667 424 V 100 w(WRA)p 1960 424 V 48 427 1914 4 v 46 505 4 78 v 125 481 a(W)-6 b(ater)p 404 505 V 421 505 V 162 w(32)p 636 505 V 119 w(123)p 851 505 V 132 w(16)p 1088 505 V 1105 505 V 167 w(40.7)p 1380 505 V 146 w(42.7)p 1667 505 V 155 w(29.5)p 1960 505 V 48 508 1914 4 v 46 585 4 78 v 104 562 a(Mildew)p 404 585 V 421 585 V 144 w(35)p 636 585 V 138 w(80)p 851 585 V 151 w(14)p 1088 585 V 1105 585 V 167 w(48.1)p 1380 585 V 146 w(40.5)p 1667 585 V 155 w(39.3)p 1960 585 V 48 588 1914 4 v 46 666 4 78 v 118 642 a(Barley)p 404 666 V 421 666 V 156 w(48)p 636 666 V 119 w(126)p 851 666 V 132 w(20)p 1088 666 V 1105 666 V 167 w(72.1)p 1380 666 V 146 w(76.3)p 1667 666 V 155 w(57.3)p 1960 666 V 48 669 1914 4 v 46 746 4 78 v 98 723 a(Munin1)p 404 746 V 421 746 V 116 w(189)p 636 746 V 101 w(366)p 851 746 V 132 w(59)p 1088 746 V 1105 746 V 148 w(159.4)p 1380 746 V 108 w(167.5)p 1667 746 V 117 w(122.6)p 1960 746 V 48 749 1914 4 v 30 945 a Ft(Figure)31 b(3:)45 b(Log)31 b(size)g(\(base)g(2\))h(of)g(the)g(lo)r(op)f(cutsets)h(found)30 1037 y(b)n(y)27 b(MGA)i(or)d(WRA.)30 1304 y(to)h(the)h(large)f(cutset)h (needed.)30 1535 y Fr(Ac)m(kno)m(wledgemen)m(t)30 1732 y Ft(W)-7 b(e)28 b(thank)g(Se\016)f(Naor)g(for)g(fruitful)i (discussions.)30 1963 y Fr(References)30 2145 y Ft([BBF95])40 b(Bafna)e(V.,)j(Berman)c(P)-7 b(.,)40 b(and)e(F)-7 b(ujito)39 b(T.,)i(Con-)118 2237 y(stan)n(t)22 b(ratio)g(appro)n(ximations)f(of)i (the)g(w)n(eigh)n(ted)g(feedbac)n(k)118 2330 y(v)n(ertex)28 b(set)i(problem)f(for)f(undirected)i(graphs,)f(Pro)r(ceed-)118 2423 y(ings)36 b(Sixth)g(Ann)n(ual)h(Symp)r(osium)f(on)h(Algorithms)e (and)118 2515 y(Computation)27 b(\(ISAA)n(C95\),)h(142{151.)30 2677 y([BGNR94])41 b(Bar-Y)-7 b(eh)n(uda)38 b(R.,)43 b(Geiger)c(D.,)44 b(Naor)39 b(J.,)j(and)118 2770 y(Roth)23 b(R.)h(Appro)n(ximation)e(algorithms)g(for)h(the)h(feedbac)n(k)118 2863 y(v)n(ertex)k(set)h(problems)g(with)h(applications)e(to)h (constrain)n(t)118 2955 y(satisfaction)k(and)i(Ba)n(y)n(esian)d (inference.)i Fk(Pr)l(o)l(c)l(e)l(e)l(dings)j(of)118 3048 y(the)27 b(5th)g(A)n(nnual)g(A)n(CM-Siam)g(Symp)l(osium)h(On)e (Discr)l(ete)118 3141 y(A)n(lgorithms)p Ft(,)i(1994,)e(344{354.)30 3303 y([BG94])41 b(Bec)n(k)n(er)29 b(A.,)j(and)f(Geiger)f(D.,)i(Appro)n (ximation)e(al-)118 3395 y(gorithms)36 b(for)g(the)h(lo)r(op)g(cutset)g (problem,)i Fk(Pr)l(o)l(c)l(e)l(e)l(dings)118 3488 y(of)d(the)g(10th)g (c)l(onfer)l(enc)l(e)g(on)g(Unc)l(ertainty)f(in)g(A)n(rti\014cial)118 3581 y(Intel)t(ligenc)l(e)p Ft(,)28 b(1994,)e(60{68.)30 3743 y([BG96])41 b(Bec)n(k)n(er)i(A.,)50 b(and)45 b(Geiger)f(D.,)50 b(Optimization)45 b(of)118 3835 y(P)n(earl's)29 b(metho)r(d)k(of)e (conditioning)g(and)h(greedy-lik)n(e)e(ap-)118 3928 y(pro)n(ximation)f (algorithms)h(for)h(the)h(feedbac)n(k)f(v)n(ertex)f(set)118 4021 y(problem,)d Fk(A)n(rti\014cial)j(Intel)t(ligenc)l(e)p Ft(,)f(83:167{188,)23 b(1996.)30 4183 y([BGS98])41 b(Bec)n(k)n(er)25 b(A.,)i(Geiger)f(D.,)h(and)g(Sc)n(h\177)-42 b(a\013er)26 b(A.A.)h(Au-)118 4275 y(tomatic)21 b(selection)g(of)g(lo)r(op)g(break)n (ers)e(for)i(genetic)g(link)-5 b(age)118 4368 y(analysis,)26 b(Human)i(Heredit)n(y)-7 b(,)27 b(48\(1\):47{60,)e(1998)30 4530 y([Bo90])40 b(Bo)r(dlaender)49 b(H.L.)h(On)g(disjoin)n(t)g (cycles.)f(In)n(t.)h(J.)118 4623 y(F)-7 b(ound.)28 b(Comp.)f(Sc.)h(5,)f (1994,)f(59-68.)30 4785 y([BH90])41 b(Breese)25 b(J.,)h(and)h(Horvitz)e (E.,)i(Ideal)f(reform)n(ulation)118 4877 y(of)e(b)r(elief)g(net)n (wroks,)g Fk(Pr)l(o)l(c)l(e)l(e)l(dings)j(of)g(the)g(6th)g(c)l(onfer)l (enc)l(e)118 4970 y(on)34 b(Unc)l(ertainty)g(in)h(A)n(rti\014cial)g (Intel)t(ligenc)l(e)p Ft(,)f(1990,)e(64{)118 5063 y(72.)30 5225 y([De90])41 b(Dec)n(h)n(ter)h(R.,)87 b(Enhancemen)n(t)42 b(sc)n(hemes)g(for)h(con-)118 5317 y(strain)n(t)27 b(pro)r(cessing:)37 b(bac)n(kjumping,)28 b(learning,)f(and)h(cut-)118 5410 y(set)37 b(decomp)r(osition,)70 b Fk(A)n(rti\014cial)39 b(Intel)t(ligenc)l(e,)j Ft(41:273{)118 5503 y(312,)26 b(1990.)30 5665 y([DF92])41 b(Do)n(wney)70 b(R.G.,)80 b(and)70 b(F)-7 b(ello)n(ws)69 b(M.R.,)81 b(Fixed)118 5757 y(parameter)49 b(tractabilit)n(y)i(and)g(completeness,)57 b Fk(Congr.)118 5850 y(Num.)p Ft(,)27 b(87:161{187,)c(1992.)2130 383 y([DF95])41 b(Do)n(wney)i(R.,)48 b(and)c(F)-7 b(ello)n(ws)43 b(M.,)k(P)n(arameterized)2218 476 y(Computational)27 b(F)-7 b(easibilit)n(y)g(,)27 b(219{244,)d(1995.)2130 635 y([F)-7 b(u96])41 b(F)-7 b(ujito)26 b(T.,)34 b(A)25 b(note)g(on)g(appro)n(ximation)f(of)h(the)g(v)n(er-)2218 727 y(tex)d(co)n(v)n(er)d(and)j(feedbac)n(k)f(v)n(ertex)g(set)h (problems)f(-)g(Uni\014ed)2218 820 y(approac)n(h,)h Fk(Information)h (Pr)l(o)l(c)l(essing)g(L)l(etters,)d Ft(59:59{63,)2218 913 y(1996.)2130 1072 y([GJ79])40 b(Garey)g(M.R.,)k(and)d(Johnson)e (D.S.,)80 b Fk(Computers)2218 1164 y(and)38 b(Intr)l(actability:)55 b(A)37 b(Guide)h(to)f(the)h(The)l(ory)h(of)f(NP-)2218 1257 y(c)l(ompleteness,)f Ft(W.)28 b(H.)g(F)-7 b(reeman,)27 b(San)h(F)-7 b(rancisco,)26 b(Cali-)2218 1350 y(fornia,)g(1979.)2130 1509 y([GP90])40 b(Geiger)23 b(D.,)i(and)e(P)n(earl)f(J.,)31 b(On)23 b(the)h(logic)f(of)g(causal)2218 1601 y(mo)r(dels,)48 b(In)32 b Fk(Unc)l(ertainty)g(in)i(A)n(rti\014cial)f(Intel)t(ligenc)l (e)h(4,)2218 1694 y Ft(Eds.)i(Shac)n(h)n(ter)g(R.D.,)k(Levitt)e(T.S.,)i (Kanal)35 b(L.N.,)40 b(and)2218 1787 y(Lemmer)35 b(J.F.,)j (North-Holland,)f(New)f(Y)-7 b(ork,)37 b(1990,)f(3{)2218 1879 y(14.)2130 2038 y([GVP90])41 b(Geiger)24 b(D.,)j(V)-7 b(erma)25 b(T.S.,)h(and)g(P)n(earl)d(J.,)34 b(Iden)n(ti-)2218 2131 y(fying)19 b(indep)r(endence)i(in)f(Ba)n(y)n(esian)d(net)n(w)n (orks,)24 b Fk(Networks,)2218 2224 y Ft(20)i(\(1990\),)h(507{534.)2130 2383 y([KP83])40 b(Kim)24 b(H.,)i(and)e(P)n(earl)e(J.,)32 b(A)25 b(computational)f(mo)r(del)2218 2475 y(for)i(com)n(bined)h (causal)f(and)h(diagnostic)f(reasoning)g(in)h(in-)2218 2568 y(ference)33 b(systems,)57 b Fk(Pr)l(o)l(c)l(e)l(e)l(dings)36 b(of)h(the)e(Eighth)i(IJCAI)p Ft(,)2218 2661 y(1983,)25 b(190{193.)2130 2820 y([LS88])41 b(Lauritzen)c(S.L.,)k(and)c (Spiegelhalter)g(D.J.,)k(Lo)r(cal)2218 2913 y(computations)26 b(with)i(probabilities)e(on)g(graphical)g(struc-)2218 3005 y(tures)h(and)h(their)g(application)g(to)g(exp)r(ert)g(systems)f (\(with)2218 3098 y(discussion\).)49 b Fk(Journal)g(R)l(oyal)i (Statistic)l(al)f(So)l(ciety)p Ft(,)55 b(B,)2218 3190 y(1988,)25 b(50\(2\):157-224.)2130 3350 y([Ot91])41 b(Ott)24 b(J.,)h Fk(A)n(nalysis)i(of)g(human)g(genetic)g(linkage)p Ft(,)f(The)2218 3442 y(Johns)31 b(Hopkins)h(Univ)n(ersit)n(y)f(Press,)h (1991,)g(revised)f(edi-)2218 3535 y(tion.)2130 3694 y([P)n(e86])40 b(P)n(earl,)27 b(J.,)42 b(F)-7 b(usion,)29 b(propagation)e(and)i (structuring)2218 3787 y(in)g(b)r(elief)h(net)n(w)n(orks,)39 b Fk(A)n(rti\014cial)32 b(Intel)t(ligenc)l(e,)e Ft(29:3:241{)2218 3879 y(288,)c(1986.)2130 4038 y([P)n(e88])40 b(P)n(earl,)29 b(J.,)46 b Fk(Pr)l(ob)l(abilistic)34 b(r)l(e)l(asoning)f(in)f(intel)t (ligent)2218 4131 y(systems:)53 b(Networks)38 b(of)g(plausible)h(infer) l(enc)l(e)p Ft(.)63 b(Morgan)2218 4224 y(Kaufmann,)27 b(San)g(Mateo,)g(California,)g(1988.)2130 4383 y([Sh86])41 b(Shac)n(h)n(ter)28 b(R.D.,)j(Ev)-5 b(aluating)29 b(in\015uence)h (diagrams,)2218 4475 y Fk(Op)l(er)l(ations)g(R)l(ese)l(ar)l(ch)p Ft(,)e(1986,)d(34:871-882.)2130 4634 y([SC90])41 b(Suermondt)j(H.J.,)k (and)c(Co)r(op)r(er)g(G.F.,)90 b(Proba-)2218 4727 y(bilistic)38 b(inference)h(in)g(m)n(ultiply)f(connected)h(b)r(elief)g(net-)2218 4820 y(w)n(orks)19 b(using)i(lo)r(op)g(cutsets,)28 b Fk(Int.)23 b(J.)h(Appr)l(ox.)h(R)l(e)l(asoning)p Ft(,)2218 4912 y(4:283{306,)f(1990.)2130 5071 y([VP88])40 b(V)-7 b(erma)41 b(T.,)k(and)d(P)n(earl,)h(J.,)81 b(Causal)41 b(net)n(w)n(orks:)2218 5164 y(Seman)n(tics)19 b(and)g(expressiv)n (eness,)24 b Fk(Pr)l(o)l(c)l(e)l(e)l(dings)f(of)g(F)-6 b(ourth)2218 5257 y(Workshop)33 b(on)e(Unc)l(ertainty)g(in)h(A)n (rti\014cial)g(Intel)t(ligenc)l(e,)2218 5349 y Ft(Minneap)r(olis,)27 b(Minnesota,)g(1988,)f(352{359.)2130 5508 y([V)-7 b(o68])41 b(V)-7 b(oss)28 b(H.J.,)43 b(Some)29 b(prop)r(erties)f(of)h(graphs)f (con)n(tain-)2218 5601 y(ing)35 b Fq(k)k Ft(indep)r(enden)n(t)d (circuits,)63 b Fk(Pr)l(o)l(c)l(e)l(e)l(dings)38 b(of)g(Col)t(lo)l(q.) 2218 5694 y(Tihany)p Ft(,)28 b(Academic)e(Press,)e(New)i(Y)-7 b(ork,)26 b(1968,)e(321{334.)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.mapfun0000644000265600020320000001120606737457627015573 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last Mod: May 24, 1995 |*| Map Functions Used In LINKAGE/FASTLINK by Jeremy Buhler Rice University This README file tries to connect the discussion of mapping functions in Chapter 1 of Ott's book[3] to what actually happens in LINKAGE/FASTLINK. LINKAGE/FASTLINK uses two functions for calculating map distance: Haldane's map function [1] and Kosambi's map function [2]. These functions are implemented as methods for calculating recombination fractions of flanking markers given the fractions between three adjacent markers. If we have three loci A, B, and C which are present on the chromosome in the order ABC, we say that A and C are flanking markers. We say that A and B, as well as B and C are adjacent markers. If we know the recombination fractions theta(AB) and theta(BC), we would like to determine the fraction theta(AC). One way to determine theta(AC) is to take the sum theta(AB) + theta(BC); this is Morgan's map function, which equates distance on the linkage map to recombination fraction. This approach implicitly assumes only a single crossover between adjacent loci, which is unreasonable for loci which are not linked fairly tightly (theta < 0.1). Haldane's map function assumes that crossovers follow a Poisson distribution, with no interference between crossovers. Haldane's function x(theta) is given by x = -1/2 ln(1 - 2 * theta) or, inversely, theta = 1/2 [1 - exp(-2x)] From this formula, we see that the process of adding recombination fractions while accounting for the new crossover distribution is equivalent to the mathematical manipulation: x(AC) = x(AB) + x(BC) = -1/2(ln(1 - 2 * theta(AB)) + ln(1 - 2 * theta(BC))) = -1/2(ln( (1 - 2 * theta(AB)) (1 - 2 * theta(BC)) )) theta(AC) = 1/2 [1 - exp(-2 x(AC))] = 1/2 [ 1 - (1 - 2 * theta(AB)) (1 - 2 * theta(BC))] = 1/2 [ 1 - 1 + 2 * theta(AB) + 2 * theta(BC) - 4 * theta(AB) * theta(BC)] theta(AC) = theta(AB) + theta(BC) - 2 * theta(AB) * theta(BC) This formula appears throughout LINKAGE/FASTLINK. Moreover, if we wish to use a map-function-derived theta(AC) and a given theta(AB) to derive theta(BC), we can rewrite the addition formula to find that theta(BC) (1 - 2 * theta(AB)) = theta(AC) - theta(AB) theta(BC) = (theta(AC) - theta(AB)) / (1 - 2 * theta(AB)) This last formula is used in LINKMAP to recalculate theta(BC) from the known theta(AC) as B is moved incrementally across the gap between A and C. Kosambi's map function is based on a model of chiasmal interference. It is given by x = 1/2 arctanh(2 * theta) = 1/4 ln((1 + 2 * theta) / (1 - 2 * theta)) or, inversely, theta = 1/2 tanh(2x) = 1/2 (exp(4x) - 1) / (exp(4x) + 1) Under this mapping function, addition of recombination fractions is equivalent to the following manipulation: x(AC) = x(AB) + x(BC) 1 / 1 + 2 * theta(AB) \ 1 / 1 + 2 * theta(BC) \ = - ln | ----------------- | + - ln | ----------------- | 4 \ 1 - 2 * theta(AB) / 4 \ 1 - 2 * theta(BC) / 1 / 1 + 2 * theta(AB) + 2 * theta(BC) + 4 * theta(AB) * theta(BC) \ = - ln | ------------------------------------------------------------- | 4 \ 1 - 2 * theta(AB) - 2 * theta(BC) + 4 * theta(AB) * theta(BC) / theta(AC) = 1/2 (exp(4x(AC)) - 1) / (exp(4x(AC) + 1) 1 + 2 * theta(AB) + 2 * theta(BC) + 4 * theta(AB) * theta(BC) ------------------------------------------------------------- - 1 1 1 - 2 * theta(AB) - 2 * theta(BC) + 4 * theta(AB) * theta(BC) = - --------------------------------------------------------------------- 2 1 + 2 * theta(AB) + 2 * theta(BC) + 4 * theta(AB) * theta(BC) ------------------------------------------------------------- + 1 1 - 2 * theta(AB) - 2 * theta(BC) + 4 * theta(AB) * theta(BC) 1 4 * theta(AB) + 4 * theta(BC) = - ----------------------------- 2 2 + 8 * theta(AB) * theta(BC) theta(AC) = (theta(AB) + theta(BC)) / (1 + 4 * theta(AB) * theta(BC)) If the user specifies that interference is to be included in the model and sets the parameter "independent" (in datain.dat) to 2, then (and only then) is Kosambi's mapping function used instead of Haldane's. * References [1] Haldane, J.B.S. 1919. "The combination of Linkage values and the calculation of distances between the loci of linked factors." J. Genet. 8:299-309. [2] Kosambi, D.D. 1944. "The estimation of map distances from recombination values." Ann. Eugen. 12:172-75. [3] Ott, J. 1991. Analysis of Human Genetic Linkage (Revised Edition). Baltimore: Johns Hopkins U. Press. fastlink-4.1P-fix95/README.AIX0000644000265600020320000000122406737457626014724 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27,1999 FASTLINK Portability Information for AIX AIX is the operating system for some IBM workstations. FASTLINK ports fine to AIX, but some minor changes to the Makefile are necessary for compilation. Change 1. Use the xlc compiler, instead of gcc. Change the line CC = gcc to CC = xlc Change 2. Uncomment the line SYSDEP = -D_POSIX_SOURCE FASTLINK user, Helge Sachau, has contributed a wonderful document explaining how to port the LINKAGE auxiliary programs to AIX. You can find this document as sachau.ps in the subdirectory aix (under fastlink). Thanks Helge! fastlink-4.1P-fix95/unknown.ps0000644000265600020320000055002006737457642015470 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software %%Title: unknown.dvi %%Pages: 9 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentPaperSizes: Letter %%EndComments %DVIPSCommandLine: dvips unknown.dvi -o %DVIPSParameters: dpi=600, comments removed %DVIPSSource: TeX output 1999.06.27:1834 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet TeXDict begin 40258431 52099146 1000 600 600 (unknown.dvi) @start /Fa 1 16 df<000FFC0000003FFF000000FFFFC00003FFFFF00007FFFFF8000F FFFFFC001FFFFFFE003FFFFFFF003FFFFFFF007FFFFFFF807FFFFFFF807FFFFFFF80FFFF FFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFF FFC0FFFFFFFFC0FFFFFFFFC07FFFFFFF807FFFFFFF807FFFFFFF803FFFFFFF003FFFFFFF 001FFFFFFE000FFFFFFC0007FFFFF80003FFFFF00000FFFFC000003FFF0000000FFC0000 22227BA72D>15 D E /Fb 1 60 df<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E6000 6000600060006000E000C000C000C001C001800380030007000E001C001800380030000B 1C798919>59 D E /Fc 34 120 df<7FFFFFFFF07FFFFFFFF0FFFFFFFFF8FFFFFFFFF8FF FFFFFFF87FFFFFFFF07FFFFFFFF025077B9E30>45 D<0F003FC07FE07FE0FFF0FFF0FFF0 FFF07FE07FE03FC00F000C0C6E8B30>I<00007F0000000000FF8000000000FF80000000 01FFC000000001FFC000000001FFC000000001FFC000000003FFE000000003F7E0000000 03F7E000000003F7E000000003F7E000000007F7F000000007E3F000000007E3F0000000 07E3F00000000FE3F80000000FE3F80000000FE3F80000000FC1F80000000FC1F8000000 1FC1FC0000001FC1FC0000001FC1FC0000001FC1FC0000003F80FE0000003F80FE000000 3F80FE0000003F80FE0000003F80FE0000007F007F0000007F007F0000007F007F000000 7F007F000000FF007F800000FE003F800000FFFFFF800000FFFFFF800000FFFFFF800001 FFFFFFC00001FFFFFFC00001FFFFFFC00001FC001FC00003FC001FE00003F8000FE00003 F8000FE00003F8000FE00003F8000FE00007F8000FF00007F00007F00007F00007F0007F FF007FFF00FFFF80FFFF80FFFF80FFFF80FFFF80FFFF80FFFF80FFFF807FFF007FFF0029 397DB830>65 D<3FFFFFE000007FFFFFFC0000FFFFFFFE0000FFFFFFFF80007FFFFFFFC0 003FFFFFFFE00003F8007FF00003F8001FF80003F8000FF80003F80007FC0003F80003FE 0003F80001FE0003F80000FF0003F80000FF0003F800007F8003F800007F8003F800003F 8003F800003FC003F800001FC003F800001FC003F800001FC003F800001FC003F800000F E003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800000F E003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800001F E003F800001FC003F800001FC003F800001FC003F800003FC003F800003F8003F800003F 8003F800007F8003F800007F0003F80000FF0003F80001FE0003F80003FE0003F80007FC 0003F8000FFC0003F8001FF80003F8007FF0003FFFFFFFE0007FFFFFFFC000FFFFFFFF80 00FFFFFFFF00007FFFFFFC00003FFFFFE000002B387FB730>68 D<7FFFFFFFFF00FFFFFF FFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF8003F800003F8003F800 003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800003F8003F800 003F8003F800001F0003F80000000003F80000000003F80000000003F80000000003F800 7C000003F800FE000003F800FE000003F800FE000003F800FE000003FFFFFE000003FFFF FE000003FFFFFE000003FFFFFE000003FFFFFE000003FFFFFE000003F800FE000003F800 FE000003F800FE000003F800FE000003F8007C000003F80000000003F80000000003F800 00000003F80000000003F80000000003F8000007C003F800000FE003F800000FE003F800 000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800000FE003F800 000FE07FFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE0FFFFFFFFFFE07FFFFF FFFFC02B387EB730>I<3FFFF80000007FFFFC000000FFFFFE000000FFFFFE0000007FFF FC0000003FFFF800000001FC0000000001FC0000000001FC0000000001FC0000000001FC 0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC 0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC 0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC 0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC 0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC 00000F8001FC00001FC001FC00001FC001FC00001FC001FC00001FC001FC00001FC001FC 00001FC001FC00001FC001FC00001FC001FC00001FC03FFFFFFFFFC07FFFFFFFFFC0FFFF FFFFFFC0FFFFFFFFFFC07FFFFFFFFFC03FFFFFFFFF802A387EB730>76 D<3FF80000FFE07FFC0001FFF0FFFE0003FFF8FFFE0003FFF87FFE0003FFF03FFF0007FF E007FF0007FF0007EF0007BF0007EF800FBF0007EF800FBF0007EF800FBF0007E7C01F3F 0007E7C01F3F0007E7C01F3F0007E7C01F3F0007E7E03F3F0007E3E03E3F0007E3E03E3F 0007E3F07E3F0007E3F07E3F0007E1F07C3F0007E1F07C3F0007E1F8FC3F0007E1F8FC3F 0007E0F8F83F0007E0F8F83F0007E0FDF83F0007E07DF03F0007E07DF03F0007E07DF03F 0007E07FF03F0007E03FE03F0007E03FE03F0007E03FE03F0007E01FC03F0007E01FC03F 0007E007003F0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F 0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F0007E000003F 0007E000003F0007E000003F003FFC0001FFE07FFE0003FFF0FFFF0007FFF8FFFF0007FF F87FFE0003FFF03FFC0001FFE02D387FB730>I<3FFC001FFF807FFE003FFFC0FFFF007F FFE0FFFF007FFFE07FFF803FFFC03FFF801FFF8003FF8001F80003F7C001F80003F7C001 F80003F7C001F80003F3E001F80003F3E001F80003F3E001F80003F3F001F80003F1F001 F80003F1F001F80003F1F801F80003F1F801F80003F0F801F80003F0FC01F80003F0FC01 F80003F07C01F80003F07E01F80003F07E01F80003F03E01F80003F03F01F80003F03F01 F80003F01F01F80003F01F01F80003F01F81F80003F01F81F80003F00F81F80003F00FC1 F80003F00FC1F80003F007C1F80003F007E1F80003F007E1F80003F003E1F80003F003F1 F80003F003F1F80003F001F1F80003F001F1F80003F001F9F80003F000F9F80003F000F9 F80003F000F9F80003F0007DF80003F0007DF80003F0007DF80003F0003FF8003FFF003F F8007FFF803FF800FFFFC01FF800FFFFC01FF8007FFF800FF8003FFF0007F0002B387EB7 30>I<003FFFE00001FFFFFC0007FFFFFF000FFFFFFF801FFFFFFFC03FFFFFFFE03FF800 FFE03FE0003FE07F80000FF07F80000FF07F000007F07F000007F07F000007F07F000007 F0FF000007F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8 FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE 000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE00 0003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FF0000 07F8FF000007F87F000007F07F000007F07F000007F07F80000FF07F80000FF07FC0001F F03FE0003FE03FF800FFE03FFFFFFFE01FFFFFFFC00FFFFFFF8007FFFFFF0001FFFFFC00 003FFFE000253A7BB830>I<7FFFFFF00000FFFFFFFE0000FFFFFFFF8000FFFFFFFFE000 FFFFFFFFF0007FFFFFFFF80003F8003FF80003F8000FFC0003F80003FE0003F80001FE00 03F80000FF0003F80000FF0003F800007F0003F800007F8003F800003F8003F800003F80 03F800003F8003F800003F8003F800003F8003F800003F8003F800007F8003F800007F00 03F80000FF0003F80000FF0003F80001FE0003F80003FE0003F8000FFC0003F8003FF800 03FFFFFFF80003FFFFFFF00003FFFFFFE00003FFFFFF800003FFFFFE000003FFFFF00000 03F80000000003F80000000003F80000000003F80000000003F80000000003F800000000 03F80000000003F80000000003F80000000003F80000000003F80000000003F800000000 03F80000000003F80000000003F80000000003F8000000007FFFC0000000FFFFE0000000 FFFFE0000000FFFFE0000000FFFFE00000007FFFC000000029387EB730>I<3FFFFF8000 007FFFFFF00000FFFFFFFC0000FFFFFFFF00007FFFFFFF80003FFFFFFFC00003F801FFE0 0003F8003FF00003F8001FF00003F8000FF80003F80007F80003F80003F80003F80003FC 0003F80001FC0003F80001FC0003F80001FC0003F80001FC0003F80001FC0003F80003FC 0003F80003F80003F80007F80003F8000FF80003F8001FF00003F8003FF00003F801FFE0 0003FFFFFFC00003FFFFFF800003FFFFFF000003FFFFFE000003FFFFFF000003FFFFFF80 0003F800FFC00003F8003FE00003F8001FE00003F8000FE00003F8000FF00003F80007F0 0003F80007F00003F80007F00003F80007F00003F80007F00003F80007F00003F80007F0 0003F80007F00003F80007F0F803F80007F1FC03F80007F1FC03F80007F1FC03F80007F1 FC03F80007F1FC3FFF8003FBFC7FFFC003FFF8FFFFE001FFF8FFFFE001FFF07FFFC000FF E03FFF80007FC0000000001F002E397FB730>82 D<000FF803C0007FFF03E001FFFFC7E0 03FFFFF7E007FFFFFFE00FFFFFFFE01FF80FFFE03FE001FFE03FC000FFE07F80007FE07F 00003FE0FF00003FE0FE00001FE0FE00001FE0FE00000FE0FE00000FE0FE00000FE0FF00 000FE0FF000007C07F000000007F800000007FC00000003FF00000001FFE0000001FFFF0 00000FFFFF000007FFFFE00001FFFFF80000FFFFFC00001FFFFF000003FFFF8000003FFF C0000001FFC00000007FE00000001FE00000000FF00000000FF000000007F800000007F8 7C000003F8FE000003F8FE000003F8FE000003F8FE000003F8FE000003F8FF000007F8FF 000007F0FF800007F0FFC0000FE0FFE0001FE0FFF8003FC0FFFF00FFC0FFFFFFFF80FFFF FFFF00FDFFFFFE00FC7FFFF800F81FFFF0007801FF8000253A7BB830>I<7FFF001FFFC0 FFFF803FFFE0FFFF803FFFE0FFFF803FFFE0FFFF803FFFE07FFF001FFFC003F80003F800 03FC0007F80003FC0007F80001FE000FF00001FE000FF00000FF000FE00000FF001FE000 007F001FC000007F803FC000003F803F8000003FC07F8000001FC07F0000001FC07F0000 000FE0FE0000000FE0FE0000000FF1FE00000007F1FC00000007F1FC00000003FBF80000 0003FBF800000001FBF000000001FFF000000000FFE000000000FFE0000000007FC00000 00007FC0000000007FC0000000003F80000000003F80000000003F80000000003F800000 00003F80000000003F80000000003F80000000003F80000000003F80000000003F800000 00003F80000000003F80000000003F80000000003F80000000003F80000000003F800000 00003F8000000003FFF800000007FFFC0000000FFFFE0000000FFFFE00000007FFFC0000 0003FFF800002B387EB730>89 D<003FFC00000001FFFF80000003FFFFE0000007FFFFF0 00000FFFFFF800001FFFFFFC00001FF00FFE00001FE001FF00001FE000FF00001FE0007F 80000FC0003F80000780003FC0000000001FC0000000001FC0000000001FC0000000001F C0000000FFFFC000000FFFFFC000007FFFFFC00001FFFFFFC00007FFFFFFC0000FFFFFFF C0001FFFC01FC0003FFC001FC0007FE0001FC0007F80001FC000FF00001FC000FE00001F C000FE00001FC000FE00001FC000FE00001FC000FF00003FC000FF00003FC0007F80007F C0007FC001FFC0003FF80FFFFFC01FFFFFFFFFE01FFFFFFFFFE007FFFFF7FFE003FFFFC3 FFE000FFFF00FFC0003FF00000002B2A7CA830>97 D<3FFC000000007FFE00000000FFFE 00000000FFFE000000007FFE000000003FFE0000000000FE0000000000FE0000000000FE 0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE 0000000000FE0000000000FE03FE000000FE1FFF800000FE7FFFE00000FEFFFFF00000FF FFFFFC0000FFFFFFFE0000FFFE07FE0000FFF001FF0000FFE000FF8000FFC0007F8000FF 80003FC000FF00001FC000FE00001FE000FE00000FE000FE00000FE000FE00000FF000FE 000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE 000007F000FE000007F000FE00000FF000FE00000FF000FE00000FE000FF00000FE000FF 00001FE000FF80003FC000FF80003FC000FFC0007F8000FFE000FF8000FFF003FF0000FF FC0FFE0000FFFFFFFC0000FFFFFFF80000FEFFFFF000007E7FFFC000003C1FFF00000000 03FC00002C3980B730>I<0000FFE0000007FFFC00001FFFFE00007FFFFF0000FFFFFF80 01FFFFFFC003FF807FC007FC003FC00FF8003FC01FF0003FC01FE0001F803FC0000F003F 800000007F800000007F000000007F00000000FF00000000FE00000000FE00000000FE00 000000FE00000000FE00000000FE00000000FE00000000FE00000000FF000000007F0000 00007F000000007F800000003F800007C03FC0000FE01FE0000FE01FF0001FE00FF8001F C007FE003FC007FFC0FF8003FFFFFF8000FFFFFF00007FFFFE00001FFFF8000007FFF000 0001FF8000232A7AA830>I<000001FFE000000003FFF000000007FFF000000007FFF000 000003FFF000000001FFF00000000007F00000000007F00000000007F00000000007F000 00000007F00000000007F00000000007F00000000007F00000000007F00000000007F000 0003FE07F000001FFF87F000003FFFE7F00000FFFFFFF00001FFFFFFF00003FFFFFFF000 07FF03FFF0000FFC00FFF0001FF0003FF0001FE0001FF0003FC0001FF0003FC0000FF000 7F800007F0007F000007F0007F000007F000FF000007F000FF000007F000FE000007F000 FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000 FE000007F000FF000007F0007F00000FF0007F00000FF0007F80000FF0003F80001FF000 3FC0003FF0001FE0003FF0001FF0007FF0000FF801FFF00007FE07FFFFC003FFFFFFFFE0 01FFFFFFFFF000FFFFF7FFF0007FFFC7FFE0001FFF03FFC00007FC0000002C397DB730> I<0001FF00000007FFE000001FFFF800007FFFFC0000FFFFFE0001FFFFFF0003FF81FF80 07FC007FC00FF8003FC01FE0001FE01FE0000FE03FC0000FF03F800007F07F800007F07F 000007F07F000003F8FF000003F8FE000003F8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFF FFFFF8FFFFFFFFF8FFFFFFFFF0FE00000000FF000000007F000000007F000000007F8000 00003F800001F03FC00003F81FE00003F80FF00003F80FF80007F807FE001FF003FFC07F E001FFFFFFE000FFFFFFC0003FFFFF80001FFFFE000007FFF8000000FFC000252A7CA830 >I<000000FF80000007FFE000001FFFF000003FFFF000007FFFF80000FFFFF80001FF87 F80003FE07F80003FC03F00007F800C00007F000000007F000000007F000000007F00000 0007F000000007F000000007F000000007F000003FFFFFFFC07FFFFFFFE0FFFFFFFFE0FF FFFFFFE0FFFFFFFFE07FFFFFFFC00007F000000007F000000007F000000007F000000007 F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0 00000007F000000007F000000007F000000007F000000007F000000007F000000007F000 000007F000000007F000000007F000000007F000000007F000000007F000000007F00000 0007F000003FFFFFFE007FFFFFFF00FFFFFFFF80FFFFFFFF807FFFFFFF003FFFFFFE0025 397DB830>I<0003FC00FF00001FFF87FFC0003FFFDFFFC000FFFFFFFFE001FFFFFFFFE0 03FFFFFFFFE007FE07FF8FE007F801FE07C00FF000FF00000FF000FF00000FE0007F0000 1FE0007F80001FC0003F80001FC0003F80001FC0003F80001FC0003F80001FC0003F8000 1FE0007F80000FE0007F00000FF000FF00000FF000FF000007F801FE000007FE07FE0000 07FFFFFC000007FFFFF800000FFFFFF000000FFFFFC000000FDFFF8000000FC3FC000000 0FC0000000000FC0000000000FC0000000000FE0000000000FF00000000007FFFFF00000 07FFFFFF000003FFFFFFC00007FFFFFFF0000FFFFFFFF8001FFFFFFFFC003FE0001FFE00 3F800001FE007F0000007F007E0000003F00FE0000003F80FC0000001F80FC0000001F80 FC0000001F80FC0000001F80FC0000001F80FE0000003F807F0000007F007F800000FF00 3FC00001FE003FF00007FE001FFF007FFC000FFFFFFFF80007FFFFFFF00001FFFFFFC000 007FFFFF0000001FFFFC00000001FFC000002B3E7DA730>I<3FFC000000007FFE000000 00FFFE00000000FFFE000000007FFE000000003FFE0000000000FE0000000000FE000000 0000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000000 0000FE0000000000FE0000000000FE01FE000000FE0FFF800000FE3FFFE00000FEFFFFF0 0000FFFFFFF80000FFFFFFF80000FFFE07FC0000FFF803FC0000FFE001FE0000FFC001FE 0000FF8000FE0000FF8000FE0000FF0000FE0000FF0000FE0000FE0000FE0000FE0000FE 0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE 0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE 0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE 003FFFF81FFFF87FFFFC3FFFFCFFFFFE3FFFFEFFFFFE3FFFFE7FFFFC3FFFFC3FFFF81FFF F82F3880B730>I<0000E000000003F800000003F800000007FC00000007FC00000007FC 00000003F800000003F800000000E0000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000001FFFF800003FFFFC0000 7FFFFC00007FFFFC00003FFFFC00001FFFFC00000001FC00000001FC00000001FC000000 01FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001 FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC 00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 000001FC00000001FC00003FFFFFFFC07FFFFFFFE0FFFFFFFFE0FFFFFFFFE07FFFFFFFE0 3FFFFFFFC023397AB830>I<7FF800000000FFFC00000000FFFC00000000FFFC00000000 FFFC000000007FFC0000000000FC0000000000FC0000000000FC0000000000FC00000000 00FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC00000000 00FC0000000000FC03FFFF8000FC07FFFFC000FC07FFFFE000FC07FFFFE000FC07FFFFC0 00FC03FFFF8000FC001FE00000FC003FC00000FC007F800000FC00FF000000FC01FE0000 00FC03FC000000FC0FF8000000FC1FF0000000FC3FE0000000FC7FC0000000FCFF800000 00FDFFC0000000FFFFE0000000FFFFF0000000FFF7F0000000FFE3F8000000FFC1FC0000 00FF81FE000000FF00FF000000FE007F000000FC003F800000FC001FC00000FC001FE000 00FC000FF00000FC0007F00000FC0003F80000FC0001FC007FFFF81FFFE0FFFFFC3FFFF0 FFFFFC3FFFF8FFFFFC3FFFF8FFFFFC3FFFF07FFFF81FFFE02D387FB730>107 D<7FFFF80000FFFFFC0000FFFFFC0000FFFFFC0000FFFFFC00007FFFFC00000001FC0000 0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC000000 01FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001 FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC 00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00 000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0000 0001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00007F FFFFFFF0FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF87FFFFFFFF025387BB730>I< 0000FC007E00007FC3FF01FF8000FFEFFF87FFC000FFFFFFCFFFE000FFFFFFDFFFE000FF FFFFFFFFF0007FFF0FFF87F00007FE07FF03F80007FC07FE03F80007F803FC01F80007F8 03FC01F80007F003F801F80007F003F801F80007F003F801F80007E003F001F80007E003 F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F0 01F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001 F80007E003F001F80007E003F001F80007E003F001F80007E003F001F80007E003F001F8 0007E003F001F80007E003F001F80007E003F001F8007FFE0FFF07FF80FFFF1FFF8FFFC0 FFFF1FFF8FFFC0FFFF1FFF8FFFC0FFFF1FFF8FFFC07FFE0FFF07FF80322881A730>I<00 0001FE00003FFC0FFF80007FFE3FFFE000FFFEFFFFF000FFFFFFFFF8007FFFFFFFF8003F FFFE07FC0000FFF803FC0000FFE001FE0000FFC001FE0000FF8000FE0000FF8000FE0000 FF0000FE0000FF0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE003FFFF81FFFF87FFFFC3FFFFCFF FFFE3FFFFEFFFFFE3FFFFE7FFFFC3FFFFC3FFFF81FFFF82F2880A730>I<0001FF000000 0FFFE000003FFFF800007FFFFC0000FFFFFE0003FFFFFF8003FF01FF8007FC007FC00FF8 003FE01FE0000FF01FE0000FF03FC00007F83F800003F87F800003FC7F000001FC7F0000 01FC7F000001FCFE000000FEFE000000FEFE000000FEFE000000FEFE000000FEFE000000 FEFE000000FEFE000000FEFF000001FE7F000001FC7F000001FC7F800003FC3F800003F8 3FC00007F83FE0000FF81FF0001FF00FF8003FE00FFC007FE007FF01FFC003FFFFFF8001 FFFFFF00007FFFFC00003FFFF800000FFFE0000001FF0000272A7CA830>I<000003FE00 003FFC1FFF80007FFE7FFFE000FFFEFFFFF000FFFFFFFFFC007FFFFFFFFE003FFFFE07FE 0000FFF001FF0000FFE000FF8000FFC0007F8000FF80003FC000FF00001FC000FE00001F E000FE00000FE000FE00000FE000FE00000FF000FE000007F000FE000007F000FE000007 F000FE000007F000FE000007F000FE000007F000FE000007F000FE000007F000FE00000F F000FE00000FF000FE00000FE000FF00000FE000FF00001FE000FF80003FC000FF80003F C000FFC0007F8000FFE000FF8000FFF003FF0000FFFC0FFE0000FFFFFFFC0000FFFFFFF8 0000FEFFFFF00000FE7FFFC00000FE1FFF000000FE03FC000000FE0000000000FE000000 0000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE000000 0000FE0000000000FE0000000000FE0000000000FE0000000000FE000000003FFFF80000 007FFFFC000000FFFFFE000000FFFFFE0000007FFFFC0000003FFFF80000002C3C80A730 >I<00000007F8003FFF803FFF007FFFC0FFFF80FFFFC3FFFF80FFFFCFFFFFC07FFFDFFF FFC03FFFFFFC3FC0001FFFE03FC0001FFF801F80001FFF000F00001FFE000000001FFC00 0000001FF8000000001FF0000000001FF0000000001FE0000000001FE0000000001FE000 0000001FE0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000 0000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000 0000001FC0000000001FC0000000001FC0000000001FC00000003FFFFFFC00007FFFFFFE 0000FFFFFFFF0000FFFFFFFF00007FFFFFFE00003FFFFFFC00002A287EA730>114 D<001FFC1E0001FFFF9F0007FFFFFF000FFFFFFF001FFFFFFF003FFFFFFF007FF007FF00 7F8001FF00FE0000FF00FC00007F00FC00007F00FC00007F00FC00007F00FE00003E007F 000000007FE00000003FFF0000001FFFFC00000FFFFF800007FFFFE00001FFFFF800007F FFFC000003FFFE0000000FFF00000000FF807C00007F80FE00001FC0FE00001FC0FE0000 0FC0FF00000FC0FF00000FC0FF80000FC0FF80001FC0FFC0003F80FFE0007F80FFFC03FF 00FFFFFFFF00FFFFFFFE00FFFFFFFC00FCFFFFF000F83FFFC000780FFE0000222A79A830 >I<0007800000000FC00000001FC00000001FC00000001FC00000001FC00000001FC000 00001FC00000001FC00000001FC00000001FC000003FFFFFFFE07FFFFFFFF0FFFFFFFFF0 FFFFFFFFF0FFFFFFFFF07FFFFFFFE0001FC00000001FC00000001FC00000001FC0000000 1FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001F C00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC00000001FC0 00F8001FC001FC001FC001FC001FC001FC001FC001FC001FC001FC001FE003FC000FE007 F8000FF007F8000FFC1FF00007FFFFE00003FFFFC00003FFFF800001FFFF0000007FFC00 00001FF00026337EB130>I<3FFC003FFC007FFE007FFE00FFFE00FFFE00FFFE00FFFE00 7FFE007FFE003FFE003FFE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 00FE0001FE0000FE0001FE0000FE0003FE0000FE0007FE0000FF000FFE00007FC07FFFF8 007FFFFFFFFC003FFFFFFFFE001FFFFFFFFE000FFFFEFFFC0007FFF87FF80000FFC00000 2F2880A630>I<3FFFC07FFF807FFFE0FFFFC0FFFFE0FFFFE0FFFFE0FFFFE07FFFE0FFFF C03FFFC07FFF8001F80003F00001F80003F00001FC0007F00000FC0007E00000FC0007E0 0000FE000FE000007E000FC000007E000FC000007F001FC000003F001F8000003F001F80 00003F803F8000001F803F0000001F803F0000001FC07F0000000FC07E0000000FC07E00 00000FE0FE00000007E0FC00000007E0FC00000007F1FC00000003F1F800000003F1F800 000003F1F800000001FBF000000001FBF000000001FBF000000001FFF000000000FFE000 000000FFE000000000FFE0000000007FC0000000003F8000002B277EA630>I<3FFFC01F FFE07FFFE03FFFF0FFFFE03FFFF8FFFFE03FFFF87FFFE03FFFF03FFFC01FFFE007E00000 3F0007E000003F0007F000007F0003F000007E0003F000007E0003F000007E0003F00000 7E0003F000007E0003F80000FE0001F80000FC0001F80F80FC0001F81FC0FC0001F83FE0 FC0001F83FE0FC0001F83FE0FC0000FC7FF1F80000FC7FF1F80000FC7DF1F80000FC7DF1 F80000FCFDF9F800007CFDF9F000007CF8F9F000007CF8F9F000007CF8F9F000007EF8FB F000007EF8FBF000003FF07FE000003FF07FE000003FF07FE000003FE03FE000003FE03F E000001FE03FC000000F800F80002D277FA630>I E /Fd 32 119 df<0000000FFF0000000001FFFFC00000000FFFFFF00000007FFFFFF8000001FFF803FC 000003FFC000FE00000FFF0003FE00001FFE0007FF00003FFC000FFF00003FF8000FFF00 007FF0000FFF00007FF0001FFF8000FFF0000FFF0000FFE0000FFF0000FFE0000FFF0000 FFE0000FFF0000FFE00007FE0000FFE00001F80000FFE00000000000FFE00000000000FF E00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0 01FFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFF FFFF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003 FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF 8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF80 00FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000 FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FF E00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF8000FFE0 0003FF8000FFE00003FF8000FFE00003FF8000FFE00003FF807FFFFFC1FFFFFF7FFFFFC1 FFFFFF7FFFFFC1FFFFFF7FFFFFC1FFFFFF7FFFFFC1FFFFFF38467EC53E>12 D<07C0001FF0003FF8007FFC00FFFE00FFFF00FFFF00FFFF00FFFF80FFFF80FFFF807FFF 803FFF801FF78007C780000780000F80000F80000F00000F00001F00001E00003E00003E 00007C0000FC0000F80001F00003E00007E0000FC0001F80001F00000C0000112278C41F >39 D<000000001F8000000000000000001F8000000000000000003FC000000000000000 003FC000000000000000007FE000000000000000007FE000000000000000007FE0000000 0000000000FFF00000000000000000FFF00000000000000001FFF80000000000000001FF F80000000000000001FFF80000000000000003FFFC0000000000000003FFFC0000000000 000007FFFE0000000000000007FFFE0000000000000007FFFE000000000000000FFFFF00 0000000000000F9FFF000000000000001F9FFF800000000000001F1FFF80000000000000 1F0FFF800000000000003F0FFFC00000000000003E07FFC00000000000007E07FFE00000 000000007C07FFE00000000000007C03FFE0000000000000FC03FFF0000000000000F801 FFF0000000000001F801FFF8000000000001F001FFF8000000000001F000FFF800000000 0003F000FFFC000000000003E0007FFC000000000007E0007FFE000000000007C0007FFE 000000000007C0003FFE00000000000FC0003FFF00000000000F80001FFF00000000001F 80001FFF80000000001F00000FFF80000000001F00000FFF80000000003F00000FFFC000 0000003E000007FFC0000000007E000007FFE0000000007FFFFFFFFFE0000000007FFFFF FFFFE000000000FFFFFFFFFFF000000000FFFFFFFFFFF000000001FFFFFFFFFFF8000000 01F0000000FFF800000001F0000000FFF800000003F0000000FFFC00000003E00000007F FC00000007E00000007FFE00000007C00000003FFE00000007C00000003FFE0000000F80 0000003FFF0000000F800000001FFF0000001F800000001FFF8000001F000000000FFF80 00003F000000000FFFC000003E000000000FFFC000007E0000000007FFC000FFFFFF0000 0FFFFFFFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFFFFF0FFFFFF00000FFFFFFFF0FF FFFF00000FFFFFFFF04C457CC455>65 D68 DI75 DIII<00000007FFC0000000000000FFFFFE000000000007FFFFFFC0000000001F FFFFFFF0000000007FFE00FFFC00000001FFF0001FFF00000007FF800003FFC000000FFF 000001FFE000001FFC0000007FF000003FF80000003FF800007FF00000001FFC0000FFF0 0000001FFE0001FFE00000000FFF0003FFC000000007FF8003FFC000000007FF8007FF80 00000003FFC007FF8000000003FFC00FFF0000000001FFE00FFF0000000001FFE01FFF00 00000001FFF01FFE0000000000FFF03FFE0000000000FFF83FFE0000000000FFF83FFE00 00000000FFF87FFE0000000000FFFC7FFC00000000007FFC7FFC00000000007FFC7FFC00 000000007FFC7FFC00000000007FFCFFFC00000000007FFEFFFC00000000007FFEFFFC00 000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00 000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00 000000007FFEFFFC00000000007FFEFFFC00000000007FFE7FFC00000000007FFC7FFE00 00000000FFFC7FFE0000000000FFFC7FFE0000000000FFFC3FFE0000000000FFF83FFE00 00000000FFF83FFF0000000001FFF81FFF0000000001FFF01FFF0000000001FFF01FFF80 00000003FFF00FFF8000000003FFE00FFF8000000003FFE007FFC000000007FFC003FFC0 00000007FF8003FFE00000000FFF8001FFF00000001FFF0000FFF80000003FFE00007FFC 0000007FFC00003FFE000000FFF800001FFF000001FFF000000FFFC00007FFE0000007FF F0001FFFC0000001FFFE00FFFF00000000FFFFFFFFFE000000003FFFFFFFF80000000007 FFFFFFC00000000000FFFFFE00000000000007FFC000000047467AC454>II<0000FFE0001C000007FFFE003C00003FFFFF807C0000FFFFFFE0FC0001FFFFFFF9FC 0003FF801FFFFC0007FC0001FFFC000FF800007FFC001FF000003FFC003FE000000FFC00 3FC0000007FC007FC0000003FC007F80000003FC007F80000001FC007F80000000FC00FF 80000000FC00FF800000007C00FF800000007C00FFC00000007C00FFC00000007C00FFE0 0000003C00FFF00000003C00FFF80000003C00FFFC00000000007FFE00000000007FFFE0 000000007FFFFE000000003FFFFFF00000003FFFFFFF0000001FFFFFFFE000001FFFFFFF FC00000FFFFFFFFE000007FFFFFFFF800003FFFFFFFFC00001FFFFFFFFE000007FFFFFFF F000001FFFFFFFF8000007FFFFFFFC000000FFFFFFFC0000000FFFFFFE00000000FFFFFE 0000000007FFFF00000000007FFF00000000003FFF00000000000FFF800000000007FF80 0000000003FF80F000000003FF80F000000001FF80F000000001FF80F000000000FF80F0 00000000FF80F800000000FF80F800000000FF80F800000000FF00FC00000000FF00FC00 000000FF00FE00000001FF00FF00000001FE00FF80000003FE00FFC0000003FC00FFE000 0007FC00FFF800000FF800FFFF00003FF000FFFFF800FFE000FE7FFFFFFFC000FC1FFFFF FF0000F807FFFFFC0000F000FFFFF00000E00007FF80000031467AC43E>83 D85 DII<0001FFE0000000 001FFFFE000000007FFFFF80000001FFFFFFE0000003FE007FF8000007FC001FFC000007 FE000FFE00000FFF0007FF00000FFF0007FF00000FFF0003FF80000FFF0003FF80000FFF 0003FF80000FFF0001FFC00007FE0001FFC00003FC0001FFC00000F00001FFC000000000 01FFC00000000001FFC00000000001FFC00000000001FFC000000003FFFFC0000000FFFF FFC0000007FFFFFFC000003FFFF1FFC00000FFFC01FFC00003FFE001FFC0000FFF8001FF C0001FFE0001FFC0003FFC0001FFC0003FF80001FFC0007FF80001FFC0007FF00001FFC0 00FFF00001FFC000FFE00001FFC000FFE00001FFC000FFE00001FFC000FFE00003FFC000 FFE00003FFC000FFF00007FFC0007FF8000FFFC0007FF8001FFFF0003FFE003EFFFFC01F FF80FC7FFFC007FFFFF87FFFC003FFFFE01FFFC0007FFF8007FFC0000FFC00000000322F 7DAD36>97 D<00003FFC00000001FFFFC000000FFFFFF000003FFFFFFC00007FF003FE00 00FFC001FF0003FF8003FF0007FF0007FF8007FE0007FF800FFE0007FF801FFC0007FF80 1FFC0007FF803FF80007FF803FF80003FF007FF80001FE007FF8000078007FF000000000 7FF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000 FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000 FFF0000000007FF8000000007FF8000000007FF8000000003FF8000000003FFC000003C0 3FFC000003C01FFE000007C00FFE000007800FFF00000F8007FF80001F0003FFC0003E00 01FFF0007C00007FFC03F800003FFFFFF000000FFFFFC0000003FFFF000000003FF80000 2A2F7CAD32>99 D<0000000003FE0000000007FFFE0000000007FFFE0000000007FFFE00 00000007FFFE0000000007FFFE00000000001FFE00000000000FFE00000000000FFE0000 0000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE000000 00000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000 000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0000003FE0 0FFE000003FFFC0FFE00000FFFFF8FFE00003FFFFFCFFE0000FFF807FFFE0001FFC001FF FE0003FF80007FFE0007FF00003FFE000FFE00001FFE000FFC00000FFE001FFC00000FFE 003FF800000FFE003FF800000FFE003FF800000FFE007FF800000FFE007FF000000FFE00 7FF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FF F000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF0 00000FFE00FFF000000FFE00FFF000000FFE007FF000000FFE007FF000000FFE007FF000 000FFE007FF800000FFE003FF800000FFE003FF800000FFE001FFC00001FFE001FFC0000 1FFE000FFE00003FFE0007FE00007FFE0003FF0000FFFF0001FFC003FFFFFC00FFF01FEF FFFC007FFFFF8FFFFC001FFFFE0FFFFC0007FFF80FFFFC00007FC00FF80036467CC43E> I<00003FF800000003FFFF8000000FFFFFE000003FFFFFF000007FF83FF80000FFC007FC 0001FF8003FE0003FF0001FF0007FE0000FF800FFC0000FF801FFC00007FC01FF800007F C03FF800003FE03FF800003FE07FF800003FE07FF000003FE07FF000003FF07FF000001F F0FFF000001FF0FFF000001FF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFF F0FFF000000000FFF000000000FFF000000000FFF000000000FFF0000000007FF0000000 007FF0000000007FF8000000007FF8000000003FF8000000003FF8000000F01FFC000000 F01FFC000001F00FFE000001E007FF000003E003FF800007C001FFC0000F8000FFF0003F 00007FFE01FE00001FFFFFFC000007FFFFF0000001FFFFC00000001FFE00002C2F7DAD33 >I<000000FF8000000FFFE000007FFFF00001FFFFF80003FF8FFC000FFE0FFE001FFC1F FE001FF81FFE003FF81FFE007FF01FFE007FF01FFE007FF00FFC00FFE00FFC00FFE003F0 00FFE000C000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE0000000FFE0000000FFE0000000FFE0000000FFE00000FFFFFFF800FFFFFFF800FFFF FFF800FFFFFFF800FFFFFFF80000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 0000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000 00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000 FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF E000007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE00027467DC522>I<00 00FFE0007E00000FFFFE03FF80003FFFFF8FFF8000FFFFFFFFFFC001FFC07FFF3FC003FF 001FF83FC007FE000FFC3FC00FFC0007FE1F801FFC0007FF0F001FF80003FF00001FF800 03FF00003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003 FF80003FF80003FF80003FF80003FF80003FF80003FF80001FF80003FF00001FF80003FF 00001FFC0007FF00000FFC0007FE000007FE000FFC000003FF001FF8000001FFC07FF000 0003FFFFFFE0000003FFFFFF800000078FFFFE0000000780FFE00000000F800000000000 0F8000000000000F8000000000000F8000000000000FC000000000000FE000000000000F F000000000000FFFFFFFC000000FFFFFFFFC000007FFFFFFFF800007FFFFFFFFE00003FF FFFFFFF00001FFFFFFFFFC0000FFFFFFFFFC0003FFFFFFFFFE000FFFFFFFFFFF001FF000 007FFF003FC0000007FF007F80000001FF807F80000000FF80FF00000000FF80FF000000 007F80FF000000007F80FF000000007F80FF000000007F80FF80000000FF807F80000000 FF007FC0000001FF003FE0000003FE001FF0000007FC000FFE00003FF80007FFC001FFF0 0001FFFFFFFFC000007FFFFFFF0000000FFFFFF8000000007FFF00000032427DAC38>I< 007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC000000000FF FFC00000000003FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 0000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000 00000001FFC00000000001FFC00000000001FFC00000000001FFC007FE000001FFC03FFF 800001FFC0FFFFE00001FFC1FFFFF80001FFC7F03FFC0001FFCF801FFC0001FFDF000FFE 0001FFDE000FFE0001FFFC000FFE0001FFF80007FF0001FFF00007FF0001FFF00007FF00 01FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007 FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFF FEFFFFFF83FFFFFEFFFFFF83FFFFFE37457CC43E>I<007C0001FF0003FF8007FFC007FF C00FFFE00FFFE00FFFE00FFFE00FFFE007FFC007FFC003FF8001FF00007C000000000000 00000000000000000000000000000000000000000000000000007FC07FFFC07FFFC07FFF C07FFFC07FFFC003FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18467CC520>I<007FC000FFFFC000FFFFC000FF FFC000FFFFC000FFFFC00003FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000FFFFFF80FFFFFF80FF FFFF80FFFFFF80FFFFFF8019457CC420>108 D<007F8007FE00000FFC0000FFFF803FFF C0007FFF8000FFFF80FFFFF001FFFFE000FFFF81FFFFF803FFFFF000FFFF87F01FFC0FE0 3FF800FFFF8FC00FFE1F801FFC0003FF9F000FFF3E001FFE0001FF9E0007FF3C000FFE00 01FFBC0007FF78000FFE0001FFF80003FFF00007FF0001FFF80003FFF00007FF0001FFF0 0003FFE00007FF0001FFE00003FFC00007FF0001FFE00003FFC00007FF0001FFE00003FF C00007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007 FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001 FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC000 03FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF80 0007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF 0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FF C00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003 FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF00FFFFFF81FFFFFF03 FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFE FFFFFF81FFFFFF03FFFFFE572D7CAC5E>I<007F8007FE0000FFFF803FFF8000FFFF80FF FFE000FFFF81FFFFF800FFFF87F03FFC00FFFF8F801FFC0003FF9F000FFE0001FF9E000F FE0001FFBC000FFE0001FFF80007FF0001FFF00007FF0001FFF00007FF0001FFE00007FF 0001FFE00007FF0001FFE00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00 01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001 FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0 0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000 07FF0001FFC00007FF00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FF FFFEFFFFFF83FFFFFE372D7CAC3E>I<00001FFC0000000001FFFFC000000007FFFFF000 00001FFFFFFC0000007FF80FFF000000FFC001FF800001FF8000FFC00003FE00003FE000 07FE00003FF0000FFC00001FF8000FF800000FF8001FF800000FFC001FF800000FFC003F F800000FFE003FF0000007FE007FF0000007FF007FF0000007FF007FF0000007FF007FF0 000007FF00FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF000 0007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF00000 07FF807FF0000007FF007FF0000007FF007FF0000007FF007FF0000007FF003FF800000F FE003FF800000FFE001FF800000FFC001FFC00001FFC000FFC00001FF80007FE00003FF0 0007FE00003FF00003FF8000FFE00001FFC001FFC000007FF80FFF0000003FFFFFFE0000 000FFFFFF800000001FFFFC0000000001FFC000000312F7DAD38>I<007FC00FF80000FF FFC0FFFF8000FFFFC3FFFFE000FFFFCFFFFFF800FFFFDFC03FFC00FFFFFF001FFE0003FF FC0007FF0001FFF80003FF8001FFF00003FFC001FFE00001FFE001FFC00001FFE001FFC0 0000FFF001FFC00000FFF001FFC000007FF801FFC000007FF801FFC000007FF801FFC000 007FF801FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC00000 3FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003F FC01FFC000003FFC01FFC000003FFC01FFC000007FF801FFC000007FF801FFC000007FF8 01FFC000007FF001FFC00000FFF001FFC00000FFF001FFC00001FFE001FFE00001FFC001 FFF00003FFC001FFF80007FF8001FFFC000FFF0001FFFE001FFE0001FFDFC07FFC0001FF CFFFFFF00001FFC3FFFFC00001FFC0FFFF000001FFC01FF0000001FFC00000000001FFC0 0000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000 00000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000 000001FFC000000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF800000 00FFFFFF8000000036407DAC3E>I<007F807F00FFFF81FFE0FFFF83FFF0FFFF8FFFF8FF FF8F8FFCFFFF9F1FFE03FFBE1FFE01FFBC1FFE01FFF81FFE01FFF81FFE01FFF01FFE01FF F00FFC01FFE007F801FFE001E001FFE0000001FFE0000001FFE0000001FFC0000001FFC0 000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC000 0001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC00000 01FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC00000FF FFFFE000FFFFFFE000FFFFFFE000FFFFFFE000FFFFFFE000272D7DAC2E>114 D<001FFC038000FFFF878003FFFFFF800FFFFFFF801FF003FF803FC000FF803F80003F80 7F00001F807E00001F80FE00000F80FE00000F80FE00000780FF00000780FF00000780FF 80000780FFE0000000FFFE0000007FFFF000007FFFFF00003FFFFFC0003FFFFFF0001FFF FFFC000FFFFFFE0003FFFFFF0001FFFFFF80007FFFFF80000FFFFFC000003FFFC0000003 FFE0000000FFE0F000003FE0F000003FE0F800001FE0F800000FE0F800000FE0FC00000F E0FC00000FE0FE00000FC0FF00001FC0FF00001FC0FF80003F80FFE0007F00FFF803FE00 FFFFFFFC00FCFFFFF800F03FFFE000E007FE0000232F7CAD2C>I<0001E000000001E000 000001E000000001E000000001E000000003E000000003E000000003E000000003E00000 0007E000000007E00000000FE00000000FE00000001FE00000001FE00000003FE0000000 7FE0000000FFE0000003FFE000000FFFFFFF80FFFFFFFF80FFFFFFFF80FFFFFFFF80FFFF FFFF8000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0 000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000 0000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000 00FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000FFE001E000 FFE001E000FFE001E000FFE003E000FFF003C0007FF003C0007FF007C0003FF80F80001F FC1F00000FFFFF000007FFFC000001FFF80000003FE00023407EBE2C>I118 D E /Fe 27 124 df<0000000007FF80000000003FFFE000000000FE00F800000001F0003E00000007 E0000E0000000FC0001F0000000F80007F0000001F8000FF0000003F0000FF0000003F00 00FF0000003F0000FE0000007E0000FE0000007E0000780000007E000000000000FE0000 00000000FC000000000000FC000000000000FC000000000001FC000000000001FC000000 000001F8000000000001F8000000000001F8000000000001F8000000000003F800000000 03FFFFFFFFF00003FFFFFFFFF00003FFFFFFFFE0000003F00007E0000007F0000FE00000 07E0000FC0000007E0000FC0000007E0000FC0000007E0001FC000000FE0001F8000000F C0001F8000000FC0001F8000000FC0003F8000000FC0003F0000001FC0003F0000001F80 003F0000001F80007F0000001F80007E0000001F80007E0000003F80007E0000003F0000 FE0000003F0000FC0000003F0000FC0000003F0000FC0000007F0001FC0000007E0001F8 1C00007E0001F81C00007E0001F81C00007E0003F81C0000FE0003F03C0000FC0003F038 0000FC0003F0380000FC0003F0780000FC0003F0700001FC0003F0700001F80001F0F000 01F80001F0E00001F80000F1C00001F800007F800003F000001F000003F0000000000003 F0000000000003F0000000000003E0000000000007E0000000000007E0000000001E07C0 000000007F07C0000000007F0FC000000000FF0F8000000000FF0F8000000000FF1F0000 000000FE1F0000000000F81E0000000000703C0000000000787800000000001FF0000000 000007C00000000000385383BF33>12 D<7FFFFE7FFFFE7FFFFEFFFFFEFFFFFE17057995 21>45 D<00000000FF8000E000000007FFF000E00000003FFFFC01C0000000FFC03E03C0 000003FC000F07C000000FF000078FC000001FE00003DF8000007F800001FF800000FF00 0000FF800001FE000000FF800003FC0000007F000007F80000007F00000FF00000007F00 001FE00000003F00003FC00000003E00007F800000003E0000FF800000003E0000FF0000 00003E0001FE000000003C0003FE000000003C0003FC000000003C0007FC000000003C00 07F80000000038000FF80000000038000FF80000000038001FF00000000038001FF00000 000000003FE00000000000003FE00000000000003FE00000000000007FE0000000000000 7FC00000000000007FC00000000000007FC0000000000000FFC0000000000000FF800000 00000000FF80000000000000FF80000000000000FF800001FFFFFE00FF000001FFFFFE00 FF000001FFFFFE00FF00000000FF8000FF00000000FF8000FF00000000FF0000FF000000 00FF0000FF00000001FF0000FF00000001FF0000FF00000001FE0000FF00000001FE0000 FF00000003FE00007F00000003FE00007F80000003FC00007F80000003FC00003F800000 07FC00003FC0000007FC00001FC0000007F800001FE000000FF800000FF000001FF80000 07F000003FF8000003F800007BF0000001FE0000F1F0000000FF0003E0F00000003FE01F 80F00000001FFFFF006000000007FFF80000000000007FC0000000003B4273BF46>71 D<0001FFFFFF01FFFFFF0003FFFFFF03FFFFFF0003FFFFFF03FFFFFF000003FF000003FF 00000003FE000003FE00000003FC000003FC00000003FC000003FC00000003FC000007FC 00000007FC000007FC00000007F8000007F800000007F8000007F800000007F800000FF8 0000000FF800000FF80000000FF000000FF00000000FF000000FF00000000FF000001FF0 0000001FF000001FF00000001FE000001FE00000001FE000001FE00000001FE000003FE0 0000003FE000003FE00000003FC000003FC00000003FC000003FC00000003FC000007FC0 0000007FC000007FC00000007F8000007F800000007F8000007F800000007F800000FF80 000000FFFFFFFFFF80000000FFFFFFFFFF00000000FFFFFFFFFF00000000FF000001FF00 000001FF000001FF00000001FE000001FE00000001FE000001FE00000001FE000003FE00 000003FE000003FE00000003FC000003FC00000003FC000003FC00000003FC000007FC00 000007FC000007FC00000007F8000007F800000007F8000007F800000007F800000FF800 00000FF800000FF80000000FF000000FF00000000FF000000FF00000000FF000001FF000 00001FF000001FF00000001FE000001FE00000001FE000001FE00000001FE000003FE000 00003FE000003FE00000003FC000003FC00000003FC000003FC00000007FC000007FC000 00007FC000007FC00000007F8000007F80000000FFC00000FFC00000FFFFFF80FFFFFF80 00FFFFFF80FFFFFF8000FFFFFF80FFFFFF8000483E7BBD44>I<0001FFFFFFC0000001FF FFFFC0000001FFFFFF8000000003FF000000000003FE000000000003FC000000000003FC 000000000003FC000000000007FC000000000007F8000000000007F8000000000007F800 000000000FF800000000000FF000000000000FF000000000000FF000000000001FF00000 0000001FE000000000001FE000000000001FE000000000003FE000000000003FC0000000 00003FC000000000003FC000000000007FC000000000007F8000000000007F8000000000 007F800000000000FF800000000000FF000000000000FF000000000000FF000000000001 FF000000000001FE000000000001FE000000000001FE000000000003FE000000000003FC 000000000003FC000000C00003FC000001E00007FC000001C00007F8000001C00007F800 0003C00007F800000380000FF800000380000FF000000780000FF000000700000FF00000 0F00001FF000000F00001FE000001E00001FE000001E00001FE000003E00003FE000007C 00003FC00000FC00003FC00001FC00007FC00003F800007FC00007F800007F80001FF800 00FF8000FFF000FFFFFFFFFFF000FFFFFFFFFFF000FFFFFFFFFFE000333E7BBD39>76 D<00007E00000001FF80000007C1C380001F80EFC0003F00FFC0007E007FC000FC007F80 01F8003F8003F0003F8003F0003F8007E0003F000FE0003F000FC0003F001FC0007F001F C0007E003F80007E003F80007E003F8000FE007F8000FC007F0000FC007F0000FC007F00 01FC00FF0001F800FE0001F800FE0001F800FE0003F800FE0003F038FC0003F038FC0003 F038FC0007F038FC0007E078FC000FE0707C000FE0707C001FE0F07E003FE0E03E007FE0 E03E00F3E1E01F01E3E1C00F8781E38003FF00FF0000FC003E00252977A72E>97 D<001FC0000FFFC0000FFF80000FFF8000003F8000003F8000003F0000003F0000007F00 00007F0000007E0000007E000000FE000000FE000000FC000000FC000001FC000001FC00 0001F8000001F8000003F8000003F8000003F0000003F07E0007F1FF8007F783E007EF01 F007FE01F00FF800F80FF800F80FF000FC0FE0007C1FC0007C1FC0007E1F80007E1F8000 FE3F8000FE3F8000FE3F0000FE3F0000FE7F0001FE7F0001FC7E0001FC7E0001FC7E0003 FCFE0003F8FC0003F8FC0003F8FC0007F0FC0007F0FC0007E0F8000FE0F8000FC0F8001F C0F8001F8078003F007C003F007C007E003C00FC003E01F8001E03E0000F07C00007FF00 0001F800001F4076BE2A>I<00001FE0000000FFF8000003F03E000007C00F00001F8007 00003F000780007E001F8000FC007F8001F8007F8003F0007F8007F0007F0007E0007F00 0FE0007E001FC00000001FC00000003F800000003F800000003F800000007F800000007F 000000007F000000007F00000000FF00000000FE00000000FE00000000FE00000000FE00 000000FE00000000FE00000000FC000003007E000007007E00000F007E00001E003E0000 3C003E000078001F0000F0001F0003E0000F800F800003E07E000001FFF80000003FC000 00212977A72A>I<000000003F800000001FFF800000001FFF000000001FFF0000000000 7F00000000007F00000000007E00000000007E0000000000FE0000000000FE0000000000 FC0000000000FC0000000001FC0000000001FC0000000001F80000000001F80000000003 F80000000003F80000000003F00000000003F00000000007F00000000007F00000000007 E00000007E07E0000001FF8FE0000007C1CFE000001F80EFC000003F00FFC000007E007F C00000FC007FC00001F8003F800003F0003F800003F0003F800007E0003F80000FE0003F 00000FC0003F00001FC0007F00001FC0007F00003F80007E00003F80007E00003F8000FE 00007F8000FE00007F0000FC00007F0000FC00007F0001FC0000FF0001FC0000FE0001F8 0000FE0001F80000FE0003F80000FE0003F83800FC0003F03800FC0003F03800FC0007F0 3800FC0007F07800FC000FE070007C000FE070007C001FE0F0007E003FE0E0003E007FE0 E0003E00F3E1E0001F01E3E1C0000F8781E3800003FF00FF000000FC003E0000294077BE 2E>I<00003F800001FFE00007E0F8001F803C003E003C00FC001E01F8001E03F0001E07 F0001E0FE0003E0FC0003C1FC0003C3F80007C3F8000F83F8003F07F000FE07F00FF80FF FFFC00FFFFC000FE000000FE000000FE000000FE000000FC000000FC000000FC000000FC 000000FC000000FC000000FC000006FC00000EFC00001E7C00003C7C0000783E0000F03E 0001E01F0007C00F801F0007C0FC0001FFF000007F80001F2976A72A>I<000000007C00 00000001FF0000000007C7800000000F83C00000001F87C00000001F1FC00000003F3FC0 0000003F3FC00000007E3FC00000007E3FC00000007E3F800000007E0E00000000FC0000 000000FC0000000000FC0000000000FC0000000001FC0000000001F80000000001F80000 000001F80000000001F80000000003F80000000003F00000000003F00000000003F00000 0003FFFFF8000003FFFFF8000003FFFFF800000007E00000000007E00000000007E00000 00000FE0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC00000 00001FC0000000001F80000000001F80000000001F80000000001F80000000003F800000 00003F00000000003F00000000003F00000000003F00000000007F00000000007E000000 00007E00000000007E00000000007E0000000000FE0000000000FC0000000000FC000000 0000FC0000000000FC0000000001FC0000000001F80000000001F80000000001F8000000 0001F80000000003F00000000003F00000000003F00000000003F00000000007E0000000 0007E00000000007E00000000007E0000000000FC00000001E0FC00000007F0FC0000000 7F0F80000000FF0F80000000FF1F00000000FF1F00000000FE1E00000000F83C00000000 703C000000007878000000003FE0000000000F80000000002A5383BF1C>I<000003F000 00000FFC0000003E0E1C0000FC077E0001F003FE0003F003FE0007E001FE000FC001FC00 1F8001FC001F8001FC003F0001FC007F0001F8007E0001F800FE0003F800FE0003F801FC 0003F001FC0003F001FC0007F003FC0007F003F80007E003F80007E003F8000FE007F800 0FE007F0000FC007F0000FC007F0001FC007F0001FC007F0001F8007E0001F8007E0003F 8003E0003F8003E0007F0003F000FF0003F000FF0001F001FF0000F003FE0000F80F7E00 007C1EFE00001FF8FE000007E0FC00000000FC00000001FC00000001FC00000001F80000 0001F800000003F800000003F800000003F0001C0007F0007F0007E000FF000FE000FF00 0FC000FF001F8000FF003F0000FE007E0000F800FC00007C03F000001FFFC0000003FE00 0000273B7CA72A>I<0000780001FC0001FC0003FC0003FC0003FC0003F80000E0000000 000000000000000000000000000000000000000000000000000000000000000000000000 007C0001FF00038F800707800E07C01E07C01C07C03C0FC0380FC0380FC0781FC0701F80 701F80F03F80F03F00003F00007F00007E0000FE0000FC0000FC0001FC0001F80001F800 03F80003F00003F03807F03807E0380FE0780FC0700FC0700FC0F00F80E00F80E00F81C0 0F83C00F838007870003FE0000F800163E79BC1C>105 D<00000007000000001FC00000 001FC00000003FC00000003FC00000003FC00000003F800000000E000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000007C00000003FF000000078F800 0000E07C000001C07C000003C07C000003807E000007007E000007007E00000E00FE0000 0E00FC00001E00FC00001C00FC00003C01FC00003C01FC00000001F800000001F8000000 03F800000003F800000003F000000003F000000007F000000007F000000007E000000007 E00000000FE00000000FE00000000FC00000000FC00000001FC00000001FC00000001F80 0000001F800000003F800000003F800000003F000000003F000000007F000000007F0000 00007E000000007E00000000FE00000000FE00000000FC00000000FC00000001FC000000 01F800000001F800001C01F800007F03F00000FF03F00000FF07E00000FF07C00000FF0F 800000FE1F000000F83E000000707C0000003FF00000000FC0000000225083BC1C>I<00 01FC000000FFFC000000FFF8000000FFF800000003F800000003F800000003F000000003 F000000007F000000007F000000007E000000007E00000000FE00000000FE00000000FC0 0000000FC00000001FC00000001FC00000001F800000001F800000003F800000003F8000 00003F000000003F0003E0007F000FF8007F003C3C007E00707C007E00E1FC00FE01C1FC 00FE0383FC00FC0703FC00FC0E03FC01FC1C03F801FC3800E001F870000001F860000003 F8E0000003F9C0000003F780000003FE00000007FE00000007FFE0000007E7F8000007E0 FE00000FE07F00000FE03F80000FC01F80000FC00FC0001FC00FC0001FC00FC0701F800F C0701F800FC0703F800FC0F03F801FC0E03F001F80E03F001F80E07F001F81E07F001F81 C07E000F83C07E000F8380FE000F8780FE00078F00FC0003FE00380000F80026407ABE2A >I<0007F003FFF003FFE003FFE0000FE0000FE0000FC0000FC0001FC0001FC0001F8000 1F80003F80003F80003F00003F00007F00007F00007E00007E0000FE0000FE0000FC0000 FC0001FC0001FC0001F80001F80003F80003F80003F00003F00007F00007F00007E00007 E0000FE0000FE0000FC0000FC0001FC0001FC0001F80001F80003F80003F80003F00003F 00007F00007F07007E07007E0700FE0F00FE0E00FC0E00FC0E00FC1E00FC1C00FC1C007C 38007C78003C70001FE000078000144079BE17>I<01F0003F80007F000007FC01FFE003 FFC0000F3E07C1F80F83F0000E1F0F00FC1E01F8001E1F1C007C3800F8001C1F38007E70 00FC003C1FF0007EE000FC00381FF0007FE000FC00381FE0007FC000FC00783FC0007F80 00FC00703FC0007F8000FC00703F80007F0000FC00703F00007E0000FC00F03F0000FE00 01FC00F07F0000FC0001F800007E0000FC0001F800007E0000FC0001F800007E0001FC00 03F80000FE0001FC0003F00000FC0001F80003F00000FC0001F80003F00000FC0003F800 07F00001FC0003F80007E00001F80003F00007E00001F80003F0000FE00001F80007F000 0FC00003F80007F0001FC0E003F00007E0001F80E003F00007E0001F80E003F0000FE000 3F81E007F0000FE0003F01C007E0000FC0003F01C007E0000FC0003F01C007E0001FC000 3E03800FE0001FC0003E03800FC0001F80003E07000FC0001F80003E07000FC0003F8000 3E0E001FC0003F80001E1C001F80003F00000FF8000700000E000003E000432979A74A> I<01F0003F800007FC01FFE0000F3E07C1F8000E1F0F00FC001E1F1C007C001C1F38007E 003C1FF0007E00381FF0007E00381FE0007E00783FC0007E00703FC0007E00703F80007E 00703F00007E00F03F0000FE00F07F0000FC00007E0000FC00007E0000FC00007E0001FC 0000FE0001F80000FC0001F80000FC0001F80000FC0003F80001FC0003F00001F80003F0 0001F80007F00001F80007E00003F8000FE07003F0000FC07003F0000FC07003F0001FC0 F007F0001F80E007E0001F80E007E0001F81E007E0001F01C00FE0001F01C00FC0001F03 800FC0001F03800FC0001F07001FC0000F0E001F800007FC0007000001F0002C2979A733 >I<00001FC0000000FFF8000003F07C00000FC01F00001F801F00003F000F80007E000F C000FC0007C001F80007E003F00007E007F00007E007E00007E00FE00007F01FC00007F0 1FC00007F03F800007F03F800007F03F80000FE07F80000FE07F00000FE07F00000FE07F 00001FE0FF00001FC0FE00001FC0FE00001FC0FE00003F80FE00003F80FE00007F00FE00 007F00FC00007E007C0000FC007E0001FC007E0001F8007E0003F0003E0007E0001F000F C0001F001F80000F803E000007C0FC000001FFF00000003F800000242977A72E>I<0003 E001F800000FF807FE00001E7C1E0F80001C3E3C07C0003C3E7807C000383EE003E00078 3FE003E000703FC003F000703F8001F000F07F0001F000E07F0001F800E07E0001F800E0 7E0003F801E0FE0003F801E0FE0003F80000FC0003F80000FC0003F80001FC0007F80001 FC0007F00001F80007F00001F80007F00003F8000FF00003F8000FE00003F0000FE00003 F0000FE00007F0001FC00007F0001FC00007E0001F800007E0003F80000FE0003F00000F E0007F00000FE0007E00000FE000FC00001FE000FC00001FE001F800001FF003F000001F F007E000003FB80F8000003F9C1F0000003F0FFC0000003F03E00000007F00000000007F 00000000007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC 0000000001FC0000000001FC0000000001F80000000001F80000000003F80000000003F8 000000007FFFE0000000FFFFE0000000FFFFE00000002D3A80A72E>I<01F000FC0007FC 07FF800F3E0F03C00E1F1C03E01E1F380FE01C1F700FE03C1FE01FE0381FE01FE0381FC0 1FE0783FC01FC0703F800700703F800000703F000000F03F000000F07F000000007E0000 00007E000000007E00000000FE00000000FC00000000FC00000000FC00000001FC000000 01F800000001F800000001F800000003F800000003F000000003F000000003F000000007 F000000007E000000007E000000007E00000000FE00000000FC00000000FC00000000FC0 0000001FC00000001F800000000700000000232979A726>114 D<00007F800001FFE000 07C0F8001F003C003E001C003C001E007C003E00F8007E00F800FE00F800FE01F800FC01 F800FC01F8007001FC000001FE000001FFC00001FFFC0000FFFF0000FFFF80007FFFC000 3FFFE0000FFFF00000FFF000000FF0000007F0000003F00C0003F03F0003F07F8001F07F 8003F0FF0003E0FF0003E0FF0003E0FC0007C0F0000F8070000F8078001F003C003C001F 01F80007FFE00000FF00001F297AA725>I<0001C0000003F0000007F0000007F0000007 E0000007E000000FE000000FE000000FC000000FC000001FC000001FC000001F8000001F 8000003F8000003F8000003F0000003F00007FFFFF80FFFFFF80FFFFFF00007E000000FE 000000FE000000FC000000FC000001FC000001FC000001F8000001F8000003F8000003F8 000003F0000003F0000007F0000007F0000007E0000007E000000FE000000FE000000FC0 00000FC000001FC000001FC01C001F801C001F801C003F803C003F8038003F0078003F00 70003F00F0003F00E0003F01C0001F03C0001F0780000F0F000007FC000001F00000193A 78B81E>I<007C0000000001FF00001C00038F80007E00070780007E000E07C0007E001E 07C000FE001C07C000FE003C0FC000FC00380FC000FC00380FC001FC00781FC001FC0070 1F8001F800701F8001F800F03F8003F800F03F0003F800003F0003F000007F0003F00000 7E0007F000007E0007F00000FE0007E00000FC0007E00000FC000FE00001FC000FE00001 F8000FC00001F8000FC00001F8001FC00003F8001FC1C003F0001F81C003F0001F81C003 F0003F81C003F0003F83C003F0003F038003F0003F038003F0007F078001F000FF070001 F001FF070001F801DF0F0000F8079F0E00007C0F0F1C00001FFC07F8000007F001F0002A 2979A731>I<007C000000007001FF00007001FC038F8001F801FC07078001F801FC0E07 C001F801FE1E07C003F801FE1C07C003F000FE3C0FC003F000FE380FC003F0007C380FC0 07F0007C781FC007E0003C701F8007E0003C701F8007E0003CF03F800FE0003CF03F000F C00038003F000FC00038007F000FC00038007E001FC00078007E001F80007000FE001F80 007000FC001F80007000FC003F8000F001FC003F0000E001F8003F0000E001F8003F0000 E001F8003F0001E003F8007F0001C003F0007E0001C003F0007E0003C003F0007E000380 03F0007E00038003F0007E00070003F000FE00070003F000FE000E0001F001FE001E0001 F801FF001C0000F8039F00380000FC079F807000003E0F07C1E000001FFC03FFC0000003 F0007F0000372979A73C>119 D<007C00000001FF000038038F8000FC07078000FC0E07 C000FC1E07C001FC1C07C001F83C0FC001F8380FC001F8380FC003F8781FC003F0701F80 03F0701F8003F0F03F8007F0F03F0007E0003F0007E0007F0007E0007E000FE0007E000F C000FE000FC000FC000FC000FC001FC001FC001FC001F8001F8001F8001F8001F8003F80 03F8003F0003F0003F0003F0003F0003F0007F0003F0007E0003F0007E0003F0007E0003 F000FE0003F000FC0001F001FC0001F803FC0000F807FC00007C1FF800003FF9F8000007 E1F800000003F800000003F000000003F000000007F0000E0007E0003F8007E0007F800F C0007F800FC0007F801F8000FF001F0000FF003E00007C007E00007000FC00007801F000 003803E000001E0FC000000FFF00000003F8000000263B79A72C>121 D123 D E /Ff 77 128 df<000001FF000FE000 00001FFFE03FFC0000007F00F8FC1E000001FC003FF03F000007F0007FE07F80000FE000 FFE0FF80001FC001FFC0FF80003F8001FF80FF80007F8001FF80FF80007F0001FF807F00 007F0001FF003E0000FE0000FF00000000FE00007F00000000FE00007F00000000FE0000 7F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F000000 00FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE0000 7F00000000FE00007F000000FFFFFFFFFFFF8000FFFFFFFFFFFF8000FFFFFFFFFFFF8000 00FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE0000 7F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F000000 00FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE0000 7F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F000000 00FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE0000 7F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE00007F000000 00FE00007F00000000FE00007F00000000FE00007F00000000FE00007F00000000FE0000 7F00000001FF0000FF8000007FFFFC3FFFFF80007FFFFC3FFFFF80007FFFFC3FFFFF8000 39407FBF35>11 D<000001FF000000001FFFC00000007F01F0000001FC0078000007F000 1C00000FE0003E00001FC000FF00003F8001FF00007F8001FF00007F0001FF00007F0001 FF0000FE0001FF0000FE0000FE0000FE0000380000FE0000000000FE0000000000FE0000 000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE0000 000000FE0000000000FE00007F00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF0000FE0001 FF0000FE0000FF0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE0000 7F0000FE00007F0001FF0000FF807FFFFC3FFFFE7FFFFC3FFFFE7FFFFC3FFFFE2F407FBF 33>I<000001FF800000001FFFF70000007F00FF000001F800FF000007F001FF00000FE0 01FF00001FC001FF00003F8001FF00007F8001FF00007F0001FF00007F0000FF0000FE00 007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00 007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00 007F0000FE00007F00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF0000FE00007F0000FE00 007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00 007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00 007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00 007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00 007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00007F0000FE00 007F0001FF0000FF807FFFFC3FFFFE7FFFFC3FFFFE7FFFFC3FFFFE2F407FBF33>I<0000 01FF0000FF800000001FFFC00FFFE00000007F01F03F80F8000001F80078FE003C000007 F0003FF8000E00000FE0007FF0001F00001FC000FFE0007F80003F8001FFC000FF80007F 8001FFC000FF80007F0001FF8000FF80007F0001FF8000FF8000FE0001FF0000FF8000FE 0000FF00007F0000FE00007F00001C0000FE00007F0000000000FE00007F0000000000FE 00007F0000000000FE00007F0000000000FE00007F0000000000FE00007F0000000000FE 00007F0000000000FE00007F0000000000FE00007F0000000000FE00007F0000000000FE 00007F00003F80FFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFF8000FE 00007F0000FF8000FE00007F00007F8000FE00007F00003F8000FE00007F00003F8000FE 00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE 00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE 00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE 00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE 00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE 00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE 00007F00003F8000FE00007F00003F8000FE00007F00003F8000FE00007F00003F8001FF 0000FF80007FC07FFFFC3FFFFE1FFFFF7FFFFC3FFFFE1FFFFF7FFFFC3FFFFE1FFFFF4840 7FBF4C>I<1E000F007F803FC0FF807FC0FFC07FE0FFC07FE0FFE07FF0FFE07FF0FFE07F F07FE03FF01E600F300060003000600030006000300060003000E0007000C0006000C000 6000C0006001C000E0018000C0038001C003000180070003800E0007001C000E0018000C 0038001C00300018001C1C7DBE2D>34 D<1E007F80FF80FFC0FFC0FFE0FFE0FFE07FE01E 60006000600060006000E000C000C000C001C001800380030007000E001C001800380030 000B1C79BE19>39 D<0000300000700000E00001C0000380000780000F00001E00003E00 003C0000780000F80000F00001F00001E00003E00003E00007C00007C0000FC0000F8000 0F80001F80001F00001F00003F00003F00003F00003E00007E00007E00007E00007E0000 7E00007E00007C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000 FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E0000 7E00007E00007E00007E00003E00003F00003F00003F00001F00001F00001F80000F8000 0F80000FC00007C00007C00003E00003E00001E00001F00000F00000F800007800003C00 003E00001E00000F000007800003800001C00000E0000070000030145A77C323>II<1E007F80FF80FFC0FFC0FFE0FF E0FFE07FE01E60006000600060006000E000C000C000C001C001800380030007000E001C 001800380030000B1C798919>44 DI<1E007F807F80FFC0FFC0FFC0FFC07F807F801E000A0A798919>I<000000018000 000003C000000007C000000007C000000007800000000F800000000F800000000F000000 001F000000001F000000001E000000003E000000003E000000003C000000007C00000000 7C000000007800000000F800000000F800000000F000000001F000000001F000000001E0 00000003E000000003E000000003C000000007C000000007C000000007800000000F8000 00000F800000001F000000001F000000001E000000003E000000003E000000003C000000 007C000000007C000000007800000000F800000000F800000000F000000001F000000001 F000000001E000000003E000000003E000000003C000000007C000000007C00000000780 0000000F800000000F800000000F000000001F000000001F000000001E000000003E0000 00003E000000007C000000007C000000007800000000F800000000F800000000F0000000 01F000000001F000000001E000000003E000000003E000000003C000000007C000000007 C000000007800000000F800000000F800000000F000000001F000000001F000000001E00 0000003E000000003E000000003C000000007C000000007C000000007800000000F80000 0000F800000000F0000000006000000000225B7BC32D>I<0001FE0000000FFFC000003F 03F000007C00F80000F8007C0001F0003E0003E0001F0007C0000F8007C0000F800FC000 0FC01F800007E01F800007E01F800007E03F800007F03F800007F03F000003F07F000003 F87F000003F87F000003F87F000003F87F000003F87F000003F8FF000003FCFF000003FC FF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF 000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF000003FCFF00 0003FCFF000003FCFF000003FCFF000003FC7F000003F87F000003F87F000003F87F0000 03F87F000003F83F800007F03F800007F03F800007F01F800007E01F800007E01F800007 E00FC0000FC00FC0000FC007E0001F8003E0001F0001F0003E0000F8007C00007C00F800 003F03F000000FFFC0000001FE0000263F7DBC2D>I<0001C0000003C0000007C000001F C000007FC00007FFC000FFFFC000FF9FC000F81FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000007F F000FFFFFFF8FFFFFFF8FFFFFFF81D3D78BC2D>I<0007FC0000003FFF800000FFFFE000 03F01FF80007C007FC000F0001FE001E0000FF001C0000FF803C00007FC07800007FC078 00003FE07000003FE0FF00003FE0FF80001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0 001FF0FFC0001FF07F80001FF03F00001FF00C00001FF00000001FE00000003FE0000000 3FE00000003FC00000007FC00000007F80000000FF80000000FF00000001FE00000001FC 00000003F800000007F000000007E00000000FC00000001F800000003F000000007E0000 00007C00000000F800000001F000000003E000000007C00000000F800000001F00007000 3E000070003C000070007800007000F00000E001E00000E003C00000E007800000E00F00 0001E01FFFFFFFE01FFFFFFFE03FFFFFFFE07FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFF FFC0243D7CBC2D>I<0007FC0000003FFF800000F80FE00001E003F800078001FC000F00 01FE000E0000FF001E0000FF801F80007F803FC0007FC03FE0007FC03FE0007FC03FF000 7FC03FE0007FC03FE0007FC01FE0007FC00FC0007FC00000007F80000000FF80000000FF 00000000FF00000001FE00000001FE00000003FC00000003F800000007E00000000FC000 00003F0000001FFC0000001FFF800000000FE000000007F800000003FC00000001FE0000 0000FF00000000FF800000007FC00000007FC00000007FE00000003FE00000003FE00000 003FF00000003FF00C00003FF03F00003FF07F80003FF0FFC0003FF0FFC0003FF0FFC000 3FF0FFC0003FE0FFC0003FE0FF80007FE07F00007FC07800007FC0780000FF803C0000FF 801E0001FF000F0003FE0007C007FC0003F80FF00000FFFFE000003FFF80000007F80000 243F7CBC2D>I<0000000E000000001E000000003E000000003E000000007E000000007E 00000000FE00000001FE00000001FE00000003FE000000077E000000067E0000000E7E00 00001C7E0000001C7E000000387E000000707E000000707E000000E07E000001C07E0000 01C07E000003807E000007007E000007007E00000E007E00001C007E00001C007E000038 007E000070007E000070007E0000E0007E0000C0007E0001C0007E000380007E00030000 7E000700007E000E00007E000C00007E001C00007E003800007E003800007E007000007E 00E000007E00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FE00000000FE00000000FE00 000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 0000FE00000000FE00000001FF000001FFFFFF0001FFFFFF0001FFFFFF283E7EBD2D>I< 06000003000780001F0007F800FE0007FFFFFE0007FFFFFC0007FFFFF80007FFFFF00007 FFFFC00007FFFF000007FFFC0000073FE000000700000000070000000007000000000700 000000070000000007000000000700000000070000000007000000000700000000070000 000007000000000701FE0000070FFF8000073E03E000077001F80007E000FC0007C0007E 000780003F000700003F800600001F800000001FC00000001FC00000001FE00000000FE0 0000000FE00000000FE00000000FF00000000FF00000000FF00C00000FF07F00000FF07F 80000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FE0FF00001FE0FC00 001FE07000001FC07800001FC03800003F803C00003F801E00007F001F0000FE000F8001 FC0007C003F80003F80FE00000FFFFC000003FFF00000007F80000243F7CBC2D>I<0000 1FE0000000FFF8000003F03E00000FC00F00001F000780003E000780007E001FC000FC00 3FC001F8007FC003F8007FC003F0007FC007F0007FC00FE0003F800FE0001F001FE00000 001FC00000001FC00000003FC00000003FC00000003FC00000007F800000007F80000000 7F80FE00007F87FF8000FF8F07E000FF9C01F000FFB800FC00FFB0007E00FFF0007E00FF E0003F00FFE0003F80FFC0003FC0FFC0003FC0FFC0001FE0FFC0001FE0FFC0001FE0FF80 001FF0FF80001FF0FF80001FF0FF80001FF0FF80001FF07F80001FF07F80001FF07F8000 1FF07F80001FF07F80001FF07F80001FF03F80001FF03FC0001FE03FC0001FE01FC0001F E01FC0003FC01FC0003FC00FE0003F800FE0003F8007E0007F0003F0007E0001F800FC00 00FC01F800007E07F000003FFFE000000FFF80000003FC0000243F7CBC2D>I<38000000 003C000000003F000000003FFFFFFFFC3FFFFFFFFC3FFFFFFFFC3FFFFFFFF87FFFFFFFF8 7FFFFFFFF07FFFFFFFE078000001E070000003C0700000078070000007007000000F00E0 00001E00E000001C00E000003C00E0000078000000007000000000F000000001E0000000 01C000000003C0000000078000000007000000000F000000001E000000001E000000003C 000000003C000000007C000000007800000000F800000000F800000001F800000001F000 000003F000000003F000000003F000000007F000000007F000000007F00000000FF00000 000FE00000000FE00000001FE00000001FE00000001FE00000001FE00000001FE0000000 1FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003F E00000003FE00000003FE00000003FE00000001FC00000000700000026407BBD2D>I<00 03FC0000001FFF8000007C07E00000F001F80001E0007C0003C0003E000780001F000F00 001F000F00000F801E00000F801E00000FC03E000007C03E000007C03E000007C03E0000 07C03F000007C03F000007C03F80000F803FC0000F801FE0001F801FF0001F001FFC003E 000FFE007C000FFF80780007FFC0F00003FFF3E00001FFFF800000FFFF0000003FFF0000 001FFFC000000FFFE000003FFFF8000078FFFC0001F07FFE0003E01FFF0007C00FFF800F 8003FFC01F0001FFC03F00007FE03E00003FE07E00001FE07C00000FF07C000007F0F800 0003F0F8000003F0F8000003F0F8000001F0F8000001F0F8000001F0F8000001F0FC0000 01E07C000003E07C000003E07E000003C03F000007C01F00000F801F80001F000FC0003E 0007F0007C0001FC03F80000FFFFE000001FFF80000003FC0000243F7CBC2D>I<0003FC 0000001FFF0000007E07C00000FC03F00001F801F80003F000FC0007E0007C000FE0007E 001FC0007F001FC0003F003FC0003F803F80003F807F80003FC07F80003FC07F80001FC0 FF80001FC0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FF0FF 80001FF0FF80001FF0FF80001FF0FF80001FF07F80001FF07F80003FF07F80003FF07F80 003FF03FC0003FF03FC0003FF01FC0007FF00FC0007FF007E000FFF007F000DFF003F001 DFF000F8039FF0007E0F1FF0001FFE1FE00007F01FE00000001FE00000001FE00000003F C00000003FC00000003FC00000003FC00000003F800000007F800F80007F001FC0007F00 3FE000FE003FE000FE003FE001FC003FE001F8003FC003F0003F8007F0001E000FE0001F 001FC0000FC07F000003FFFE000001FFF80000003FC00000243F7CBC2D>I<1E007F807F 80FFC0FFC0FFC0FFC07F807F801E00000000000000000000000000000000000000000000 00000000000000000000000000000000001E007F807F80FFC0FFC0FFC0FFC07F807F801E 000A2779A619>I<1E007F807F80FFC0FFC0FFC0FFC07F807F801E000000000000000000 0000000000000000000000000000000000000000000000000000000000001E007F00FF80 FF80FFC0FFC0FFC0FFC07FC01EC000C000C000C000C001C0018001800180038003000700 06000E000C001C003800300030000A3979A619>I<00000007000000000000000F800000 000000000F800000000000000F800000000000001FC00000000000001FC0000000000000 1FC00000000000003FE00000000000003FE00000000000003FE00000000000007FF00000 000000007FF00000000000007FF0000000000000FFF8000000000000E7F8000000000000 E7F8000000000001C7FC000000000001C3FC000000000001C3FC00000000000381FE0000 0000000381FE00000000000381FE00000000000700FF00000000000700FF000000000007 00FF00000000000E007F80000000000E007F80000000000E007F80000000001C003FC000 0000001C003FC0000000001C003FC00000000038001FE00000000038001FE00000000038 001FE00000000070000FF00000000070000FF00000000070000FF000000000E00007F800 000000E00007F800000000E00007F800000001C00003FC00000001FFFFFFFC00000001FF FFFFFC00000003FFFFFFFE00000003800001FE00000003800001FE00000007000000FF00 000007000000FF0000000F000000FF8000000E0000007F8000000E0000007F8000001E00 00007FC000001C0000003FC000001C0000003FC000003C0000003FE00000380000001FE0 0000380000001FE00000780000001FF00000780000000FF00000FC0000000FF00003FC00 00001FF8000FFF0000003FFC00FFFFF0000FFFFFF8FFFFF0000FFFFFF8FFFFF0000FFFFF F83D417DC044>65 DI<0000003FF00006000003FFFE000E00000FFF FF801E00003FF007E03E0000FF8000F83E0003FE00007C7E0007F800001EFE000FF00000 0FFE003FE0000007FE007FC0000003FE00FF80000003FE00FF00000001FE01FE00000000 FE03FE00000000FE07FC000000007E07F8000000007E0FF8000000003E0FF8000000003E 1FF0000000001E1FF0000000001E3FF0000000001E3FE0000000001E3FE0000000000E7F E0000000000E7FE0000000000E7FE0000000000E7FC00000000000FFC00000000000FFC0 0000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC000 00000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000 0000007FC000000000007FE000000000007FE0000000000E7FE0000000000E3FE0000000 000E3FE0000000000E3FF0000000000E1FF0000000001E1FF0000000001C0FF800000000 1C0FF8000000001C07F8000000003C07FC000000003803FE000000007801FE0000000070 00FF00000000F000FF80000001E0007FC0000001C0003FE0000003C0000FF00000078000 07F800001F000003FE00003E000000FF8000F80000003FF007F00000000FFFFFC0000000 03FFFF00000000003FF0000037427BBF42>IIII< 0000003FE0000C00000003FFFE001C0000001FFFFF803C0000007FF00FC07C000000FF00 01F07C000003FC000078FC000007F800003DFC00001FE000001FFC00003FC000000FFC00 007F80000007FC0000FF80000003FC0001FF00000003FC0001FE00000001FC0003FC0000 0001FC0007FC00000000FC0007F800000000FC000FF8000000007C000FF0000000007C00 1FF0000000003C001FF0000000003C003FE0000000003C003FE0000000003C003FE00000 00001C007FE0000000001C007FE0000000001C007FC0000000001C007FC0000000000000 FFC0000000000000FFC0000000000000FFC0000000000000FFC0000000000000FFC00000 00000000FFC0000000000000FFC0000000000000FFC0000000000000FFC0000000000000 FFC0000000000000FFC0000000000000FFC000001FFFFFF07FC000001FFFFFF07FC00000 1FFFFFF07FE00000000FFE007FE000000003FC003FE000000003FC003FE000000003FC00 3FF000000003FC001FF000000003FC001FF000000003FC000FF800000003FC000FF80000 0003FC0007F800000003FC0007FC00000003FC0003FC00000003FC0001FE00000003FC00 01FF00000003FC0000FF80000003FC00007FC0000007FC00003FE0000007FC00001FF000 000FFC000007F800001EFC000003FE00003C7C000000FF8000F83C0000007FF007F01C00 00001FFFFFC00C00000003FFFF0000000000003FF00000003C427BBF47>III<001FFF FFFC001FFFFFFC001FFFFFFC000007FF00000003FE00000001FE00000001FE00000001FE 00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00 000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000 0001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE000000 01FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001 FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE 00000001FE00000001FE00000001FE003F0001FE007F8001FE00FFC001FE00FFC001FE00 FFC001FE00FFC001FE00FFC003FC00FF8003FC007F0003F8007C0007F800380007F0003C 000FE0001E001FC0000F003F800003E07E000000FFF80000003FC0000026407CBD2F>I< FFFFFFC0007FFFFCFFFFFFC0007FFFFCFFFFFFC0007FFFFC01FFE000000FFF80007F8000 0007FE00007F80000007F800007F80000007E000007F80000007C000007F8000000F8000 007F8000001F0000007F8000003E0000007F8000007C0000007F800000F80000007F8000 01F00000007F800003E00000007F800007C00000007F80000F800000007F80001F000000 007F80003E000000007F80007C000000007F8000F8000000007F8001F0000000007F8003 E0000000007F800780000000007F800FC0000000007F801FC0000000007F803FE0000000 007F807FF0000000007F80FFF0000000007F81EFF8000000007F83C7FC000000007F8787 FC000000007F8F03FE000000007F9E01FF000000007FBC01FF000000007FF800FF800000 007FF0007FC00000007FE0007FC00000007FC0003FE00000007F80001FF00000007F8000 1FF00000007F80000FF80000007F800007FC0000007F800007FC0000007F800003FE0000 007F800001FF0000007F800001FF0000007F800000FF8000007F8000007FC000007F8000 007FE000007F8000003FE000007F8000001FF000007F8000000FF800007F8000000FF800 007F80000007FC00007F80000007FE00007F80000007FF00007F80000007FF8001FFE000 000FFFC0FFFFFFC000FFFFFFFFFFFFC000FFFFFFFFFFFFC000FFFFFF403E7DBD47>IIII<0000007FE0000000000007FFFE00 000000001FC03F80000000007E0007E000000001FC0003F800000007F00000FE0000000F E000007F0000001FC000003F8000003F8000001FC000007F0000000FE00000FE00000007 F00001FE00000007F80001FC00000003F80003FC00000003FC0007F800000001FE0007F8 00000001FE000FF000000000FF000FF000000000FF001FF000000000FF801FE000000000 7F803FE0000000007FC03FE0000000007FC03FE0000000007FC07FE0000000007FE07FC0 000000003FE07FC0000000003FE07FC0000000003FE0FFC0000000003FF0FFC000000000 3FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0 000000003FF0FFC0000000003FF0FFC0000000003FF0FFC0000000003FF0FFC000000000 3FF0FFC0000000003FF07FC0000000003FE07FE0000000007FE07FE0000000007FE07FE0 000000007FE07FE0000000007FE03FE0000000007FC03FE0000000007FC01FF000000000 FF801FF000000000FF801FF000000000FF800FF800000001FF000FF800000001FF0007FC 00000003FE0003FC00000003FC0003FE00000007FC0001FE00000007F80000FF0000000F F000007F0000000FE000003F8000001FC000001FC000003F8000000FE000007F00000007 F00000FE00000001FC0003F8000000007F000FE0000000001FC03F800000000007FFFE00 00000000007FE00000003C427BBF47>II82 D<0007FC000C001FFF801C007FFFF03C01FC03F83C03F0007E7C07C0001FFC 0F80000FFC1F800007FC3F000003FC3E000001FC7E000000FC7E000000FC7C0000007CFC 0000007CFC0000007CFC0000003CFC0000003CFC0000003CFE0000001CFE0000001CFF00 00001CFF0000001C7F800000007FC00000007FE00000003FF80000003FFF8000001FFFF8 00000FFFFF800007FFFFF00003FFFFFC0001FFFFFF0000FFFFFFC0003FFFFFE00007FFFF F000007FFFF0000007FFF80000007FFC0000000FFC00000007FE00000003FE00000001FE 00000000FF00000000FFE00000007FE00000007FE00000007FE00000003FE00000003FF0 0000003FF00000003FF00000003FF00000003EF80000003EF80000007EFC0000007CFE00 0000FCFF000000F8FF800001F8FFC00003F0FFE00007E0F9FC000FC0F07F803F80F01FFF FE00E007FFF800C0007FC00028427BBF33>I<3FFFFFFFFFFFFF803FFFFFFFFFFFFF803F FFFFFFFFFFFF803FF0007FE001FF803F80003FC0003F807F00003FC0001FC07E00003FC0 0007C07C00003FC00007C07800003FC00003C07800003FC00003C07800003FC00003C070 00003FC00001C07000003FC00001C07000003FC00001C07000003FC00001C07000003FC0 0001C0E000003FC00000E0E000003FC00000E0E000003FC00000E0E000003FC00000E0E0 00003FC00000E00000003FC00000000000003FC00000000000003FC00000000000003FC0 0000000000003FC00000000000003FC00000000000003FC00000000000003FC000000000 00003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC0 0000000000003FC00000000000003FC00000000000003FC00000000000003FC000000000 00003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC0 0000000000003FC00000000000003FC00000000000003FC00000000000003FC000000000 00003FC00000000000003FC00000000000003FC00000000000003FC00000000000003FC0 0000000000003FC00000000000003FC00000000000003FC00000000000003FC000000000 00007FE0000000000000FFF00000000007FFFFFFFE00000007FFFFFFFE00000007FFFFFF FE00003B3D7DBC42>IIII91 D<018000C0038001C003000180070003800E0007001C000E0018000C0038001C 003000180070003800600030006000300060003000E0007000C0006000C0006000C00060 00C0006000CF006780FFC07FE0FFE07FF0FFE07FF0FFE07FF07FE03FF07FE03FF03FE01F F03FC01FE00F0007801C1C73BE2D>II<000FF800000000FFFE0000 0003F01F800000078007E000000F8003F000000FE001F800001FF001FC00001FF000FE00 001FF000FE00001FF000FE00001FF0007F00000FE0007F00000380007F00000000007F00 000000007F00000000007F00000000007F000000001FFF00000003FFFF0000001FF87F00 00007F807F000001FC007F000007F8007F00000FE0007F00001FC0007F00003F80007F00 003F80007F00007F00007F00007F00007F0380FE00007F0380FE00007F0380FE00007F03 80FE0000FF0380FE0000FF0380FE0000FF03807F0001FF03807F0003BF03803F80071F87 001FC00E1FCF0007F03C0FFE0001FFF807FC00003FC001F000292A7DA82D>97 D<01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC03FC00 0001FC1FFF800001FC7C07E00001FDE001F00001FFC000FC0001FF80007E0001FF00003F 0001FE00003F8001FC00001F8001FC00001FC001FC00000FE001FC00000FE001FC00000F F001FC00000FF001FC000007F001FC000007F801FC000007F801FC000007F801FC000007 F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007 F801FC000007F001FC000007F001FC00000FF001FC00000FF001FC00000FE001FC00001F E001FC00001FC001FE00001F8001FE00003F0001FF00007F0001FF8000FE0001F3C001F8 0001F1E003F00001E0780FC00001C03FFF0000000007F800002D407EBE33>I<0001FF00 00000FFFE000003F00F800007C001E0001F8001F0003F0007F0007F000FF800FE000FF80 0FC000FF801FC000FF801FC000FF803F80007F003F80001C007F800000007F800000007F 00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 000000FF00000000FF00000000FF00000000FF000000007F800000007F800000007F8000 00003F800001C03FC00001C01FC00003C01FC00003800FE000078007F000070003F0000E 0001F8001E0000FC007800003F01F000000FFFC0000001FE0000222A7DA828>I<000000 01FC00000000FFFC00000000FFFC00000000FFFC0000000007FC0000000003FC00000000 01FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00000000 01FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC00000000 01FC0000000001FC0000000001FC0000000001FC0000000001FC000000FF01FC000007FF E1FC00001F80F9FC00007E003DFC0000FC001FFC0003F80007FC0007F00007FC0007E000 03FC000FC00001FC001FC00001FC003FC00001FC003F800001FC007F800001FC007F8000 01FC007F000001FC007F000001FC00FF000001FC00FF000001FC00FF000001FC00FF0000 01FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF0000 01FC007F000001FC007F800001FC007F800001FC003F800001FC003F800001FC001FC000 01FC000FC00003FC000FE00003FC0007E00007FC0003F0000FFE0001F8001FFF00007C00 79FFF8003F01F1FFF8000FFFC1FFF80001FE01FC002D407DBE33>I<0001FE0000000FFF C000003F03F00000FC01F80001F800FC0003F0007E0007E0003F000FE0003F800FC0001F 801FC0001FC03F80000FC03F80000FC07F80000FC07F80000FE07F00000FE07F00000FE0 FF00000FE0FF00000FE0FFFFFFFFE0FFFFFFFFE0FF00000000FF00000000FF00000000FF 00000000FF00000000FF000000007F000000007F000000007F800000003F800000003F80 0000E01FC00000E01FC00001E00FC00001C007E00003C007F000078003F800070000FC00 1E00007E003C00001F80F8000007FFE0000000FF0000232A7EA828>I<00001FC000007F F80001F83C0007E07E000FC0FF001FC1FF003F81FF003F01FF007F01FF007F00FE00FE00 7C00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 0000FE000000FE000000FE000000FE000000FE0000FFFFFF00FFFFFF00FFFFFF0000FE00 0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 0000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 0000FE000000FE000000FE000000FE000001FF00007FFFFF007FFFFF007FFFFF0020407E BF1C>I<000000007C000003F801FF00001FFF078F80007E0FDE1F8000F803F81F8003F0 01F81F8003F001F81F8007E000FC06000FE000FE00000FC0007E00001FC0007F00001FC0 007F00001FC0007F00001FC0007F00001FC0007F00001FC0007F00001FC0007F00001FC0 007F00000FC0007E00000FE000FE000007E000FC000003F001F8000003F001F8000001F8 03E0000003FE0FC00000071FFF0000000703F80000000600000000000E00000000000E00 000000000E00000000000F00000000000F00000000000F80000000000FC00000000007FF FFE0000007FFFFFE000003FFFFFF800001FFFFFFE00000FFFFFFF00003FFFFFFF8000FC0 001FFC001F000001FE003E000000FE007C0000007E007C0000003F00F80000003F00F800 00001F00F80000001F00F80000001F00F80000001F00FC0000003F007C0000003E007E00 00007E003F000000FC001F800001F8000FC00003F00003F0000FC00000FE007F0000003F FFFC00000003FFC00000293D7EA82D>I<01FC00000000FFFC00000000FFFC00000000FF FC0000000007FC0000000003FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC01FE000001FC07FFC00001FC1E07E00001FC7803F00001 FCE001F80001FDC001FC0001FD8001FC0001FF8000FE0001FF0000FE0001FF0000FE0001 FE0000FE0001FE0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0003FE0001FF00FFFFF87FFFFCFFFFF87FFFFCFFFFF87FFFFC2E 3F7DBE33>I<01E00007F80007F8000FFC000FFC000FFC000FFC0007F80007F80001E000 000000000000000000000000000000000000000000000000000000000000000000000000 01FC007FFC007FFC007FFC0007FC0003FC0001FC0001FC0001FC0001FC0001FC0001FC00 01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 03FE00FFFFF0FFFFF0FFFFF0143E7DBD1A>I<0000780001FE0001FE0003FF0003FF0003 FF0003FF0001FE0001FE0000780000000000000000000000000000000000000000000000 0000000000000000000000000000007F007FFF007FFF007FFF0001FF0000FF00007F0000 7F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0000 7F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0000 7F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0000 7F00007F00007F00007F3E007F7F007FFF807EFF80FEFF80FEFF80FCFF81F87F01F87C03 F01E07C00FFF8001FC00185185BD1C>I<01FC00000000FFFC00000000FFFC00000000FF FC0000000007FC0000000003FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC00FFFF8001FC00FFFF8001FC00FFFF8001 FC003FFC0001FC003FE00001FC003F800001FC003F000001FC003C000001FC0078000001 FC00F0000001FC01E0000001FC07C0000001FC0F80000001FC1F00000001FC3E00000001 FC7F00000001FCFF80000001FDFF80000001FFDFC0000001FF9FE0000001FF0FE0000001 FE07F0000001FC07F8000001F803FC000001F801FC000001F801FE000001F800FF000001 F8007F000001F8007F800001F8003FC00001F8001FC00001F8001FE00001F8000FF00001 F8000FF00001F8000FF80003FC000FFE00FFFFF07FFFE0FFFFF07FFFE0FFFFF07FFFE02B 3F7EBE30>I<01FC00FFFC00FFFC00FFFC0007FC0003FC0001FC0001FC0001FC0001FC00 01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 01FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC0001FC00 01FC0003FE00FFFFF8FFFFF8FFFFF8153F7DBE1A>I<01F801FE0000FF0000FFF807FFC0 03FFE000FFF81E07E00F03F000FFF87803F03C01F80007F8E001F87000FC0003F9C001FC E000FE0001F98001FCC000FE0001FB8000FFC0007F0001FB0000FF80007F0001FF0000FF 80007F0001FE0000FF00007F0001FE0000FF00007F0001FC0000FE00007F0001FC0000FE 00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE 00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE 00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE 00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE 00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE00007F0001FC0000FE 00007F0001FC0000FE00007F0001FC0000FE00007F0003FE0001FF0000FF80FFFFF87FFF FC3FFFFEFFFFF87FFFFC3FFFFEFFFFF87FFFFC3FFFFE47287DA74C>I<01F801FE0000FF F807FFC000FFF81E07E000FFF87803F00007F8E001F80003F9C001FC0001F98001FC0001 FB8000FE0001FB0000FE0001FF0000FE0001FE0000FE0001FE0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001 FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0003FE0001FF00FF FFF87FFFFCFFFFF87FFFFCFFFFF87FFFFC2E287DA733>I<0000FF00000007FFE000001F 81F800007E007E0000F8001F0001F0000F8003E00007C007C00003E00FC00003F01F8000 01F81F800001F83F800001FC3F800001FC7F000000FE7F000000FE7F000000FE7F000000 FEFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FFFF000000FF FF000000FFFF000000FF7F000000FE7F000000FE7F000000FE3F800001FC3F800001FC3F 800001FC1F800001F80FC00003F00FC00003F007E00007E003F0000FC001F8001F80007E 007E00003F81FC00000FFFF0000000FF0000282A7EA82D>I<01FC03FC0000FFFC1FFF80 00FFFC7C0FE000FFFDE003F00003FFC001FC0001FF8000FE0001FF00007F0001FE00003F 8001FC00003F8001FC00001FC001FC00001FE001FC00001FE001FC00000FF001FC00000F F001FC00000FF001FC000007F801FC000007F801FC000007F801FC000007F801FC000007 F801FC000007F801FC000007F801FC000007F801FC000007F801FC000007F801FC00000F F001FC00000FF001FC00000FF001FC00000FF001FC00001FE001FC00001FE001FC00003F C001FE00003F8001FE00007F0001FF00007F0001FF8000FE0001FFC001F80001FDE007F0 0001FC780FC00001FC3FFF000001FC07F8000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000 0001FC0000000001FC0000000001FC0000000001FC0000000003FE00000000FFFFF80000 00FFFFF8000000FFFFF80000002D3A7EA733>I<0000FF001C000007FFC03C00001F80F0 3C00007F00387C0000FC001C7C0003F8000E7C0007F0000FFC0007F00007FC000FE00003 FC001FE00003FC003FC00003FC003FC00001FC007F800001FC007F800001FC007F800001 FC007F800001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001 FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC00FF000001FC007F800001 FC007F800001FC007F800001FC003FC00001FC003FC00001FC001FC00003FC000FE00003 FC000FE00007FC0007F0000FFC0003F8000FFC0001FC003DFC00007E0079FC00003F81F1 FC00000FFFC1FC000001FE01FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001 FC0000000001FC0000000001FC0000000001FC0000000003FE00000000FFFFF8000000FF FFF8000000FFFFF82D3A7DA730>I<01F807E0FFF81FF8FFF8787CFFF8E1FE07F9C1FE03 F981FE01FB81FE01FB01FE01FB00FC01FF003001FE000001FE000001FE000001FC000001 FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001 FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001 FC000001FC000001FC000001FC000003FE0000FFFFFE00FFFFFE00FFFFFE001F287EA724 >I<003FC06001FFF8E007C03FE01F000FE03E0007E03C0003E07C0003E0780001E0F800 01E0F80000E0F80000E0FC0000E0FE0000E0FF0000E0FF8000007FF800007FFFC0003FFF F8001FFFFE000FFFFF0007FFFF8001FFFFC0003FFFE00003FFF000001FF000000FF8E000 03F8E00003F8E00001F8F00001F8F00000F8F00000F8F80000F8F80000F0FC0000F0FC00 01F0FE0001E0FF0003C0FF800780F3E01F00E0FFFC00C01FE0001D2A7DA824>I<001C00 00001C0000001C0000001C0000001C0000001C0000003C0000003C0000003C0000003C00 00007C0000007C000000FC000000FC000001FC000003FC000007FC00001FFFFFC0FFFFFF C0FFFFFFC001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 0001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00 0001FC000001FC000001FC000001FC00E001FC00E001FC00E001FC00E001FC00E001FC00 E001FC00E001FC00E001FC00E000FC00E000FE01C000FE01C0007F03C0003F0380001F87 000007FE000001F8001B397EB723>I<01FC0000FE00FFFC007FFE00FFFC007FFE00FFFC 007FFE0007FC0003FE0003FC0001FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC 0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC 0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC 0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC0000FE0001FC 0000FE0001FC0000FE0001FC0001FE0001FC0001FE0001FC0001FE0001FC0003FE0000FC 0003FE0000FC0007FE0000FE0006FF00007E000EFF80003F001CFFFC001FC078FFFC0007 FFE0FFFC0000FF80FE002E297DA733>IIIII<1F FFFFFF801FFFFFFF801FE000FF801F8000FF001F0001FE001E0003FC001C0003FC001C00 07F8003C000FF0003C001FF00038001FE00038003FC00038007FC00038007F80003800FF 00000001FE00000001FE00000003FC00000007F80000000FF80000000FF00000001FE000 00003FC00380003FC00380007F80038000FF00038001FF00038001FE00038003FC000780 07FC00078007F80007000FF00007001FE0000F001FE0000F003FC0001F007F80007F00FF 8001FF00FFFFFFFF00FFFFFFFF0021277EA628>II<1C000E007F003F80FF807FC0FF807FC0FF807FC0FF807FC0FF807FC07F003F80 1C000E001A0977BD2D>127 D E /Fg 23 122 df<0000000000E00000000001E0000000 0003C0000000000F80000000001F00000000003E00000000007C0000000000F800000000 01F00000000003E00000000007C0000000000F80000000001F00000000003F0000000000 7E00000000007C0000000000F80000000001F80000000003F00000000003E00000000007 C0000000000FC0000000001F80000000001F80000000003F00000000003E00000000007E 0000000000FC0000000000FC0000000001F80000000001F80000000003F00000000003F0 0000000007E00000000007E0000000000FC0000000000FC0000000001F80000000001F80 000000003F80000000003F00000000007F00000000007E00000000007E0000000000FE00 00000000FC0000000001FC0000000001FC0000000001F80000000003F80000000003F800 00000003F00000000007F00000000007F00000000007E00000000007E0000000000FE000 0000000FE0000000000FC0000000000FC0000000001FC0000000001FC0000000001F8000 0000001F80000000003F80000000003F80000000003F00000000003F00000000003F0000 0000007F00000000007F00000000007E00000000007E00000000007E00000000007E0000 000000FE0000000000FE0000000000FC0000000000FC0000000000FC0000000000FC0000 000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000 000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000 000000FC0000000000FC0000000000FC0000000000FC00000000007C00000000007C0000 0000007C00000000007C00000000007C00000000003E00000000003E00000000003E0000 0000003E00000000001F00000000001F00000000001F00000000000F00000000000F8000 00000007800000000007C00000000003C00000000003E00000000001E00000000001F000 00000000F000000000007800000000003C00000000003C000000002B796FD930>40 D<00000007000000000007800000000003C00000000001E00000000001E00000000000F0 0000000000F000000000007800000000007C00000000003C00000000003E00000000003E 00000000001E00000000001F00000000001F00000000000F00000000000F80000000000F 80000000000F80000000000F800000000007C00000000007C00000000007C00000000007 C00000000007C00000000007C00000000007E00000000007E00000000007E00000000007 E00000000007E00000000007E00000000007E00000000007E00000000007E00000000007 E00000000007E00000000007E00000000007E00000000007E00000000007E00000000007 E00000000007E0000000000FC0000000000FC0000000000FC0000000000FC0000000000F C0000000000FC0000000001FC0000000001FC0000000001F80000000001F80000000001F 80000000003F80000000003F80000000003F00000000003F00000000007F00000000007F 00000000007E00000000007E0000000000FE0000000000FE0000000000FC0000000000FC 0000000001FC0000000001FC0000000001F80000000003F80000000003F80000000003F0 0000000003F00000000007F00000000007E0000000000FE0000000000FE0000000000FC0 000000001FC0000000001F80000000001F80000000003F00000000003F00000000007F00 000000007E0000000000FE0000000000FC0000000000FC0000000001F80000000001F800 00000003F00000000003F00000000007E0000000000FC0000000000FC0000000001F8000 0000001F80000000003F00000000003E00000000007E0000000000FC0000000000F80000 000001F00000000003F00000000003E00000000007C0000000000F80000000001F000000 00003F00000000003E00000000007C0000000000F80000000001F00000000003E0000000 0007C0000000000F80000000001F00000000003C0000000000780000000000F000000000 00E000000000002B797ED930>I<07C01FF03FF07FF87FF87FF8FFF8FFF0FFF07FE07FC0 1F000D0C738B24>46 D<000000000380000000000780000000000700000000000F000000 00001F00000000003F00000000007E0000000000FE0000000001FE0000000003FE000000 0007FC000000001FFC000000003FFC00000000FFFC00000007FFF8000000FFE7F8000001 FFCFF8000003FF0FF8000003F80FF0000000000FF0000000001FF0000000001FF0000000 001FE0000000001FE0000000003FE0000000003FE0000000003FC0000000003FC0000000 007FC0000000007FC0000000007F80000000007F8000000000FF8000000000FF80000000 00FF0000000000FF0000000001FF0000000001FF0000000001FE0000000001FE00000000 03FE0000000003FE0000000003FC0000000003FC0000000007FC0000000007FC00000000 07F80000000007F8000000000FF8000000000FF8000000000FF0000000000FF000000000 1FF0000000001FF0000000001FE0000000001FE0000000003FE0000000003FE000000000 3FC0000000003FC0000000007FC0000000007FC0000000007F80000000007F8000000000 FF8000000000FF8000000000FF0000000000FF0000000001FF0000000001FF0000000001 FE0000000001FE0000000003FE0000000003FE000000000FFF0000007FFFFFFFE000FFFF FFFFE000FFFFFFFFE000FFFFFFFFE000294F73CE3C>49 D<000000000007800000000000 0FC000000000001FC000000000001FC000000000003FC000000000003F8000000000003F 8000000000003F8000000000007F8000000000007F0000000000007F0000000000007F00 0000000000FE000000000000FE000000000000FE000000000001FE000000000001FC0000 00000001FC000000000003F8000000000003F8000000000003F8000000000007F0000000 000007F0000000000007F000000000000FE000000000000FE000000000001FC000000000 001FC000000000001F8000000000003F8000000000003F8000000000007F000000000000 7F000000000000FE000000000000FE000000000000FC000000000001FC000000000001F8 000000000003F8000000000003F0000000000007F0000000000007E000000000000FC000 000000001FC000000000001F8000000000003F8000000000003F0000000000007E000000 0000007E000000000000FC000000000001F801C000000001F807E000000003F007E00000 0007E00FE000000007C00FE00000000FC00FE00000001F801FE00000003F001FC0000000 3E001FC00000007E001FC0000000FC003FC0000001F8003F80000003F0003F80000007E0 003F8000000FC0007F8000001F80007F0000001F00007F0000003E00007F0000007C0000 FF000001F80000FE000003F00000FE000007FFF000FE00000FFFFF01FE00003FFFFFC1FC 00007FFFFFF9FC0000FF000FFFFC0000F80001FFFC0780F000003FFFFFC06000000FFFFF C000000003FFFF0000000007FFF00000000007F0000000000007F0000000000007F00000 0000000FF000000000000FE000000000000FE000000000000FE000000000001FE0000000 00001FC000000000001FC000000000001FC000000000003FC000000000003F8000000000 003F8000000000003F8000000000007F8000000000007F0000000000007F000000000000 7F0000000000007E0000000000003C00000032667BCE3C>52 D<00000FFFFF0000000000 03FFFFE000000FFFFF800000000003FFFFE000001FFFFF800000000007FFFFC000001FFF FF80000000000FFFFFC00000000FFF80000000000FFF800000000007FF80000000001FFF 000000000007FF80000000001FFE00000000000FFF80000000003FFE00000000000FFF80 000000003FFC00000000000F7F80000000007BFC00000000000F7F8000000000F3FC0000 0000001F7F8000000000F7FC00000000001F7F8000000001E7F800000000001E3FC00000 0001E7F800000000001E3FC000000003C7F800000000003E3FC000000003CFF800000000 003E3FC0000000078FF000000000003C3FC00000000F0FF000000000003C3FC00000000F 0FF000000000007C3FC00000001E1FF000000000007C3FC00000001E1FE0000000000078 3FC00000003C1FE00000000000783FC0000000781FE00000000000F83FC0000000783FE0 0000000000F83FC0000000F03FC00000000000F01FE0000000F03FC00000000000F01FE0 000001E03FC00000000001F01FE0000001E07FC00000000001F01FE0000003C07F800000 000001E01FE0000007807F800000000001E01FE0000007807F800000000003E01FE00000 0F00FF800000000003E01FE000000F00FF000000000003C01FE000001E00FF0000000000 03C01FE000001E00FF000000000007C01FE000003C01FF000000000007C01FE000007801 FE000000000007801FE000007801FE000000000007800FF00000F001FE00000000000F80 0FF00000F003FE00000000000F800FF00001E003FC00000000000F000FF00003C003FC00 000000000F000FF00003C003FC00000000001F000FF000078007FC00000000001F000FF0 00078007F800000000001E000FF0000F0007F800000000001E000FF0000F0007F8000000 00003E000FF0001E000FF800000000003E000FF0003C000FF000000000003C000FF0003C 000FF000000000003C0007F80078000FF000000000007C0007F80078001FF00000000000 7C0007F800F0001FE00000000000780007F800F0001FE00000000000780007F801E0001F E00000000000F80007F803C0003FE00000000000F80007F803C0003FC00000000000F000 07F80780003FC00000000000F00007F80780003FC00000000001F00007F80F00007FC000 00000001F00007F81E00007F800000000001E00007F81E00007F800000000001E00007F8 3C00007F800000000003E00003FC3C0000FF800000000003E00003FC780000FF00000000 0003C00003FC780000FF000000000003C00003FCF00000FF000000000007C00003FDE000 01FF000000000007C00003FDE00001FE000000000007800003FFC00001FE000000000007 800003FFC00001FE00000000000F800003FF800003FE00000000000F800003FF800003FC 00000000000F000003FF000003FC00000000001F800003FE000003FC00000000003F8000 03FE000007FC00000000007FC00001FC000007FC0000000003FFF00001FC00001FFC0000 0000FFFFFF8001F8003FFFFFFE000000FFFFFF8001F0003FFFFFFE000000FFFFFF8001F0 003FFFFFFE000000FFFFFF8001E0003FFFFFFE0000006B5277D169>77 D<00000FFFFFFFFFFC000000000FFFFFFFFFFF800000001FFFFFFFFFFFF00000001FFFFF FFFFFFF8000000000FFE00003FFE0000000007FC000007FF0000000007FC000001FF8000 00000FFC000000FF800000000FFC0000007FC00000000FF80000003FE00000000FF80000 003FE00000001FF80000001FE00000001FF80000001FF00000001FF00000001FF0000000 1FF00000001FF00000003FF00000001FF00000003FF00000001FF00000003FE00000001F F80000003FE00000001FF00000007FE00000001FF00000007FE00000003FF00000007FC0 0000003FF00000007FC00000003FF0000000FFC00000003FF0000000FFC00000007FE000 0000FF800000007FE0000000FF800000007FC0000001FF80000000FFC0000001FF800000 00FF80000001FF00000000FF80000001FF00000001FF00000003FF00000001FE00000003 FF00000003FE00000003FE00000007FC00000003FE0000000FF800000007FE0000001FF0 00000007FE0000003FE000000007FC0000007FC000000007FC000001FF000000000FFC00 0007FE000000000FFC00007FF8000000000FFFFFFFFFE0000000000FFFFFFFFF80000000 000FFFFFFFF800000000001FF800000000000000001FF000000000000000001FF0000000 00000000001FF000000000000000003FF000000000000000003FE000000000000000003F E000000000000000003FE000000000000000007FE000000000000000007FC00000000000 0000007FC000000000000000007FC00000000000000000FFC00000000000000000FF8000 00000000000000FF800000000000000000FF800000000000000001FF8000000000000000 01FF000000000000000001FF000000000000000001FF000000000000000003FF00000000 0000000003FE000000000000000003FE000000000000000003FE000000000000000007FE 000000000000000007FC000000000000000007FC000000000000000007FC000000000000 00000FFC00000000000000000FF800000000000000000FF800000000000000001FF80000 0000000000001FF800000000000000007FF800000000000000FFFFFFFC000000000000FF FFFFFC000000000000FFFFFFFC000000000000FFFFFFFC0000000000004D5278D14F>80 D<00FFFFFFFFFFFFFFFF8000FFFFFFFFFFFFFFFF8001FFFFFFFFFFFFFFFF8001FFFFFFFF FFFFFFFF8001FFF0001FF8000FFF0003FF00001FF00001FF0003FC00003FF00000FF0003 F800003FF000007F0007F000003FE000003F0007E000003FE000003F0007C000007FE000 003E000FC000007FE000003E000F8000007FC000003E000F8000007FC000003E001F0000 00FFC000003E001F000000FFC000003E001E000000FF8000003C003E000000FF8000003C 003E000001FF8000003C003C000001FF8000003C007C000001FF0000003C0078000001FF 0000007C0078000003FF0000007800F8000003FF0000007800F0000003FE0000007800F0 000003FE0000007800F0000007FE000000780000000007FE000000000000000007FC0000 00000000000007FC00000000000000000FFC00000000000000000FFC0000000000000000 0FF800000000000000000FF800000000000000001FF800000000000000001FF800000000 000000001FF000000000000000001FF000000000000000003FF000000000000000003FF0 00000000000000003FE000000000000000003FE000000000000000007FE0000000000000 00007FE000000000000000007FC000000000000000007FC00000000000000000FFC00000 000000000000FFC00000000000000000FF800000000000000000FF800000000000000001 FF800000000000000001FF800000000000000001FF000000000000000001FF0000000000 00000003FF000000000000000003FF000000000000000003FE000000000000000003FE00 0000000000000007FE000000000000000007FE000000000000000007FC00000000000000 0007FC00000000000000000FFC00000000000000000FFC00000000000000000FF8000000 00000000000FF800000000000000001FF800000000000000001FF800000000000000001F F000000000000000001FF000000000000000003FF000000000000000003FF00000000000 0000003FE000000000000000003FE000000000000000007FE00000000000000000FFE000 00000000000003FFF00000000000003FFFFFFFFF00000000003FFFFFFFFF00000000003F FFFFFFFF00000000003FFFFFFFFF000000000049516BD054>84 D<0FFFFFFFC0003FFFFF E00FFFFFFFC0003FFFFFE01FFFFFFF80007FFFFFC01FFFFFFF80007FFFFFC0000FFF0000 0001FFF0000007FE000000007FC0000007FC000000007F8000000FFC000000003F000000 0FFC000000003E0000000FF8000000003C0000000FF8000000003C0000001FF800000000 7C0000001FF800000000780000001FF000000000780000001FF000000000780000003FF0 00000000F80000003FF000000000F00000003FE000000000F00000003FE000000000F000 00007FE000000001F00000007FE000000001E00000007FC000000001E00000007FC00000 0001E0000000FFC000000003E0000000FFC000000003C0000000FF8000000003C0000000 FF8000000003C0000001FF8000000007C0000001FF800000000780000001FF0000000007 80000001FF000000000780000003FF000000000F80000003FF000000000F00000003FE00 0000000F00000003FE000000000F00000007FE000000001F00000007FE000000001E0000 0007FC000000001E00000007FC000000001E0000000FFC000000003E0000000FFC000000 003C0000000FF8000000003C0000000FF8000000003C0000001FF8000000007C0000001F F800000000780000001FF000000000780000001FF000000000780000003FF000000000F8 0000003FF000000000F00000003FE000000000F00000003FE000000000F00000007FE000 000001F00000007FE000000001E00000007FC000000001E00000007FC000000001E00000 007FC000000003E0000000FFC000000003C0000000FF8000000003C0000000FF80000000 03C0000000FF800000000780000000FF800000000780000000FF800000000F80000000FF 000000000F00000000FF000000001F00000000FF000000001E00000000FF000000003E00 000000FF000000003C00000000FF000000007C00000000FF00000000F8000000007F8000 0001F0000000007F80000001E0000000007F80000003E0000000003F80000007C0000000 003FC000000F80000000001FC000001F00000000001FE000007E00000000000FF00000FC 000000000007F80003F0000000000003FC000FE0000000000001FF807FC0000000000000 FFFFFF000000000000003FFFFC000000000000000FFFF00000000000000001FF00000000 0000004B5468D157>I<000000000007FC0000000007FFFC000000000FFFF8000000000F FFF8000000000FFFF800000000000FF800000000000FF0000000000007F000000000000F F000000000000FF000000000000FE000000000000FE000000000001FE000000000001FE0 00000000001FC000000000001FC000000000003FC000000000003FC000000000003F8000 000000003F8000000000007F8000000000007F8000000000007F0000000000007F000000 000000FF000000000000FF000000000000FE000000000000FE000000000001FE00000000 0001FE000000000001FC00000001FC01FC00000007FF03FC0000001FFFC3FC0000007F03 E3F8000001FC01F3F8000003F800FFF8000007F0007FF800000FE0007FF000001FC0003F F000003F80003FF000007F80003FF00000FF00001FE00000FE00001FE00001FE00001FE0 0003FC00001FE00003FC00001FC00007FC00001FC00007F800003FC0000FF800003FC000 0FF000003F80001FF000003F80001FF000007F80003FF000007F80003FE000007F00003F E000007F00003FE00000FF00007FE00000FF00007FC00000FE00007FC00000FE00007FC0 0001FE00007FC00001FE0000FF800001FC0000FF800001FC0000FF800003FC0000FF8000 03FC03C0FF800003F803C0FF000003F803C0FF000007F803C0FF000007F807C07F00000F F007807F00000FF007807F00001FF00F807F00003FF00F003F80007FE00F003F8000FFE0 1F001F8001F7E01E001FC003E7E03E000FC007C3F03C0007E00F83F07C0003F03F01F8F8 0001FFFC00FFF000007FF0007FE000001FC0001F8000365474D23C>100 D<0000007F8000000007FFF00000001FFFF80000007F80FE000001FE003F000007F8001F 00000FF0001F80001FC0000F80003F80000F80007F80000F8000FF00000F8001FE00000F 8003FC00000F8007FC00001F8007F800001F000FF800003F000FF000007E001FF00000FE 001FF00001FC003FE00007F0003FE0007FE0003FE07FFF80007FFFFFFE00007FFFFFE000 007FFF800000007FC000000000FFC000000000FF8000000000FF8000000000FF80000000 00FF8000000000FF8000000000FF0000000000FF0000000000FF0000000000FF00000000 00FF0000000000FF00000000007F00000003007F00000007807F0000000F807F0000001F 003F8000003F003F8000007E001F800000FC001FC00001F8000FC00007E00007E0001FC0 0003F0007F000001FC07FC000000FFFFF00000003FFFC000000007FC000000293573B336 >I<00000000001F8000000000007FF00000000001FFF80000000003F0FC0000000007E0 7E000000000FC1FE000000001FC1FE000000001F83FE000000003F83FE000000003F83FE 000000003F03FC000000007F03F8000000007F00F0000000007F000000000000FE000000 000000FE000000000000FE000000000000FE000000000001FE000000000001FC00000000 0001FC000000000001FC000000000001FC000000000003FC000000000003F80000000000 03F8000000000003F8000000000003F8000000000007F8000000000007F0000000000007 F0000000000007F0000000000007F0000000001FFFFFFE0000003FFFFFFE0000003FFFFF FE0000003FFFFFFE000000000FE000000000001FE000000000001FC000000000001FC000 000000001FC000000000001FC000000000003FC000000000003F8000000000003F800000 0000003F8000000000003F8000000000007F8000000000007F0000000000007F00000000 00007F0000000000007F000000000000FF000000000000FF000000000000FE0000000000 00FE000000000000FE000000000000FE000000000001FE000000000001FC000000000001 FC000000000001FC000000000001FC000000000003FC000000000003F8000000000003F8 000000000003F8000000000003F8000000000007F8000000000007F0000000000007F000 0000000007F0000000000007F000000000000FF000000000000FE000000000000FE00000 0000000FE000000000001FE000000000001FC000000000001FC000000000001FC0000000 00001FC000000000003FC000000000003F8000000000003F8000000000003F8000000000 007F8000000000007F0000000000007F0000000000007F0000000000007E000000000000 FE000000000000FE000000000000FC000000001E00FC000000003F81FC000000007F81F8 00000000FF81F800000000FF83F000000000FF83F000000000FF03E000000000FF07C000 000000FC0F80000000007E1F00000000003FFE00000000001FFC000000000003F0000000 0000376C83D324>I<00003FE0000000003FFFE0000000007FFFC0000000007FFFC00000 00007FFFC000000000007FC000000000007F8000000000003F8000000000007F80000000 00007F8000000000007F0000000000007F000000000000FF000000000000FF0000000000 00FE000000000000FE000000000001FE000000000001FE000000000001FC000000000001 FC000000000003FC000000000003FC000000000003F8000000000003F8000000000007F8 000000000007F8000000000007F0000000000007F000000000000FF000000000000FF000 000000000FE000000000000FE007F80000001FE03FFF0000001FE0FFFF8000001FC3F81F E000001FC7C007E000003FDF8007F000003FFE0003F000003FFC0003F800003FF80003F8 00007FF80003F800007FF00003F800007FE00003F800007FC00003F80000FFC00003F800 00FF800003F80000FF800003F80000FF000003F80001FF000007F80001FE000007F00001 FE000007F00001FC000007F00003FC00000FF00003FC00000FE00003F800000FE00003F8 00000FE00007F800001FE00007F800001FC00007F000001FC00007F000003FC0000FF000 003F80000FF000003F80000FE000007F80000FE000007F00001FE000007F00001FE00000 FF00781FC00000FE00781FC00000FE00783FC00001FE00F83FC00001FC00F03F800003FC 00F03F800003F801F07F800003F801E07F800003F801E07F000003F803C07F000003F003 C0FF000003F00780FF000003F00F80FE000003F00F00FE000001F81E00FE000001F87C00 FC000000FFF800FC0000007FE000700000000F8000355477D23C>104 D<000001E0000003F0000007F800000FF800000FF800000FF800000FF000000FE0000003 800000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000 000007C000003FF000007FFC0000F87C0001E07E0003C03E0007803F000F803F000F007F 001F007F001E007F003E007F003C00FF003C00FE007C00FE007801FE007801FC00F803FC 00F803F8000003F8000007F8000007F0000007F000000FF000000FE000000FE000001FE0 00001FC000003FC000003F8000003F8000007F8000007F0000007F000000FF007800FE00 7800FE007801FE00F801FC00F003FC00F003F801F003F801E003F801E003F803C003F003 C003F0078003F00F8003F00F0001F01E0001F87C0000FFF800007FE000001F80001D5077 CE24>I<00003FE0000000003FFFE0000000007FFFC0000000007FFFC0000000007FFFC0 00000000007FC000000000007F8000000000003F8000000000007F8000000000007F8000 000000007F0000000000007F000000000000FF000000000000FF000000000000FE000000 000000FE000000000001FE000000000001FE000000000001FC000000000001FC00000000 0003FC000000000003FC000000000003F8000000000003F8000000000007F80000000000 07F8000000000007F0000000000007F000000000000FF000000000000FF000000000000F E000000000000FE00001F800001FE0000FFC00001FE0003FFF00001FC0007C1F00001FC0 00F00F80003FC003E01F80003FC007807F80003F800F00FF80003F801E00FF80007F801C 00FF80007F803801FF00007F007000FF00007F00E000FE0000FF01C000780000FF03C000 000000FE078000000000FE0F0000000001FE1E0000000001FE3C0000000001FCF8000000 0001FDF00000000003FFC00000000003FFE00000000003FFFC0000000003FFFF80000000 07F8FFE000000007F81FF000000007F007F800000007F003FC0000000FF001FE0000000F F000FE0000000FE000FF0000000FE0007F0000001FE0007F0000001FE0007F001E001FC0 007F001E001FC0007F001E003FC0007F003E003FC000FF003C003F8000FE003C003F8000 FE003C007F8000FE0078007F8000FE0078007F0000FE0078007F0000FE00F000FF0000FE 00F000FF00007E01E000FE00007E03E000FE00003E03C000FE00003F0F8000FC00001FFF 0000FC000007FE000070000001F80000315477D236>107 D<003E00001FE0000000FFC0 00FFFC000001FFE003FFFE000003E3F00FE07F800007C1F81F001F80000F81F87E001FC0 000F01FCF8000FC0001F01FDF0000FE0001E01FDE0000FE0001E01FFE0000FE0003E01FF C0000FE0003C01FF80000FE0003C01FF00000FE0003C03FF00000FE0007C03FE00000FE0 007803FE00000FE0007803FC00000FE000F807FC00001FE000F807F800001FC0000007F8 00001FC0000007F000001FC000000FF000003FC000000FF000003F8000000FE000003F80 00000FE000003F8000001FE000007F8000001FE000007F0000001FC000007F0000001FC0 0000FF0000003FC00000FE0000003FC00000FE0000003F800001FE0000003F800001FC00 00007F800001FC0000007F800003FC01E0007F000003F801E0007F000003F801E000FF00 0007F803E000FF000007F003C000FE00000FF003C000FE00000FE007C001FE00000FE007 8001FE00000FE0078001FC00000FE00F0001FC00000FC00F0003FC00000FC01E0003FC00 000FC03E0003F800000FC03C0003F8000007E0780003F8000007E1F00003F0000003FFE0 0003F0000001FF800001C00000003E00003B3577B342>110 D<0000003FC000000001FF F80000000FFFFE0000003FE07F8000007F001FC00001FE000FE00003F80007F00007F000 07F0000FE00003F8001FC00003F8003F800001FC007F800001FC00FF000001FE01FE0000 01FE01FE000001FE03FC000001FE07FC000001FE07F8000001FE0FF8000001FE0FF80000 01FE1FF0000001FE1FF0000003FE3FF0000003FE3FE0000003FE3FE0000003FE3FE00000 07FE7FE0000007FC7FC0000007FC7FC0000007FC7FC000000FFC7FC000000FF8FF800000 0FF8FF8000000FF8FF8000001FF0FF8000001FF0FF8000003FE07F8000003FC07F800000 7FC07F8000007F807F800000FF807F800000FF003F800001FE003F800003FC003F800003 F8001FC00007F0001FC0000FE0000FE0001FC00007F0007F800003F800FE000001FE07F8 0000007FFFE00000001FFF8000000007FC0000002F3574B33C>I<003F0000FF0000FFC0 03FFC001FFE00FFFF003E3F03F01F807C1F87C007C0781F8F8007E0F01FDF001FE0F01FF E003FE1E01FFC003FE1E01FFC003FE3E01FF8007FC3C01FF0003FC3C01FF0003F83C03FE 0001E07C03FE0000007803FC0000007803FC000000F807F8000000F807F80000000007F0 0000000007F0000000000FF0000000000FF0000000000FE0000000000FE0000000001FE0 000000001FE0000000001FC0000000001FC0000000003FC0000000003FC0000000003F80 000000003F80000000007F80000000007F80000000007F00000000007F0000000000FF00 00000000FF0000000000FE0000000000FE0000000001FE0000000001FE0000000001FC00 00000001FC0000000003FC0000000003FC0000000003F80000000003F80000000003F800 00000003F00000000003F00000000001C0000000002F3577B331>114 D<000001FE0000000FFFC000003FFFF00000FE03F80001F000FC0003E0007C0007C0003E 000F80001E001F80003E001F0000FE001F0001FE003E0001FE003E0001FE007E0001FE00 7E0001FC007E0000F8007F000000007F000000007F800000007FC00000007FFC0000003F FFE000003FFFF800001FFFFE00000FFFFF000007FFFF800001FFFFC000007FFFE0000007 FFE00000007FF00000001FF00000000FF000000007F000000003F000000003F01F000003 F07F800003F07F800003F0FF800003E0FF800003E0FF800003E0FF000007C0FE000007C0 F800000F80F800001F80F800001F007C00003E007E0000FC003F0001F8001FE00FE00007 FFFF800001FFFE0000003FF00000273577B330>I<00000F000000001F800000003F8000 00003F800000003F800000007F800000007F000000007F000000007F00000000FF000000 00FE00000000FE00000000FE00000001FE00000001FC00000001FC00000001FC00000003 FC00000003F800000003F800000003F800000007F800000007F000000007F000007FFFFF FF80FFFFFFFF80FFFFFFFF00FFFFFFFF00000FE00000001FE00000001FC00000001FC000 00001FC00000003FC00000003F800000003F800000003F800000007F800000007F000000 007F000000007F00000000FF00000000FE00000000FE00000000FE00000001FE00000001 FC00000001FC00000001FC00000003FC00000003F800000003F800000003F800000007F8 00000007F000000007F000000007F00000000FF0003C000FE0003C000FE0007C000FE000 78001FE00078001FC000F8001FC000F0001FC001F0001FC003E0001F8003C0001F8007C0 001F800F80001F800F00000FC03E00000FC07C000007E1F8000003FFF0000001FFC00000 007E000000214C75CA27>I<000FC0000078003FF00000FE007FFC0001FE00F07C0003FF 01E07E0003FF03C03E0003FF07803F0003FF0F803F0003FF0F007F0001FF1F007F0000FF 1E007F0000FF3E007F00007F3C00FF00007F3C00FE00003E7C00FE00003E7801FE00003E 7801FC00003EF803FC00003EF803F800003C0003F800003C0007F800003C0007F000007C 0007F0000078000FF0000078000FE0000078000FE00000F8001FE00000F0001FC00000F0 001FC00000F0001FC00001F0003FC00001E0003F800001E0003F800003E0003F800003C0 007F800003C0007F00000780007F00000780007F00000780007F00000F00007F00000F00 007F00001E00007F00001E00007F00003C00007F00007800003F00007800003F8000F000 001F8001E000001FC003C000000FE00780000007F81F00000003FFFE00000000FFF80000 00001FE00000303577B336>118 D<000FC0000000000078003FF000000F0000FE007FFC 00001F8001FE00F07C00003F8003FF01E07E00003F8003FF03C03E00007F8003FF07803F 00007F8003FF0F803F00007F0003FF0F007F00007F0001FF1F007F0000FF0000FF1E007F 0000FF0000FF3E007F0000FE00007F3C00FF0000FE00007F3C00FE0001FE00003E7C00FE 0001FE00003E7801FE0001FC00003E7801FC0001FC00003EF803FC0003FC00003EF803F8 0003FC00003C0003F80003F800003C0007F80003F800003C0007F00007F800007C0007F0 0007F8000078000FF00007F0000078000FE00007F0000078000FE0000FF00000F8001FE0 000FF00000F0001FC0000FE00000F0001FC0000FE00000F0001FC0001FE00001F0003FC0 001FE00001E0003F80001FC00001E0003F80001FC00001E0003F80001FC00003C0007F80 003FC00003C0007F00003F800003C0007F00003F80000780007F00003F80000780007F00 003F80000780007F00003F80000F00007F00007F80000F00007F00007F80001E00007F00 00FF80001E00003F0000FF80003C00003F8001FFC0007C00003F8001FFC0007800001FC0 03EFC000F000001FC007CFE001F000000FE00F87F003E0000007F81F03FC0FC0000001FF FE01FFFF000000007FF8007FFE000000000FE0000FF00000483577B34E>I<000FC00000 0000003FF0000003C0007FFC000007E000F07C00000FE001E07E00000FE003C03E00001F E007803F00001FC00F803F00001FC00F007F00001FC01F007F00003FC01E007F00003F80 3E007F00003F803C00FF00003F803C00FE00007F807C00FE00007F007801FE00007F0078 01FC00007F00F803FC0000FF00F803F80000FE000003F80000FE000007F80000FE000007 F00001FE000007F00001FC00000FF00001FC00000FE00001FC00000FE00003FC00001FE0 0003F800001FC00003F800001FC00003F800001FC00007F800003FC00007F000003F8000 07F000003F800007F000003F80000FF000007F80000FE000007F00000FE000007F00000F E000007F00001FE000007F00001FC000007F00001FC000007F00001FC000007F00003FC0 00007F00007F8000007F00007F8000003F0000FF8000003F0001FF8000003F8003FF0000 001F8007FF0000001FC00FFF0000000FF03FFF00000003FFFCFE00000001FFF0FE000000 003FC0FE000000000001FE000000000001FC000000000001FC000000000003FC00000000 0003F8000000000003F8000003C00007F0000007F00007F000000FF0000FE000001FF000 0FE000001FF0001FC000001FF0003F8000001FE0003F0000001FE0007F0000001F8000FE 0000001E0001FC0000001F0003F80000000F0007E00000000F801FC000000007E07F8000 000003FFFE0000000000FFF800000000003F8000000000334C77B339>121 D E end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: Letter %%EndSetup %%Page: 1 1 1 0 bop 448 623 a Fg(The)41 b(Mystery)g(of)h(\(the\))f(Unknown)f(\(r)-6 b(evise)g(d)41 b(for)h(version)f(4.1P\))1514 826 y Ff(Alejandro)30 b(A.)h(Sc)m(h\177)-45 b(a\013er)1455 939 y(formerly)29 b(Rice)i(Univ)m(ersit)m(y)1869 1051 y(and)1174 1164 y(curren)m(tly)f (National)g(Institutes)f(of)i(Health)448 1377 y(This)39 b(do)s(cumen)m(t)i(describ)s(es)e(some)i(asp)s(ects)g(of)g(the)g(UNKNO) m(WN)h(auxiliary)c(pro-)448 1490 y(gram)e(that)g(is)f(distributed)d (with)j(LINKA)m(GE)h(and)f(F)-10 b(ASTLINK.)34 b(This)g(do)s(cumen)m(t) 448 1603 y(w)m(as)j(originally)d(written)h(to)i(accompan)m(y)g(F)-10 b(ASTLINK,)36 b(v)m(ersion)g(2.2)h(and)f(b)s(ey)m(ond.)448 1716 y(This)k(v)m(ersion)g(is)h(a)g(revision)f(mean)m(t)i(to)f (accompan)m(y)i(F)-10 b(ASTLINK,)40 b(v)m(ersion)h(4.1P)448 1829 y(and)31 b(b)s(ey)m(ond.)42 b(Due)31 b(to)h(the)f(c)m(hanges)h(in) d(v)m(ersion)i(3.0P)-8 b(,)32 b(the)g(con)m(ten)m(ts)g(of)g(this)d(do)s (cu-)448 1941 y(men)m(t)35 b(are)f(logically)f(in)m(tert)m(wined)g (with)g(the)h(con)m(ten)m(ts)i(of)e(lo)s(ops.ps.)50 b(I)34 b(recommend)448 2054 y(that)41 b(y)m(ou)g(read)g(lo)s(ops.ps)e (\014rst,)k(unless)38 b(y)m(ou)j(w)m(an)m(t)h(to)f(kno)m(w)g(what)f (UNKNO)m(WN)448 2167 y(do)s(es)32 b(only)g(on)g(lo)s(opless)f(p)s (edigrees.)46 b(This)31 b(material)h(is)f(a)i(signi\014can)m(t)f (expansion)f(of)448 2280 y(the)37 b(discussion)c(on)j(pages)g(25{26)j (of)d Fe(Handb)-5 b(o)g(ok)40 b(of)e(Human)g(Genetic)f(Linkage)f Ff(b)m(y)448 2393 y(Joseph)25 b(Douglas)i(T)-8 b(erwilliger)23 b(and)i(Jurg)g(Ott.)39 b(The)26 b(emphasis)e(there)i(is)f(on)g(usage)i (of)448 2506 y(UNKNO)m(WN)35 b(and)f(all)e(algorithmic)h(asp)s(ects)h (are)h(suppressed.)49 b(As)34 b(with)f(the)h(do)s(c-)448 2619 y(umen)m(ts)29 b(on)h(tra)m(v)m(ersals)g(and)f(lo)s(ops)f(that)i (\014rst)e(accompanied)i(F)-10 b(ASTLINK)28 b(2.1,)j(this)448 2732 y(do)s(cumen)m(t)k(is)g(v)m(ery)h(informal)d(and)i(directed)f(at)j (those)e(who)g(ma)m(y)h(wish)e(to)i(mo)s(dify)448 2845 y(the)31 b(co)s(de.)589 2958 y(Thanks)36 b(to)i(Jerry)f(Halp)s(ern)e (\(Stanford\))i(for)g(suggesting)g(that)h(I)f(prepare)f(this)448 3071 y(do)s(cumen)m(t.)48 b(Thanks)32 b(to)h(Jo)s(e)g(T)-8 b(erwilliger)30 b(\(Colum)m(bia\))h(for)i(straigh)m(tening)f(out)h(m)m (y)448 3183 y(confusion)26 b(ab)s(out)h(lots)g(of)g(LINKA)m(GE)g (things,)g(including)d(the)j(di\013eren)m(t)g(v)m(ersions)f(of)448 3296 y(UNKNO)m(WN.)448 3540 y Fd(UNKNO)m(WN)36 b(from)h(a)h(User's)g(P) m(ersp)s(ectiv)m(e)448 3711 y Ff(The)i(main)f(purp)s(ose)f(of)j(UNKNO)m (WN)g(is)e(to)i(rapidly)d(iden)m(tify)g(whic)m(h)h(genot)m(yp)s(es)448 3824 y(are)28 b(p)s(ossible)d(for)i(individuals)22 b(t)m(yp)s(ed)27 b(as)h(unkno)m(wns)d(in)h(the)i(input)d(p)s(edigree.)39 b(Start-)448 3937 y(ing)27 b(with)g(F)-10 b(ASTLINK)27 b(4.0P)i(an)f(additional)e(purp)s(ose)g(of)i(UNKNO)m(WN)h(is)e(to)h (select)448 4050 y(lo)s(op)34 b(break)m(ers)h(for)f(lo)s(op)s(ed)f(p)s (edigrees)g(\(see)j(README.lselect)f(and)f(lo)s(ops.ps\).)52 b(It)448 4163 y(is)43 b(a)h(go)s(o)s(d)g(idea)f(to)i(run)d(UNKNO)m(WN)j (just)e(b)s(efore)g(running)e(an)m(y)j(of)g(the)g(main)448 4276 y(programs)j(\(i.e.)91 b(LODSCORE,)46 b(ILINK,)h(LINKMAP)-8 b(,)48 b(or)f(MLINK\))g(in)f(LINK-)448 4389 y(A)m(GE/F)-10 b(ASTLINK.)42 b(Most)f(v)m(ersions)f(in)f(circulation)g(of)i(the)g (main)f(programs)g(ac-)448 4502 y(tually)i(require)f(that)i(UNKNO)m(WN) g(b)s(e)f(run)f(due)h(to)h(\014le)f(name)h(con)m(v)m(en)m(tions,)j(in) 448 4615 y(the)38 b(sense)f(that)i(they)e(exp)s(ect)h(to)g(\014nd)e (the)i(output)f(\014les)g(that)h(UNKNO)m(WN)g(pro-)448 4728 y(duces)26 b(a)m(v)-5 b(ailable)25 b(as)h(input)e(\014les.)38 b(The)25 b(shell)f(scripts)h(pro)s(duced)f(b)m(y)i(LCP)f(for)g(ILINK,) 448 4840 y(LINKMAP)-8 b(,)31 b(and)f(MLINK)g(will)e(call)i(UNKNO)m(WN)h (b)m(y)f(default.)1920 5162 y(1)p eop %%Page: 2 2 2 1 bop 448 623 a Fd(More)38 b(details)e(on)i(UNKNO)m(WN)e(Sp)s (eci\014cations)448 794 y Ff(W)-8 b(e)38 b(mak)m(e)g(one)g(terminology) e(con)m(v)m(en)m(tion.)61 b(F)-8 b(or)38 b(the)f(rest)g(of)g(this)f(do) s(cumen)m(t,)j(the)448 907 y(term)28 b Fe(joint)j(genotyp)-5 b(e)29 b Ff(refers)f(to)h(the)f(m)m(ultilo)s(cus)d(join)m(t)j(genot)m (yp)s(e)h(at)g(the)f(lo)s(ci)f(sp)s(eci-)448 1020 y(\014ed)j(for)g(the) h(analysis;)e(in)h(particular,)f(the)h(genetic)h(information)e(for)h (lo)s(ci)g(sp)s(eci\014ed)448 1133 y(in)37 b Fc(pedin.dat)p Ff(,)i(but)e(ignored)h(in)f(the)i(analysis)e(is)g(not)i(incorp)s (orated.)64 b(The)38 b(term)448 1246 y Fe(genotyp)-5 b(e)40 b Ff(when)e(not)h(preceded)g(b)m(y)g(\\join)m(t")g(refers)g(to)g (the)h(genot)m(yp)s(e)f(at)h(a)f(single)448 1359 y(lo)s(cus.)g(This)26 b(con)m(v)m(en)m(tion)j(is)e(used)g(for)g(this)g(do)s(cumen)m(t)g(only) g(and)g(is)g(actually)g(rather)448 1472 y(incon)m(v)m(enien)m(t)k(for)f (discussing)d(other)k(asp)s(ects)g(of)f(LINKA)m(GE/F)-10 b(ASTLINK.)589 1585 y(UNKNO)m(WN)22 b(pro)s(duces)d(four)g(\014les:)35 b Fc(speedfile.dat)p Ff(,)19 b Fc(ipedfile.dat)p Ff(,)g Fc(newspeedfile.dat)p Ff(,)448 1698 y(and)29 b Fc(loopfile.dat)p Ff(;)d(the)j(last)g(t)m(w)m(o)h(are)g(not)f(used)f(in)g(LINKA)m(GE)h(v) m(ersions)f(of)h(UN-)448 1810 y(KNO)m(WN)37 b(or)f(in)e(v)m(ersions)h (of)h(F)-10 b(ASTLINK)35 b(b)s(efore)h(3.0P)-8 b(.)37 b(On)e(systems)h(that)g(limit)448 1923 y(\014le)21 b(names)g(to)g(8)h (c)m(haracters,)j Fc(speedfile.dat)17 b Ff(and)k Fc(newspeedfile.dat)16 b Ff(are)22 b(called)448 2036 y Fc(speedfil.dat)30 b Ff(and)i Fc(newspeedfil.dat)p Ff(.)45 b(On)32 b(man)m(y)h(systems,)h (the)f(default)f(shell)448 2149 y(scripts)25 b(pro)s(duced)f(b)m(y)i (LCP)f(delete)i(the)f(\014les)f Fc(speedfile.dat)d Ff(and)j Fc(ipedfile.dat)448 2262 y Ff(b)s(efore)30 b(the)h(run)e(is)g (completed.)589 2375 y(UNKNO)m(WN)35 b(exp)s(ects)g(that)f(for)g(eac)m (h)h(p)s(edigree)e(in)g Fc(pedin.dat)p Ff(,)f(the)j(individ-)448 2488 y(uals)28 b(in)g(that)i(p)s(edigree)e(are)h(n)m(um)m(b)s(ered)f(1) p Fb(;)15 b Ff(2)p Fb(;)g Ff(3)p Fb(;)31 b Ff(in)d(increasing)f(order)i (with)f(no)h(n)m(um-)448 2601 y(b)s(ers)39 b(skipp)s(ed.)66 b(This)38 b(assumption)g(is)g(plausible)f(b)s(ecause)i(it)h(will)d(alw) m(a)m(ys)j(hold)e(if)448 2714 y Fc(pedin.dat)27 b Ff(is)h(prepared)h (with)f(the)h(LINKA)m(GE)h(auxiliary)d(program)i(MAKEPED.)448 2827 y(A)m(ttempts)41 b(to)f(co)s(ok)g Fc(pedin.dat)d Ff(b)m(y)i(hand)g(often)h(lead)f(to)h(errors)f(when)f(it)h(is)f(fed)448 2940 y(to)d(a)f(script)f(pro)s(duced)g(b)m(y)h(LCP)-8 b(.)34 b(See)g(README.trouble)g(for)g(guidance)f(on)h(trou-)448 3052 y(blesho)s(oting)29 b(when)h(suc)m(h)g(errors)f(arise.)589 3165 y Fc(ipedfile.dat)35 b Ff(is)i(a)i(p)s(edigree)d(\014le)i(that)g (lo)s(oks)g(v)m(ery)g(m)m(uc)m(h)g(lik)m(e)f Fc(pedin.dat)p Ff(,)448 3278 y(whic)m(h)45 b(is)f(the)i(initial)c(input)i(p)s(edigree) g(\014le.)86 b(There)45 b(are)g(at)i(least)e(four)g(notable)448 3391 y(di\013erences)30 b(b)s(et)m(w)m(een)h Fc(pedin.dat)d Ff(and)i Fc(ipedfile.dat)p Ff(.)559 3594 y(1.)47 b(Genot)m(yp)s(e)32 b(information)e(in)g Fc(ipedfile.dat)e Ff(is)i(restricted)h(to)h(those) g(lo)s(ci)e(b)s(e-)676 3707 y(ing)f(used)g(in)g(the)h(curren)m(t)g (analysis,)f(while)f Fc(pedin.dat)f Ff(ma)m(y)k(ha)m(v)m(e)g(genot)m (yp)s(e)676 3819 y(information)d(for)i(lots)h(of)f(lo)s(ci.)559 4004 y(2.)47 b(Some)30 b(genot)m(yp)s(es)h(ma)m(y)g(b)s(e)f(\014lled)e (in.)559 4188 y(3.)47 b(T)-8 b(ext)31 b(commen)m(ts)g(in)e Fc(pedin.dat)f Ff(are)j(not)f(copied)g(in)m(to)g Fc(ipedfile.dat)559 4372 y Ff(4.)47 b(Spacing)28 b(and)g(inden)m(tation)g(ma)m(y)i (di\013er)e(ev)m(en)i(in)e(the)h(case)h(where)f(all)f(the)h(lo)s(ci)676 4485 y(in)g Fc(pedin.dat)e Ff(are)k(used)f(for)g(the)h(analysis.)589 4687 y(F)-10 b(ASTLINK)36 b(4.0P)h(in)m(tro)s(duced)e(a)h(m)m(uc)m(h)h (more)f(fundamen)m(tal)f(distinction)f(b)s(e-)448 4800 y(t)m(w)m(een)45 b Fc(pedin.dat)d Ff(and)h Fc(ipedfile.dat)e Ff(for)i(lo)s(op)s(ed)g(p)s(edigrees.)80 b(UNKNO)m(WN)448 4913 y(no)m(w)28 b(attempts)g(to)g(impro)m(v)m(e)f(on)g(the)h(user's)e (selection)i(of)f(lo)s(op)f(break)m(ers.)40 b(If)27 b(suc)m(h)g(an)1920 5162 y(2)p eop %%Page: 3 3 3 2 bop 448 623 a Ff(impro)m(v)m(emen)m(t)35 b(is)e(deemed)h(p)s (ossible,)f(it)h(is)f(ac)m(hiev)m(ed)i(b)m(y)f(rearranging)f(and)h(ren) m(um-)448 736 y(b)s(ering)25 b(the)i(p)s(eople)f(in)f(the)i(p)s (edigree)f(\014le.)38 b(F)-8 b(or)28 b(more)e(information)f(on)i(lo)s (op)f(break)m(er)448 848 y(selection)31 b(see)f Fc(loops.ps)p Ff(.)589 961 y(F)-10 b(ASTLINK)39 b(4.1P)h(in)m(tro)s(duced)e(the)h (abilit)m(y)f(to)i(use)f(UNKNO)m(WN)h(to)g(c)m(ho)s(ose)448 1074 y(lo)s(op)23 b(break)m(ers)h(from)f(scratc)m(h.)40 b(This)22 b(replaces)h(the)h(complicated)f(metho)s(d)g(suggested)448 1187 y(on)f(pages)g(93-96)i(of)d Fe(Handb)-5 b(o)g(ok)27 b(of)d(Human)h(Genetic)g(Linkage)c Ff(b)m(y)g(T)-8 b(erilliger)19 b(and)i(Ott.)448 1300 y(The)34 b(new)f(metho)s(d)g(uses)h(a)g(sp)s (ecial)e(\015ag)j(for)e(UNKNO)m(WN,)i(whic)m(h)e(is)g(\\-l".)51 b(If)34 b(y)m(ou)448 1413 y(run)29 b(the)i(command)g Fc(unknown)45 b(-l)30 b Ff(either)h(when)e Fc(pedfile.dat)f Ff(has)i(lo)s(op)g(break)m(ers)448 1526 y(selected)35 b(or)g(when)f Fc(pedfile.dat)d Ff(has)k(no)f(lo)s(op)g(break)m(ers)h (selected,)h(the)f(program)448 1639 y(will)30 b(write)j(out)g(a)g(new)f (p)s(edigree)g(\014le)g(with)f(a)j(go)s(o)s(d)e(set)i(of)f(lo)s(op)e (break)m(ers)j(selected)448 1752 y(automagically)j(for)g(y)m(ou)g(in)m (to)f Fc(lpedfile.dat)p Ff(.)57 b(See)37 b(README.lselect)g(for)g(more) 448 1865 y(complete)31 b(and)f(precise)g(instructions.)589 1978 y(Although)g(this)e(is)h(not)h(enforced)g(syn)m(tactically)g(b)s (et)m(w)m(een)h(programs,)f(the)g(same)448 2090 y(con)m(v)m(en)m(tions) 42 b(should)c(b)s(e)i(used)f(to)j(iden)m(tify)c(unkno)m(wn)h(genot)m (yp)s(es)j(in)d Fc(pedin.dat)448 2203 y Ff(and)30 b Fc(ipedfile.dat)p Ff(.)37 b(In)30 b(particular,)559 2350 y(1.)47 b(F)-8 b(or)38 b(lo)s(ci)e(sp)s(eci\014ed)g(b)m(y)i(a\013ection)g(status,)i (the)e(constan)m(t)h Fc(missaff)c Ff(sp)s(eci\014es)676 2463 y(the)30 b(v)-5 b(alue)30 b(used)g(for)g(unkno)m(wn.)39 b(By)31 b(con)m(v)m(en)m(tion,)g Fc(missaff)e Ff(is)g(de\014ned)g(to)i (0.)559 2634 y(2.)47 b(F)-8 b(or)22 b(lo)s(ci)e(sp)s(eci\014ed)g(b)m(y) i(quan)m(titativ)m(e)g(measures,)i(the)e(constan)m(t)g Fc(missval)e Ff(sp)s(ec-)676 2747 y(i\014es)k(the)h(v)-5 b(alue)25 b(used)g(for)g(unkno)m(wn.)38 b(By)25 b(con)m(v)m(en)m(tion,) j Fc(missval)23 b Ff(is)i(set)h(to)g(0.0.)559 2918 y(3.)47 b(F)-8 b(or)29 b(lo)s(ci)f(sp)s(eci\014ed)f(b)m(y)i(binary)e(factors,)j (an)m(y)f(com)m(bination)f(of)h(binary)e(factors)676 3031 y(whic)m(h)i(is)h(not)i(one)f(of)g(the)h(p)s(ossibilities)26 b(listed)k(in)g(datain.dat)h(for)f(that)i(lo)s(cus)676 3144 y(will)27 b(b)s(e)j(treated)h(as)g(unkno)m(wn.)448 3290 y(Changing)i(the)h(de\014nitions)e(of)i Fc(missaff)e Ff(or)i Fc(missval)e Ff(in)h(an)m(y)h(of)g(the)h(source)f(co)s(de)448 3403 y(\014les)c(is)f(lik)m(ely)g(to)i(lead)f(to)h(computational)f (disasters.)589 3516 y(W)-8 b(e)34 b(de\014ne)e(a)i(p)s(erson)d(to)j(b) s(e)e Fe(sp)-5 b(e)g(e)g(d\014le{unknown)36 b Ff(if)31 b(that)j(p)s(erson's)d(join)m(t)i(geno-)448 3629 y(t)m(yp)s(e)g(is)e (not)i(completely)f(sp)s(eci\014ed)f(in)g Fc(pedin.dat)f Ff(and)h(cannot)i(b)s(e)f(inferred)f(from)448 3742 y(the)24 b(genot)m(yp)s(e)g(information)e(of)i(relativ)m(es.)38 b(Otherwise)22 b(a)i(p)s(erson)e(is)g Fe(sp)-5 b(e)g(e)g(d\014le-known) p Ff(.)589 3855 y(F)d(or)31 b(all)e(sp)s(eed\014le-kno)m(wn)f (individuals)d(the)30 b(complete)g(join)m(t)g(genot)m(yp)s(e)h(app)s (ears)448 3968 y(in)e Fc(ipedfile.dat)e Ff(and)j(no)g(information)f (app)s(ears)h(in)f Fc(speedfile.dat)p Ff(.)589 4081 y(F)-8 b(or)31 b(all)d(sp)s(eed\014le-unkno)m(wn)f(individuals)e(that)30 b(ha)m(v)m(e)h(at)f(least)g(one)g(c)m(hild)e(in)g(the)448 4194 y(p)s(edigree,)33 b(information)e(ab)s(out)h(their)g(p)s(ossible)e (genot)m(yp)s(es)k(at)f(eac)m(h)h(lo)s(cus)d(is)h(giv)m(en)448 4307 y(in)g Fc(speedfile.dat)p Ff(.)43 b(In)32 b Fc(speedfile.dat)d Ff(individuals)f(are)33 b(n)m(um)m(b)s(ered)e(from)h(1)h(to)448 4420 y(the)26 b(n)m(um)m(b)s(er)e(of)h(individuals)c(in)j(all)g(p)s (edigrees)g(together;)k(no)e(p)s(edigree)e(n)m(um)m(b)s(ers)g(are)448 4533 y(sho)m(wn.)37 b(F)-8 b(or)22 b(eac)m(h)h(sp)s(eed\014le-unkno)m (wn)18 b(individual)e(a)22 b(list)e(of)h(triples)e(is)i(displa)m(y)m (ed.)36 b(In)448 4645 y(a)30 b(triple,)e(the)h(\014rst)f(n)m(um)m(b)s (er)g(is)g(a)i(lo)s(cus)e(n)m(um)m(b)s(er.)39 b(The)29 b(second)g(and)f(third)f(n)m(um)m(b)s(ers)448 4758 y(are)k(p)s(ossible) d(alleles)h(at)i(that)g(lo)s(cus.)40 b(F)-8 b(or)31 b(example,)f(the)h (triple)1784 4913 y(3)91 b(1)g(3)1920 5162 y(3)p eop %%Page: 4 4 4 3 bop 448 623 a Ff(means)29 b(that)g(at)h(lo)s(cus)e(3,)h(the)g (genot)m(yp)s(e)h(1)f(3)g(is)f(p)s(ossible.)38 b(The)28 b(p)s(ossible)f(triples)g(are)448 736 y(written)j(out)g(to)h Fc(speedfile.dat)c Ff(in)i(the)i(routine)e Fc(writespeed)p Ff(.)589 848 y(It)g(is)f(imp)s(ortan)m(t)f(to)j(clarify)d(sev)m(eral)i (subtle)e(p)s(oin)m(ts)h(ab)s(out)g(the)h(triple)e(represen-)448 961 y(tation.)589 1074 y(First,)i(the)h(lo)s(ci)e(are)h(n)m(um)m(b)s (ered)f(1)h(to)h(n)m(um)m(b)s(er)e(of)h(lo)s(ci)f(in)g(the)h(analysis,) f(and)h(are)448 1187 y(not)i(n)m(um)m(b)s(ered)e(with)g(resp)s(ect)h (to)h Fc(pedin.dat)p Ff(.)589 1300 y(Second,)38 b(all)d(lo)s(ci)g(are)i (enco)s(ded)f(b)m(y)g(allele)g(n)m(um)m(b)s(ers)e(in)h(the)i(guts)f(of) h(the)f(com-)448 1413 y(putations)41 b(in)g(UNKNO)m(WN)i(and)e(all)g (the)h(LINKA)m(GE)g(programs,)j(regardless)c(of)448 1526 y(whic)m(h)33 b(format)i(is)e(used)g(to)i(en)m(ter)g(the)f(data.)53 b(Hence)35 b(allele)e(n)m(um)m(b)s(ers)f(are)j(used)e(for)448 1639 y Fc(speedfile.dat)26 b Ff(output.)40 b(In)28 b(con)m(trast,)j Fc(ipedfile.dat)26 b Ff(preserv)m(es)j(whatev)m(er)h(for-)448 1752 y(mat)h(is)f(used)f(in)g Fc(pedin.dat)f Ff(for)i(eac)m(h)i(lo)s (cus.)589 1865 y(Third,)48 b(unlik)m(e)c(man)m(y)i(places)f(in)g(the)h (LINKA)m(GE)g(programs,)j(UNKNO)m(WN)448 1978 y(treats)c(genot)m(yp)s (es)f(as)g Fe(or)-5 b(der)g(e)g(d)47 b Ff(pairs.)79 b(Th)m(us)42 b(if)h(the)h(genot)m(yp)s(e)g(1)h(3)f(is)e(p)s(ossible,)448 2090 y(then)29 b(the)g(genot)m(yp)s(e)h(3)f(1)g(is)f(also)h(p)s (ossible)e(and)h(will)e(b)s(e)i(listed)g(in)f(a)j(separate)f(triple.) 589 2203 y(F)-8 b(ourth,)36 b(if)e(a)h(p)s(erson's)e(genot)m(yp)s(e)j (can)f(b)s(e)e(inferred)g(at)i(some)g(lo)s(ci,)g(but)f(not)g(at)448 2316 y(other's,)29 b(the)e(p)s(ossible)e(genot)m(yp)s(es)j(at)g(all)e (lo)s(ci)g(will)e(b)s(e)j(listed.)38 b(F)-8 b(or)28 b(those)g(lo)s(ci)e (where)448 2429 y(the)g(genot)m(yp)s(e)h(is)e(kno)m(wn,)h Fc(speedfile.dat)c Ff(will)h(con)m(tain)k(1)f(or)f(2)i(triples)d(dep)s (ending)448 2542 y(on)31 b(whether)e(the)i(kno)m(wn)f(genot)m(yp)s(e)h (is)f(homozygous)h(or)f(heterozygous.)589 2655 y(Fifth,)i(if)f(a)h(p)s (erson's)f(genot)m(yp)s(e)i(can)f(b)s(e)f(partially)-8 b(,)31 b(but)h(incompletely)e(inferred)448 2768 y(to)f(the)g(exten)m(t) g(that)g(one)f(allele)f(is)h(kno)m(wn,)g(the)g(kno)m(wn)g(allele)f(do)s (es)h(not)g(sho)m(w)g(up)f(in)448 2881 y Fc(ipedfile.dat)p Ff(.)50 b(Only)33 b(when)h(the)g(full)f(genot)m(yp)s(e)i(at)h(a)e(lo)s (cus)g(is)g(kno)m(wn)g(do)s(es)g(the)448 2994 y(information)29 b(app)s(ear)h(in)f Fc(ipedfile.dat)p Ff(.)589 3107 y(Sixth,)j(starting) f(with)g(F)-10 b(ASTLINK)31 b(3.0P)-8 b(,)33 b(the)f(co)s(de)h (implemen)m(ts)d(allele)h(amal-)448 3220 y(gamation,)c(if)c(the)i (constan)m(t)h Fc(ALLELE)p 1751 3220 29 4 v 33 w(SPEED)d Ff(is)g(set)i(to)g(1.)40 b(Allele)23 b(amalgamation)i(ap-)448 3333 y(plies)e(when)g(at)i(least)f(t)m(w)m(o)i(alleles)d(at)h(the)h (same)f(lo)s(cus)f(are)i(un)m(used)e(in)g(the)h(same)h(p)s(edi-)448 3445 y(gree.)62 b(Details)37 b(ab)s(out)g(allele)f(amalgamation)h(can)h (b)s(e)e(found)g(in)f Fc(README.allele)p Ff(.)448 3558 y(What)48 b(is)e(signi\014can)m(t)g(for)g(users)h(of)g(UNKNO)m(WN)h(is) e(that)h Fc(ipedfile.dat)d Ff(and)448 3671 y Fc(speedfile.dat)17 b Ff(use)j(pre-amalgamation)h(allele)e(n)m(um)m(b)s(ers,)i(while)d Fc(newspeedfile.dat)448 3784 y Ff(and)29 b Fc(loopfile.dat)c Ff(\(see)30 b(section)g(on)f(Lo)s(ops)f(b)s(elo)m(w\))h(use)g(p)s (ost-amalgamation)g(al-)448 3897 y(lele)h(n)m(um)m(b)s(ers.)448 4140 y Fd(Error)37 b(Detection)f(in)g(UNKNO)m(WN)448 4312 y Ff(One)42 b(of)g(the)h(principal)38 b(purp)s(oses)j(of)h(UNKNO)m (WN)h(is)e(to)i(detect)h(genetic)f(errors)448 4425 y(in)33 b(input)f(p)s(edigrees.)52 b(A)34 b(true)g(incompatibilit)m(y)d(error)j (o)s(ccurs)g(precisely)f(when)g(the)448 4538 y(sp)s(eci\014ed)39 b(genot)m(yp)s(es)i(are)f(not)h(consisten)m(t)g(with)d(Mendel's)i (rules)f(of)h(inheritance.)448 4651 y([P)m(edan)m(tic)45 b(aside:)67 b(I)43 b(carefully)g(wrote)h(\\Mendel's)f(rules)g(of)g (inheritance")g(rather)448 4764 y(than)32 b(\\Mendelian)f(inheritance") g(to)i(emphasize)f(that)g(UNKNO)m(WN)h(lo)s(oks)f(at)h(one)448 4877 y(lo)s(cus)f(at)h(a)g(time,)g(and)f(therefore,)h(the)g(e\013ects)h (of)f(recom)m(bination,)f(a)h(phenomenon)1920 5162 y(4)p eop %%Page: 5 5 5 4 bop 448 623 a Ff(UNKNO)m(WN)39 b(to)g(Mendel,)h(are)e(irrelev)-5 b(an)m(t.])63 b(Ho)m(w)m(ev)m(er,)43 b(I)37 b(ha)m(v)m(e)j(found)c (that)j(mis-)448 736 y(formatted)d(input)e(can)h(sometimes)h(cause)g (UNKNO)m(WN)g(to)g(generate)h(incompati-)448 848 y(bilit)m(y)31 b(errors,)j(rather)f(than)f(rep)s(orting)g(a)h(formatting)g(error.)49 b(In)32 b(particular,)g(when)448 961 y(UNKNO)m(WN)h(rep)s(orts)e (incompatibilit)m(y)e(errors)j(for)f(most)i(of)f(the)g(individuals)27 b(in)k(a)448 1074 y(p)s(edigree,)f(this)f(is)h(usually)e(a)i (formatting)h(error)f(in)f Fc(pedin.dat)p Ff(.)589 1187 y(In)e(v)m(ersion)g(2.3P)h(of)f(F)-10 b(ASTLINK,)27 b(I)g(impro)m(v)m (ed)g(UNKNO)m(WN)h(so)g(that)f(it)g(w)m(ould)448 1300 y(pinp)s(oin)m(t)22 b(the)j(n)m(uclear)f(family)g(in)f(whic)m(h)g(an)i (incompatibilit)m(y)d(o)s(ccurs,)k(pro)m(vided)d(the)448 1413 y(input)33 b(p)s(edigree)h(is)g(lo)s(opless.)52 b(When)35 b(m)m(ultiple)d(n)m(uclear)j(families)d(are)k(rep)s(orted)e (as)448 1526 y(erroneous,)h(one)f(can)f(b)s(e)g(assured)g(only)g(that)h (the)g(\014rst)e(one)i(prin)m(ted)e(has)i(an)f(error.)448 1639 y(The)c(others)h(ma)m(y)g(ha)m(v)m(e)h(errors)e(or)g(ma)m(y)h(b)s (e)f(propagated)h(consequences)g(of)g(the)g(\014rst)448 1752 y(error.)57 b(One)35 b(ma)m(y)h(get)h(UNKNO)m(WN)g(to)f(prin)m(t)f (only)f(the)i(\014rst)f(error)h(b)m(y)f(c)m(hanging)448 1865 y(the)c(de\014nition)d(of)i(the)h(constan)m(t)h Fc(ONE)p 1786 1865 29 4 v 33 w(ERROR)p 2059 1865 V 33 w(ONLY)d Ff(from)h(\(the)h(default\))f(0)h(to)g(1.)589 1978 y(In)h(v)m(ersion)f(3.0P)j(of)e(F)-10 b(ASTLINK,)31 b(UNKNO)m(WN)i(detects)h(incompatibilit)m(y)29 b(er-)448 2090 y(rors)k(in)e(lo)s(op)s(ed)h(p)s(edigrees,)h(whic)m(h)e(w)m(as)j (nev)m(er)f(done)g(in)f(previous)f(v)m(ersions.)48 b(Ho)m(w-)448 2203 y(ev)m(er,)38 b(in)c(lo)s(op)s(ed)g(p)s(edigrees)g(it)g(only)h (rep)s(orts)f(the)i(problematic)e(p)s(edigree.)54 b(T)-8 b(o)36 b(get)448 2316 y(a)d(more)g(detailed)f(error)g(diagnostic,)h (use)f(a)h(cop)m(y)g(of)g(the)f(p)s(edigree)g(\014le,)g(c)m(hange)i (all)448 2429 y(en)m(tries)f(in)f(column)g(9)i(that)f(are)h(2)g(or)f (higher)f(to)h(0,)i(and)d(rerun)g(UNKNO)m(WN)i(with)448 2542 y(the)e(mo)s(di\014ed)d(p)s(edigree)i(\014le.)42 b(Changing)31 b(column)f(9)h(in)g(this)f(w)m(a)m(y)i(has)f(the)h (e\013ect)h(of)448 2655 y(arti\014cially)28 b(eliminating)g(all)h(the)i (lo)s(ops)e(\(see)j(lo)s(ops.ps\).)589 2768 y(In)i(v)m(ersion)f(2.3P)i (of)f(F)-10 b(ASTLINK,)33 b(I)h(added)f(an)h(error)f(c)m(hec)m(king)i (diagnostic)e(to)448 2881 y(detect)44 b(most)e(p)s(edigrees)g(with)f (un)m(brok)m(en)g(lo)s(ops.)75 b(Thanks)41 b(to)i(F)-8 b(rank)43 b(Visser)e(for)448 2994 y(suggesting)c(this)e(impro)m(v)m (emen)m(t.)59 b(All)36 b(previous)e(v)m(ersions)i(of)h(UNKNO)m(WN)g(w)m (ould)448 3107 y(crash)27 b(if)f(the)h(p)s(edigree)f(had)h(an)g(un)m (brok)m(en)f(lo)s(op.)39 b(Starting)27 b(with)e(F)-10 b(ASTLINK)26 b(4.1P)-8 b(,)448 3220 y(UNKNO)m(WN)31 b(can)g(break)e(lo) s(ops)g(for)h(y)m(ou)g(automatically)g(and)g(systematically)f(\(see)448 3333 y(README.lselect\).)41 b(I)25 b(ha)m(v)m(e)i(left)e(the)h (diagnostic)f(for)h(un)m(brok)m(en)f(lo)s(ops)f(in)h(the)h(co)s(de,)448 3445 y(but)k(it)g(should)e(nev)m(er)j(b)s(e)f(needed)g(again.)589 3558 y(Ken)h(Morgan)g(sho)m(w)m(ed)g(that)g(m)m(y)g(initial)d(test)k (for)e(un)m(brok)m(en)g(lo)s(ops)g(w)m(as)h(insu\016-)448 3671 y(cien)m(t,)g(and)f(a)h(b)s(etter)f(diagnostic)g(w)m(as)h(put)e (in)m(to)i(F)-10 b(ASTLINK)29 b(3.0P)-8 b(.)589 3784 y(There)20 b(is)g(a)h(dual)e(\015a)m(w)h(in)f(LINKA)m(GE)i(and)f(all)f (v)m(ersions)g(of)i(F)-10 b(ASTLINK,)20 b(through)448 3897 y(3.0P)-8 b(.)25 b(The)e(programs)g(will)d(accept)25 b(p)s(edigrees)d(that)i(are)g(disconnected)f(b)s(ecause)g(they)448 4010 y(ha)m(v)m(e)33 b(to)s(o)e(man)m(y)h(lo)s(op)e(break)m(ers.)43 b(This)29 b(\015a)m(w)i(has)g(b)s(een)f(corrected)i(implicitly)-8 b(,)28 b(with)448 4123 y(no)37 b(diagnostics,)h(in)e(F)-10 b(ASTLINK)35 b(4.0P)j(b)m(y)f(the)g(in)m(tro)s(duction)e(of)i(a)g (sophisticated)448 4236 y(algorithm)e(to)h(c)m(ho)s(ose)h(lo)s(op)d (break)m(ers.)56 b(See)36 b(pap)s(er6.ps)f(for)g(m)m(uc)m(h)g(more)h (informa-)448 4349 y(tion.)k(Moreo)m(v)m(er,)32 b(in)d(F)-10 b(ASTLINK)28 b(4.1,)j(UNKNO)m(WN)g(can)f(c)m(ho)s(ose)g(the)g(initial)d (lo)s(op)448 4462 y(break)m(er)k(set)g(for)f(y)m(ou)h(\(see)g (README.lselect\))h(so)e(this)g(error)f(should)g(not)h(o)s(ccur.)589 4575 y(There)j(are)g(t)m(w)m(o)h(standard)d(routines)h(called)g Fc(inputerror)d Ff(and)j Fc(inputwarning)448 4687 y Ff(that)i(list)d (most)i(of)g(the)g(input)e(errors)h(that)h(can)g(b)s(e)f(detected.)50 b(These)32 b(routines)g(are)448 4800 y(standard)23 b(in)g(the)h(sense)f (that)i(they)f(are)g(shared)f(b)m(y)h(all)e(the)i(LINKA)m(GE/F)-10 b(ASTLINK)448 4913 y(programs.)55 b(Ev)m(en)35 b(though)f Fc(inputerror)f Ff(lists)g(o)m(v)m(er)j(40)g(di\013eren)m(t)f(p)s (ossible)d(errors,)1920 5162 y(5)p eop %%Page: 6 6 6 5 bop 448 623 a Ff(only)36 b(ab)s(out)g(15)h(of)g(these)g(can)f(o)s (ccur)h(in)e(UNKNO)m(WN.)i(A)g(detailed)e(listing)g(of)h(all)448 736 y(the)31 b(error)f(messages)h(and)f(what)g(they)h(mean)f(is)g(giv)m (en)g(in)f(README.trouble.)589 848 y(In)k(recen)m(t)i(v)m(ersions)e(of) h(UNKNO)m(WN,)h(the)f(routine)f Fc(respond)f Ff(is)h(called)g(when-)448 961 y(ev)m(er)j(an)g(error)e(is)h(detected)h(to)g(ask)g(the)f(user)g (if)f(the)i(run)d(of)j(UNKNO)m(WN)g(should)448 1074 y(con)m(tin)m(ue.) 45 b(If)31 b(the)h(user)f(wishes)f(to)j(con)m(tin)m(ue,)f(the)g(user)f (should)f(press)h(the)h(ENTER)448 1187 y(k)m(ey)-8 b(.)41 b(Otherwise)25 b(CTRL{C)h(or)h(whatev)m(er)g(kills)d(a)k(pro)s(cess)e (can)h(b)s(e)f(used)g(to)h(stop)g(the)448 1300 y(run.)448 1544 y Fd(Lo)s(ops)448 1715 y Ff(It)38 b(w)m(as)g(a)f(w)m(ell-k)m(ept)h (secret)g(that)g(un)m(til)e(F)-10 b(ASTLINK)36 b(3.0P)-8 b(,)39 b(UNKNO)m(WN)g(did)c(no)448 1828 y(genot)m(yp)s(e)30 b(inference)e(or)g(incompatibilit)m(y)e(detection)j(for)f(lo)s(op)s(ed) f(p)s(edigrees.)39 b(These)448 1941 y(\015a)m(ws)30 b(ha)m(v)m(e)i(b)s (een)d(corrected,)j(and)d(the)h(new)g(co)s(de)g(is)f(used)h(pro)m (vided)e(that)j(the)f(con-)448 2054 y(stan)m(t)39 b(LOOPSPEED)e(is)g (set)i(to)g(1.)64 b(The)38 b(algorithmic)e(asp)s(ects)j(are)f (discussed)e(in)448 2167 y(pap)s(er5.ps)i(and)g(lo)s(ops.ps.)65 b(Here)39 b(w)m(e)g(add)f(a)h(few)g(salien)m(t)f(p)s(oin)m(ts)g(ab)s (out)g(ho)m(w)h(the)448 2280 y(new)30 b(algorithms)f(a\013ect)j(the)f (usage)g(of)f(UNKNO)m(WN.)589 2393 y(UNKNO)m(WN)35 b(no)m(w)e(outputs)f (a)i(\014le)e(called)h Fc(loopfile.dat)p Ff(,)d(whic)m(h)i(represen)m (ts)448 2506 y(the)44 b(results)e(of)h(its)g(genot)m(yp)s(e)h (inference.)78 b(lo)s(op\014le.dat)42 b(is)h(output)f(regardless)h(of) 448 2618 y(whether)24 b(an)m(y)g(of)g(the)g(input)e(p)s(edigrees)h(ha)m (v)m(e)j(lo)s(ops.)37 b(The)24 b(syn)m(tax)g(of)g Fc(loopfile.dat)448 2731 y Ff(is)30 b(describ)s(ed)e(with)h(an)h(example)g(in)f Fc(README.loopfile)p Ff(.)589 2844 y(UNKNO)m(WN)23 b(is)e(no)m(w)g (faster)i(on)e(lo)s(opless)f(p)s(edigrees)h(b)s(ecause)g(some)i(of)e (the)h(algo-)448 2957 y(rithmic)k(impro)m(v)m(emen)m(ts)i(originally)d (done)i(in)f(F)-10 b(ASTLINK)27 b(1.0)h(ha)m(v)m(e)h(b)s(een)e(incorp)s (o-)448 3070 y(rated)33 b(in)m(to)g(UNKNO)m(WN.)h(Ho)m(w)m(ev)m(er,)i (UNKNO)m(WN)e(ma)m(y)f(no)m(w)g(tak)m(e)i(signi\014can)m(tly)448 3183 y(longer)30 b(than)f(b)s(efore)g(on)h(lo)s(op)s(ed)e(p)s(edigrees) h(b)s(ecause)g(of)h(the)g(extra)h(time)e(needed)g(to)448 3296 y(do)38 b(genot)m(yp)s(e)i(inference)d(and)h(incompatibilit)m(y)d (c)m(hec)m(king.)65 b(On)37 b(inputs)f(for)i(whic)m(h)448 3409 y(UNKNO)m(WN)c(tak)m(es)g(m)m(uc)m(h)f(longer)g(than)f(b)s(efore,) h(it)g(is)f(lik)m(ely)f(that)i(a)g(m)m(uc)m(h)g(larger)448 3522 y(amoun)m(t)e(of)g(time)f(will)d(b)s(e)j(sa)m(v)m(ed)i(in)d(the)h (main)g(F)-10 b(ASTLINK)29 b(program.)589 3635 y(The)d(genot)m(yp)s(e)h (inference)f(for)f(lo)s(op)s(ed)g(p)s(edigrees)g(uses)h(space)h(that)f (gro)m(ws)h(exp)s(o-)448 3748 y(nen)m(tially)21 b(with)f(the)i(n)m(um)m (b)s(er)f(of)h(lo)s(ops.)37 b(One)21 b(can)i(trade)f(space)g(for)g (time)g(b)m(y)f(reducing)448 3860 y(the)h(constan)m(t)h(max)p 1128 3860 28 4 v 33 w(v)m(ectors)p 1438 3860 V 34 w(considered.)36 b(When)22 b(space)g(is)e(a)i(problem,)g(the)f(program)448 3973 y(will)32 b(output)i(ho)m(w)h(m)m(uc)m(h)g(lo)m(w)m(er)f(this)g (constan)m(t)i(needs)e(to)h(b)s(e)f(to)h(reduce)g(the)f(space)448 4086 y(usage.)49 b(What)34 b(the)f(lo)m(w)m(er)g(v)-5 b(alue)32 b(means)h(in)e(e\013ect)k(is)d(that)h(one)g(few)m(er)g(lo)s (op)f(will)f(b)s(e)448 4199 y(considered)36 b(in)f(the)i(genot)m(yp)s (e)g(inference)f(algorithm.)59 b(This)35 b(means)h(that)h(the)g(fact) 448 4312 y(that)31 b(one)f(of)g(the)g(lo)s(op)f(break)m(ers)h(migh)m(t) g(not)g(ha)m(v)m(e)h(all)e(genot)m(yp)s(es)i(p)s(ossible,)c(will)h(b)s (e)448 4425 y(ignored.)589 4538 y(UNKNO)m(WN)h(no)m(w)e(includes)e (constan)m(ts)j Fc(LOOPSPEED)d Ff(and)i Fc(ALLELE)p 2978 4538 29 4 v 33 w(SPEED)e Ff(that)448 4651 y(con)m(trol)31 b(whether)f(the)h(new)f(lo)s(op)g(algorithms)f(are)i(used)f(and)g (whether)f(allele)h(amal-)448 4764 y(gamation)39 b(is)e(used.)64 b(Both)39 b(are)f(set)h(to)g(1)g(b)m(y)f(default.)64 b(The)37 b(only)h(reason)g(I)g(kno)m(w)448 4877 y(of)c(to)g(c)m(hange)h Fc(LOOPSPEED)c Ff(to)j(0)g(w)m(ould)e(b)s(e)h(to)i(see)f(ho)m(w)f(m)m (uc)m(h)h(slo)m(w)m(er)g(the)f(co)s(de)h(is)1920 5162 y(6)p eop %%Page: 7 7 7 6 bop 448 623 a Ff(without)38 b(genot)m(yp)s(e)h(inference)e(for)h (lo)s(ops.)64 b(The)37 b(only)h(t)m(w)m(o)h(reasons)g(I)f(kno)m(w)g(of) g(to)448 736 y(c)m(hange)g Fc(ALLLELE)p 1097 736 29 4 v 33 w(SPEED)d Ff(to)j(0)f(w)m(ould)f(b)s(e)g(to)i(see)f(ho)m(w)g(m)m (uc)m(h)g(slo)m(w)m(er)g(the)g(co)s(de)g(is)448 848 y(without)25 b(allele)f(amalgamation,)j(and)e(if)g(one)h(w)m(an)m(ts)g(to)g(do)f (allele)g(frequency)g(estima-)448 961 y(tion)34 b(with)e(ILINK.)i(Both) g(these)g(constan)m(ts)h(app)s(ear)f(in)e(commondefs.h)h(also.)52 b(The)448 1074 y(new)28 b(co)s(de)g(enforces)g(that)h(they)f(ha)m(v)m (e)h(the)f(same)h(settings)f(in)f(UNKNO)m(WN)h(and)g(the)448 1187 y(main)i(programs.)448 1431 y Fd(V)-9 b(ersions)37 b(of)g(UNKNO)m(WN)448 1602 y Ff(There)f(seem)g(to)h(b)s(e)e(a)i(v)-5 b(ariet)m(y)36 b(of)g(v)m(ersions)f(of)h(UNKNO)m(WN)h(in)e (circulation.)56 b(Jo)s(e)448 1715 y(T)-8 b(erwilliger)36 b(has)j(kindly)d(p)s(oin)m(ted)i(out)h(to)h(me)f(that)g(man)m(y)g(of)g (these)g(v)m(ersions)g(are)448 1828 y(buggy)-8 b(.)45 b(Some)32 b(of)g(the)f(problems)f(are)i(discussed)e(at)j(length)e(in)f (the)i(recen)m(tly)g(issued)448 1941 y Fe(Handb)-5 b(o)g(ok)30 b(of)e(Human)h(Genetic)f(Linkage)d Ff(b)m(y)g(T)-8 b(erwilliger)23 b(and)h(Ott.)40 b(They)25 b(strongly)448 2054 y(recommend)30 b(using)f(v)m(ersions)h(prepared)f(at)i(Colum)m(bia)e(after)i(July)e (1993.)589 2167 y(P)m(art)h(of)e(the)h(F)-10 b(ASTLINK)28 b(distribution)d(is)i(a)i(C)f(v)m(ersion)g(of)h(UNKNO)m(WN.)h(This)448 2280 y(is)44 b(not)g(really)f(in)m(tended)g(to)i(b)s(e)f(part)g(of)g(F) -10 b(ASTLINK,)44 b(but)g(is)f(distributed)e(as)k(a)448 2393 y(courtesy)33 b(to)g(F)-10 b(ASTLINK)31 b(users)g(who)g(w)m(an)m (t)i(to)g(completely)e(a)m(v)m(oid)i(the)f(need)g(for)g(a)448 2506 y(P)-8 b(ASCAL)32 b(compiler.)45 b(Starting)32 b(with)e(v)m (ersion)i(2.2)h(of)g(F)-10 b(ASTLINK,)31 b(the)i(C)f(v)m(ersion)448 2618 y(of)e(UNKNO)m(WN)g(is)e(based)h(on)g(the)g(OS/2)g(P)-8 b(ASCAL)29 b(v)m(ersion)g(from)g(Colum)m(bia)e(\(fol-)448 2731 y(lo)m(wing)j(the)h(ab)s(o)m(v)m(e)g(recommendation\).)42 b(I)30 b(made)h(it)f(b)m(y)g(using)f(the)i(p2c)g(program)f(to)448 2844 y(translate)24 b(the)f(P)-8 b(ASCAL)23 b(v)m(ersion)g(to)h(C)f (and)g(then)g(applying)e(some)j(simple)d(syn)m(tactic)448 2957 y(transformations)30 b(to)h(remo)m(v)m(e)h(the)e(need)h(for)f(the) g(p2c)h(library)-8 b(.)589 3070 y(The)30 b(new)m(er)f(v)m(ersions)g(of) h(UNKNO)m(WN)h(ha)m(v)m(e)g(added)e(some)h(nice)f(user-in)m(terface)448 3183 y(features.)39 b(A)23 b(diagnostic)g(is)f(no)m(w)i(prin)m(ted)d (after)j(eac)m(h)h(p)s(edigree)d(has)h(b)s(een)f(pro)s(cessed.)448 3296 y(More)27 b(error)f(c)m(hec)m(king)i(has)e(b)s(een)f(added.)39 b(When)26 b(an)g(error)g(in)f(the)i(data)g(is)f(detected,)448 3409 y(the)f(user)f(is)g(ask)m(ed)i(if)d(the)i(program)g(should)e(con)m (tin)m(ue)i(or)f(not.)40 b(Because)26 b(of)f(this)e(need)448 3522 y(for)38 b(user)f(input,)i(it)e(is)g(sligh)m(tly)g(dangerous)g(to) i(do)f(y)m(our)g(LINKA)m(GE/F)-10 b(ASTLINK)448 3635 y(runs)39 b(in)h(the)h(bac)m(kground)f(if)g(y)m(ou)h(are)g(not)g(sure)f (whether)g(y)m(our)h(input)d(will)g(pass)448 3748 y(through)30 b(UNKNO)m(WN)h(without)f(errors.)589 3860 y(I)44 b(added)f(b)s(etter)h (error-c)m(hec)m(king)h(tests)g(in)d(UNKNO)m(WN)j(with)e(F)-10 b(ASTLINK,)448 3973 y(2.3P)i(.)589 4086 y(The)39 b(UNKNO)m(WN)i(that)f (comes)g(with)e(v)m(ersion)h(3.0P)h(is)f(drastically)e(c)m(hanged)448 4199 y(in)32 b(man)m(y)i(w)m(a)m(ys.)50 b(T)-8 b(o)34 b(b)s(ene\014t)e(from)h(the)g(new)g(sp)s(eedups)f(in)g(F)-10 b(ASTLINK)32 b(3.0P)i(\(see)448 4312 y(pap)s(er5.ps\),)39 b(it)d(is)h(required)e(to)j(use)e(the)i(new)e(UNKNO)m(WN)i(with)e(the)i (new)e(main)448 4425 y(programs,)31 b(and)e(this)h(is)f(enforced)h(syn) m(tactically)-8 b(.)589 4538 y(The)30 b(UNKNO)m(WN)h(that)f(comes)h (with)d(v)m(ersion)h(4.0P)i(an)f(b)s(ey)m(ond)f(adds)g(new)g(al-)448 4651 y(gorithms)e(to)h(select)g(lo)s(op)e(break)m(ers.)40 b(See)28 b(README.lselect,)h(lo)s(ops.ps,)e(pap)s(er6.ps,)448 4764 y(and)c(pap)s(er7.ps)f(for)g(more)i(details.)37 b(The)22 b(new)h(co)s(de)g(is)f(in)g(the)h(\014le)f Fc(loopbrk.c)p Ff(,)g(whic)m(h)448 4877 y(w)m(as)31 b(written)f(mostly)f(b)m(y)i(Ann)e (Bec)m(k)m(er)k(and)c(partly)h(b)m(y)g(me.)1920 5162 y(7)p eop %%Page: 8 8 8 7 bop 448 623 a Fd(UNKNO)m(WN)36 b(from)h(an)h(Algorithmicist's)33 b(P)m(ersp)s(ectiv)m(e)448 794 y Ff(The)f(signi\014cance)g(of)g(iden)m (tifying)e(p)s(ossible)g(genot)m(yp)s(es)j(for)g(unkno)m(wn)e (individuals,)448 907 y(is)f(that)h(in)e(man)m(y)h(cases)h(the)g(list)e (of)h(p)s(ossible)e(genot)m(yp)s(es)j(is)e(quite)h(small)f(compared)448 1020 y(to)35 b(the)g(list)d(of)j(all)e(genot)m(yp)s(es.)53 b(F)-8 b(rom)34 b(the)h(p)s(oin)m(t)e(of)h(view)g(of)g(running)e(time,) j(mak-)448 1133 y(ing)h(the)g(list)f(of)h(p)s(ossible)e(genot)m(yp)s (es)j(as)g(small)e(as)h(p)s(ossible)e(is)h(crucial)g(b)s(ecause)i(it) 448 1246 y(mak)m(es)g(the)f(essen)m(tial)g(arra)m(ys)h(that)f(enco)s (de)g(the)h(conditional)d(probabilit)m(y)g(of)i(eac)m(h)448 1359 y(genot)m(yp)s(e)i(sparse.)59 b(Ev)m(en)37 b(in)f(cases)h(where)f (the)h(genot)m(yp)s(e)h(cannot)f(b)s(e)f(completely)448 1472 y(inferred)30 b(\(and)i(it)g(app)s(ears)f(as)h(unkno)m(wn)f(in)g Fc(ipedfile.dat)p Ff(\),)e(the)k(list)d(of)i(p)s(ossible)448 1585 y(genot)m(yp)s(es)j(in)e Fc(speedfile.dat)d Ff(can)k(b)s(e)f (extremely)h(helpful)d(in)i(reducing)f(compu-)448 1698 y(tation)g(in)f(the)h(main)e(program.)45 b(The)31 b(algorithmic)g (impro)m(v)m(emen)m(ts)h(in)e(F)-10 b(ASTLINK)448 1810 y(ha)m(v)m(e)30 b(redoubled)d(the)h(signi\014cance)g(of)g(sparsit)m(y)g (for)g(the)h(impatien)m(t)f(link)-5 b(age)27 b(analyst)448 1923 y(\(see)32 b(pap)s(er1.ps\).)589 2036 y(The)27 b(UNKNO)m(WN)g (program)g(tries)f(to)h(infer)e(as)i(m)m(uc)m(h)g(as)f(p)s(ossible)f (for)h(eac)m(h)i(un-)448 2149 y(kno)m(wn)k(genot)m(yp)s(e)i(of)f(eac)m (h)h(individual.)43 b(T)-8 b(o)33 b(do)f(this)g(it)g(do)s(es)h(a)g(p)s (edigree)e(tra)m(v)m(ersal)448 2262 y(with)j(that)h(individual)c(as)k (proband)e(v)m(ery)j(m)m(uc)m(h)f(lik)m(e)f(the)h(tra)m(v)m(ersals)g (in)f(the)h(main)448 2375 y(programs.)53 b(See)35 b(the)f(F)-10 b(ASTLINK)34 b(do)s(cumen)m(t)g(tra)m(v)m(erse.ps)i(for)e(more)h (information)448 2488 y(on)g(p)s(edigree)e(tra)m(v)m(ersals.)54 b(The)34 b(tra)m(v)m(ersals)h(are)g(orc)m(hestrated)h(b)m(y)e(a)h (routine)f(called)448 2601 y Fc(iterpeds)p Ff(.)55 b(T)-8 b(o)37 b(b)s(e)e(similar)e(to)k(the)f(main)f(programs,)i(eac)m(h)g(tra) m(v)m(ersal)g(for)e(a)h(\(p)s(er-)448 2714 y(son,)c(unkno)m(wn)e(genot) m(yp)s(e\))j(pair)d(is)h(done)g(b)m(y)g(a)h(routine)e(called)h Fc(likelihood)p Ff(,)e(ev)m(en)448 2827 y(though)g(no)g(lik)m(eliho)s (o)s(d)e(of)i(an)m(ything)g(is)f(computed)h(in)f(the)i Fc(likelihood)c Ff(routine)i(in)448 2940 y(UNKNO)m(WN.)589 3052 y(The)h(main)f(di\013erences)g(b)s(et)m(w)m(een)h(the)g(tra)m(v)m (ersal)h(in)d(UNKNO)m(WN)j(and)e(the)h(reg-)448 3165 y(ular)g(tra)m(v)m(ersals)j(are)e(that:)585 3378 y Fa(\017)46 b Ff(Only)25 b(one)i(lo)s(cus)f(is)g(considered)f(at)j(a)f(time,)h (hence)f(the)g(e\013ects)h(of)f(recom)m(bina-)676 3491 y(tion)32 b(can)i(b)s(e)e(ignored,)h(and)g(the)g(n)m(um)m(b)s(er)f(of)h (p)s(ossible)e(genot)m(yp)s(es)j(is)e(usually)676 3604 y(small.)585 3791 y Fa(\017)46 b Ff(Bo)s(olean)33 b(logic)g(is)f(used)g (to)i(indicate)e(whic)m(h)g(genot)m(yp)s(es)i(are)g(p)s(ossible)c (rather)676 3904 y(than)g(actually)g(computing)f(their)h(conditional)e (probabilities.)38 b(That)30 b(is,)f(UN-)676 4017 y(KNO)m(WN)d(mak)m (es)g(no)g(distinction)d(b)s(et)m(w)m(een)j(genot)m(yp)s(es)h(that)f (could)e(ha)m(v)m(e)j(dif-)676 4130 y(feren)m(t)34 b(nonzero)h (conditional)d(probabilities)f(in)i(a)i(tra)m(v)m(ersal)g(as)g(done)f (b)m(y)g(the)676 4243 y(main)29 b(programs.)589 4456 y(The)41 b(t)m(w)m(o)h(p)s(oin)m(ts)e(ab)s(o)m(v)m(e)j(accoun)m(t)f (for)f(wh)m(y)g(UNKNO)m(WN)h(can)f(examine)g(the)448 4568 y(same)25 b(p)s(edigrees)e(m)m(uc)m(h)h(more)h(quic)m(kly)e(than)h (LINKA)m(GE/F)-10 b(ASTLINK.)24 b(The)g(signif-)448 4681 y(icance)j(of)g(using)e(Bo)s(olean)j(arithmetic)d(instead)h(of)h (regular)f(arithmetic)g(is)g(discussed)448 4794 y(at)31 b(some)g(length)f(in)f(pap)s(er1.ps.)1920 5162 y(8)p eop %%Page: 9 9 9 8 bop 589 623 a Ff(UNKNO)m(WN)43 b(uses)e(routines)g Fc(collapsedown)p Ff(,)g Fc(collapseup)p Ff(,)h Fc(seg)p Ff(,)i Fc(segdown)448 736 y Ff(and)28 b Fc(segup)f Ff(m)m(uc)m(h)h(lik) m(e)f(those)i(in)e(the)h(original)f(main)g(LINKA)m(GE)h(programs.)40 b(Ho)m(w-)448 848 y(ev)m(er,)i(these)c Fc(segup)f Ff(and)h Fc(segdown)e Ff(routines)h(are)h(algorithmically)e(m)m(uc)m(h)i (simpler)448 961 y(b)s(ecause)31 b(of)f(the)h(t)m(w)m(o)h(p)s(oin)m(ts) d(ab)s(o)m(v)m(e.)589 1074 y(One)20 b(other)h(distinction)d(is)h(that)i (in)e(UNKNO)m(WN)i(\(unlik)m(e)e(LINKA)m(GE/F)-10 b(ASTLINK\),)448 1187 y(the)31 b(same)g(routines)e(are)i(used)e(to)i(handle)e(b)s(oth)h (autosomal)h(and)f(sexlink)m(ed)e(data.)589 1300 y(When)38 b(the)g(tra)m(v)m(ersal)h(is)e(done,)i(the)g(arra)m(y)f(of)g(genot)m (yp)s(es)h(for)e(proband)g(is)f(ex-)448 1413 y(amined,)e(to)g(\014nd)e (whic)m(h)g(genot)m(yp)s(es)i(are)g(p)s(ossible.)47 b(These)34 b(are)f(then)g(stored)h(in)e(an)448 1526 y(arra)m(y)f(called)f Fc(possible)e Ff(to)j(b)s(e)f(prin)m(ted)f(later)h(in)f(the)i Fc(writespeed)c Ff(routine.)589 1639 y(UNKNO)m(WN)h(in)e(F)-10 b(ASTLINK)26 b(4.0P)i(includes)c(an)j(algorithmic)f(solution)f(to)j (the)448 1752 y(problem)39 b(of)h(selecting)f(lo)s(op)g(break)m(ers.)70 b(This)38 b(is)h(a)h(longstanding)e(op)s(en)i(problem)448 1865 y(in)h(link)-5 b(age)41 b(analysis.)74 b(It)42 b(turns)f(out)h (that)h(the)f(link)-5 b(age)41 b(analysis)f(v)m(ersion)i(of)g(the)448 1978 y(problem)35 b(is)g(a)h(sp)s(ecial)f(case)i(of)f(a)h(problem)d (that)j(has)f(b)s(een)f(studied)f(in)h(computer)448 2090 y(science)f(since)f(at)h(least)f(the)h(mid-1980's.)50 b(Ann)33 b(Bec)m(k)m(er,)j(Dan)e(Geiger,)h(and)e(I)g(ha)m(v)m(e)448 2203 y(applied)26 b(some)i(of)g(the)g(tec)m(hniques)f(dev)m(elop)s(ed)h (for)f(the)h(more)g(general)g(problem)e(in)m(to)448 2316 y(the)39 b(new)f(v)m(ersion)f(of)i(UNKNO)m(WN.)g(See)g(pap)s(er6.ps)e (for)h(the)g(in)m(teresting)g(history)448 2429 y(of)31 b(the)h(lo)s(op)e(break)m(er)h(selection)g(problem)e(and)h(for)h (information)e(on)i(ho)m(w)g(it)f(can)i(b)s(e)448 2542 y(solv)m(ed)f(algorithmically)-8 b(.)1920 5162 y(9)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.djgpp0000644000265600020320000001325107146513763015400 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: August 15, 2000 DJGPP Installation and Use Instructions This file describes how to retrieve, install, and use the djgpp C compiler for DOS. djgpp is a port of gcc to DOS done by DJ Delorie. It is freely available via ftp over the Internet. djgpp is the compiler we use to make the executable files for FASTLINK for DOS. Big thanks to Ramana Idury and Roger Kou who first ported FASTLINK to DOS. Thanks to Toby Nygaard for updating this file to reflect changes in djgpp. The djgpp compiler understands make. The source code for FASTLINK for DOS is *exactly* the same as the source code for the UNIX versions of FASTLINK. All you need to do to prepare to compile the code for DOS is add the flag -DDOS by changing the line in the Makefile that currently reads: #SYSDEP = to: SYSDEP = -DDOS A significant incentive for you to install djgpp and compile FASTLINK for yourselves is that you will get to try the "fast" version of FASTLINK for 2 and 3 point runs. The executables we distribute are for the "slow" version of FASTLINK, which is still measurably faster than LINKAGE. djgpp is configured to cope with the fact that the Makefile uses long (longer than 8 characters before the dot) file names, but DOS traditionally supports 8.3 file names. On newer systems that support longer file names, you either have to modify the file names so that they are truncated to the 8.3 limit. See http://www.delorie.com/djgpp/ for more up to date information. |*| File Retrieval for setting up the djgpp C compiler. This is mostly about retrieving the files. ftp is file transfer protocol. It is a program for transferring files from one computer to another via internet. There are several ftp repositories on the internet that have djgpp. One is at Oakland University in Michigan called - oak.oakland.edu Start at the prompt in the drive you wish to install djgpp in e.g., [Drive letter]:\> You need to make a directory to put the compiler in, such as, [Drive letter]:\djgpp (the compiler name is djgpp). To do this Type "md djgpp" (here and in all cases do not type the "") Retrieving files from the ftp repository. ftp ftp.simtel.net You should get a login prompt. Although you do not have an account with this computer you can log in as anonymous. (Many computers on the net allow access to the general public this way) type - "anonymous" At the password prompt, type in your full e-mail address. The files are currently located in the directory SimTel/vendors/djgpp - to get there type cd pub/simtelnet/gnu/djgpp This directory contains a large number of files that take a long time to retrieve all together. As of July 24, 1995, the recommended files necessary are: bnu252.zip (The GNU assembler, previously in gasXXXbn.zip, is now included in this file) djdev112.zip djdocXXX.zip djeoe112.zip djgpp.faq dj112m1.zip (see note below) dj112m2.zip dj112m3.zip dj112m4.zip gcc263bn.zip mak371bn.zip split.exe unzip386.exe More up to date instructions can be found via the Web page listed above. The dj112mX.zip files are updates. When you install the compiler, it will be important to unzip and install (by running the 112mX.bat file in each dj112mX.zip file) each update sequentially. To retrieve these files use the get command (before using you must set to binary transfer rather then ascii), do this by typing "bin". Optional; type "hash" (this lets you know how transfer is proceeding) type "bell" (this tells you when each operation is done) For each file you want. type "get filename" (ex: get split.exe) When done type "quit" to exit archive. As you can see most of the files you retrieve are zip files. You should use the program unzip386.exe which you will have retrieved to unzip them. Different versions of unzip have been unsuccessful at unzipping these files. To unzip files type unzip386 filename.zip (you only need to unzip .zip files) ex:unzip386 djeoe112.zip |*| Installing djgpp and compiling FASTLINK To install djgpp, find the file readme.dj. Follow the directions in readme.dj verbatim. You must be extremely careful to type the modifications to your system files exactly as they are shown there, particularly with the exact same spaces or lack of spaces. (1) Execute the following command before any compilation. setdjgpp [Drive letter]:\djgpp [Drive letter]:/djgpp where [Drive letter]:\djgpp is the directory where DJGPP has been installed. If it is installed at a different location change the above command accordingly. This step is needed since DJGPP works and behaves like a Unix compiler. As such the Makefile from the Unix version can be used directly. (2) Change the working directory to wherever the fastlink source code files are located. (3) Run make installslow -f makefile This will create the files ilink. lodscore, linkmap, and mlink. (4) If you are using a version 1.XX of djgpp, then at this stage the files are not exactly suitable for execution on a DOS machine. You need to run coff2exe -s [Drive letter]:\djgpp\bin\go32.exe ilink lodscore mlink linkmap The program does not seem to find go32.exe without stipulating the path even if its path is included in one's autoexec.bat file. If you are using a newer version 2.XX of djgpp, then the programs you compiled (unknown mlink ilink lodscore linkmap) are executable, but you may need to rename them with a .exe extension, so that they can be integrated with the LINKAGE auxiliary programs. If the compilation cannot find certain library functions it is either because: 1. You did not modify the system configuration files exactly right or 2. You did not unzip the djdev file in a subdirectory which is on the path where djgpp can find it. fastlink-4.1P-fix95/README.memory0000644000265600020320000000545006737457627015621 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 FASTLINK, version 3.0P and beyond This file discusses memory requirements for FASTLINK. See the top level README file for a roadmap to all FASTLINK documentation. |*| Memory Requirements ------------------- The FASTLINK programs can require large amounts of memory when doing multilocus analysis. Of course the amount of memory required is very dependent on the number of loci and the number of alleles at each locus. However even 100 Mb is not a problem to run under Sun OS for instance, because this is a virtual memory operating system. Ideally one would want to run a program of this size on a machine with 32 Mb of memory, but in our experience it is possible to run on machines with as little as 12 Mb. Of course it is necessary to have a swap file with sufficient space to run the OS and have enough free space for the program. To see how much space a program requires in version 2.0 or earlier, it was possible to use the unix command: size for instance using linkmap from FASTLINK, 2.0: unix> /usr/bin/size linkmap text data bss dec hex 139264 8192 28719480 28866936 1b87978 This value under "dec" is the decimal number of bytes for the whole program. So we see in this case that 28.9 Mbytes is required. Then compare this with the unix pstat command: unix> /etc/pstat -s 14880k allocated + 3712k reserved = 18592k used, 169000k available This indicates that a total of 187592 Kbytes or 187 Mb has been allocated on this system for swap space, and with the current job mix, 18.5 Mb are used and 169 Mb are available. So in this case linkmap will be able to run. To enlarge the swap space consult your local system administrator. For a single user system running FASTLINK we recommend 150Mb total swap space as a minimum. Alternatively, use the "slow" versions of the programs. The term slow is a little misleading in that these versions will still be significantly faster than the originals. In the case of linkmap, the version compiled with make slowlinkmap with the current constant settings is less than 1 Mb in size. Any unix system should have a swap file large enough for this. Starting in version 2.1 of FASTLINK a lot of the memory allocation is done dynamically (See README.updates). In version 2.2 and beyond, almost all the large data structures are allocated dynamically. This means that you will not be able to detect before running whether you have enough memory. If you do not have enough, the program should exit politely with an explanation, shortly after startup. The advantage of doing the memory allocation at runtime is that it may be possible to use significantly less memory based on knowledge of certain parameters that are available only at runtime. fastlink-4.1P-fix95/README.p40000644000265600020320000004536606737457627014646 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: October 6, 1997 FASTLINK, version 3.0P and beyond This file describes installation of the P4 Parallel Processing Library in conjunction with parallel FASTLINK. See README for an overview of all the documentation. See README.parallel for an overview of how FASTLINK can run in parallel. |*| P4, Background -------------- P4 is a portable, parallel processing library developed at Argonne National Laboratory. P4 supports both shared-memory and message-passing models of parallel computation. Shared-memory programs can be run on advanced parallel supercomputers, and single, shared-memory multiprocessors. Additionally, P4 can simulate shared-memory multiprocessing on uniprocessors that support SYSV IPC (UNIX System V, Inter Process Communication). The P4 version of FASTLINK utilizes the shared-memory model. It has been successfully run on Sun multiprocessor workstations running Solaris, DEC Alphas running OSF, and SGI Challenges running IRIX. It will likely run with minor modifications on other platforms supported by P4. We are eager to provide portability assistance if you can provide us access to your shared-memory multiprocessor. Please note that while P4 message-passing programs can also be run on networks of workstations, P4 FASTLINK will not. If you are interested in running parallel FASTLINK on a network of UNIX workstations, please refer to the file README.parallel for more information. |*| FTP Instructions ---------------- The P4 distribution can be obtained by anonymous ftp from info.mcs.anl.gov in the directory pub/p4. The current version of p4 is 1.4 (even though the README in the ftp directory says it's 1.3). Here are specific instructions for obtaining p4. ftp info.mcs.anl.gov Login as "anonymous", and use your full e-mail address as password. cd pub/p4 Remember to use binary mode for transfer. To retrieve the distribution: bin get p4-1.4.tar.Z |*| Building P4 ------------ The distribution is a compressed tar file. To unpack it, use: uncompress p4-1.4.tar.Z tar xvf p4-1.4 or zcat p4-1.4.tar.Z | tar xvf - Then, go to the directory created. cd p4-1.4 The distribution contains all the source code, installation instructions, a complete reference manual, and a number of sample programs. Refer to the README in the directory doc for details about the documentation. To build P4, you will need to specify the specific architecture of your machine. Type: make P4ARCH= where is one of the machines listed in the file util/machines. If you are not quite sure which machine to choose, the file doc/p4.txt enumerates these names more specifically. For example, to build P4 on a Sun workstation running Solaris, you would type: make P4ARCH=SUN_SOLARIS The default makefile uses the cc compiler. If you wish to use another compiler, you can edit the file util/defs.all. Look for the section corresponding to your architecture, and change the variables CC and CLINKER. If you have trouble compiling P4, please consult your system administrator for assistance. If you wish to put the P4 library in another directory, type: make install INSTALLDIR= where is the directory where you want P4 to be installed. The directory you choose here will be the P4_HOME_DIR that you will need to supply in the FASTLINK Makefile. needs to be given with a full path name. On some systems the make install command may fail due to the relative placement of various system commands and files. In this case, it is still possible to use P4 in the p4-1.4 subdirectory where make P4ARCH command was run. |*| Building P4, Using SYSV_IPC --------------------------- Depending on your system, P4 should be built with or without SYSV_IPC (Unix System V Interprocess Communication). The file OPTIONS in the P4 distribution directory contains the line: /* #define SYSV_IPC */ Since this line is commented out, by default P4 is always built *without* SYSV_IPC. If your system requires SYSV_IPC, you should change the above line to: #define SYSV_IPC This change, of course, must be made *before* compiling P4. The P4 documentation states that in certain cases, you can build P4 with *or* without SYSV_IPC. From our experience, however, FASTLINK has specific requirements for each system that in each case mandate only one of these options. In general, with the exception of SOLARIS, it seems that shared-memory multiprocessors require SYSV_IPC in order to run FASTLINK properly. Refer to the following sections on building P4 for SOLARIS, IRIX, and OSF for details. A final note on SYSV_IPC: due to the way this protocol allocates shared data, if a P4 run crashes before completion, some of the data may not be properly de-allocated. If a run crashes, you should use the "ipcs" utility to determine if there is any unclaimed data. The command: ipcs -c will tell you if you have any stray message queues, shared memory, or semaphores lying around. You can use the "ipcrm" command to remove any, should they exist. Consult your local documentation (man pages) for details. |*| Building P4 for SOLARIS ----------------------- P4 should compile pretty much "out of the box" for SOLARIS. Note that for SOLARIS, P4 must be build *without* SYSV_IPC, although this should be done automatically for you. The make variable P4ARCH should be defined as SUN_SOLARIS. On some systems, make might crash while building in the directory "alog", due to a header file that can have different names on different systems. Since FASTLINK does not make use of the alog package, you should just be able to restart make (using the same P4ARCH flag as before), and it should proceed smoothly until the end. Make sure to read the notes in the section "Hooking FASTLINK and P4 Together" below that relate to SOLARIS. |*| Building P4 for IRIX -------------------- IRIX is an implementation of UNIX for SGI workstations. P4 will run under IRIX, but our experience has been that some simple modifications must be made to the source code in order to get it to compile properly. First, note that for IRIX, P4 must be built *with* SYSV_IPC. Refer to the section "Building P4, Using SYSV_IPC" above for details. The make variable P4ARCH should be defined as SGI. Next, from our experience, the linking flag -lsun automatically included in the Makefile did not work. You can disable this by editing the file defs.all in the P4 util directory. Look for the line: # BEGIN SGI in defs.all. Eight lines below this, you will see the line: MDEP_LIBS = -lsun Comment this line out, by changing it to: #MDEP_LIBS = -lsun Make sure that the line you comment out comes before the line: # END SGI Finally, you must modify the source code for compilation. There are two ways you can do this: First, if you have access to the unix "patch" utility, you can use the file p4_patchfile.IRIX found in the directory 3.0P/irix of the FASTLINK distribution to make these changes. First copy this file into the P4 distribution directory p4-1.4/lib. Then cd to this directory. Within the p4-1.4/lib directory, type: patch < p4_patchfile.IRIX In the event that you don't have patch available, you can make the modifications by hand. The files you need to change are in the lib directory in the P4 distribution. They are p4_secure.c, and p4_sock_cr.c. Only three lines of code need to be changed. 1) In p4_secure.c, chage line 336 from: char *getpw(host, name) to: char *p4_getpw(host, name) 2) In p4_sock_cr.c, change line 149 from: char *getpw(); to: char *p4_getpw(); 3) Also in p4_sock_cr.c, change line 182 from: rc = start_slave(host, username, pgm, serv_port, am_slave_c, getpw); to: rc = start_slave(host, username, pgm, serv_port, am_slave_c, p4_getpw); In either case, you should then continue with the compilation process as described above. Make sure to read the notes in the section "Hooking FASTLINK and P4 Together" below that relate to IRIX. |*| Building P4 for OSF ------------------- OSF is an implementation of UNIX used on most DEC Alpha workstations. Thanks to Garret Taylor at DEC Ireland for the following information on compiling P4 for OSF. For OSF, P4 must be built *with* SYSV_IPC. Refer to the section "Building P4, Using SYSV_IPC" above for details. The make variable P4ARCH should be defined as ALPHA. When running P4 FASTLINK, you may have to increase the maximum allowed size of a shared-memory block to run the code. This can be done by editing the /etc/sysconfigtab file and adding the following entry: ipc: shm-max = 16777216 (or whatever size you need, in bytes) and rebooting. |*| Hooking FASTLINK and P4 Together --------------------------------- Please refer to the file README.install, README.makefile and README.parallel for general details on building FASTLINK. When building the P4 version of FASTLINK, you will need to examine the following variables in the FASTLINK Makefile: PARLIB This variable must be set to "-DIS_P4=1", which tells FASTLINK to use it's P4-specific code. Uncomment the line in the Makefile that reads: PARLIB = -DIS_P4=1 Make sure that the other definition of PARLIB is commented out. PARINCLPATH This variable tells make where to find the P4 include files. Uncomment the line in the Makefile that reads: PARINCLPATH = -I$(P4_INCLDIR) Again, make sure that the other definition of PARINCLPATH is commented out. P4_HOME_DIR Set this variable to the directory you specified when installing as above. For example, if you installed with /usr/lib/p4-1.4 as the INSTALLDIR, set P4_HOME_DIR to: P4_HOME_DIR = /usr/lib/p4-1.4 P4_MDEP_LD SYSDEP If you are running Solaris, you must uncomment the line: P4_MDEP_LD = -lsocket -lnsl -lthread as well as the line: SYSDEP = -DSOLARIS in order to successfully compile FASTLINK. If your compiler complains about "undefined symbol"s, or about "EXIT_FAILURE redefined", it is likely you have forgotten to uncomment one of these lines. After installing P4, and setting these variables, you may proceed to building FASTLINK as described in the files README.install, README.makefile, and README.parallel. The target P4 executables are ilink.p4, mlink.p4, and linkmap.p4. They can be built individually with: make ilink.p4 make linkmap.p4 make mlink.p4 respectively. Alternately, you can build all three with: make installp4 These will put the corresponding executables wherever the BINDIR flag (described in README.makefile) points to. |*| Running P4 FASTLINK ------------------- You will typically want to make a soft link between the regular name without the .p4 extension in your data directory and the actual executable. e.g.:. ln -s ../bin/ilink.p4 ilink There are some compilation flags you may want to set to prepare for a run. See README.Makefile or the Makefile itself for instructions. |*| Running P4 FASTLINK, Specifying number of processors ---------------------------------------------------- One small modification is needed either in the command line (if you call ilink, linkmap, or mlink directly) or in the lcp-produced shell script. At the line where the main program is invoked, the string: -n must be appended, where is the number of processors you wish to run on. If you do not specify the number of processors, FASTLINK will default to a 4 processor run. For example, when running LINKMAP on 8 processors, linkmap becomes linkmap -n 8 When modifying lcp-produced scripts be careful that the first occurrence of the string ilink, linkmap, or mlink is a parameter to lsp, and therefore should not be altered. It is the second occurrence which is actually the call to the program, where the flag must be set. |*| Running P4 FASTLINK, Specifying maxworkingset --------------------------------------------- You may also specify a value for the variable maxworkingset, which represents the maximum number of people active during the analysis (sometimes known as maximum cutset). In FASTLINK 3.0P, maxworkingset is estimated automatically at runtime. In some pedigrees with loops, the estimate is unnecessarily high, so you may wish to override the estimate with a different value. If you use the automatic estimate of maxworkingset and the code complains that this estimate is too low, you have hit a bug and should report it (see README.bugreport). However, you can still use the -w flag to work around the bug, while I fix it. For example, to run ILINK with maxworkingset defined to 40, you would type: ilink -w 40 The error message you would encounter if maxworkingset is too low will report what the current value is. You may try incrementally larger values until the run succeeds. |*| Running P4 FASTLINK, Specifying memory usage -------------------------------------------- Additionally, P4 allows you to specify the amount of global memory to allocate with the flag -p4gm where is the number of bytes of global memory to allocate. This parameter is really measured in bytes, not any larger units. FASTLINK has been tuned to calculate in advance the amount of memory it will need, and to request the proper amount for you. In general, it will request a bit more memory than is actually needed, just to be safe. If, for some reason, a run fails because it does not have sufficient shared memory, or if your machine refuses to grant the amount FASTLINK specifies, you can override FASTLINK's calculation and specify the amount of global memory you would like with this flag. You can use the -m flag (described in the next section) to see how much memory FASTLINK is requesting, and try manually to request a bit less. |*| Running P4 FASTLINK, Analyzing memory usage ------------------------------------------- Memory usage becomes important when using P4 FASTLINK, because P4 allocates all of the shared memory it will need for the entire run at the beginning of the run. Depending on your system configuration, you may not be able to complete arbitrarily large (in terms of memory usage) runs. As described in README.makefile, there are different levels of memory usage for FASTLINK. The -m option for parallel FASTLINK provides a simple way to determine shared memory requirements for a specific run. When you run with this option, FASTLINK will do some brief i/o and computation, and then exit (before starting the actual linkage analysis) with a diagnostic message. A sample run of LINKMAP with the command: linkmap -n 2 -m yielded: LINKMAP is currently compiled with PRECOMPUTE=1. Shared memory usage for this run will be as follows: memory usage total request calculated (including fudge factor) ---------------------------------------------- 7441589 bytes 9301986 bytes for 2 processor(s) 6734521 bytes 8418152 bytes for 1 processor(s) Recompiling with PRECOMPUTE=0 would yield: memory usage total request calculated (including fudge factor) ---------------------------------------------- 6360069 bytes 7950086 bytes for 2 processor(s) 5692341 bytes 7115427 bytes for 1 processor(s) Please refer to the README.makefile and README.p4 for details. As was mentioned above in the section on "Specifying memory usage", FASTLINK calculates how much memory a run is likely to require, and then adds in a little extra (the fudge factor). You can see from this message both the original amount calculated, and the amount of the final request. You can use the amount calculated as a lower bound on reasonable requests with -p4gm. You can also see from this message the difference in memory usage between compiling with PRECOMPUTE=0 and PRECOMPUTE=1. This can be useful when determining whether or not you can expect to compute a given run on your system. As with the -n flag above, -w, -p4gm, and -m would need to be added to your lcp-produced script if you use them in conjunction with a script. |*| Parallel FASTLINK, Running times -------------------------------- Due to the way theta evaluations are done in parallel, unlike the sequential version, output will not appear on the screen after each theta is complete. However, you will see periodic reports of execution times for each group of thetas as they are evaluated. A sample run might show: Execution time (!parallelThetas) = 0.099 Execution time (parallelThetas) for 1 = 0.052 Execution time (parallelThetas) for 2 = 0.896 Execution time (parallelThetas) for 3 = 0.096 Execution time (!parallelThetas) = 0.086 Elapsed time: 1.28 seconds Each of the "Execution time" statements will appear one at a time as computation progresses. The difference between parallelThetas and !parallelThetas has to do with whether all processors are working together on a single theta, or whether they are working independently on different thetas. The "Elapsed time" statement shows the total execution time for the entire run. |*| P4, Troubleshooting ------------------- Unfortunately, some of the error messages that P4 produces are not very descriptive. Many times, the particular message produced under similar circumstances can differ from system to system. As a result, it is generally difficult to determine what the problem really is. In general, error messages produced by P4 will look like: p4_error: where is the error being reported, or: p0_xxxxx: p4_error: where xxxxx is the pid (process id) of the FASTLINK program. Most any other error message you see is likely a FASTLINK error message. If you encounter a P4 error message near the beginning of a run (ie, before the first theta evaluation is complete), and the program quits, it is likely that you do not have enough shared memory available for this run. Likewise, if you encounter a FASTLINK error message with the phrase "MALLOC ERROR", you need more memory. See the above section on "Analyzing memory usage" for possible remedies. Another common problem is getting different results for a run on 1 processor, and the same run on more than 1 processor. If this happens to you, it is likely that you have not defined SYSV_IPC properly for your system. Please refer to the section above on "Using SYSV_IPC" for details. If you encounter an error that you feel is not of the flavor described above, please send us as precise a description of the problem as possible (including output, etc.) so we can try to help discern the cause of the problem. Please refer to README.bugreport for guidlines on submitting a bug report. |*| P4, Misc ----------- If you have any other problems compiling or building P4, please refer to the documentation included in the P4 distribution, or ask your system administrator for help. Specific problems or questions may be directed to p4@mcs.anl.gov. fastlink-4.1P-fix95/4.1P/0000755000265600020320000000000011117263771014027 5ustar tilleaadminfastlink-4.1P-fix95/4.1P/src/0000755000265600020320000000000010761543162014615 5ustar tilleaadminfastlink-4.1P-fix95/4.1P/src/commoncode.c0000644000265600020320000004660510517437622017121 0ustar tilleaadmin/* This file contains common routines abstracted from main() in all versions of the FASTLINK programs ILINK, LINKMAP, and MLINK. Sequential FASTLINK is an improved version of LINKAGE. Improvements are described in described in: R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer Faster Sequential Genetic Linkage Computations American Journal of Human Genetics, 53(1993), pp. 252--263 and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Linkage Analysis Human Heredity 44(1994), pp. 225-237. The parallel implementations of ILINK are described in: S. Dwarkadas, A. A. Schaffer, R. W. Cottingham Jr., A. L. Cox, P. Keleher, and W. Zwaenepoel, Parallelization of General Linkage Analysis Problems, Human Heredity 44(1994), pp. 127-141 and S. K. Gupta, A. A. Schaffer, A. L. Cox, S. Dwarkadas, and W. Zwaenepoel, Integerating Parallelization Strategies for Linkage Analysis, Computers and Biomedical Research, to appear. The code in this file was written by Chris Hyams. */ #include "commondefs.h" #include "gemdefs.h" #if !defined(LESSMEMORY) #include "moddefs.h" #endif /* if !defined(LESSMEMORY) */ #if !defined(DOS) #include "checkpointdefs.h" #endif /* if !defined(DOS) */ #if defined(MLINK) #include "mldefs.h" #endif /* if defined(MLINK) */ #if defined(LINKMAP) #include "lidefs.h" #endif /* if defined(LINKMAP) */ #if defined(ILINK) #include "ildefs.h" #endif /* if defined(ILINK) */ #if PARALLEL #include "compar.h" /* parallel support code */ #endif /* defined(PARALLEL) */ #if (defined(MLINK) || defined(LINKMAP)) extern void preIpedLoop(); #if PARALLEL #if !defined(KNR_PROTO) extern void simIpedLoop(loopStatus); #else /* !defined(KNR_PROTO) */ extern void simIpedLoop(); #endif /* !defined(KNR_PROTO) */ #else /* if PARALLEL */ extern void ipedLoop(); #endif /* if PARALLEL */ #endif /* (defined(MLINK) || defined(LINKMAP) */ #if defined(GMEM_DEBUG) int totMem = 0; #endif /* defined(GMEM_DEBUG) */ double mapfunction(theta1, theta2) double theta1, theta2; { /*User defined function giving recombination between flanking markers as a function of recombination between adjacent markers*/ return ((theta1 + theta2) / (1 + 4 * theta1 * theta2)); } double getdist(theta) double *theta; { if (*theta < 0.5) return (log(1.0 - 2.0 * *theta) / -2.0); else return 10.0; } double invdist(dist) double *dist; { #if defined(ILINK) if (*dist != 10.0) #else if (*dist < 10.0) #endif /* defined(ILINK) */ return ((1 - exp(-2 * *dist)) / 2.0); else return 0.5; } static void printVersion() { printf("\nProgram %s version%6.2f (1-Feb-1991)\n\n", PROGRAM, fVersion); printf("\nFASTLINK "); #if defined(LESSMEMORY) printf("(slow) "); #endif printf("version %s (30-Jun-1999)", fastversion); #if PARALLEL printf(" (PARALLEL)"); #endif printf("\n\n"); } void initialize() { #if PRALLEL if (Tmk_proc_id == 0) { #endif printVersion(); printf("The program constants are set to the following maxima:\n"); #if defined(ILINK) printf("%6d loci in mapping problem\n", (int)maxlocus); #else printf("%6d loci in mapping problem (maxlocus)\n", (int)maxlocus); #endif /* defined(ILINK) */ printf("%6d alleles at a single locus (maxall)\n", (int)maxall); printf("%6ld maximum of censoring array (maxcensor)\n", maxcensor); #if defined(ILINK) printf("%6d individuals in all pedigrees combined\n", (int)maxind); #else printf("%6d individuals in all pedigrees combined (maxind)\n", (int)maxind); #endif /* defined(ILINK) */ printf("%6d pedigrees (maxped)\n", (int)maxped); #if !defined(ILINK) printf("%6d binary codes at a single locus (maxfact)\n", (int)maxfact); #endif /* !defined(ILINK) */ printf("%6d quantitative factor(s) at a single locus\n", (int)maxtrait); printf("%6d liability classes\n", (int)maxliab); printf("%6d binary codes at a single locus\n", (int)maxfact); printf("%8.2f base scaling factor for likelihood (scale)\n", scale); printf("%8.2f scale multiplier for each locus (scalemult)\n", scalemult); printf("%8.5f frequency for elimination of heterozygotes (minfreq)\n", minfreq); if (minfreq != 0.0) { printf("IMPORTANT : RECOMPILE THIS PROGRAM WITH MINFREQ=0.0\n"); printf("FOR THE ANALYSIS OF RECESSIVE TRAITS\n"); } putchar('\n'); #if PRALLEL } #endif } /*initialize*/ void printInfo() { printVersion(); printf("\n%s has been compiled with the following options:\n\n", PROGRAM); #if PARALLEL printf(" PARALLEL computation (PARALLEL defined)\n"); #endif printf(" CHECKPOINTING is "); #if defined(DOS) printf("disabled (DOS defined)\n"); #else printf("enabled (DOS not defined)\n"); #endif /* defined(DOS) */ #if defined(LESSMEMORY) printf(" SLOW version (LESSMEMORY defined)\n"); #else printf(" FAST version (LESSMEMORY not defined)\n"); #endif /* defined(LESSMEMORY) */ #if PARALLEL printf(" PRECOMPUTE = "); #if PRECOMPUTE printf("1\n"); #else printf("0\n"); #endif #endif /* PARALLEL */ printf("\nProgram constants are set to the following maxima:\n\n"); printf("%6d maximum number of loci (maxlocus)\n", (int)maxlocus); printf("%6d maximum number of alleles at a single locus (maxall)\n", (int)maxall); printf("%6d maximum number of individuals in a pedigree (maxind)\n", (int)maxind); printf("%6d maximum number of loops (maxloop)\n", (int)maxloop); printf("%6d maximum number of children of a parent (maxchild)\n", (int)maxchild); printf("\n"); exit(0); } void openFiles() { final = NULL; speedfile = NULL; stream = NULL; datafile = NULL; ipedfile = NULL; outfile = NULL; datafile = fopen("datafile.dat", "r"); if (datafile == NULL) exit(FileNotFound); ipedfile = fopen("ipedfile.dat", "r"); if (ipedfile == NULL) exit(FileNotFound); #if ALLELE_SPEED speedfile = fopen("newspeedfile.dat", "r"); #else speedfile = fopen("speedfile.dat", "r"); #endif if (speedfile == NULL) exit(FileNotFound); #if PARALLEL #if defined(LESSMEMORY) if (PRECOMPUTE) Tmk_errexit("Cannot have LESSMEMORY defined and PRECOMPUTE set to 1\n"); #endif /* If you change things in connexion with either final or stream, be sure to make the appropriate modifications to the checkpointing code near the beginning of outf(). --Shriram */ if (Tmk_proc_id ==0) { #endif /* PARALLEL */ #ifdef vms outfile = fopen("outfile.dat", "w", "ctx=rec","shr=get,put,upd" ) ; #else /* ifdef vms */ outfile = fopen("outfile.dat", "w"); #endif /* ifdef vms */ if (outfile == NULL) exit(FileNotFound); if (dostream) { #ifdef vms stream = fopen("stream.dat", "w", "ctx=rec","shr=get,put,upd" ) ; #else /* ifdef vms */ stream = fopen("stream.dat", "w"); #endif /* ifdef vms */ if (stream == NULL) exit(FileNotFound); } #if defined(ILINK) #ifdef vms final = fopen("final.dat", "w", "ctx=rec","shr=get,put,upd" ) ; #else /* ifdef vms */ final = fopen("final.dat", "w"); #endif /* ifdef vms */ if (final == NULL) exit(FileNotFound); #endif /* defined(ILINK) */ #if PARALLEL } #endif /* if PARALLEL */ } void ckptInit() { #if PARALLEL /* cgh */ if (Tmk_proc_id == 0) { #endif /* if PARALLEL -- cgh */ #if !defined(DOS) /* Shriram: begin */ /*Perform the script level checkpointing here*/ #ifdef vms scriptCheckpoint = fopen ( ScriptCheckpointFilename , "r", "ctx=rec","shr=get,put,upd" ) ; #else /* ifdef vms */ scriptCheckpoint = fopen ( ScriptCheckpointFilename , "r" ); #endif /* ifdef vms */ if ( NULL != scriptCheckpoint ) { fscanf ( scriptCheckpoint , "%d %d" , & scriptRun , & scriptToSleep ) ; fclose ( scriptCheckpoint ) ; if ( 0 != scriptToSleep ) { #ifdef vms scriptCheckpoint = fopen ( ScriptCheckpointFilename , "w", "ctx=rec","shr=get,put,upd" ) ; #else /* ifdef vms */ scriptCheckpoint = fopen ( ScriptCheckpointFilename , "w" ) ; #endif /* ifdef vms */ scriptRun ++ ; scriptToSleep -- ; fprintf ( scriptCheckpoint , "%d %d\n" , scriptRun , scriptToSleep ) ; fclose ( scriptCheckpoint ) ; printf ( "Recovering to checkpoint: %d more run(s)\n" , scriptToSleep + 1 ) ; #if defined(ILINK) if ( NULL != final ) fclose ( final ) ; #endif /* defined(ILINK) */ #if defined(MLINK) || defined(LINKMAP) if ( NULL != outfile ) fclose ( outfile ) ; #endif /* defined(MLINK) || defined(LINKMAP) */ if ( NULL != stream ) fclose ( stream ) ; if ( 0 == scriptToSleep ) { #ifdef vms fileTester = fopen ( ScriptFinalOut , "r" , "ctx=rec","shr=get,put,upd" ) ; #else /* ifdef vms */ fileTester = fopen ( ScriptFinalOut , "r" ) ; #endif /* ifdef vms */ if ( NULL != fileTester ) { fclose ( fileTester ) ; copyFile ( ScriptFinalOut , "final.out" ) ; } if ( dostream ) { #ifdef vms fileTester = fopen ( ScriptStreamOut , "r", "ctx=rec","shr=get,put,upd" ) ; #else /* ifdef vms */ fileTester = fopen ( ScriptStreamOut , "r" ) ; #endif /* ifdef vms */ if ( NULL != fileTester ) { fclose ( fileTester ) ; copyFile ( ScriptStreamOut , "stream.out" ) ; } } } exit ( EXIT_FAILURE ) ; } } #endif /* if !defined(DOS) */ #if PARALLEL /* cgh */ } /* if (Tmk_proc_id == 0) */ #endif /* if PARALLEL -- cgh */ } #if !defined(DOS) void ckptEnsureFileContents() { /* Shriram: begin */ /* We will use stat() to determine the size of the checkpointing file. If stat() reports any of the following: the file cannot be accessed; there is a problem with the filename or with the buffer; the file does not exist; or the file is shorter than the length of the date/time stamp we put in it, then we assume that no checkpointing has taken place. If we don't ensure the file has contents now, we would be doing this later, and might need to return here, etc. */ statBuffer.st_size = 0 ; statReturnCode = stat(CheckpointFilename, &statBuffer); if (statReturnCode != STAT_SUCCESS) checkpointStatus = normalRun ; else { #ifdef vms checkpointDatafile = fopen(CheckpointFilename , "r", "ctx=rec","shr=get,put,upd"); #else /* vms */ checkpointDatafile = fopen ( CheckpointFilename , "r" ) ; #endif /* vms */ checkpointStatus = checkpointedRun ; puts("NOTE: attempting to continue previous (unfinished) run"); fgets(dateTimeStamp , DateTimeStampStringLength , checkpointDatafile ) ; printf ( " from %s" , dateTimeStamp ) ; getCkptTuple ( ) ; } /* Shriram: end */ } #endif /* if !defined(DOS) */ void closeInputFiles() { #if (defined(LINKMAP) || defined(ILINK)) if (datafile != NULL) fclose(datafile); datafile = NULL; #endif /* defined(LINKMAP) || defined(ILINK) */ if (ipedfile != NULL) fclose(ipedfile); ipedfile = NULL; if (speedfile != NULL) fclose(speedfile); speedfile = NULL; } void miscInit() { #if defined(ILINK) #if !defined(DOS) if ( checkpointStatus != checkpointedRun ) /* Shriram */ { #endif /* !defined(DOS) */ h = sqrt(exp(-nbit * log(2.0))); tol = tolconst; /* tol:=tolconst*sqrt(n);*/ trupb = sqrt(h); maxit = n * iterationMultiple; firsttime = true; #if !defined(DOS) } firsttime = ( checkpointStatus == normalRun ) ; /* K. Shriram */ #endif /* !defined(DOS) */ #elif defined(MLINK) /* defined(ILINK) */ firsttime = true; #else /* defined(ILINK) */ firsttime = ( checkpointStatus != checkpointedRun ); /*K. Shriram*/ #endif /* defined(ILINK) */ lasttime = false; dolod = false; censorstruct = (censorrec *)Malloc(sizeof(censorrec)); if (censorstruct == NULL) malloc_err("censorstruct"); firstapprox = true; if (DIAGNOSTIC) /* A. A. Schaffer*/ { allele_downcode_check(); /* dwix */ #if ALLELE_SPEED adjust_alleles(); #endif #if PARALLEL if (Tmk_proc_id == 0) #endif /*PARALLEL*/ check_constants(); #if ALLELE_SPEED allele_adjust_persons(); #endif } } #if (defined(MLINK) || defined(LINKMAP)) #if !defined(DOS) void ckptPreIpedRecover() { if (checkpointedRun == checkpointStatus) { recoverCheckpoint(&checkpoint_place); checkpoint_counter = ckptTuple.ckptAttribute; fclose(outfile); copyFile(MainOutfileDat, "outfile.dat"); #ifdef vms outfile = fopen("outfile.dat", "a", "ctx=rec","shr=get,put,upd"); #else /* ifdef vms */ outfile = fopen( "outfile.dat", "a"); #endif /* ifdef vms */ if (dostream) { fclose(stream); copyFile(MainStreamDat, "stream.dat"); #ifdef vms stream = fopen("stream.dat", "a", "ctx=rec","shr=get,put,upd"); #else /* ifdef vms */ stream = fopen( "stream.dat", "a"); #endif /* ifdef vms */ } } else{ checkpoint_counter = 0; checkpoint_place = iterped_call_before; } } #endif /* !defined(DOS) */ #endif /* (defined(MLINK) || defined(LINKMAP)) */ void closeOutputFiles() { #if PARALLEL if (Tmk_proc_id == 0) { #endif /* if PARALLEL */ if (outfile != NULL) fclose(outfile); outfile = NULL; if (dostream) { #if !defined(ILINK) fprintf(stream, "~\n"); #endif /* !defind(ILINK) */ if (stream != NULL) fclose(stream); stream = NULL; } #if defined(ILINK) if (final != NULL) fclose(final); final = NULL; #endif /* defined(ILINK) */ #if defined(MLINK) if (datafile != NULL) fclose(datafile); datafile = NULL; #endif /* defined(MLINK) */ #if PARALLEL } #endif /* if PARALLEL */ } #if !defined(DOS) void ckptCleanup() { /* Shriram: begin */ /* This is the time at which to update the script-level checkpointing routine, since we have closed final and stream; any disasters that occur after this are "safe". */ #ifdef vms scriptCheckpoint = fopen(ScriptCheckpointFilename, "r+", "ctx=rec","shr=get,put,upd" ); #else /* ifdef vms */ scriptCheckpoint = fopen ( ScriptCheckpointFilename , "r+" ) ; #endif /* ifdef vms */ if ( NULL != scriptCheckpoint ) { rewind ( scriptCheckpoint ) ; scriptRun ++ ; fprintf ( scriptCheckpoint , "%d 0\n" , scriptRun ) ; fclose ( scriptCheckpoint ) ; copyFile ( "final.out" , ScriptFinalOut ) ; appendFile ( "outfile.dat" , ScriptFinalOut ) ; if ( dostream ) { copyFile ( "stream.out" , ScriptStreamOut ) ; appendFile ( "stream.dat" , ScriptStreamOut ) ; } } if ( NULL != checkpointDatafile ) fclose ( checkpointDatafile ) ; unlink ( CheckpointFileBackup ) ; unlink ( CheckpointFilename ) ; unlink ( MainOutfileDat ); unlink ( MainStreamDat ); /* Shriram: end */ } #endif /* if !defined(DOS) */ void initParams() { /*find number of recombination probabilities*/ nuneed = 7; for (i= 3; i<= mlocus; i++) nuneed = 5 * nuneed - 3; #if !defined(LESSMEMORY) /*find size of isozygote class and it's square for joint classes*/ maxclasssize = 2; for (i = 3; i<= mlocus; i++) maxclasssize *= 2; maxisozygclass = maxclasssize * maxclasssize; #endif nuprobclass = 2; for(i = 2; i <= mlocus; i++) nuprobclass = 3 * nuprobclass - 1; #if defined(ILINK) initialize(); ihess = 0; ibnd = 1; icall = 1; ivar = 0; ihx = 1; inconsistent = false; #endif /* defined(ILINK) */ } /* sequential startup code */ void seqStartup(argc, argv) int argc; char** argv; { int c; disfreqs = false; #ifdef vms ; #else while ((c = getopt(argc, argv, "ic")) != -1) switch (c) { case 'i': printInfo(); break; case 'c': disfreqs = true; break; case '?': /* fprintf(stderr, "Unrecognized option\n"); */ exit(-1); default: break; } #endif } #if (defined(MLINK) || defined(LINKMAP)) void checkzero() { int i; /* cgh */ if (!firsttime) { for (i = 1; i < mlocus; i++) { if (maletheta->theta[i - 1] != 0.0 && zeromale[i - 1]) firsttime = true; } for (i = 1; i < mlocus; i++) { if (femaletheta->theta[i - 1] != 0.0 && zerofemale[i - 1]) firsttime = true; } } #if defined(MLINK) if (maletheta->theta[which - 1] == 0.0) firsttime = true; if (femaletheta->theta[which - 1] == 0.0) firsttime = true; #elif defined(LINKMAP) if (maletheta->theta[whichvary - 1] == 0.0) firsttime = true; if (femaletheta->theta[whichvary - 1] == 0.0) firsttime = true; #endif /* defined(MLINK) */ if (!firsttime) return; for (i = 1; i < mlocus; i++) zeromale[i - 1] = (maletheta->theta[i - 1] == 0.0); for (i = 1; i < mlocus; i++) zerofemale[i - 1] = (femaletheta->theta[i - 1] == 0.0); } /*The following procedure was introduced by A. A. Schaffer to catch components of theta vectors that should be 0.0 but aren't*/ boolean zerotest(thetacomponent) double thetacomponent; { return((thetacomponent < epsilon) && (thetacomponent >= 0.0)); } /* This main() serves for both MLINK and LINKMAP */ int main(argc, argv) int argc; char *argv[]; { #if PARALLEL /* cgh */ parStartup(argc, argv); if (Tmk_proc_id == 0) #else seqStartup(argc, argv); #endif /* if PARALLEL -- cgh */ initialize(); #if !defined(DOS) checkpointStatus = normalRun; #endif /* if !defined(DOS) */ init_ped_loc_all(); /* dwix */ openFiles(); #if !defined(DOS) ckptInit(); #endif /* if !defined(DOS) */ #if PARALLEL #if !IS_SHMEM if (reportMemStats == false) gMemAndBarrierAlloc(); #endif /* !IS_SHMEM */ allocthetas(); #endif /* if PARALLEL */ inputdata(); initParams(); #if PARALLEL /* cgh */ if (Tmk_proc_id == 0) checkNotImplemented(); #endif /* if PARALLEL -- cgh */ #if !defined(DOS) ckptEnsureFileContents(); #endif /* if !defined(DOS) */ miscInit(); #if !ALLELE_SPEED allocategenetables(); getlocations(); #endif getgeneindices(); /*R. M. Idury*/ allocate_loopbreaker_vectors(); /*A. A. Schaffer*/ closeInputFiles(); #if PARALLEL if (0 == maxworkingset) { /*number was not input by user*/ maxworkingset = maxw_estimation(); if (Tmk_proc_id == 0) printf("\nEstimating %d for maxworkingset\n", maxworkingset); } else printf("\nOverriding computed value of maxworkingset with input value %d\n",maxworkingset); #endif #if PARALLEL /* cgh */ if (Tmk_proc_id == 0) { #endif /* if PARALLEL -- cgh */ preIpedLoop(); #if PARALLEL /* cgh */ /* simulate loop to calculate the number of calls to iterpeds() */ simIpedLoop(countIpeds); initParLib(argc, argv); #if IS_SHMEM gMemAndBarrierAlloc(); #endif /* IS_SHMEM */ initOutBuffs(); /* initialize output buffers */ allocgen(); /*Added by Alex*/ #if PRECOMPUTE allocprob(); #endif /* if PRECOMPUTE */ parThetaSetup(); /* simulate loop iterpeds() loop again, this time buffering output to stream, as well as computing and storing theta values */ simIpedLoop(computeThetas); } /* if (Tmk_proc_id == 0) */ #endif /* if PARALLEL -- cgh */ #if !defined(DOS) ckptPreIpedRecover(); #endif /* if !defined(DOS) */ #if !PARALLEL /* cgh */ ipedLoop(); #endif /* if !PARALLEL -- cgh */ #if PARALLEL /* cgh */ childLoop(); if (Tmk_proc_id == 0) { writeOutBuffs(); /* done -- write buffered output to files */ #endif /* if PARALLEL -- cgh */ closeOutputFiles(); #if PARALLEL } /* if (Tmk_proc_id == 0) */ #endif /* PARALLEL */ #if !defined(DOS) ckptCleanup(); #endif /* if !defined(DOS) */ #if PARALLEL parFinish(); #endif /* if PARALLEL */ exit(EXIT_SUCCESS); } #endif /* defined(MLINK) || defined(LINKMAP) */ fastlink-4.1P-fix95/4.1P/src/compar.c0000644000265600020320000011447706737460341016265 0ustar tilleaadmin/* This file contains common parallel routines for use with the parallel versions of the FASTLINK programs ILINK, LINKMAP, and MLINK. Sequential FASTLINK is an improved version of LINKAGE. Improvements are described in described in: R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer Faster Sequential Genetic Linkage Computations American Journal of Human Genetics, 53(1993), pp. 252--263 and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Linkage Analysis Human Heredity 44(1994), pp. 225-237. The parallel implementations of ILINK are described in: S. Dwarkadas, A. A. Schaffer, R. W. Cottingham Jr., A. L. Cox, P. Keleher, and W. Zwaenepoel, Parallelization of General Linkage Analysis Problems, Human Heredity 44(1994), pp. 127-141 and S. K. Gupta, A. A. Schaffer, A. L. Cox, S. Dwarkadas, and W. Zwaenepoel, Integerating Parallelization Strategies for Linkage Analysis, Computers and Biomedical Research, to appear. The code in this file was written by Chris Hyams. */ #include "commondefs.h" #include "gemdefs.h" #if !defined(LESSMEMORY) #include "moddefs.h" #endif /* if !defined(LESSMEMORY) */ #if defined(MLINK) #include "mldefs.h" #endif /* if defined(MLINK) */ #if defined(LINKMAP) #include "lidefs.h" #endif /* if defined(LINKMAP) */ #include #include "compar.h" /* these routines are specific to MLINK and LINKMAP */ #if (defined(MLINK) || defined(LINKMAP)) /* Figure out which processors will be masters for which theta evaluations. This function is based on AssignThetas() in ilink.c */ void AssignThetas() { int i, j, procNum; /* figure out how many thetas are left */ int nonzeroThetasLeft = numNonzeroThetas - nextThetaToAssign; /* remember the first theta in this group */ *firstThetanum = nextThetaToAssign; #ifdef ASSIGNTHETA_DEBUG printf("-- In AssignThetas, with nonzeroThetasLeft = %d, and firstThetanum = %d\n", nonzeroThetasLeft, *firstThetanum); #endif /* ifdef ASSIGNTHETA_DEBUG */ if (nonzeroThetasLeft >= Tmk_nprocs) { /* At least as many thetas as processors */ *slavesPerGroup = 1; *numGroups = Tmk_nprocs; } else { /* More processors than thetas */ for (i = 2; i <= Tmk_nprocs; i++) if (((Tmk_nprocs % i) == 0) && ((Tmk_nprocs / i) <= nonzeroThetasLeft)) break; *slavesPerGroup = i; *numGroups = Tmk_nprocs / i; } *thetasPerGroup = nonzeroThetasLeft / (*numGroups); nextThetaToAssign += (*numGroups) * (*thetasPerGroup); for (i = 0, procNum = 0; i < (*numGroups); i++) for (j = 0; j < (*slavesPerGroup); j++, procNum++) { whoIsMyMaster[procNum] = i * (*slavesPerGroup); #ifdef ASSIGNTHETA_DEBUG printf("-- processor %d made master of processor %d\n", i * (*slavesPerGroup), procNum); #endif /* ifdef ASSIGNTHETA_DEBUG */ if (j == 0) { iAmAMaster[procNum] = true; thetanumbase[procNum] = i * (*thetasPerGroup); thetanumfence[procNum] = thetanumbase[procNum] + (*thetasPerGroup); #ifdef ASSIGNTHETA_DEBUG printf("-- Master processor %d assigned thetas %d through %d\n", procNum, (i * (*thetasPerGroup)), thetanumbase[procNum] + (*thetasPerGroup)); #endif /* ifdef ASSIGNTHETA_DEBUG */ } else iAmAMaster[procNum] = false; } } /* AssignThetas */ /* this function was adapted from fun() in ilink.c, and iterpeds() in mlink.c and linkmap.c */ static void multiPedLike() { int i; int thisped; #if PARALLEL #if FUNTIMES struct timeval starttime, endtime; double time; #endif /* if FUNTIMES */ #endif /* if PARALLEL */ #if defined(MLINK) /* cgh */ static double eachlod[maxped]; /* C. Haynes */ int II=0; /* C. Haynes */ #endif /* cgh -- if defined(MLINK) */ #if PARALLEL #if FUNTIMES gettimeofday(&starttime, NULL); /* Get start time */ #endif /* if FUNTIMES */ #endif /* if PARALLEL */ #if PARALLEL accumfamilytime = 0; infun = 1; if (!parallelThetas) { OneMaster(); #if BARRIER_OUTPUT printBarrier("(%d) Full barrier (!parallelThetas) at beginning of multiPedLike\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /* if IS_SHMEM */ } #endif /* if PARALLEL */ tlike = 0.0; /* cgh -- added this from iterpeds */ alike = 0.0; for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } thisc = minint; if (sexdif && readfemale) for(j = 0; j < mlocus - 1; j++) { maletheta->theta[j] = gmaletheta[absoluteThetanum][j]; femaletheta->theta[j] = gfemaletheta[absoluteThetanum][j]; } else for(j = 0; j < mlocus - 1; j++) maletheta->theta[j] = gmaletheta[absoluteThetanum][j]; recombination(); checkzero(); /* cgh -- added this from iterpeds */ /* buffer output from before calls to likelihood() */ preLikeBufferOutput(); #if LOOPSPEED open_loop_file(); #endif /* likelihood loop */ for (thisped = 0; thisped < nuped; thisped++) { #if LOOPSPEED read_loop_file(thisped+1); #endif likelihood((thisped + 1), proband[thisped]); /* store likelihood for later */ likebyped[thisped] = like; /* buffer pedigree output */ bufferPedOutput(thisped, like); alike += like; like /= log10_; #if defined(MLINK) /* C. Haynes */ if (maletheta->theta[which - 1] == 0.5) { eachlod[II] = like; unlinkedLikeByPed[thisped] = like; } /* buffer likelihood output */ bufferLikeOutput(like, unlinkedLikeByPed[thisped]); #else /* if defined(MLINK) */ bufferLikeOutput(like); #endif /* if defined(MLINK) */ tlike += like; #if defined(MLINK) II++; /* C. Haynes */ #endif /* if defined(MLINK) */ } #if LOOPSPEED close_loop_file(); #endif /* buffer totals output */ bufferTotalsOutput(alike, tlike); alike *= -2; /* buffer lodscore and likelihood output */ bufferLodOutput(alike, tlike, firsttime); #if PARALLEL /* BARRIER */ funfinished[Tmk_proc_id]++; infun = 0; if ((*slavesPerGroup) > 1) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at end of multiPedLike\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier, *slavesPerGroup); #else Tmk_barrier(MakeMask(mymaster, mymaster + (*slavesPerGroup) - 1)); #endif /* if IS_SHMEM */ } if (!parallelThetas) { #if BARRIER_OUTPUT printBarrier("(%d) Full barrier (!parallelThetas) at end of multiPedLike\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(gMem->full_barrier, Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /* if IS_SHMEM */ } #endif /* if PARALLEL */ firsttime = false; #if PARALLEL #if FUNTIMES gettimeofday(&endtime, NULL); /* Get end time */ if (!parallelThetas) { time = (endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec)/1000000.0; /* add message about which absolute theta we're on, as well as master's number */ printf("Execution time (all processors working together) = %7.3f\n", time); fflush(stdout); } else { /* update currentthetanum */ executionTimes[absoluteThetanum][0] = (endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec)/1000000.0; } #endif /* if FUNTIMES */ #endif /* if PARALLEL */ } /* multiPedLike */ /* This function was adapted from gforward() in ilink.c. All master processors call this function. */ void masterPedLike() { int i; #if DO_PARALLELTHETAS parallelThetas = 1; /* Turn on parallel thetas */ /* Iterate over each theta */ for (i = thetanumbase[Tmk_proc_id]; i < thetanumfence[Tmk_proc_id]; i++) { eTimeIndex = i; /* schaffer && cgh -- indexing bugfix */ if ((*slavesPerGroup) == Tmk_nprocs) currentthetanum = 0; else currentthetanum = Tmk_proc_id / (*slavesPerGroup); absoluteThetanum = absoluteThetaIndex[i + (*firstThetanum)]; thischild = gMem->gthischild[mymaster]; pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; /* spawn likelihood evaluations */ multiPedLike(); } parallelThetas = 0; /* Turn off parallelthetas */ #else /* if DO_PARALLELTHETAS */ /* cgh -- not sure if this is right anymore */ *nextTheta = 0; #endif /* if DO_PARALLELTHETAS */ } /* masterPedLike */ /* Assign thetas, etc. Function is called only by processor 0. This function is analagous to gemini() in ILINK */ void iterpedsControl() { int i; temprowfence = (fencearray *) Malloc(sizeof(fencearray)); tempqfence = (fencearray *) Malloc(sizeof(fencearray)); *secondfe = 0; *numNuclear = 0; *firstfe = 1; parallelThetas = 0; /* Iterate over each theta */ currentthetanum = 0; absoluteThetanum = absoluteThetaIndex[0]; thischild = gMem->gthischild[mymaster]; pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; #if DO_PARALLELTHETAS /* spawn likelihood evaluations */ multiPedLike(); /* If there are too many nuclear families (usually due to multiple loops), then dynamic load balancing should not be enabled */ if ((*numNuclear) <= MAXNUMFAM) *firstfe = 0; /* start off with the first theta vector */ nextThetaToAssign = 1; while (nextThetaToAssign < numNonzeroThetas) { /* assign thetas, and setup global info */ AssignThetas(); *checkmaster = 1; #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at beginning of iterpedsControl\n", ++barnum); #endif /* BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else /* IS_SHMEM */ Tmk_barrier(Tmk_mask); #endif /* IS_SHMEM */ /* call master likelihood evaluation loop */ masterPedLike(); #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at end of masterPedLike\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else /* if IS_SHMEM */ Tmk_barrier(Tmk_mask);/* Wait for everybody to finish */ #endif /* IS_SHMEM */ #if FUNTIMES for (i = *firstThetanum; i < nextThetaToAssign; i++) printf("Execution time (likelihood evaluation done by %d processor(s)) for %d = %7.3f\n", *(slavesPerGroup), absoluteThetaIndex[i], executionTimes[absoluteThetaIndex[i]][0]); fflush(stdout); #endif /* if FUNTIMES */ } /* need to compute loadbalancing information on each function evaluation from now on */ *firstfe = 1; currentthetanum = 0; thischild = gMem->gthischild[mymaster]; pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; #endif /* if DO_PARALLELTHETAS */ /* Finish rest of thetas sequentially */ while (nextThetaToAssign < numIpeds) { /* Iterate over each theta */ absoluteThetanum = absoluteThetaIndex[nextThetaToAssign++]; multiPedLike(); } } /* iterpedsControl */ #endif /* if (defined(MLINK) || defined(LINKMAP)) */ /* procedure to manage child processes in parallel computation */ void child() { struct timeval start, finish; int i,j; #if ALLELE_SPEED int l; boolean needToRecomputeTables; #endif /*ALLELE_SPEED*/ int oldfun; /* stores old value of funfinished */ #if defined(ILINK) int funind; int numfuns; /* number of function evaluations in gradient */ #endif /* defined(ILINK) */ if (Tmk_proc_id == 0) { gettimeofday(&start, NULL); mymaster = 0; #if defined(ILINK) gemini(); outf(); #else /* defined(ILINK) */ iterpedsControl(); #endif /* defined(ILINK) */ gettimeofday(&finish, NULL); printf("Elapsed time: %.2f seconds\n", (((finish.tv_sec * 1000000.0) + finish.tv_usec) - ((start.tv_sec * 1000000.0) + start.tv_usec)) / 1000000.0); } else { while (1) { #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at beginning of child\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(gMem->full_barrier, Tmk_nprocs); #else /* IS_SHMEM */ Tmk_barrier(Tmk_mask); /* Wait to find out if master or slave */ #endif /* if IS_SHMEM */ mymaster = 0; /* Dummy line */ if (gMem->finished) break; if ((*checkmaster) && (iAmAMaster[Tmk_proc_id] == true)) { /* I am a master */ mymaster = Tmk_proc_id; #if defined(ILINK) if (*usecentral) gcentral(); else gforward(); #else /* defined(ILINK) */ masterPedLike(); #endif /* defined(ILINK) */ } else { /* I am a slave */ #if defined(ILINK) if (*usecentral) numfuns = 2; else numfuns =1; #endif /* defined(ILINK) */ if (*checkmaster) mymaster = whoIsMyMaster[Tmk_proc_id]; else /* Sequential function evaluation */ mymaster = 0; for (i = thetanumbase[mymaster]; i < thetanumfence[mymaster]; i++) { #if DO_PARALLELTHETAS eTimeIndex = i; /* schaffer && cgh -- indexing bugfix */ if ((*slavesPerGroup) == Tmk_nprocs) currentthetanum = 0; else currentthetanum = Tmk_proc_id / (*slavesPerGroup); #else currentthetanum = 0; #endif /* if DO_PARALLEL_THETAS */ thischild = gMem->gthischild[mymaster]; pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; #if defined(ILINK) #if !PARALLEL_GCENTRAL for(funind = 1; funind <= numfuns; funind++) { #endif /* !PARALLEL_GCENTRAL */ #endif /* defined(ILINK) */ /* Moved this assignment up here to fix problem with the shared memory version. TreadMarks update semantics are lazy, but P4 can be greedier. -- cgh */ oldfun = funfinished[mymaster]; if ((*slavesPerGroup) > 1) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier 1 at middle of child\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier, *slavesPerGroup); #else Tmk_barrier(MakeMask(mymaster, mymaster + (*slavesPerGroup) - 1)); #endif /* if IS_SHMEM */ } if ((sexdif) && readfemale) for (j = 0; j < mlocus - 1; j++) { maletheta->theta[j] = gmaletheta[i][j]; femaletheta->theta[j] = gfemaletheta[i][j]; } else for (j = 0; j < mlocus - 1; j++) maletheta->theta[j] = gmaletheta[i][j]; for (j = 0; j < nuneed; j++) { maletheta->segprob[j] = gmalesegprob[currentthetanum][j]; femaletheta->segprob[j] = gfemalesegprob[currentthetanum][j]; } while (1) { if ((*slavesPerGroup) > 1) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier 2 at middle of child\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier, *slavesPerGroup); #else Tmk_barrier(MakeMask(mymaster, mymaster + (*slavesPerGroup) - 1)); #endif /* if IS_SHMEM */ } if (funfinished[mymaster] > oldfun) break; #if ALLELE_SPEED if ((*slavesPerGroup) > 1) { /*Test if need to recompute*/ if (sharedCurrentPed[mymaster] != currentped) { needToRecomputeTables = TRUE; ped_must_change_locations[sharedCurrentPed[mymaster] - 1] = true; currentped = sharedCurrentPed[mymaster]; recompute_haps(currentped, true); } } #endif /*ALLELE_SPEED*/ switch(gMem->trav_flag[mymaster]) { case ONEDOWN: onechilddown(); break; case MANYDOWN: manychilddown(); break; case ONEUP: #if defined(LESSMEMORY) manychildup(); #else onechildup(); #endif break; case MANYUP: manychildup(); break; default: printf("ERROR: unknown flag in child\n"); exit(1); break; } } #if defined(ILINK) #if !PARALLEL_GCENTRAL } #endif /* !PARALLEL_GCENTRAL */ #endif /* defined(ILINK) */ } /* end for loop */ } /* end else */ /* This barrier is for all processers except for 0 */ #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at end of child\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(gMem->full_barrier, Tmk_nprocs); #else /* IS_SHMEM */ Tmk_barrier(Tmk_mask); /* Wait for everybody to finish */ #endif /* if IS_SHMEM */ mymaster = 0; /* Dummy line */ } #if IS_P4 #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at WAIT_FOR_END() in child\n", ++barnum); #endif /* if BARRIER_OUTPUT */ BARRIER(gMem->full_barrier, Tmk_nprocs); /* Child process is done */ /* cgh -- we used to call WAIT_FOR_END() here, due to some semantic unclarities in the P4 docs. Even though we haven't gotten any official word back from Lusk, et. al. I decided that we really don't want this call. */ /* WAIT_FOR_END(Tmk_nprocs-1) */ #endif /* IS_P4 */ } } /* child */ /* Set up data structures for parallel theta evaluations. Used to be SandeepSetup(). */ void parThetaSetup() { #if defined(ILINK) gg = (vector *) Tmk_malloc(sizeof(vector)); if (!gg) Tmk_errexit("MALLOC ERROR - gg\n"); Tmk_distribute((char *) &gg,sizeof(gg)); gitp = (itertype *) Tmk_malloc(sizeof(itertype)); if (!gitp) Tmk_errexit("MALLOC ERROR - gitp\n"); Tmk_distribute((char *) &gitp,sizeof(gitp)); gnfe = (int *) Tmk_malloc(sizeof(int) * maxn); if (!gnfe) Tmk_errexit("MALLOC ERROR - gnfe\n"); Tmk_distribute((char *) &gnfe,sizeof(gnfe)); for(i = 0; i < maxn; i++) gnfe[i] = 0; usecentral = (int *) Tmk_malloc(sizeof(int) * Tmk_nprocs); if (!usecentral) Tmk_errexit("MALLOC ERROR - usecentral\n"); Tmk_distribute((char *) &usecentral,sizeof(usecentral)); *usecentral = 0; #if PARALLEL_GCENTRAL gcentralf = (double **) Tmk_malloc(sizeof(double*) * maxn); if (!gcentralf) Tmk_errexit("MALLOC ERROR - gcentralf\n"); Tmk_distribute((char *) &gcentralf,sizeof(gcentralf)); for(i = 0; i < maxn; i++) { gcentralf[i] = (double *) Tmk_malloc(sizeof(double) * 2); if (!gcentralf[i]) Tmk_errexit("MALLOC ERROR - gcentralf[%d]\n",i); } #endif /* PARALLEL_GCENTRAL */ #endif /* defined(ILINK) */ #if !defined(ILINK) unlinkedLike = (double*) Tmk_malloc(sizeof(double)); if (!unlinkedLike) Tmk_errexit("MALLOC ERROR - unlinkedLike\n"); Tmk_distribute((char*) &unlinkedLike, sizeof(unlinkedLike)); *unlinkedLike = 0.0; #endif /* !defined(ILINK) */ #if defined(MLINK) if (lodbyfamily) { unlinkedLikeByPed = (double *) Tmk_malloc(maxped * sizeof(double)); if (!unlinkedLikeByPed) Tmk_errexit("MALLOC ERROR - unlinkedLikeByPed\n"); Tmk_distribute((char *) &unlinkedLikeByPed, sizeof(unlinkedLikeByPed)); for(i = 0; i < nuped; i++) unlinkedLikeByPed[i] = 0.0; } #endif gx = (vector *) Tmk_malloc(sizeof(vector)); if (!gx) Tmk_errexit("MALLOC ERROR - gx\n"); Tmk_distribute((char *) &gx,sizeof(gx)); gxall = (vector *) Tmk_malloc(sizeof(vector)); if (!gxall) Tmk_errexit("MALLOC ERROR - gxall\n"); Tmk_distribute((char *) &gxall,sizeof(gxall)); rowtime = (double *) Tmk_malloc(sizeof(double) * fgeno); if (!rowtime) Tmk_errexit("MALLOC ERROR - rowtime\n"); Tmk_distribute((char *) &rowtime,sizeof(rowtime)); qrowtime = (double *) Tmk_malloc(sizeof(double) * fgeno); if (!qrowtime) Tmk_errexit("MALLOC ERROR - qrowtime\n"); Tmk_distribute((char *) &qrowtime,sizeof(qrowtime)); timeExecutions = (int *) Tmk_malloc(sizeof(int)); if (!timeExecutions) Tmk_errexit("MALLOC ERROR - timeExecutions\n"); Tmk_distribute((char *) &timeExecutions,sizeof(timeExecutions)); numNuclear = (int *) Tmk_malloc(sizeof(int)); if (!numNuclear) Tmk_errexit("MALLOC ERROR - numNuclear\n"); Tmk_distribute((char *) &numNuclear,sizeof(numNuclear)); firstfe = (int *) Tmk_malloc(sizeof(int)); if (!firstfe) Tmk_errexit("MALLOC ERROR - firstfe\n"); Tmk_distribute((char *) &firstfe,sizeof(firstfe)); secondfe = (int *) Tmk_malloc(sizeof(int)); if (!secondfe) Tmk_errexit("MALLOC ERROR - secondfe\n"); Tmk_distribute((char *) &secondfe,sizeof(secondfe)); rowfence = (fencearray *) Tmk_malloc(sizeof(fencearray)); if (!rowfence) Tmk_errexit("MALLOC ERROR - rowfence\n"); Tmk_distribute((char *) &rowfence,sizeof(rowfence)); qfence = (fencearray *) Tmk_malloc(sizeof(fencearray)); if (!qfence) Tmk_errexit("MALLOC ERROR - qfence\n"); Tmk_distribute((char *) &qfence,sizeof(qfence)); funfinished = (int *) Tmk_malloc(sizeof(int) * Tmk_nprocs); if (!funfinished) Tmk_errexit("MALLOC ERROR - funfinished\n"); Tmk_distribute((char *) &funfinished,sizeof(funfinished)); for (i = 0; i < Tmk_nprocs; i++) funfinished[i] = 0; gf = (double *) Tmk_malloc(sizeof(double)); if (!gf) Tmk_errexit("MALLOC ERROR - gf\n"); Tmk_distribute((char *) &gf, sizeof(gf)); thetanumbase = (int *) Tmk_malloc(sizeof(int) * Tmk_nprocs); if (!thetanumbase) Tmk_errexit("MALLOC ERROR - thetanumbase\n"); Tmk_distribute((char *) &thetanumbase,sizeof(thetanumbase)); thetanumfence = (int *) Tmk_malloc(sizeof(int) * Tmk_nprocs); if (!thetanumfence) Tmk_errexit("MALLOC ERROR - thetanumfence\n"); Tmk_distribute((char *) &thetanumfence,sizeof(thetanumfence)); iAmAMaster = (boolean *) Tmk_malloc(sizeof(boolean) * Tmk_nprocs); if (!iAmAMaster) Tmk_errexit("MALLOC ERROR - iAmAMaster\n"); Tmk_distribute((char *) &iAmAMaster,sizeof(iAmAMaster)); whoIsMyMaster = (int *) Tmk_malloc(sizeof(int) * Tmk_nprocs); if (!whoIsMyMaster) Tmk_errexit("MALLOC ERROR - whoIsMyMaster\n"); Tmk_distribute((char *) &whoIsMyMaster,sizeof(whoIsMyMaster)); checkmaster = (int *) Tmk_malloc(sizeof(int) * Tmk_nprocs); if (!checkmaster) Tmk_errexit("MALLOC ERROR - checkmaster\n"); Tmk_distribute((char *) &checkmaster,sizeof(checkmaster)); slavesPerGroup = (int *) Tmk_malloc(sizeof(int)); if (!slavesPerGroup) Tmk_errexit("MALLOC ERROR - slavesPerGroup\n"); Tmk_distribute((char *) &slavesPerGroup,sizeof(slavesPerGroup)); thetasPerGroup = (int *) Tmk_malloc(sizeof(int)); if (!thetasPerGroup) Tmk_errexit("MALLOC ERROR - thetasPerGroup\n"); Tmk_distribute((char *) &thetasPerGroup,sizeof(thetasPerGroup)); nextTheta = (int *) Tmk_malloc(sizeof(int)); if (!nextTheta) Tmk_errexit("MALLOC ERROR - nextTheta\n"); Tmk_distribute((char *) &nextTheta,sizeof(nextTheta)); numGroups = (int *) Tmk_malloc(sizeof(int)); if (!numGroups) Tmk_errexit("MALLOC ERROR - numGroups\n"); Tmk_distribute((char *) &numGroups,sizeof(numGroups)); *checkmaster = 0; } /* parThetaSetup */ /* parallel startup/initialization code */ void parStartup(argc, argv) int argc; char** argv; { int c; #if !IS_SHMEM boolean seenOptN = false; #endif #if (IS_P4 || !IS_SHMEM) reportMemStats = false; #endif /* (IS_P4 || !IS_SHMEM) */ maxworkingset = 0; #if IS_SHMEM Tmk_proc_id = 0; Tmk_nprocs = 4; #if IS_P4 while ((c = getopt(argc, argv, "w:n:p:mi")) != -1) #else /* IS_P4 */ while ((c = getopt(argc, argv, "w:n:i")) != -1) #endif /* IS_P4 */ #else /* IS_SHMEM */ while ((c = getopt(argc, argv, "w:n:mi")) != -1) #endif /* IS_SHMEM */ switch (c) { case 'w': maxworkingset = atoi(optarg); break; case 'i': printInfo(); break; #if (IS_P4 || !IS_SHMEM) case 'm': reportMemStats = true; break; #endif /* (IS_P4 || !IS_SHMEM) */ case 'n': Tmk_nprocs = atoi(optarg); #if !IS_SHMEM seenOptN = true; Tmk_proc_id = 0; #endif /* !IS_SHMEM */ break; #if IS_P4 case 'p': if (*optarg == '4') /* it's a p4 command-line switch */ break; /* otherwise, it *is* an unrecognized option... */ #endif /* IS_P4 */ case '?': /* fprintf(stderr,"Unrecognized option\n"); */ exit(-1); default: break; } #if !IS_SHMEM /* make sure options make sense */ if (reportMemStats == true) { if (seenOptN == false) Tmk_errexit("To use the -m option with TreadMarks, you must also\nprovide -n to specify the number of processors.\n"); } else if (seenOptN == true) { Tmk_errexit("The -n option before the \"--\" can only be used with TreadMarks\nin conjunction with the -m option. Refer to the README.TreadMarks\nfor details on specifying processors.\n"); } else { /* everything is normal -- no memory stat reporting, and no -n */ Tmk_startup(argc, argv); } #endif /* !IS_SHMEM */ if (Tmk_nprocs > maxprocs) Tmk_errexit("In order to use more than %d processors, you must increase the value\nof maxprocs in commondefs.h\n", maxprocs); } /* parStartup */ /* Allocate and initialize barriers, and allocate global memory */ void gMemAndBarrierAlloc() { #if IS_SHMEM #if IS_PARMACS MAIN_INITENV(); #endif /* IS_PARMACS */ partial_barrier = (Barrier **) G_MALLOC(Tmk_nprocs * sizeof(Barrier *)); for (i = 0; i < Tmk_nprocs; i++) partial_barrier[i] = (Barrier *) G_MALLOC(sizeof(Barrier)); /* Don't need barrier with SHMEM */ #else /* IS_SHMEM */ #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at beginning of main\n", ++barnum); #endif /* BARRIER_OUTPUT */ Tmk_barrier(Tmk_mask); #endif /* if IS_SHMEM */ onlymaster = 0; if (Tmk_proc_id == 0) { gMem = (GlobalMemory *) Tmk_malloc(sizeof(GlobalMemory)); if (!gMem) Tmk_errexit("MALLOC ERROR - gMem\n"); Tmk_distribute((char *) &gMem, sizeof(gMem)); gMem->finished = 0; } #if IS_SHMEM BARINIT(gMem->full_barrier); for (i=0;ibarrier); /* Don't need barrier with SHMEM */ #else /* IS_SHMEM */ #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at middle of main\n", ++barnum); #endif /* if BARRIER_OUTPUT */ Tmk_barrier(Tmk_mask); #endif /* if IS_SHMEM */ } /* gMemAndBarrierAlloc */ #if IS_SHMEM /* This function *must* be called right before the fork for shared memory versions. Otherwise, child processes inherit buffer state (which may not be flushed) at the time of the fork. When the functions exit, the buffers will then be flushed, potentially leading to invalid output. -- cgh */ static void flushOutputFiles() { if (final != NULL) fflush(final); if (stream != NULL) fflush(stream); if (outfile != NULL) fflush(outfile); fflush(stdout); } #endif /* IS_SHMEM */ /* iterates over processes, creating children */ void childLoop() { #if IS_SHMEM flushOutputFiles(); /* cgh -- see comment above */ for (Tmk_proc_id = 1; Tmk_proc_id < Tmk_nprocs; Tmk_proc_id++) { CREATE(child) } Tmk_proc_id = 0; #endif /* if IS_SHMEM */ child(); if (Tmk_proc_id == 0) { gMem->finished = 1; #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at end of main\n", ++barnum); #endif /* if BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /* if IS_SHMEM */ } #if IS_PARMACS /* in P4, processor 0 is not quite done yet */ WAIT_FOR_END(Tmk_nprocs-1) #endif /* if IS_PARMACS */ } /* childLoop */ /* Exit safely from parallel code, writing an error message to stderr, as well as writing to the FASTLINK.err file */ void parErrExit(errmesg) char* errmesg; { time_t secondsNow; FILE* errFile = fopen("FASTLINK.err", "a"); if (errFile != NULL) { time(&secondsNow); fprintf(errFile, "\n%s", ctime(&secondsNow)); fprintf(errFile, errmesg); fclose(errFile); } Tmk_errexit(errmesg); } /* parErrExit */ /* This function should be called after inputdata() to check to see if there are any constants set that provide situations we have not yet implemented */ void checkNotImplemented() { #if (PARALLEL && !defined(DOS)) parErrExit("Parallel FASTLINK (compiled with PARALLEL=1)\ncurrently requires that DOS be defined as well.\nPlease recompile with -DDOS, or use sequential\nFASTLINK if you want to use checkpointing.\n"); #endif /* (PARALLEL && !defined(DOS)) */ if (sexlink) parErrExit("FASTLINK has not yet been parallelized for sexlinked data --\nuse the sequential version instead.\n"); if (interfer) parErrExit("FASTLINK has not yet been parallelized for a model with interference --\nuse the sequential version instead.\n"); if (mutsys != 0) parErrExit("FASTLINK has not yet been parallelized for the mutation model --\nuse the sequential version instead.\n"); } /* checkNotImplemented */ void printBarrier(format, barrierNum) char* format; int barrierNum; { printf("%d: ", Tmk_proc_id); printf(format, barrierNum); } #if PARALLEL void parFinish() { #if defined(GMEM_DEBUG) if (Tmk_proc_id == 0) printf("Total memory used: %d\n", totMem); #endif /* defined(GMEM_DEBUG) */ #if IS_P4 #if BARRIER_OUTPUT printBarrier("(%d) Full barrier at WAIT_FOR_END() in main\n", ++barnum); #endif /* if BARRIER_OUTPUT */ BARRIER(gMem->full_barrier, Tmk_nprocs); /* Master process is done */ WAIT_FOR_END(Tmk_nprocs-1) #elif IS_PARMACS /* if IS_P4 */ MAIN_END #else /* if IS_P4 */ Tmk_exit(0); #endif /* if IS_P4 */ } /* parFinish */ #if (defined(MLINK) || defined(LINKMAP)) /* Determine the proper value for numparams in allocgen(). This value represents the maximum value that currentthetanum can take on. It is calculated as the maximum of (the maximum of 1 and the largest number smaller than the number of non-zero thetas that divides Tmk_nprocs evenly) and the value of numgroups calculated in AssignThetas() for the first theta evaluation. */ int calcNumparams() { int i = 1; /* This loop is similar to one in AssignThetas(). It determines the the value of numgroups for the first theta evaluation. */ if ((numIpeds - numZeroThetas) < Tmk_nprocs) { for (i = 2; i <= Tmk_nprocs; i++) if (((Tmk_nprocs % i) == 0) && ((Tmk_nprocs / i) <= (numIpeds - numZeroThetas))) break; } return(Max(1,(Tmk_nprocs / i))); } #endif /* (defined(MLINK) || defined(LINKMAP)) */ #endif /* if PARALLEL */ /* Determine amount of memory to request given the value of our computed estimate */ unsigned addFudge(memNeeded, fmemNeeded) unsigned *memNeeded, *fmemNeeded; { int p; /* First, add a fudge factor to take into account other run-time allocations, like the string buffers, etc. The fudge factor is either some percentage of the total usage calculated, or the maximum we allow -- whichever is smaller. */ for(p =0; p < Tmk_nprocs; p++) { fmemNeeded[p] += Min((memFudgePercentage * memNeeded[p]), maxMemFudge); /* Next, we make sure to allocate at least the minimum we allow. */ fmemNeeded[p] = memNeeded[p] + ((fmemNeeded[p] < minMemNeeded) ? minMemNeeded : fmemNeeded[p]); } return(fmemNeeded[Tmk_nprocs -1]); } /* print out memory use statistics given memory usage calculated in computeMemNeeded() */ static void printMemStats(memCalculated) unsigned *memCalculated; { int p; unsigned fmemCalculated[maxprocs]; for(p=0; p < Tmk_nprocs; p++) fmemCalculated[p] = 0; #if IS_P4 addFudge(memCalculated,fmemCalculated); printf("\tmemory usage total request\n"); printf("\tcalculated (including fudge factor)\n"); printf("\t----------------------------------------------\n"); for (p = Tmk_nprocs; p> 0; p--) printf("\t%-11d bytes %-11d bytes on %d processor(s)\n", memCalculated[p-1], fmemCalculated[p-1], p); #else /* IS_P4 */ for (p = Tmk_nprocs; p> 0; p--) printf("\t%d bytes of shared memory on %d processor(s)\n", memCalculated[p -1], p); #endif /* IS_P4 */ printf("\n"); } /* report memory usage statistics */ static void reportMemoryStats(memNeeded, allocprobMem) unsigned *memNeeded, *allocprobMem; { #if PRECOMPUTE int precompute = 1; #else int precompute = 0; #endif /* PRECOMPUTE */ int p; printf("----------------------------------\n"); printf("\n\n%s is currently compiled with PRECOMPUTE=%d.\n", PROGRAM, precompute); #if IS_P4 printf("Shared memory usage for this run will be as follows:\n\n"); #else /* IS_P4 */ printf("This run will require at least:\n\n"); #endif /* IS_P4 */ printMemStats(memNeeded); printf("Recompiling with PRECOMPUTE=%d would yield:\n\n", (precompute + 1) & 1); for(p =0; p < Tmk_nprocs; p++) { if (precompute == 1) memNeeded[p] = memNeeded[p] - allocprobMem[p]; else memNeeded[p] = memNeeded[p] + allocprobMem[p]; } printMemStats(memNeeded); printf("Please refer to the README.makefile and "); #if IS_P4 printf("README.p4 for details.\n"); #else /* IS_P4 */ printf("README.TreadMarks for details.\n"); #endif /* IS_P4 */ } /* reportMemoryStats */ /* Approximate how much shared memory we will need so we don't need to tell p4 on the command line. Essentially, we just add up all of the arguments to Tmk_malloc() in the routines parThetaSetup(), allocgen() and allocprob(), and add half again as much to the result to be safe. -- cgh */ static unsigned computeMemNeeded() { unsigned memNeeded[maxprocs], allocprobMem[maxprocs], fmemNeeded[maxprocs]; unsigned numparams, maxThetas; int numprocs; for(numprocs = 1; numprocs <= Tmk_nprocs; numprocs++) { fmemNeeded[numprocs - 1] = memNeeded[numprocs - 1] = allocprobMem[numprocs - 1] = 0; /* from allocgen() in comlike.c */ #if PARALLEL_GCENTRAL numparams = maxThetas = 2 * maxn; #elif (defined(MLINK) || defined(LINKMAP)) numparams = calcNumparams(); maxThetas = numIpeds; memNeeded[numprocs -1] = (sizeof(boolean) * numIpeds) + (sizeof(int) * numIpeds) + (sizeof(int)) + #else /* if PARALLEL_GCENTRAL ... */ numparams = maxThetas = maxn; memNeeded[numprocs - 1] = #endif /* if PARALLEL_GCENTRAL */ (sizeof(thetarray) * maxThetas) + (sizeof(thetarray) * maxThetas) + (sizeof(double *) * numparams) + (numparams * (sizeof(double) * nuneed)) + (sizeof(double *) * numparams) + (numparams * (sizeof(double) * nuneed)) + (numparams * sizeof(char*)) + (numparams * sizeof(thisarray*)) + (numparams * ((maxworkingset * sizeof(char)) + (maxworkingset * maxfemgen * sizeof(unsigned char)) + (maxworkingset * maxfemgen * sizeof(double)))) + (numprocs * (sizeof(double *))) + (numprocs * (maxfemgen * sizeof(double))) + (numprocs * (sizeof(double *))) + (numprocs * (sizeof(double) * maxhaplo)) + (numprocs * (sizeof(double *))) + (numprocs * (sizeof(double) * maxhaplo)) + (numparams * sizeof(int*)) + (numparams * sizeof(int*)) + (numparams * ((maxfemgen * sizeof(int)) + (maxfemgen * sizeof(int)))); #if FUNTIMES #if PARALLEL_GCENTRAL memNeeded[numprocs - 1] += (2 * maxn * sizeof(double)); #else /* !PARALLEL_GCENTRAL */ memNeeded[numprocs - 1] += (maxThetas * sizeof(double*)) + (maxThetas * (2 * sizeof(double))); #endif /* PARALLEL_GCENTRAL */ #endif /*FUNTIMES*/ /* from parThetaSetup() in compar.c */ memNeeded[numprocs - 1] += #if defined(ILINK) (sizeof(vector)) + (sizeof(itertype)) + (sizeof(int) * maxn) + (sizeof(int) * numprocs) + #if PARALLEL_GCENTRAL (sizeof(double*) * maxn) + (maxn * (sizeof(double) * 2)) + #endif /* PARALLEL_GCENTRAL */ #else /* defined(ILINK) */ (sizeof(double)) + #endif /* defined(ILINK) */ #if defined(MLINK) (maxped * sizeof(double)) + #endif (sizeof(vector)) + (sizeof(vector)) + (sizeof(double) * fgeno) + (sizeof(double) * fgeno) + (sizeof(int)) + (sizeof(int)) + (sizeof(int)) + (sizeof(int)) + (sizeof(fencearray)) + (sizeof(fencearray)) + (sizeof(int) * numprocs) + (sizeof(double)) + (sizeof(int) * numprocs) + (sizeof(int) * numprocs) + (sizeof(boolean) * numprocs) + (sizeof(int) * numprocs) + (sizeof(int) * numprocs) + (sizeof(int)) + (sizeof(int)) + (sizeof(int)) + (sizeof(int)) + /* Global memory */ (sizeof(GlobalMemory)); /* from allocprob() in parmodified.c */ /* Note: this memory usage is only counted in the total usage if PRECOMPUTE=1. However, for statists reporting, we figure it out anyway. */ allocprobMem[numprocs -1] += (numprocs * (sizeof(double *))) + (numprocs * ((maxisozygclass * nuneed * nuneed) * sizeof(double))); if (!sexlink) { allocprobMem[numprocs -1] += (numprocs * (sizeof(unsigned *))) + (numprocs * ((nuneed * nuneed) * sizeof(unsigned))); if (sexdif) allocprobMem[numprocs - 1] += (numprocs * (sizeof(double *))) + (numprocs * ((maxisozygclass * nuneed * nuneed) * sizeof(double))); } allocprobMem[numprocs - 1] += (nuprobclass * sizeof(unsigned)) + (nuprobclass * sizeof(unsigned)); #if PRECOMPUTE /* This is where we add in the usage. */ memNeeded[numprocs - 1] += allocprobMem[numprocs - 1]; #endif /* if PRECOMPUTE */ } if (reportMemStats == true) { reportMemoryStats(memNeeded, allocprobMem); exit(0); } /* add the fudge */ return addFudge(memNeeded, fmemNeeded); } /* computeMemNeeded */ #if IS_P4 /* p4's command line option for setting global memory size */ static char* p4gmOpt = "-p4gm"; #define maxNumStrlen 19 /* convert an unsigned into it's ASCII representation */ static void itoa(str, num) char* str; unsigned num; { unsigned digit; char buffer[maxNumStrlen + 1]; int i = maxNumStrlen; buffer[i--] = '\0'; do { digit = num % 10; buffer[i--] = digit + '0'; num = (num - digit) / 10; } while (num > 0); strcpy(str, &buffer[i+1]); } #define maxArgs 8192 /* this should be sufficient */ /* p4 only allows us to declare the amount of global memory we'll need on the command line. Since we can determine it simply at run-time, we create a bogus argc and argv, and call the p4 initialization routine with an appropriate command-line flag. */ void initP4(argc, argv) int argc; char** argv; { int i; char memNeededStr[maxNumStrlen]; char* p4_argv[maxArgs+1]; int p4_argc = argc + 2; /* we're adding 2 arguments */ /* first, check to see if memsize was specified on the command line already */ for (i = 0; i < argc; i++) { if (!strcmp(argv[i], p4gmOpt)) { /* it was, so just initialize p4 the normal way and return */ p4_initenv(&argc, argv); return; } } /* generate string representing memory usage */ itoa(memNeededStr, computeMemNeeded()); /* concoct our new argv */ /* first, copy the old argv */ for (i = 0; i < argc; i++) p4_argv[i] = argv[i]; /* now, add the flag for global memory size */ p4_argv[i++] = p4gmOpt; p4_argv[i++] = memNeededStr; p4_argv[p4_argc] = NULL; #if defined(GMEM_DEBUG) printf("Allocating %s bytes of shared memory\n", memNeededStr); #endif /* defined(GMEM_DEBUG) */ /* initialize p4 */ p4_initenv(&p4_argc, p4_argv); } /* initP4 */ #endif /* IS_P4 */ void initParLib(argc, argv) int argc; char** argv; { #if IS_P4 initP4(argc, argv); #endif /* IS_P4 */ #if !IS_SHMEM if (reportMemStats == true) computeMemNeeded(); #endif /* !IS_SHMEM */ } /* end */ fastlink-4.1P-fix95/4.1P/src/mlinputcode.c0000644000265600020320000001050606737460342017314 0ustar tilleaadmin/* This file contains part of a modified version of the MLINK program */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Genetic Linkage Analysis, */ /* Human Heredity 44(1994), PP. 225-237 */ #include "commondefs.h" #include "gemdefs.h" #include "mldefs.h" Void readloci(LINK) struct LOC_inputdata *LINK; { struct LOC_readloci V; long i, j, coupling, autosomal, independent, difference; locusvalues *WITH; V.LINK = LINK; lastpriv = 0; fscanf(datafile, "%d%d%ld%*[^\n]", &mlocus, &risksys, &autosomal); getc(datafile); /*Replace the above line with the next when using epistasis*/ /*readln(datafile,nlocus,risksys,autosomal,lastpriv);*/ if (mlocus > maxlocus) inputerror(0L, mlocus, mlocus, LINK); if (mlocus <= 0) inputerror(1L, mlocus, mlocus, LINK); if (risksys > maxlocus) inputerror(37L, risksys, risksys, LINK); if (risksys < 0) inputerror(38L, risksys, risksys, LINK); risk = (risksys != 0); sexlink = (autosomal == 1); #if PARALLEL if (Tmk_proc_id == 0) { #endif printf("YOU ARE USING LINKAGE (V%3.1f (1-Feb-1991)) WITH%3d-POINT\n", fVersion, mlocus); printf("YOU ARE USING FASTLINK (V%s (6-Oct-1997))", fastversion); if (sexlink) printf(" SEXLINKED DATA\n"); else printf(" AUTOSOMAL DATA\n"); #if PARALLEL } #endif fscanf(datafile, "%d%lf%lf%ld%*[^\n]", &mutsys, &mutmale, &mutfemale, &coupling); getc(datafile); if (mutsys > maxlocus) inputerror(39L, mutsys, mutsys, LINK); if (mutsys < 0) inputerror(40L, mutsys, mutsys, LINK); if (coupling == 1) disequi = true; else disequi = false; if (disequi) { hapfreq = (thisarray *)Malloc(sizeof(thisarray)); if (!(hapfreq)) malloc_err("hapfreq"); } for (i = 1; i <= mlocus; i++) { fscanf(datafile, "%ld", &j); if (j > mlocus) inputerror(2L, i, j, LINK); if (j <= 0) inputerror(3L, i, j, LINK); order[j - 1] = i; } for (i = 1; i <= mlocus; i++) { for (j = 1; j < i; j++) { if (order[i - 1] == order[j - 1]) inputerror(4L, i, j, LINK); } } fscanf(datafile, "%*[^\n]"); getc(datafile); if (mutsys != 0) mutsys = order[mutsys - 1]; if (risksys != 0) risksys = order[risksys - 1]; V.nupriv = 0; for (i = 0; i < mlocus; i++) getlocus(order[i], &V); increment[mlocus - 1] = 1; for (i = mlocus - 1; i >= 1; i--) increment[i - 1] = increment[i] * thislocus[i]->nallele; fgeno = 1; for (j = 0; j < mlocus; j++) fgeno *= thislocus[j]->nallele; mgeno = fgeno; nuhap = fgeno; for (i = 0; i < mlocus; i++) nohom[i] = false; if (disequi) { allocate_thisarray(hapfreq, mgeno); for (i = 0; i < mgeno; i++) fscanf(datafile, "%lf", &hapfreq->genarray[i]); fscanf(datafile, "%*[^\n]"); getc(datafile); } else { for (i = 0; i < mlocus; i++) { WITH = thislocus[i]; if (WITH->which == affection || WITH->which == quantitative) { if (WITH->freq[affall - 1] < minfreq) nohom[i] = true; } } } fgeno = fgeno * (fgeno + 1) / 2; if (!sexlink) mgeno = fgeno; fscanf(datafile, "%ld", &difference); if ((unsigned long)difference > 2) { inputwarning(0L, difference, difference, LINK); difference = 0; } sexdif = (difference != 0); readfemale = (difference == 2); fscanf(datafile, "%ld%*[^\n]", &independent); getc(datafile); if ((unsigned long)independent > 2) { inputwarning(1L, independent, independent, LINK); independent = 0; } interfer = (independent != 0); mapping = (independent == 2); gettheta(&maletheta, &V); if (sexdif) gettheta(&femaletheta, &V); else femaletheta = maletheta; if (sexlink && sexdif) { inputwarning(2L, difference, difference, LINK); sexdif = false; readfemale = false; } fscanf(datafile, "%ld%lf%lf%*[^\n]", &which, &inc, &finish); getc(datafile); finish += 0.0001; if (!sexlink) { if (mutsys == 0) thispath = auto_; else thispath = mauto; } else if (mutsys == 0) thispath = sex; else thispath = msex; segscale = scale; for (i = 1; i <= mlocus; i++) segscale *= scalemult; } fastlink-4.1P-fix95/4.1P/src/mlink.c0000644000265600020320000003557307504150277016112 0ustar tilleaadmin/* This file contains a modified version of the MLINK program */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, Human Heredity */ /* 44(1994), pp. 225-237. */ #include "commondefs.h" #include "gemdefs.h" #include "mldefs.h" #if !defined(DOS) #include "checkpointdefs.h" #endif #ifndef LESSMEMORY #include "moddefs.h" #endif #if PARALLEL /* cgh */ #include "compar.h" /* parallel support code */ #endif /* defined(PARALLEL) -- cgh */ extern void checkzero(); #if !defined(KNR_PROTO) extern boolean zerotest(double); #else extern boolean zerotest(); #endif /* !defined(KNR_PROTO) */ #if PARALLEL /* cgh */ /* Calculate the number of calls to iterpeds() by simulating the nested loop in main(). We utilize temporary copies of all global variables to ensure nothing external is affected. */ void simIpedLoop(status) loopStatus status; { int i, j; int currentIter; /* current number of simulated iteration */ long datafilePos; /* current position in datafile */ /* initialize temporaries */ thetarray tMaletheta; int tWhich = which; double tInc = inc; double tFinish = finish; for (i = 0; i < mlocus - 1; i++) tMaletheta[i] = maletheta->theta[i]; /* remember where we are in datafile.dat */ datafilePos = ftell(datafile); if (status == countIpeds) /* initialize zero theta counter */ numZeroThetas = 0; /* initialize the loop counter */ if (score && (!risk)) { /* we will do an initial iteration of iterpeds() with 0.5 theta */ currentIter = 1; if (status == computeThetas) { /* we have an initial call to iterpeds() here with theta = 0.5 */ for (i = 0; i < mlocus - 1; i++) gmaletheta[0][i] = tMaletheta[i]; gmaletheta[0][tWhich - 1] = 0.5; /* see if this thetarray has a 0 */ gZeroTheta[0] = false; for (i = 1; i < mlocus - 1; i++) if (zerotest(tMaletheta[i])) gZeroTheta[0] = true; } else { /* we are counting iterations -- but we also want to count the number of zero thetas */ for (i = 1; i < mlocus - 1; i++) if (zerotest(tMaletheta[i])) { numZeroThetas++; break; } } } else { /* no initial call, so the first iteration is 0 */ currentIter = 0; } /* here we simulate the nested loop in main that calls iterpeds() */ do { while (tMaletheta[tWhich - 1] <= tFinish) { /* calculate thetas, if appropriate */ if (status == computeThetas) { gZeroTheta[currentIter] = false; for (i = 0; i < mlocus - 1; i++) { gmaletheta[currentIter][i] = tMaletheta[i]; if (zerotest(tMaletheta[i])) /* if this thetarray has a 0, record it */ gZeroTheta[currentIter] = true; } } else { for (i = 0; i < mlocus - 1; i++) { if (zerotest(tMaletheta[i])) { /* count the number of zero thetas */ numZeroThetas++; break; } } } /* this is where iterpeds() is called */ currentIter++; tMaletheta[tWhich - 1] += tInc; if (zerotest(tMaletheta[tWhich - 1])) tMaletheta[tWhich - 1] = 0.0; } if (!P_eof(datafile)) { fscanf(datafile, "%lf%lf%lf%*[^\n]", &tMaletheta[tWhich - 1], &tInc, &tFinish); getc(datafile); } else tWhich = 0; /* this increment is used to avoid round-off errors when checking for the finishing value */ tFinish += ROUNDOFF_INC; } while (tWhich != 0); if (datafile == NULL) Tmk_errexit("simIpedLoop() error - datafile is NULL\n"); /* reset datafile to its previous position */ if (fseek(datafile,datafilePos,0) != 0) Tmk_errexit("simIpedLoop() error - fseek failed\n"); /* we probably hit feof, so clear it */ clearerr(datafile); /* if it was our job to count the calls to iterpeds(), set the global numIpeds variable */ if (status == countIpeds) { numIpeds = currentIter; } else { /* calculate the number of nonzero theta vectors */ for (i = 0, numNonzeroThetas = 0; i < numIpeds; i++) if (gZeroTheta[i] == false) /* increment count of nonzero thetas, and save ordering of nozero thetas */ absoluteThetaIndex[numNonzeroThetas++] = i; /* save ordering of theta vectors that contain zeros */ for (i = 0, j = numNonzeroThetas; i < numIpeds; i++) if (gZeroTheta[i] == true) absoluteThetaIndex[j++] = i; } return; } #else /* if PARALLEL -- cgh */ /*The following routine iterates over the different pedigrees and handles output. Carol Haynes suggested adding the printing of lod scores for each family*/ void iterpeds() { int i; int thisped; int FORLIM; static double eachlod[maxped]; /*C. Haynes */ int II=0; /*C. Haynes*/ tlike = 0.0; alike = 0.0; for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } thisc = minint; recombination(); checkzero(); if (normalRun == checkpointStatus) { for (i = 1; i <= 35; i++) putc('-', outfile); putc('\n', outfile); for (i = 1; i <= 35; i++) putc('-', outfile); putc('\n', outfile); if (sexdif) fprintf(outfile, "MALE THETAS "); else fprintf(outfile, "THETAS "); } FORLIM = mlocus - 2; if (normalRun == checkpointStatus) { for (i = 0; i <= FORLIM; i++) fprintf(outfile, "%6.3f", maletheta->theta[i]); if (interfer) fprintf(outfile, "%6.3f", maletheta->theta[mlocus - 1]); putc('\n', outfile); if (dostream) { FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(stream, "%6.3f\n", maletheta->theta[i]); } if (interfer && dostream) fprintf(stream, "%6.3f\n", maletheta->theta[mlocus - 1]); if (sexdif) { fprintf(outfile, "FEMALE THETAS "); FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(outfile, "%6.3f", femaletheta->theta[i]); if (interfer) fprintf(outfile, "%6.3f", femaletheta->theta[mlocus - 1]); putc('\n', outfile); if (dostream) { FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(stream, "%6.3f\n", femaletheta->theta[i]); } if (interfer && dostream) fprintf(stream, "%6.3f\n", femaletheta->theta[mlocus - 1]); } for (i = 1; i <= 35; i++) putc('-', outfile); fprintf(outfile, "\nPEDIGREE | LN LIKE | LOG 10 LIKE\n"); for (i = 1; i <= 35; i++) putc('-', outfile); putc('\n', outfile); for (i = 1; i <= 35; i++) putchar('-'); putchar('\n'); for (i = 1; i <= 35; i++) putchar('-'); putchar('\n'); if (sexdif) printf("MALE THETAS "); else printf("THETAS "); FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) printf("%6.3f", maletheta->theta[i]); if (interfer) printf("%6.3f", maletheta->theta[mlocus - 1]); putchar('\n'); if (sexdif) { printf("FEMALE THETAS "); FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) printf("%6.3f", femaletheta->theta[i]); if (interfer) printf("%6.3f", femaletheta->theta[mlocus - 1]); putchar('\n'); } for (i = 1; i <= 35; i++) putchar('-'); printf("\nPEDIGREE | LN LIKE | LOG 10 LIKE\n"); for (i = 1; i <= 35; i++) putchar('-'); putchar('\n'); } #if LOOPSPEED open_loop_file(); #endif for (thisped = 0; thisped < nuped; thisped++) { #if LOOPSPEED read_loop_file(thisped + 1); #endif likelihood((thisped + 1), proband[thisped]); if (byfamily && (normalRun == checkpointStatus)) fprintf(outfile, "%9d %12.6f ", proband[thisped]->ped, like); if (dostream && (normalRun == checkpointStatus)) fprintf(stream, "%12d % .5e", proband[thisped]->ped, like); if (normalRun == checkpointStatus) printf("%9d %12.6f ", proband[thisped]->ped, like); alike += like; like /= log10_; /* C. Haynes*/ if (maletheta->theta[which - 1] == 0.5) eachlod[II] = like; if (byfamily && (normalRun == checkpointStatus)) if (lodbyfamily) fprintf(outfile, "%12.6f LOD= %12.6f\n", like, ((like-eachlod[II]) > BIGNEGATIVE) ? like-eachlod[II] : -999.999999); else fprintf(outfile, "%12.6f\n", like); if (dostream && (normalRun == checkpointStatus)) fprintf(stream, " %.5e\n", like); /* ERouillard -- "large" likelihoods and LRP */ if (normalRun == checkpointStatus) if (lodbyfamily) printf("%12.6f LOD= %12.6f\n", like, ((like - eachlod[II]) > BIGNEGATIVE) ? like-eachlod[II] : -999.999999); else printf("%12.6f\n", like); tlike += like; II++; /*C. Haynes*/ } #if LOOPSPEED close_loop_file(); #endif if (normalRun == checkpointStatus) { for (i = 1; i <= 35; i++) putc('-', outfile); fprintf(outfile, "\nTOTALS %12.6f %12.6f\n", alike, tlike); for (i = 1; i <= 35; i++) putchar('-'); printf("\nTOTALS %12.6f %12.6f\n", alike, tlike); if (dostream) fprintf(stream, "% .5e % .5e\n", alike, tlike); } alike = -2 * alike; if (normalRun == checkpointStatus) { fprintf(outfile, "-2 LN(LIKE) = % .5e", alike); printf("-2 LN(LIKE) = % .5e", alike); } if (score && (!risk)) { if (mlocus == 2) { if (maletheta->theta[which - 1] == 0.5) scorevalue = tlike; alike = tlike - scorevalue; if (normalRun == checkpointStatus) { fprintf(outfile, " LOD SCORE = %12.6f", alike); printf(" LOD SCORE = %12.6f", alike); } } else { if (maletheta->theta[which - 1] == 0.5) scorevalue = alike; alike = scorevalue - alike; if (normalRun == checkpointStatus) { fprintf(outfile, " LOG LIKE DIFFERENCE = %12.6f", alike); printf(" LOG LIKE DIFFERENCE = %12.6f", alike); } } } if (score && (!risk) && dostream) if (normalRun == checkpointStatus) fprintf(stream, "% .5e\n", tlike - scorevalue); if (normalRun == checkpointStatus) { putc('\n', outfile); putchar('\n'); } if (firsttime) { if (thisc < maxcensor) printf("Maxcensor can be reduced to %12d\n", thisc); else { if (thisc > maxcensor) printf("you may gain efficiency by increasing maxcensor\n"); } } firsttime = false; } #endif /* if PARALLEL -- cgh */ void preIpedLoop() { if (dostream && (checkpointedRun != checkpointStatus)) { fprintf(stream, "@\n"); fprintf(stream, "MLINK\n"); fprintf(stream, "%5d%5ld\n", mlocus, which); if (score && (!risk)) fprintf(stream, " 1\n"); else fprintf(stream, " 0\n"); if (interfer) fprintf(stream, " 1\n"); else fprintf(stream, " 0\n"); if (sexdif && readfemale) fprintf(stream, "2 "); else { if (sexdif) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); } fprintf(stream, "%12d\n", nuped); for (i = 1; i <= mlocus; i++) { j = 0; do { j++; } while (j != order[i - 1]); fprintf(stream, "%12ld\n", j); } putc('\n', stream); /* This call to recombination() is needed to make sure that the proper theta values are printed to stream. recombination() is called again before liklihood() is ever called from within iterpeds() (in sequential MLINK), or multiPedLike() (in parallel MLINK). Therefore, if dostream is false, this call can be safely omitted. In parallel MLINK, we don't want the barrier inside of recombination() to get called, and we don't want g{male,female}segprob assigned to. This code in recombination() is only executed when the boolean flag infun is true, so we set it to false before the call. -- cgh */ #if PARALLEL /* cgh */ infun = false; #endif /* if PARALLEL -- cgh */ recombination(); for (i = 1; i < mlocus; i++) fprintf(stream, "% .5e\n", maletheta->theta[i - 1]); if (interfer) fprintf(stream, "%6.3f\n", maletheta->theta[mlocus - 1]); if (sexdif) { for (i = 1; i < mlocus; i++) fprintf(stream, "% .5e\n", femaletheta->theta[i - 1]); } if (interfer && sexdif) fprintf(stream, "%6.3f\n", femaletheta->theta[mlocus - 1]); } fprintf(outfile, "LINKAGE (V%3.1f) WITH%3d-POINT", fVersion, mlocus); if (sexlink) fprintf(outfile, " SEXLINKED DATA\n"); else fprintf(outfile, " AUTOSOMAL DATA\n"); fprintf(outfile, " ORDER OF LOCI: "); for (i = 1; i <= mlocus; i++) { thissystem = 1; while (order[thissystem - 1] != i) thissystem++; fprintf(outfile, "%3ld", thissystem); } putc('\n', outfile); scorevalue = 0.0; #if !PARALLEL /* cgh */ if (score && (!risk)) { holdtheta = maletheta->theta[which - 1]; maletheta->theta[which - 1] = 0.5; if (checkpointedRun == checkpointStatus) { printf("\nTo get LODSCOREs correct the program will redo the"); printf("\nlikelihood evaluation with moving locus unlinked"); printf("\nOutput will be suppressed\n\n"); fflush(stdout); } iterpeds(); if (normalRun == checkpointStatus) { ensureWrite(outfile); ensureWrite(stream); } maletheta->theta[which - 1] = holdtheta; } #endif /* if !PARALLEL -- cgh */ } #if !PARALLEL void ipedLoop() { #if !defined(DOS) iterpeds_counter = 0; /*set up for checkpointing*/ #endif /* !defined(DOS) */ do { while (maletheta->theta[which - 1] <= finish) { #if !defined(DOS) if ((0 == checkpoint_counter) && (iterped_call_before == checkpoint_place)) checkpointStatus = normalRun; if (normalRun == checkpointStatus) { performCheckpoint(functionLocation, iterpeds_counter, iterped_call_before); copyFile("outfile.dat", MainMLINKOutfileDat); if (dostream) copyFile("stream.dat", MainMLINKStreamDat); } if (( 0 == checkpoint_counter) && (iterped_call_before == checkpoint_place)) { #endif /* if !defined(DOS) */ iterpeds(); ensureWrite(outfile); ensureWrite(stream); #if !defined(DOS) performCheckpoint(functionLocation, iterpeds_counter, iterped_call_after); } if ((checkpoint_counter == 0) && (iterped_call_after == checkpoint_place)){ checkpoint_place = iterped_call_before; checkpointStatus = normalRun; } if (normalRun == checkpointStatus) { copyFile("outfile.dat", MainMLINKOutfileDat); if (dostream) copyFile("stream.dat", MainMLINKStreamDat); } #endif /* if !defined(DOS) */ maletheta->theta[which - 1] += inc; if (zerotest(maletheta->theta[which - 1])) maletheta->theta[which - 1] = 0.0; #if !defined(DOS) if (checkpoint_counter > 0) checkpoint_counter--; iterpeds_counter++; #endif /* if !defined(DOS) */ } if (!P_eof(datafile)) { fscanf(datafile, "%lf%lf%lf%*[^\n]", &maletheta->theta[which - 1], &inc, &finish); getc(datafile); } else which = 0; /* cgh -- this increment is used to avoid round-off errors when checking for the finishing value */ finish += ROUNDOFF_INC; } while (which != 0); } #endif /* !PARALLEL */ /* End. */ fastlink-4.1P-fix95/4.1P/src/.pure0000644000265600020320000000000007422124711015552 0ustar tilleaadminfastlink-4.1P-fix95/4.1P/src/strbuff.c0000644000265600020320000000476206737460342016453 0ustar tilleaadmin/* strbuff.c -- Support code for strCache class This is a dynamically resizing string buffer. Output is written to an external buffer, and then appended to the internal buffer. Internal state maintains a pointer to the current end of the string. If the buffer to be appended would cause an overflow of the internal buffer, the internal string is doubled in size before the copy. Based on an idea by Jeremy Buhler (jbuhler@rice.edu). */ #include "strbuff.h" #include "commondefs.h" #define INITSIZE 1024 /* exits with an error message -- for use in non-parallel mode */ void errExit(errmsg) char* errmsg; { fprintf(stderr, "%s\n", errmsg); exit(-1); } /* "Constructor" for strBuff. Allocates space for a single strBuff object. */ strBuff* newStrBuff() { #if PARALLEL strBuff* newBuff = (strBuff*) Tmk_malloc(sizeof(strBuff)); if (newBuff == NULL) Tmk_errexit("MALLOC ERROR - newStrBuff\n"); newBuff->string = (char*) Tmk_malloc(INITSIZE * sizeof(char)); if (newBuff->string == NULL) Tmk_errexit("MALLOC ERROR - newBuff->string\n"); #else /* if PARALLEL */ strBuff* newBuff = (strBuff*) malloc(sizeof(strBuff)); if (newBuff == NULL) errExit("couldn't malloc newBuff"); newBuff->string = (char*) calloc(INITSIZE, sizeof(char)); if (newBuff->string == NULL) errExit("couldn't malloc newBuff->string"); #endif /* if PARALLEL */ newBuff->string[0] = '\0'; newBuff->size = INITSIZE; newBuff->stindex = 0; return newBuff; } /* Appends string in buffer to the internal string in a strBuff object. If appending the string in buffer would cause an overflow, the internal string is doubled in size first. */ void append(sBuff, buffer) strBuff* sBuff; char* buffer; { int length = strlen(buffer); if (sBuff->stindex + length >= sBuff->size) { char* newString; /* double the size of the string */ sBuff->size <<= 1; #if PARALLEL newString = (char*) Tmk_malloc(sBuff->size * sizeof(char)); if (newString == NULL) Tmk_errexit("MALLOC ERROR - resizing in append\n"); #else /* if PARALLEL */ newString = (char*) calloc(sBuff->size, sizeof(char)); if (newString == NULL) errExit("couldn't malloc newString"); #endif strcpy(newString, sBuff->string); #if PARALLEL Tmk_free(sBuff->string); #else free(sBuff->string); #endif sBuff->string = newString; } /* append buffer to the internal string */ strcpy(sBuff->string + sBuff->stindex, buffer); sBuff->stindex += length; } fastlink-4.1P-fix95/4.1P/src/lodefs.h0000644000265600020320000000260506737460342016253 0ustar tilleaadmin#ifndef _LODEFS_H #define _LODEFS_H /* This file contains some definitions for the faster version of */ /* the LODSCORE program described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Gentics, 53(1993), pp. 252-263. */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, Human Heredity */ /* 44(1994), pp. 225-237. */ #ifndef _COMMONDEFS_H #include #endif #define scale 2.0 /*SCALE FACTOR*/ #ifndef byfamily #define byfamily false #endif #define epsilon 1.0e-6 /* typedef struct phenotype { binset phenf; double x[maxtrait]; boolean missing; int aff, liability; } phenotype; */ int startped[maxped], endped[maxped]; int locuslist1[maxsys], locuslist2[maxsys]; int ilocus, jlocus, j, holdmutsys, nlocus1, nlocus2, hitsys; double holdmutmale, holdmutfemale, holdftheta, holdmtheta, holdratio; locusvalues *holdlocus[maxsys]; /*OTHERS*/ int nlocus, iplace, jplace; boolean inconsistent; FILE *pedfile, *recfile; /*ILINK*/ boolean penalty; double penlike; /*GEMINI*/ enum { go, quit, restart } continue_; #if defined(DOS) typedef enum { normalRun , checkpointedRun } checkpointType; checkpointType checkpointStatus; #endif #endif /* _LODEFS_H */ fastlink-4.1P-fix95/4.1P/src/gemdefs.h0000644000265600020320000000561406737460341016413 0ustar tilleaadmin#ifndef _GEMDEFS_H #define _GEMDEFS_H 1 /* Output from p2c, the Pascal-to-C translator */ /* From input file "ilink.p" */ /* This file contains definitions for a modified version of */ /* the gemini package used in the LODSCORE and ILINK programs*/ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, Human Heredity */ /* 44(1994), pp. 225-237. */ #include "commondefs.h" /*GEMINI*/ #if !defined(iterationMultiple) /* Maximum number of iterations will be iterationMultiple * n; n is number of dimensions */ #define iterationMultiple 50 #endif #ifndef maxn #define maxn 20 /* MAXIMUM NUMBER OF ITERATED PARAMETERS */ #endif #define nbit 23 /*NUMBER OF BITS OF MACHINE PRECISION*/ #define tolconst 1.0e-3 /*TOLERANCE ON LIKELIHOOD FOR STOP*/ /*DO NOT CHANGE THE FOLLOWING CONSTANTS*/ #define tolg 1.0e-35 #define xpmcon 1.0e30 #define clbcon 1.0e10 #define tbndcon 1.0e5 #define curv 0.75 #define small 1.0e-10 /*GEMINI*/ typedef int itertype[maxn]; typedef double vector[maxn]; typedef vector matrix[maxn]; /*VARIABLES FROM COMMON MIN1*/ matrix tl; vector d, g, gsave, y, p; #if PARALLEL vector *gg; /*Tmk_malloc later, Sandeep*/ #endif /*VARIABLE FROM COMMON MIN2*/ int nit, nfe, idg, idif, isw, iret, ibnd, ihess, ivar, ihx, maxit; double tol, tmin, h, trupb, ptg; #if PARALLEL int *gnfe; /*Sandeep*/ #endif /*DIMENSIONED IN GEMINI*/ vector xall, x, v, se; #if PARALLEL vector *gx, *gxall; /*Tmk_malloc later, Sandeep*/ #endif itertype itp, holditp; #if PARALLEL itertype *gitp; /*Tmk_malloc later, Sandeep*/ #endif double bnd[maxn][2]; int nall, n, icall; double tbnd, f, fsmf, fsav2, t, hx, xsave, fxph, fxmh, xp, xpm, ytp; /*ARRAYS IN UPDATE*/ vector wtil, ztil, w, z, wtjp1, ztjp1, s, dp; double nu, muj, lambj, lambj2, sb, sc, sd, fbcd, alpha, sa, thet1, thet2, aa, bb, cc, del2, alph1, alph2, rdiv, eta, aj, thj, bj, gamlj, betlj, del; int iswup; /*FROM STEP*/ vector xt; double fsave, sumt, twot, ft, f2t, ft2, scal; /*FROM CHKBND */ double clb, check, eh, teq; /*OTHERS*/ int itsys; /*USUALLY IN INIB*/ matrix bmat; boolean active; /*Added to avoid extra function evaluations*/ vector outsavex; double outsavefvalue; double savedf[2 * maxn]; double likebyped[maxped]; double outsavelike[maxped]; #if PARALLEL /*Prototypes */ #if defined(KNR_PROTO) void OneMaster(); void AssignThetas(); unsigned MakeMask(); #else void OneMaster(void); void AssignThetas(void); unsigned MakeMask(int start, int end); #endif /* defined(KNR_PROTO) */ #endif #endif /* _GEMDEFS_H */ fastlink-4.1P-fix95/4.1P/src/cominputcode.c0000644000265600020320000015241110517437761017464 0ustar tilleaadmin/* This file contains input code shared by modified versions of the */ /* ILINK, LINKMAP, and MLINK programs */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237. */ /* Modified by Dylan in late 1994. Main difference is reads from 'loopfile' instead of 'speedfile' when LOOPSPEED is set. Please read README.loopfile. See also unknown.c and commondefs.c. */ #include "commondefs.h" #if !defined(DOS) #include "checkpointdefs.h" #endif #include "gemdefs.h" /* Local variables for getlocations: */ struct LOC_getlocations { long ngene, nseg, here, there, start, nhet, thisseg; boolean rarepresent, riskhom, riskhet; hapvector hap1, hap2; boolean thishet[maxlocus]; }; Local boolean checkrare(LINK) struct LOC_getlocations *LINK; { long i; boolean check; locusvalues *WITH; check = false; for (i = 1; i <= mlocus; i++) { if (nohom[i - 1]) { WITH = thislocus[i - 1]; if ((WITH->freq[LINK->hap1[i] - 1]< minfreq) || (WITH->freq[LINK->hap2[i] - 1] < minfreq)) check = true; } } return check; } Local Void checkrisk(riskhet, riskhom, LINK) boolean *riskhet, *riskhom; struct LOC_getlocations *LINK; { *riskhet = false; *riskhom = false; if (LINK->hap1[risksys - 1] == riskall && LINK->hap2[risksys - 1] == riskall) *riskhom = true; else { if ((LINK->hap1[risksys - 1] != riskall && LINK->hap2[risksys - 1] == riskall) || (LINK->hap2[risksys - 1] != riskall && LINK->hap1[risksys - 1] == riskall)) *riskhet = true; } } Local long gethapn(hap, LINK) hapvector hap; struct LOC_getlocations *LINK; { long i, n; n = 1; for (i = 1; i <= mlocus; i++) n += increment[i - 1] * (hap[i - 1] - 1); return n; } /* Local variables for domalerisk: */ struct LOC_domalerisk { struct LOC_getlocations *LINK; } ; Local Void setrisk(LINK) struct LOC_domalerisk *LINK; { long n; n = gethapn(LINK->LINK->hap1, LINK->LINK); if (LINK->LINK->hap1[risksys - 1] == riskall) riskmale[n - 1] = true; else riskmale[n - 1] = false; } Local Void getriskhap(system, LINK) long system; struct LOC_domalerisk *LINK; { long i; locusvalues *WITH; long FORLIM; WITH = thislocus[system - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[system - 1] = i; if (system != mlocus) getriskhap(system + 1, LINK); else setrisk(LINK); } } Local Void domalerisk(LINK) struct LOC_getlocations *LINK; { struct LOC_domalerisk V; V.LINK = LINK; getriskhap(1L, &V); } /* Local variables for domutation: */ struct LOC_domutation { struct LOC_getlocations *LINK; } ; Local Void setmutation(LINK) struct LOC_domutation *LINK; { long i, n; n = gethapn(LINK->LINK->hap1, LINK->LINK); if (LINK->LINK->hap1[mutsys - 1] == thislocus[mutsys - 1]->nallele) { muthap[n - 1] = n; return; } i = LINK->LINK->hap1[mutsys - 1]; LINK->LINK->hap1[mutsys - 1] = thislocus[mutsys - 1]->nallele; muthap[n - 1] = gethapn(LINK->LINK->hap1, LINK->LINK); LINK->LINK->hap1[mutsys - 1] = i; } Local Void getmuthap(system, LINK) long system; struct LOC_domutation *LINK; { long i; locusvalues *WITH; long FORLIM; WITH = thislocus[system - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[system - 1] = i; if (system != mlocus) getmuthap(system + 1, LINK); else setmutation(LINK); } } Local Void domutation(LINK) struct LOC_getlocations *LINK; { struct LOC_domutation V; V.LINK = LINK; getmuthap(1L, &V); } Local Void setnumbers(LINK) struct LOC_getlocations *LINK; { long nhap1, nhap2; LINK->ngene++; segstart[LINK->ngene - 1] = LINK->here + 1; probstart[LINK->ngene - 1] = LINK->there + 1; probend[LINK->ngene - 1] = LINK->there + LINK->nseg; LINK->there += LINK->nseg; nhap1 = gethapn(LINK->hap1, LINK); nhap2 = gethapn(LINK->hap2, LINK); genenumber[nhap1 - 1][nhap2 - 1] = LINK->ngene; genenumber[nhap2 - 1][nhap1 - 1] = LINK->ngene; if (minfreq != 0.0) { if (LINK->rarepresent) rare[LINK->ngene - 1] = true; else rare[LINK->ngene - 1] = false; } else rare[LINK->ngene - 1] = false; if (risk) { risk1[LINK->ngene - 1] = LINK->riskhet; risk2[LINK->ngene - 1] = LINK->riskhom; } LINK->thisseg++; invgenenum1[LINK->thisseg - 1] = nhap1; invgenenum2[LINK->thisseg - 1] = nhap2; } Local Void hapscr(system, nscramble, LINK) long system, nscramble; struct LOC_getlocations *LINK; { long i, j; if (LINK->thishet[system - 1]) nscramble++; if (system != mlocus) hapscr(system + 1, nscramble, LINK); else setnumbers(LINK); if (nscramble <= 1) return; if (LINK->hap1[system - 1] == LINK->hap2[system -1]) return; i = LINK->hap1[system - 1]; j = LINK->hap2[system - 1]; LINK->hap1[system - 1] = j; LINK->hap2[system - 1] = i; if (system != mlocus) hapscr(system + 1, nscramble, LINK); else setnumbers(LINK); LINK->hap1[system - 1] = i; LINK->hap2[system - 1] = j; } Local Void sethap(system, LINK) long system; struct LOC_getlocations *LINK; { long i, j; locusvalues *WITH; long FORLIM, FORLIM1; WITH = thislocus[system - 1]; if (LINK->thishet[system - 1]) { FORLIM = WITH->nallele; for (i = 1; i < FORLIM; i++) { LINK->hap1[system - 1] = i; FORLIM1 = WITH->nallele; for (j = i + 1; j <= FORLIM1; j++) { LINK->hap2[system - 1] = j; if (system != mlocus) sethap(system + 1, LINK); else { LINK->rarepresent = checkrare(LINK); if (risk) checkrisk(&LINK->riskhet, &LINK->riskhom, LINK); LINK->there = LINK->start; LINK->thisseg = LINK->here; hapscr(1L, 0L, LINK); LINK->here += LINK->nseg; } } } return; } FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->hap1[system - 1] = i; LINK->hap2[system - 1] = i; if (system != mlocus) sethap(system + 1, LINK); else { LINK->rarepresent = checkrare(LINK); if (risk) checkrisk(&LINK->riskhet, &LINK->riskhom, LINK); LINK->thisseg = LINK->here; LINK->there = LINK->start; hapscr(1L, 0L, LINK); LINK->here += LINK->nseg; } } } Local Void starthap(LINK) struct LOC_getlocations *LINK; { long i, FORLIM; LINK->nseg = 1; FORLIM = LINK->nhet; for (i = 2; i <= FORLIM; i++) LINK->nseg *= 2; sethap(1L, LINK); LINK->start = LINK->there; } Local Void gethet1(system, LINK) long system; struct LOC_getlocations *LINK; { LINK->thishet[system - 1] = false; if (system != mlocus) gethet1(system + 1, LINK); else starthap(LINK); LINK->thishet[system - 1] = true; LINK->nhet++; if (system != mlocus) gethet1(system + 1, LINK); else starthap(LINK); LINK->nhet--; } Void getlocations() { struct LOC_getlocations V; V.nhet = 0; V.here = 0; V.there = 0; V.ngene = 0; V.start = 0; gethet1(1L, &V); if (mutsys != 0) domutation(&V); if (sexlink && risk) domalerisk(&V); } Void inputerror(nerror, par1, par2, LINK) long nerror, par1, par2; struct LOC_inputdata *LINK; { printf("Fatal error detected in procedure inputdata\n"); switch (nerror) { case 0: printf("Number of loci %2ld exceeds the constant maxlocus\n", par1); break; case 1: printf("Number of loci read %2ld. Less than minimum of 1\n", par1); break; case 2: printf( "Error detected reading loci order. Locus number %2ld in position %2ld exceeds number of loci\n", par2, par1); break; case 3: printf( "Error detected reading loci order. Illegal locus number %2ld in position %2ld\n", par2, par1); break; case 4: printf( "Error detected reading loci order. Locus number repeated in positions %2ld and %2ld\n", par1, par2); break; case 5: printf( "Error detected reading locus description. Illegal locus type %2ld for locus %2ld\n", par2, par1); break; case 6: printf( "Error detected reading locus description for system %2ld. Number of alleles %2ld exceeds maxall\n", par1, par1); break; case 7: printf( "Error detected reading locus description for system %2ld. Illegal number of alleles %2ld\n", par1, par2); break; case 8: printf( "Error detected reading locus description for system %2ld.\n Number of factors %2ld exceeds maxfact or length of a long int\n", par1, par2); break; case 9: printf( "Error detected reading locus description for system %2ld. Illegal number of factors %2ld\n", par1, par2); break; case 10: printf( "Error detected reading locus description for system %2ld. Alleles not codominant\n", par1); break; case 11: printf("Error detected reading pedigree record %2ld. Illegal code for sex %2ld\n", par1, par2); break; case 12: printf( "Error detected reading pedigree record at pedigree%2ld. Maximum number of pedigree records exceeded\n", par1); break; case 13: printf( "Error detected reading pedigree record %2ld. Maximum number of individuals exceeded\n", par1); break; case 14: printf( "Error detected reading pedigree record %2ld. Illegal binary factor code %2ld\n", par1, par2); break; case 15: printf( "Error detected reading pedigree record %2ld. No allelic pair for genotype\n", par1); break; case 16: printf( "Error detected reading pedigree record %2ld. Allele number %2ld exceeds maxall\n", par1, par2); break; case 17: printf( "Error detected reading pedigree record %2ld. Illegal allele number %2ld\n", par1, par2); break; case 18: printf("Number of systems after factorization (%3ld) exceeds maxsystem\n", par1); break; case 19: printf("Number of systems after factorization (%3ld) less than minimum of 1\n", par1); break; case 20: printf("Number of recombination types (%3ld) exceeds maxrectype\n", par1); break; case 21: printf("Number of recombination types (%3ld) less than minimum of 1\n", par1); break; case 22: printf( "End of file detected in tempdat by procedure readthg before all data found\n"); break; case 23: printf( "Error detected reading iterated locus in datafile. Value (%3ld) greater than nlocus\n", par1); break; case 24: printf( "Error detected reading iterated locus in datafile. Illegal value (%3ld)\n", par1); break; case 25: printf("Number of iterated parameters greater then maxn in gemdefs.h\n"); break; case 26: printf( "Error detected reading pedigree record %2ld. Liability class (%2ld) exceeds nclass\n", par1, par2); break; case 27: printf( "Error detected reading pedigree record %2ld. Illegal liability class (%2ld)\n", par1, par2); break; case 28: printf( "Error detected reading locus description for system%2ld. Liability classes (%3ld) exceed maxliab\n", par1, par2); break; case 29: printf( "Error detected reading locus description for system%2ld. Illegal number of liability classes (%3ld)\n", par1, par2); break; case 30: printf( "Error detected reading locus description for system%2ld. Penetrance out of range\n", par1); break; case 31: printf( "Error detected reading locus description for system%2ld. Number of traits (%3ld) exceeds maxtrait\n", par1, par2); break; case 32: printf( "Error detected reading locus description for system%2ld. Number of traits out of range (%3ld)\n", par1, par2); break; case 33: printf( "Error detected reading locus description for system%2ld. Variance must be positive\n", par1); break; case 34: printf( "Error detected reading locus description for system%2ld. Variance multiplier must be positive\n", par1); break; case 35: printf( "Error detected reading locus description for system%2ld. Risk allele %3ld) exceeds nallele\n", par1, par2); break; case 36: printf( "Error detected reading locus description for system%2ld. Illegal risk allele (%3ld)\n", par1, par2); break; case 37: printf("Error detected reading datafile. Risk locus %3ld) exceeds nlocus\n", par2); break; case 38: printf("Error detected reading datafile. Illegal value for risk locus %3ld)\n", par2); break; case 39: printf("Error detected reading datafile. Mutation locus %3ld) exceeds nlocus\n", par2); break; case 40: printf( "Error detected reading datafile. Illegal value for mutation locus %3ld)\n", par2); break; case 41: printf( "Error detected reading datafile. Linkage disequilbirium is not allowed with this program\n"); break; case 42: printf("Locus %5ld in lod score list exceeds nlocus %5ld\n", par1, par2); break; case 43: printf("Illegal locus number %5ld in lod score list\n", par1); break; } exit(EXIT_FAILURE); } Void inputwarning(nwarning, par1, par2, LINK) long nwarning, par1, par2; struct LOC_inputdata *LINK; { printf("Warning number from procedure inputdata\n"); switch (nwarning) { case 0: printf("Illegal sex difference parameter %2ld Parameter should be 0, 1, or 2\n", par1); break; case 1: printf("Illegal interference parameter %2ld Lack of interference assumed\n", par1); break; case 2: printf( "Illegal sex difference parameter %2ld Parameter must be 0 with sex-linked data\n", par1); break; case 3: printf( "Non-standard affection status%4ld interpreted as normal in pedigree record%5ld\n", par2, par1); break; } } #if LOOPSPEED /* Written by Dylan in late 1994. Thus routine opens up loopfile.dat */ void open_loop_file() { if (loopfile != NULL) { fclose(loopfile); loopfile = fopen(LOOPFILE_NAME, "r"); } else { loopfile = fopen(LOOPFILE_NAME, "r"); } if (loopfile == NULL) { printf("The file %s was not found.\n", LOOPFILE_NAME); printf("Check that LOOPSPEED is defined in unknown.c\n"); exit(FileNotFound); } } /* Written by Dylan in late 1994. This routine closes loopfile.dat */ void close_loop_file() { if (loopfile != NULL) { fclose(loopfile); } loopfile = NULL; } /*free the memory associated with is_zero_breaker*/ static void free_is_zero_breaker() { int locus; for (locus = 0; locus < mlocus; locus++) free(is_zero_breaker[locus]); free(is_zero_breaker); is_zero_breaker = NULL; } /*free the memory associated with breaker_poss_genotype*/ static void free_breaker_poss_genotype() { int loopindex; /*index over loop breakers*/ for(loopindex = 0; loopindex < maxloop; loopindex++) { if (NULL != breaker_poss_genotype[loopindex]) { free(breaker_poss_genotype[loopindex]); breaker_poss_genotype[loopindex] = NULL; } } } /* This procedure frees the space used by 'loop_vectors'. Written by Dylan. */ static void free_loop_vectors () { int locus, vect; if (loop_vectors != NULL) { for (locus = 0; locus < mlocus; locus++) { if ( loop_vectors[locus] != NULL ) { for (vect = 0; vect < num_loop_vectors[locus]; vect++) { if ( loop_vectors[locus][vect] != NULL ) { free(loop_vectors[locus][vect]); } } free(loop_vectors[locus]); } } free(loop_vectors); loop_vectors = NULL; } } /* free_loop_vectors */ /* This procedure frees the space used by the data structure 'unknown_poss'. Written by Dylan in late 1994. */ static void free_unknown_poss() { int curr_person, locus, loop_v; if (unknown_poss != NULL) { for (curr_person = 1; curr_person <= totperson; curr_person++){ /* only entries for people with unknown genotype */ if ( person[curr_person]->unknown ) { for (locus = 0; locus < mlocus; locus++){ if ( person[curr_person]->thisunknown[locus] ) { for (loop_v = 0; loop_v < num_loop_vectors[locus]; loop_v++) { free(unknown_poss[curr_person][locus][loop_v]); } /* for each loop vector */ } else { /* known at this locus so only one loop vector used */ free(unknown_poss[curr_person][locus][0]); } free(unknown_poss[curr_person][locus]); } /* for each locus */ free(unknown_poss[curr_person]); person[curr_person]->unknown = false; } } /* for each person */ free(unknown_poss); unknown_poss = NULL; } } /* free_unknown_poss */ /* Written by Dylan in late 1994. */ static void read_loop_err() { /* other errors get written to standard out for some reason fprintf(stderr, "Error in reading %s.\n", LOOPFILE_NAME); */ printf("Error in reading %s.\n", LOOPFILE_NAME); exit(EXIT_FAILURE); } static void malloc_loop_err(message, fewer_vects_size) char * message; int fewer_vects_size; { FILE *errorfile; time_t secondsNow; fprintf(stderr, "\nProblem with malloc, probably not enough space\n"); fprintf(stderr, "Problem occurred when allocating %s\n", message); fprintf(stderr, "while reading %s.\n", LOOPFILE_NAME); fprintf(stderr, "Try reducing max_vectors_considered to %d.\n", fewer_vects_size); errorfile = fopen("FASTLINK.err","a"); if (errorfile) { time (&secondsNow); fprintf(errorfile,"\n%s",ctime(&secondsNow)); fprintf(errorfile, "\nProblem with malloc, probably not enough space\n"); fprintf(errorfile, "Problem occurred when allocating %s\n", message); fclose(errorfile); } exit(EXIT_FAILURE); } /*infer possible genotypes for each loop breaker*/ void infer_genotypes(curr_ped) int curr_ped; { int loopindex; /*index over loop breakers*/ boolean **breaker_poss_bylocus[maxloop]; /*possible single locus genotypes for each loop breaker and locus*/ int plocus; /*placeholder for locus index*/ int locus; /*loop index for loci*/ int genoindex; /*loop index for single locus and multilocus genotypes*/ int hap1, hap2; /*haplotypes for one person*/ int num_alleles; /*number of alleles at a locus*/ int vect; /*loop index for single locus loop vectors over all breakers*/ int a,b,temp; /*placeholders for alleles*/ int this_locus_geno; /*genotype for a single person at a single locus*/ int duplicates; /*used to go from genotype to alleles*/ for(loopindex = 0; loopindex < num_loops[curr_ped - 1]; loopindex++) { breaker_poss_bylocus[loopindex] = (boolean **) malloc (mlocus * sizeof (boolean *)); if (NULL == breaker_poss_bylocus[loopindex]) malloc_err("breaker_poss_bylocus middle level"); for (locus = 0; locus < mlocus; locus++) { plocus = order[locus] - 1; breaker_poss_bylocus[loopindex][plocus] = (boolean *) malloc (thislocus[plocus]->fgeno); if (NULL == breaker_poss_bylocus[loopindex][plocus]) malloc_err("breaker_poss_bylocus inner level"); for (genoindex = 0; genoindex < thislocus[plocus]->fgeno; genoindex++) breaker_poss_bylocus[loopindex][plocus][genoindex] = false; } } for (locus = 0; locus < mlocus; locus++) { plocus = order[locus] - 1; for(vect = 0; vect < num_loop_vectors[plocus]; vect++) if (!(is_zero_breaker[plocus][vect])) { for (loopindex = 0; loopindex < num_loops[curr_ped - 1]; loopindex++) breaker_poss_bylocus[loopindex][plocus] [loop_vectors[plocus][vect][loopindex]] = true; } } for(loopindex = 0; loopindex < maxloop; loopindex++) breaker_poss_genotype[loopindex] = NULL; for(loopindex = 0; loopindex < num_loops[curr_ped - 1]; loopindex++) { breaker_poss_genotype[loopindex] = (boolean *) malloc (fgeno * sizeof(boolean)); if (NULL == breaker_poss_genotype[loopindex]) { malloc_err("breaker_poss_genotype"); } for (genoindex = 0; genoindex < fgeno; genoindex++) { breaker_poss_genotype[loopindex][genoindex] = true; if (sexlink && (looppers[curr_ped - 1][loopindex][0]->male)) { hap1 = genoindex; /*already decremented*/ hap2 = genoindex; } else { hap1 = invgenenum1[genoindex] - 1; hap2 = invgenenum2[genoindex] - 1; } /* for each locus in reverse order */ for (locus = (mlocus - 1); locus >= 0; locus--) { num_alleles = thislocus[locus]->nallele; /* Calculate the left and right allele for this locus. I'm taking advantage of knowing how the joint haplotypes are computed in setval(). */ a = hap1 % num_alleles; hap1 = (hap1 - a) / num_alleles; b = hap2 % num_alleles; hap2 = (hap2 - b) / num_alleles; /* Calculate the the single loucs genotype, given the alleles. I'm taking advantage of knowing how the genotypes are calculated in unknown. */ if ( a > b ) { temp = a; a = b; b = temp; } duplicates = a * (a + 1) / 2; if (sexlink && (looppers[curr_ped -1][loopindex][0]->male)) this_locus_geno = a; else this_locus_geno = (a * num_alleles) - duplicates + b; if (!(breaker_poss_bylocus[loopindex][locus][this_locus_geno])) { breaker_poss_genotype[loopindex][genoindex] = false; break; } } } } for(loopindex = 0; loopindex < num_loops[curr_ped - 1]; loopindex++) { if (NULL != breaker_poss_bylocus[loopindex]) { for (locus = 0; locus < mlocus; locus++) free(breaker_poss_bylocus[loopindex][locus]); free(breaker_poss_bylocus[loopindex]); breaker_poss_bylocus[loopindex] = NULL; } } } /* This procedure reads the next pedigree in 'loopfile'. The information is read into 'loop_vectors', 'num_loop_vectors', and 'unknown_poss'. Written by Dylan in late 1994. */ void read_loop_file(curr_ped) int curr_ped; { int ped_read; char ch; int locus, vect, geno; int plocus; /*A. A. Schaffer*/ int check_locus, check_vect; int ind, num_vects; int loop; int init; int fewer_vects_size; int b; /*index over loop_breaker vectors*/ boolean any_possible; /*count of possible genotypes*/ char extrachar; /*for debugging*/ /* if only one pedigree, don't reread each time */ if ( ever_read_loopfile && (nuped == 1) ) { return; } /* free data from last pedigree */ if ( ever_read_loopfile ) { free_unknown_poss(); free_loop_vectors(); free_is_zero_breaker(); free_breaker_poss_genotype(); } /* read in pedigree -- assumes pedigrees start at 1 */ if ( curr_ped == 1 ) { if ( !fscanf(loopfile, "Pedigree: %d\n", &ped_read) ) { read_loop_err(); } } else { if ( !fscanf(loopfile, "edigree: %d\n", &ped_read) ) { read_loop_err(); } } /* read fewer_vects_size */ if ( !fscanf(loopfile, "fewer_vects_size: %d\n", &fewer_vects_size) ) { read_loop_err(); } /* read in num_loops_considered */ if (!fscanf(loopfile,"num_loops_considered: %d\n",&(num_loops[ped_read-1]))){ read_loop_err(); } /* read in num_loop_vectors */ if ( !fscanf(loopfile, "num_loop_vectors %c\n", &ch) ) { read_loop_err(); } for (locus = 0; locus < mlocus; locus++) { if ( !fscanf(loopfile, "\t%d :", &check_locus) || (locus != check_locus)){ read_loop_err(); } fscanf(loopfile, " %d\n", &num_vects); num_loop_vectors[order[locus] - 1] = num_vects; } /*Alex*/ is_zero_breaker = (boolean **) malloc(mlocus * sizeof(boolean *)); if (is_zero_breaker == NULL) malloc_err("is_zero_breaker"); for (locus = 0; locus < mlocus; locus++) { is_zero_breaker[locus] = (boolean *) malloc(num_loop_vectors[locus] * sizeof(boolean)); if (is_zero_breaker[locus] == NULL) malloc_loop_err("is_zero_breaker", locus); for(b=0; b < num_loop_vectors[locus]; b++) is_zero_breaker[locus][b] = false; } /* read in loop vectors array */ if ( !fscanf(loopfile, "loop_vectors %c\n", &ch) ) { read_loop_err(); } loop_vectors =(vector_for_locus *) malloc(mlocus * sizeof(vector_for_locus)); if ( loop_vectors == NULL ) { malloc_loop_err("loop vectors array", fewer_vects_size); } for (locus = 0; locus < mlocus; locus++) { if (!fscanf(loopfile, "\tL : %d\n",&check_locus) || (locus !=check_locus)){ read_loop_err(); } plocus = order[locus] -1; /*Alex*/ loop_vectors[plocus] = (vector_for_loop *) malloc(num_loop_vectors[plocus] * sizeof(vector_for_loop)); if ( loop_vectors[plocus] == NULL ) { malloc_loop_err("loop vectors array", fewer_vects_size); } for (vect = 0; vect < num_loop_vectors[plocus]; vect++) { if ( !fscanf(loopfile, "\t\t%d :", &check_vect) || (vect != check_vect)){ read_loop_err(); } loop_vectors[plocus][vect] = (int *) malloc (num_loops[curr_ped - 1] * sizeof(int)); /* DYLAN -- warning EOL */ loop = 0; while ( getc(loopfile) != '\n' ) { fscanf(loopfile, "%d", &geno); loop_vectors[plocus][vect][loop] = geno; loop++; } if ( loop != num_loops[curr_ped - 1] ) { read_loop_err(); } } } /* read in unknown_poss */ if ( !fscanf(loopfile, "unknown_poss %c\n", &ch) ) { read_loop_err(); } unknown_poss = (geno_for_unknown *) malloc((totperson + 1) * sizeof(geno_for_unknown)); if ( unknown_poss == NULL ) { malloc_loop_err("table of possible genotypes for unknowns", fewer_vects_size); } while ((extrachar = getc(loopfile)) == 'i' ) { if ( !fscanf(loopfile, "d: %d\n", &ind) ) { read_loop_err(); } person[ind]->unknown = true; unknown_poss[ind] = (geno_for_locus *) malloc (mlocus * sizeof(geno_for_locus)); if ( unknown_poss[ind] == NULL ) { malloc_loop_err("table of possible genotypes for unknowns", fewer_vects_size); } for (locus = 0; locus < mlocus; locus++) { if ( !fscanf(loopfile, "\tL: %d\n", &check_locus) || (locus != check_locus) ) { read_loop_err(); } plocus = order[locus] - 1; person[ind]->thisunknown[plocus] = true; unknown_poss[ind][plocus] = (geno_for_loop_vector *) malloc(num_loop_vectors[plocus] * sizeof(geno_for_loop_vector)); if ( unknown_poss[ind][plocus] == NULL ) { malloc_loop_err("table of possible genotypes for unknowns", fewer_vects_size); } if ( getc(loopfile) == '-' ) { person[ind]->thisunknown[plocus] = false; } for (vect = 0; vect < num_loop_vectors[plocus]; vect++) { if ( !fscanf(loopfile, "\t\t%d :", &check_vect) || (vect != check_vect)) { read_loop_err(); } unknown_poss[ind][plocus][vect] = (boolean *) malloc (thislocus[plocus]->fgeno * sizeof(boolean)); if ( unknown_poss[ind][plocus][vect] == NULL ) { malloc_loop_err("table of possible genotypes for unknowns", fewer_vects_size); } for (init = 0; init < thislocus[plocus]->fgeno; init++) { unknown_poss[ind][plocus][vect][init] = false; } any_possible = false; while ( getc(loopfile) != '\n' ) { fscanf(loopfile, "%d", &geno); unknown_poss[ind][plocus][vect][geno] = true; any_possible = true; } if (!any_possible) is_zero_breaker[plocus][vect] = true; } } } /*infer_genotypes(curr_ped);*/ ever_read_loopfile = true; /* global flag to say we're read this */ } /* read_loop_file */ static void readsignature() { int allele_speed_signature; /*used to verify that UNKNOWN also has ALLELE_SPEED on*/ int signature; signature = 0; allele_speed_signature = 0; signature = fscanf(speedfile,"%d", &allele_speed_signature); if ( ((ALLELE_SPEED && (( signature < 1) || (allele_speed_signature != ALLELE_SPEED_CONSTANT))) || ((!ALLELE_SPEED) && (signature > 0)))) { fprintf(stderr,"\nYou appear to be using a version of UNKNOWN"); fprintf(stderr,"\nthat predates FASTLINK 3.0, or has ALLELE_SPEED set"); fprintf(stderr,"\ndifferently. ALLELE_SPEED must be set to the same value"); fprintf(stderr,"\nin unknown.c and commondefs.c."); fprintf(stderr,"\nFASTLINK will exit politely to allow you to fix the problem."); fprintf(stderr,"\nPlease ensure that your path gives you compatible versions"); fprintf(stderr,"\nof UNKNOWN and the main programs.\n"); exit(EXIT_FAILURE); } return; } #else Void readspeed(LINK) struct LOC_inputdata *LINK; { long i, a, b, sys; char ch; information *WITH; int allele_speed_signature; /*used to verify that UNKNOWN also has ALLELE_SPEED on*/ int signature; signature = 0; allele_speed_signature = 0; signature = fscanf(speedfile,"%d\n", &allele_speed_signature); if ( ((ALLELE_SPEED && ((signature < 1) || (allele_speed_signature != ALLELE_SPEED_CONSTANT))) || ((!ALLELE_SPEED) && (signature > 0)))) { fprintf(stderr,"\nYou appear to be using a version of UNKNOWN"); fprintf(stderr,"\nthat predates FASTLINK 3.0, or has ALLELE_SPEED set"); fprintf(stderr,"\ndifferently. ALLELE_SPEED must be set to the same value"); fprintf(stderr,"\nin unknown.c and commondefs.c."); fprintf(stderr,"\nFASTLINK will exit politely to allow you to fix the problem."); fprintf(stderr,"\nPlease ensure that your path gives you compatible versions"); fprintf(stderr,"\nof UNKNOWN and the main programs.\n"); exit(EXIT_FAILURE); } while (!P_eof(speedfile)) { ch = getc(speedfile); if (ch == '\n') ch = ' '; if (ch == 'i' || ch == 'I') { fscanf(speedfile, "%c%ld", &ch, &i); if (ch == '\n') ch = ' '; person[i]->unknown = true; person[i]->store = (information *)Malloc(sizeof(information)); if ((person[i]->store) == NULL) malloc_err("store field"); WITH = person[i]->store; for (sys = 0; sys < mlocus; sys++) { for (a = 0; a < maxall; a++) { for (b = 0; b < maxall; b++) WITH->possible[sys][a][b] = false; } } } else { WITH = person[i]->store; fscanf(speedfile, "%ld%ld%ld", &sys, &a, &b); if (sys <= mlocus) WITH->possible[order[sys - 1] - 1][a - 1][b - 1] = true; } fscanf(speedfile, "%*[^\n]"); getc(speedfile); } } #endif /* Local variables for readped: */ struct LOC_readped { struct LOC_inputdata *LINK; long sequence; long startped[maxped], endped[maxped]; } ; /* Local variables for getphenotype: */ struct LOC_getphenotype { struct LOC_readped *LINK; thisperson **p; long system; } ; Local Void readbin(phen, ourlocus, LINK) phenotype **phen; locusvalues *ourlocus; struct LOC_getphenotype *LINK; { long i, j; phenotype *WITH; long FORLIM; WITH = *phen; WITH->which = binary_; WITH->phenf = 0; FORLIM = LINK->LINK->LINK->nfactor[LINK->system - 1]; for (i = 1; i <= FORLIM; i++) { fscanf(ipedfile, "%ld", &j); if (j != 0 && j != 1) inputerror(14L, (*LINK->p)->id, j, LINK->LINK->LINK); if (j == 1) WITH->phenf = ((long)WITH->phenf) | (1 << ((long)i)); } } Local Void readnumber(phen, ourlocus, LINK) phenotype **phen; locusvalues *ourlocus; struct LOC_getphenotype *LINK; { long i, j, l; phenotype *WITH; /* dwix: begin */ static int pedidx = 0; static int pednum = -1; int locidx, allidx; /* dwix: end */ int allfirst, allsecond; WITH = *phen; WITH->which = binary_; WITH->phenf = 0; for (i = 1; i <= 2; i++) { fscanf(ipedfile, "%ld", &j); if (j > maxall) inputerror(16L, (*LINK->p)->id, j, LINK->LINK->LINK); if ((j < 0) || (j > ourlocus->nallele)) inputerror(17L, (*LINK->p)->id, j, LINK->LINK->LINK); if (j != 0) #if ALLELE_SPEED WITH->phenf = 1; #else WITH->phenf = ((long)WITH->phenf) | (1 << ((long)j)); #endif if (1==i) allfirst = j; else allsecond = j; /* dwix: begin */ allidx = j; locidx = -1; for(l=0; l < mlocus; l++) if(ourlocus == thislocus[l]) locidx = l; if (pednum != (*LINK->p)->ped) { pedidx++; pednum = (*LINK->p)->ped; } ped_loc_all[pedidx - 1][locidx][allidx].present = true; /* dwix: end */ } if (allfirst <= allsecond) { WITH->allele1 = allfirst; WITH->allele2 = allsecond; } else { WITH->allele1 = allsecond; WITH->allele2 = allfirst; } } Local Void readaff(phen, thislocus, LINK) phenotype **phen; locusvalues *thislocus; struct LOC_getphenotype *LINK; { long thisval; phenotype *WITH; WITH = *phen; WITH->which = affection; fscanf(ipedfile, "%ld", &thisval); if (thisval == missaff) WITH->aff = 0; else { if (thisval == affval) WITH->aff = 2; else { if (thisval != 1) inputwarning(3L, (*LINK->p)->id, thisval, LINK->LINK->LINK); WITH->aff = 1; } } if (thislocus->UU.U0.nclass == 1) WITH->liability = 1; else fscanf(ipedfile, "%ld", &(*phen)->liability); if (WITH->liability > thislocus->UU.U0.nclass) inputerror(26L, (*LINK->p)->id, WITH->liability, LINK->LINK->LINK); if (WITH->liability <= 0) inputerror(27L, (*LINK->p)->id, WITH->liability, LINK->LINK->LINK); } Local Void readquan(phen, thislocus, LINK) phenotype **phen; locusvalues *thislocus; struct LOC_getphenotype *LINK; { long i; double xval; phenotype *WITH; long FORLIM; WITH = *phen; if (!sexlink || !(*LINK->p)->male) { WITH->which = quantitative; FORLIM = thislocus->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) fscanf(ipedfile, "%lf", &(*phen)->x[i]); WITH->missing = true; FORLIM = thislocus->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { if (WITH->x[i] != missval) WITH->missing = false; } return; } WITH->which = affection; fscanf(ipedfile, "%lf", &xval); if (xval == missval) WITH->aff = missaff; else { if (xval == affall) WITH->aff = affall; else WITH->aff = -11; } WITH->liability = 1; FORLIM = thislocus->UU.U1.ntrait; for (i = 2; i <= FORLIM; i++) fscanf(ipedfile, "%lf", &xval); } Local Void getphenotype(p_, LINK) thisperson **p_; struct LOC_readped *LINK; { struct LOC_getphenotype V; long thisread; thisperson *WITH; V.LINK = LINK; V.p = p_; WITH = *V.p; for (thisread = 0; thisread < mlocus; thisread++) { V.system = order[thisread]; WITH->phen[V.system - 1] = NULL; if (thislocus[V.system - 1]->which != null_) { WITH->phen[V.system - 1] = (phenotype *)Malloc(sizeof(phenotype)); if ((WITH->phen[V.system - 1]) == NULL) malloc_err("phen field"); } switch (thislocus[V.system - 1]->which) { case quantitative: readquan(&WITH->phen[V.system - 1], thislocus[V.system - 1], &V); break; case affection: readaff(&WITH->phen[V.system - 1], thislocus[V.system - 1], &V); break; case binary_: if (thislocus[V.system - 1]->format == allformat) readnumber(&WITH->phen[V.system - 1], thislocus[V.system - 1], &V); else readbin(&WITH->phen[V.system - 1], thislocus[V.system - 1], &V); break; /* cgh -- added this for gcc warning */ case null_: default: break; } if (lastpriv == V.system) { WITH->privphen = (phenotype *)Malloc(sizeof(phenotype)); if (WITH->privphen == NULL) malloc_err("privphen field"); switch (thislocus[V.system - 1]->privlocus->which) { case quantitative: readquan(&WITH->privphen, thislocus[V.system - 1]->privlocus, &V); break; case affection: readaff(&WITH->privphen, thislocus[V.system - 1]->privlocus, &V); break; /* cgh -- added this for gcc warning */ case binary_: case null_: default: break; } } } } Local Void getinformative(LINK) struct LOC_readped *LINK; { long i, j, k, l, m, count, nchild; thisperson *child; long FORLIM1, FORLIM3; phenotype *WITH; locusvalues *WITH1; if (fitmodel || risk) { for (i = 0; i < nuped; i++) informative[i] = true; return; } for (i = 0; i < nuped; i++) { informative[i] = false; FORLIM1 = LINK->endped[i]; for (j = LINK->startped[i]; j <= FORLIM1; j++) { if (person[j]->foff != NULL) { nchild = 0; child = person[j]->foff; do { nchild++; if (person[j]->male) child = child->nextpa; else child = child->nextma; } while (child != NULL); count = 0; if (nchild > 1 || (nchild == 1 && person[j]->pa != NULL)) { for (k = 0; k < mlocus; k++) { WITH = person[j]->phen[k]; WITH1 = thislocus[k]; if (WITH1->which != binary_) count++; else { if (WITH->phenf == 0) count++; else { l = 0; FORLIM3 = WITH1->nallele; if (binformat == WITH1->format) { for (m = 1; m <= FORLIM3; m++) { if ((unsigned long)m < 32 && ((1L << m) & WITH->phenf) != 0) l++; } } else if((WITH->allele1 > 0) && (WITH->allele2 > 0) && (WITH->allele1 != WITH->allele2)) l = 2; if (l > 1) count++; } } } } if (count > 1) informative[i] = true; } } } } Local Void getind(id, LINK) long *id; struct LOC_readped *LINK; { fscanf(ipedfile, "%ld", id); if (*id == 0) return; *id += LINK->sequence; if (*id > maxind) inputerror(13L, *id, *id, LINK->LINK); if (person[*id] == NULL) { person[*id] = (thisperson *)Malloc(sizeof(thisperson)); if (person[*id] == NULL) malloc_err("person"); } } /*getind*/ Local Void multimarriage(p, LINK) thisperson **p; struct LOC_readped *LINK; { thisperson *q, *child, *WITH; if ((*p)->foff == NULL) { (*p)->multi = false; return; } WITH = *p; if (WITH->male) q = WITH->foff->ma; else q = WITH->foff->pa; child = WITH->foff; (*p)->multi = false; do { if (WITH->male) { WITH->multi = (q == child->ma); child = child->nextpa; } else { WITH->multi = (q == child->pa); child = child->nextma; } } while (!(child == NULL || WITH->multi)); } /*multimarriage*/ Void readped(LINK) struct LOC_inputdata *LINK; { struct LOC_readped V; /*profield reads column 9 of pedin.dat which indicates proband or loopbreaker status*/ long i, newid, sex_, profield, newped, nuperson, thisone, thisped; thisperson *holdloop; thisperson *WITH; int specialproband; /*seen a proband that is a loopbreaker in this pedigree*/ #if LOOP_BREAKERS int copyIndex; #endif V.LINK = LINK; for (i = 0; i <= maxind; i++) person[i] = NULL; V.sequence = 0; nuperson = 0; nuped = 1; specialproband = 0; #if LOOP_BREAKERS for (i = 0; i < maxloop; i++) for(copyIndex = 0; copyIndex < maxloop; copyIndex++) looppers[nuped - 1][i][copyIndex] = NULL; /*G OK*/ #else for (i = 0; i < maxloop; i++) { looppers[nuped - 1][i][0] = NULL; /*G OK*/ looppers[nuped - 1][i][1] = NULL; /*G OK*/ } #endif proband[nuped - 1] = NULL; fscanf(ipedfile, "%ld", &newped); thisped = newped; V.startped[0] = 1; while (!P_eof(ipedfile)) { nuperson++; getind(&thisone, &V); if (proband[nuped - 1] == NULL) proband[nuped - 1] = person[thisone]; WITH = person[thisone]; WITH->ped = thisped; WITH->id = thisone; getind(&newid, &V); WITH->pa = person[newid]; getind(&newid, &V); WITH->ma = person[newid]; getind(&newid, &V); WITH->foff = person[newid]; getind(&newid, &V); WITH->nextpa = person[newid]; getind(&newid, &V); WITH->nextma = person[newid]; fscanf(ipedfile, "%ld", &sex_); if (sex_ != 1 && sex_ != 2) inputerror(11L, WITH->id, sex_, LINK); if (sex_ == 1) WITH->male = true; else WITH->male = false; WITH->unknown = false; WITH->inloop = 0; WITH->loopdepend = false; /*A. A. Schaffer added this line and next*/ WITH->loopneeded = false; fscanf(ipedfile, "%ld", &profield); /*Diagnostic added by A. A. Schaffer 7/25/94*/ if ((profield - 1) > maxloop) if (specialproband != nuped) specialproband = nuped; else { /*second violation in this pedigree */ fprintf(stderr, "\nYour pedigree has more loops than allowed by the constant maxloop"); fprintf(stderr, "\nYou must increase the constant maxloop defined in commondefs.h and recompile"); fprintf(stderr, "\nYou are encouraged to read the loops.ps document distributed with FASTLINK"); fprintf(stderr, "\nThe program will exit politely to allow you to correct the problem\n"); exit(EXIT_FAILURE); } if (profield == 1) proband[nuped - 1] = person[thisone]; #if LOOP_BREAKERS else if (profield > (maxloop +1) && proband == NULL) { profield -= maxloop; proband[nuped - 1] = person[thisone]; } #endif else if (profield > 1 && profield - 1 <= maxloop) { #if LOOP_BREAKERS looppers[nuped - 1][profield - 2][numCopies[nuped - 1][profield -2]] = person[thisone]; numCopies[nuped - 1][profield - 2]++; #else if (looppers[nuped - 1][profield - 2][1] == NULL) looppers[nuped - 1][profield - 2][1] = person[thisone]; /*G OK*/ else looppers[nuped - 1][profield - 2][0] = person[thisone]; /*G OK*/ #endif } getphenotype(&person[thisone], &V); fscanf(ipedfile, "%*[^\n]"); getc(ipedfile); if (!P_eof(ipedfile)) fscanf(ipedfile, "%ld", &newped); if (newped == thisped) continue; V.sequence += nuperson; V.endped[nuped - 1] = V.sequence; nuperson = 0; nuped++; if (nuped > maxped) inputerror(12L, newped, nuped, LINK); V.startped[nuped - 1] = V.sequence + 1; #if LOOP_BREAKERS for (i = 0; i < maxloop; i++) for(copyIndex = 0; copyIndex < maxloop; copyIndex++) looppers[nuped - 1][i][copyIndex] = NULL; /*G OK*/ #else for (i = 0; i < maxloop; i++) { looppers[nuped - 1][i][0] = NULL; /*G OK*/ looppers[nuped - 1][i][1] = NULL; /*G OK*/ } #endif proband[nuped - 1] = NULL; thisped = newped; } totperson = V.sequence + nuperson; V.endped[nuped - 1] = totperson; for (newped = 0; newped < nuped; newped++) { for (i = 0; i < maxloop; i++) { if (looppers[newped][i][0] == NULL) /*G OK*/ looppers[newped][i][1] = NULL; /*G OK*/ else { #if LOOP_BREAKERS for(copyIndex = 0; copyIndex < numCopies[newped][i]; copyIndex++) { looppers[newped][i][copyIndex]->inloop = i + 1; /*G OK*/ } holdloop = NULL; for(copyIndex = 1; copyIndex < numCopies[newped][i]; copyIndex++) { if(looppers[newped][i][copyIndex]->pa != NULL) { /*G OK*/ holdloop = looppers[newped][i][0]; /*G OK*/ break; } } if (holdloop && holdloop->pa == NULL) { looppers[newped][i][0] = looppers[newped][i][copyIndex]; /*G OK*/ looppers[newped][i][copyIndex] = holdloop; /*G OK*/ } #else looppers[newped][i][0]->inloop = i + 1; /*G OK*/ looppers[newped][i][1]->inloop = i + 1; /*G OK*/ if (looppers[newped][i][0]->pa == NULL && /*G OK*/ looppers[newped][i][1]->pa != NULL) { /*G OK*/ holdloop = looppers[newped][i][0]; looppers[newped][i][0] = looppers[newped][i][1]; /*G OK*/ looppers[newped][i][1] = holdloop; /*G OK*/ } #endif } } } for (thisone = 1; thisone <= totperson; thisone++) multimarriage(&person[thisone], &V); getinformative(&V); } /*readped*/ /* Local variables for getlocus: */ struct LOC_getlocus { struct LOC_readloci *LINK; long system; } ; Local Void getbin(locus, system, LINK) locusvalues **locus; long *system; struct LOC_getlocus *LINK; { long i, j, k; locusvalues *WITH; long FORLIM, FORLIM1; fscanf(datafile, "%ld%*[^\n]", &LINK->LINK->LINK->nfactor[*system - 1]); getc(datafile); if ((LINK->LINK->LINK->nfactor[*system - 1] > maxfact) || (LINK->LINK->LINK->nfactor[*system - 1] > (sizeof(long) * 8 - 1))) inputerror(8L, *system, LINK->LINK->LINK->nfactor[*system - 1], LINK->LINK->LINK); if (LINK->LINK->LINK->nfactor[*system - 1] <= 0) inputerror(9L, *system, LINK->LINK->LINK->nfactor[*system - 1], LINK->LINK->LINK); WITH = *locus; FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) WITH->UU.allele[i] = 0; FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) { FORLIM1 = LINK->LINK->LINK->nfactor[*system - 1]; for (j = 1; j <= FORLIM1; j++) { fscanf(datafile, "%ld", &k); if (k == 1) WITH->UU.allele[i] = ((long)WITH->UU.allele[i]) | (1 << ((long)j)); } } fscanf(datafile, "%*[^\n]"); getc(datafile); } Local Void getnumber(locus, system, LINK) locusvalues **locus; long *system; struct LOC_getlocus *LINK; { long i; locusvalues *WITH; long FORLIM; WITH = *locus; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) WITH->UU.allele[i - 1] = 1; } Local Void getpen(locus, LINK) locusvalues **locus; struct LOC_getlocus *LINK; { long i, j, k, l; locusvalues *WITH; long FORLIM, FORLIM1, FORLIM2; WITH = *locus; fscanf(datafile, "%ld%*[^\n]", &(*locus)->UU.U0.nclass); getc(datafile); if (WITH->UU.U0.nclass > maxliab) inputerror(28L, LINK->system, WITH->UU.U0.nclass, LINK->LINK->LINK); if (WITH->UU.U0.nclass <= 0) inputerror(29L, LINK->system, WITH->UU.U0.nclass, LINK->LINK->LINK); FORLIM = WITH->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH->nallele; for (j = i - 1; j < FORLIM2; j++) { fscanf(datafile, "%lf", &(*locus)->UU.U0.pen[i][j][2][l]); if ((unsigned)WITH->UU.U0.pen[i][j][2][l] > 1.0) inputerror(30L, LINK->system, LINK->system, LINK->LINK->LINK); WITH->UU.U0.pen[i][j][1][l] = 1 - WITH->UU.U0.pen[i][j][2][l]; WITH->UU.U0.pen[i][j][0][l] = 1.0; for (k = 0; k <= 2; k++) WITH->UU.U0.pen[j + 1][i - 1][k][l] = WITH->UU.U0.pen[i][j][k][l]; } } fscanf(datafile, "%*[^\n]"); getc(datafile); FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) WITH->UU.U0.pen[0][i][0][l] = 1.0; if (sexlink) { FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) { fscanf(datafile, "%lf", &(*locus)->UU.U0.pen[0][i][2][l]); if ((unsigned)WITH->UU.U0.pen[0][i][2][l] > 1.0) inputerror(30L, LINK->system, LINK->system, LINK->LINK->LINK); } FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) WITH->UU.U0.pen[0][i][1][l] = 1.0 - WITH->UU.U0.pen[0][i][2][l]; fscanf(datafile, "%*[^\n]"); getc(datafile); } } } Local Void getquan(locus, privelege, LINK) locusvalues **locus; boolInt privelege; struct LOC_getlocus *LINK; { /*Get information of a quantitative locus. Privelege says whether it is a priveleged locus or not*/ long i, j, k; locusvalues *WITH; long FORLIM, FORLIM1, FORLIM2; WITH = *locus; fscanf(datafile, "%ld%*[^\n]", &(*locus)->UU.U1.ntrait); getc(datafile); if (WITH->UU.U1.ntrait > maxtrait) inputerror(31L, LINK->system, WITH->UU.U1.ntrait, LINK->LINK->LINK); if (WITH->UU.U1.ntrait <= 0) inputerror(32L, LINK->system, WITH->UU.U0.nclass, LINK->LINK->LINK); FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->nallele; for (j = 1; j <= FORLIM1; j++) { FORLIM2 = WITH->nallele; for (k = j; k <= FORLIM2; k++) { fscanf(datafile, "%lf", &(*locus)->UU.U1.pm[j][k - 1][i]); WITH->UU.U1.pm[k][j - 1][i] = WITH->UU.U1.pm[j][k - 1][i]; } } } fscanf(datafile, "%*[^\n]"); getc(datafile); if (privelege && LINK->LINK->nupriv != lastpriv) return; FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->UU.U1.ntrait; for (j = i; j < FORLIM1; j++) { fscanf(datafile, "%lf", &(*locus)->UU.U1.vmat[i][j]); if (i + 1 == j + 1 && WITH->UU.U1.vmat[i][j] <= 0.0) inputerror(33L, LINK->system, LINK->system, LINK->LINK->LINK); WITH->UU.U1.vmat[j][i] = WITH->UU.U1.vmat[i][j]; } } fscanf(datafile, "%*[^\n]"); getc(datafile); invert(WITH->UU.U1.vmat, WITH->UU.U1.ntrait, &WITH->UU.U1.det); WITH->UU.U1.det = 1 / sqrt(WITH->UU.U1.det); fscanf(datafile, "%lf%*[^\n]", &(*locus)->UU.U1.conmat); getc(datafile); if (WITH->UU.U1.conmat <= 0) inputerror(34L, LINK->system, LINK->system, LINK->LINK->LINK); WITH->UU.U1.conmat = 1 / WITH->UU.U1.conmat; WITH->UU.U1.contrait = 1.0; FORLIM = WITH->UU.U1.ntrait; for (i = 1; i <= FORLIM; i++) WITH->UU.U1.contrait *= WITH->UU.U1.conmat; WITH->UU.U1.contrait = sqrt(WITH->UU.U1.contrait); } Void getlocus(system_, LINK) long system_; struct LOC_readloci *LINK; { struct LOC_getlocus V; long j; locusvalues *WITH, *WITH1; long FORLIM; int TEMP; V.LINK = LINK; V.system = system_; thislocus[V.system - 1] = (locusvalues *)Malloc(sizeof(locusvalues)); if (thislocus[V.system - 1] == NULL) malloc_err("entry in thislocus"); WITH = thislocus[V.system - 1]; WITH->privlocus = NULL; fscanf(datafile, "%ld%d", &LINK->whichtype, &thislocus[V.system - 1]->nallele); #if LOOPSPEED /* Dylan added */ /*compute number of genotypes at this locus*/ thislocus[V.system - 1]->fgeno = thislocus[V.system - 1]->nallele * (thislocus[V.system - 1]->nallele + 1) / 2; #endif if (LINK->whichtype < 0 && LINK->whichtype > 4) inputerror(5L, V.system, LINK->whichtype, LINK->LINK); if (WITH->nallele > maxall) inputerror(6L, V.system, WITH->nallele, LINK->LINK); if (WITH->nallele <= 0) inputerror(7L, V.system, WITH->nallele, LINK->LINK); switch (LINK->whichtype) { case 0: WITH->which = quantitative; break; case 1: WITH->which = affection; break; case 2: WITH->which = binary_; break; case 3: WITH->which = binary_; break; } WITH->format = LINK->whichtype; if (lastpriv == 0) { fscanf(datafile, "%*[^\n]"); getc(datafile); } else { fscanf(datafile, "%ld%*[^\n]", &LINK->whichtype); getc(datafile); if (LINK->whichtype == 0 || LINK->whichtype == 1) { LINK->nupriv++; WITH->privlocus = (locusvalues *)Malloc(sizeof(locusvalues)); if (WITH->privlocus == NULL) malloc_err("privlocus field"); WITH->privlocus->nallele = WITH->nallele; WITH1 = WITH->privlocus; switch (LINK->whichtype) { case 0: WITH1->which = quantitative; break; case 1: WITH1->which = affection; break; } } } if (!disequi) { FORLIM = WITH->nallele; for (j = 0; j < FORLIM; j++) { fscanf(datafile, "%lf", &thislocus[V.system - 1]->freq[j]); if (thislocus[V.system - 1]->freq[j] <= minfreq) { fprintf(stderr, "\nWarning: one of your allele frequencies is dangerously low\n"); if (j == 0) { exit(EXIT_FAILURE); } } } fscanf(datafile, "%*[^\n]"); getc(datafile); if (disfreqs && (binary_ == WITH->which)) { for (j = 0; j < FORLIM; j++) { fscanf(datafile, "%lf", &thislocus[V.system - 1]->freqcond[j]); } fscanf(datafile, "%*[^\n]"); getc(datafile); } } switch (WITH->which) { case binary_: if (WITH->format == allformat) getnumber(&thislocus[V.system - 1], &V.system, &V); else getbin(&thislocus[V.system - 1], &V.system, &V); break; case affection: getpen(&thislocus[V.system - 1], &V); break; case quantitative: getquan(&thislocus[V.system - 1], false, &V); break; /* cgh -- added for gcc */ case null_: default: break; } if (WITH->privlocus != NULL) { switch (WITH->privlocus->which) { case affection: getpen(&WITH->privlocus, &V); break; case quantitative: getquan(&WITH->privlocus, true, &V); break; /* cgh -- gcc */ case binary_: case null_: default: break; } } if (LINK->nupriv == lastpriv && lastpriv != 0) lastpriv = V.system; if (!risk) return; if (V.system == risksys) { fscanf(datafile, "%d%*[^\n]", &TEMP); getc(datafile); riskall = TEMP; } if (riskall > thislocus[V.system - 1]->nallele) inputerror(35L, V.system, (int)riskall, LINK->LINK); if (riskall < 0) inputerror(36L, V.system, (int)riskall, LINK->LINK); } Void gettheta(sex_, LINK) thetavalues **sex_; struct LOC_readloci *LINK; { thetarray oldtheta; long i; thetavalues *WITH; long FORLIM; #if !PARALLEL *sex_ = (thetavalues *)Malloc(sizeof(thetavalues)); for (i = 0; i < maxlocus; i++) (*sex_)->theta[i] = 0.0; #endif nuneed = 7; for(i = 2; i < mlocus; i++) nuneed = 5 * nuneed - 3; if (*sex_ == NULL) malloc_err("item of type thetavalues"); /*Next line added by A. A. Schaffer*/ (*sex_)->segprob = (double*) malloc(nuneed * sizeof(double)); if ((*sex_)->segprob == NULL) malloc_err("a segprob array in procedure gettheta"); WITH = *sex_; if (*sex_ == maletheta || readfemale) { FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fscanf(datafile, "%lf", &(*sex_)->theta[i]); if (interfer && !mapping) fscanf(datafile, "%lf", &(*sex_)->theta[mlocus - 1]); fscanf(datafile, "%*[^\n]"); getc(datafile); } else { fscanf(datafile, "%lf%*[^\n]", &distratio); getc(datafile); } /* FOR j:=1 TO maxneed DO segprob[j]:=0.0;*/ if (!interfer || mapping) return; memcpy(oldtheta, WITH->theta, sizeof(thetarray)); WITH->theta[0] = (oldtheta[0] + oldtheta[mlocus - 1] - oldtheta[mlocus - 2]) / 2.0; WITH->theta[mlocus - 2] = (oldtheta[mlocus - 2] + oldtheta[mlocus - 1] - oldtheta[0]) / 2.0; WITH->theta[mlocus - 1] = (oldtheta[0] + oldtheta[mlocus - 2] - oldtheta[mlocus - 1]) / 2.0; for (i = 0; i < mlocus; i++) { /*=ln(1/0.0001-1.0)*/ if (WITH->theta[i] > 0.0) { if (WITH->theta[i] < 0.999) WITH->theta[i] = log(1.0 / WITH->theta[i] - 1.0); else WITH->theta[i] = -6.9; /*=ln(1/0.999-1.0)*/ } else WITH->theta[i] = 9.21; } } extern void readloci(struct LOC_inputdata *LINK); #ifdef ILINK extern void setiterate(struct LOC_inputdata *LINK); #endif /* Moved from ilinputcode.c, mlinputcode.c, and liinputcode.c by Dylan in late 1994. */ Void inputdata() { struct LOC_inputdata V; readloci(&V); #ifdef ILINK setiterate(&V); #endif readped(&V); #if LOOPSPEED readsignature(); #else readspeed(&V); #endif /*LOOPSPEED*/ } fastlink-4.1P-fix95/4.1P/src/checkpointdefs.h0000644000265600020320000001543506737460341017774 0ustar tilleaadmin/* This file contains the definitions that are used in checkpoint.c, and in ilink.c or lodscore.c (as the case may be). Unlike checkpoint.c, this file does not use the ILINK or LODSCORE #define's; it could, but it likely isn't worth the bother. Note that distinct names are set up for each of ILINK and LODSCORE. */ /* The checkpointing code was written by K. Shriram */ /* The checkpointing process is described in the paper: */ /* A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis,*/ /* Human Heredity 44(1994), pp. 225-237. */ #ifndef _CHECKPOINTDEFS_H #define _CHECKPOINTDEFS_H 1 /* When recovering and the primary checkpoint file is corrupted ... */ #define HelpTextFoundBackup "recoveryFoundText" #define HelpTextNotFoundBackup "recoveryNotFoundText" /* String marker to check for corruption of the primary checkpoint */ #define EndOfDataString "END_OF_DATA" /* The grand old checkpoint files, which contain the interation- and function-checkpoints */ #define CheckpointILINKFilename "./checkpoint.ILINK" #define CheckpointILINKFileBackup "./checkpoint.ILINK.bak" #define CheckpointLODSCOREFilename "./checkpoint.LODSCORE" #define CheckpointLODSCOREFileBackup "./checkpoint.LODSCORE.bak" #define CheckpointLINKMAPFilename "./checkpoint.LINKMAP" #define CheckpointLINKMAPFileBackup "./checkpoint.LINKMAP.bak" #define CheckpointMLINKFilename "./checkpoint.MLINK" #define CheckpointMLINKFileBackup "./checkpoint.MLINK.bak" /* We need to store information about how many runs we have made in the current script and how many have been skipped over during recovery */ #define ScriptILINKCheckpointFilename "./script.checkpoint.ILINK" #define ScriptLODSCORECheckpointFilename "./script.checkpoint.LODSCORE" #define ScriptLINKMAPCheckpointFilename "./script.checkpoint.LINKMAP" #define ScriptMLINKCheckpointFilename "./script.checkpoint.MLINK" /* We maintain copies of final.out and stream.out */ #define ScriptILINKFinalOut "script.ILINK.final.out" #define ScriptILINKStreamOut "script.ILINK.stream.out" #define ScriptLODSCOREFinalOut "script.LODSCORE.final.out" #define ScriptLODSCOREStreamOut "script.LODSCORE.stream.out" #define ScriptLINKMAPFinalOut "script.LINKMAP.final.out" #define ScriptLINKMAPStreamOut "script.LINKMAP.stream.out" #define ScriptMLINKFinalOut "script.MLINK.final.out" #define ScriptMLINKStreamOut "script.MLINK.stream.out" /* outf() stores *it's* own copies of final, stream and recfile */ #define OutfILINKFinalDat "outf.ILINK.final.dat" #define OutfILINKStreamDat "outf.ILINK.stream.dat" #define OutfLODSCORERecfileDat "outf.LODSCORE.recfile.dat" #define OutfLODSCOREStreamDat "outf.LODSCORE.stream.dat" /* main() stores copies of recfile and stream in LODSCORE */ #define MainLODSCORERecfileDat "main.LODSCORE.recfile.dat" #define MainLODSCOREStreamDat "main.LODSCORE.stream.dat" #define MainLINKMAPStreamDat "main.LINKMAP.stream.dat" #define MainLINKMAPOutfileDat "main.LINKMAP.outfile.dat" #define MainMLINKStreamDat "main.MLINK.stream.dat" #define MainMLINKOutfileDat "main.MLINK.outfile.dat" /* cgh -- abstracted filenames for sharing code */ #if defined(MLINK) #define ScriptCheckpointFilename ScriptMLINKCheckpointFilename #define ScriptFinalOut ScriptMLINKFinalOut #define ScriptStreamOut ScriptMLINKStreamOut #define CheckpointFilename CheckpointMLINKFilename #define CheckpointFileBackup CheckpointMLINKFileBackup #define MainOutfileDat MainMLINKOutfileDat #define MainStreamDat MainMLINKStreamDat #endif /* if defined(MLINK) */ #if defined(LINKMAP) #define ScriptCheckpointFilename ScriptLINKMAPCheckpointFilename #define ScriptFinalOut ScriptLINKMAPFinalOut #define ScriptStreamOut ScriptLINKMAPStreamOut #define CheckpointFilename CheckpointLINKMAPFilename #define CheckpointFileBackup CheckpointLINKMAPFileBackup #define MainOutfileDat MainLINKMAPOutfileDat #define MainStreamDat MainLINKMAPStreamDat #endif /* if defined(LINKMAP) */ #if defined(ILINK) #define ScriptCheckpointFilename ScriptILINKCheckpointFilename #define ScriptFinalOut ScriptILINKFinalOut #define ScriptStreamOut ScriptILINKStreamOut #define CheckpointFilename CheckpointILINKFilename #define CheckpointFileBackup CheckpointILINKFileBackup #define MainOutfileDat OutfILINKFinalDat #define MainStreamDat OutfILINKStreamDat #endif /* if defined(ILINK) */ /* end cgh */ /* We will be copying files block-by-block, so we use a constant for the block size. Set this to the optimal value for your system. */ #define CopyBlockSize 512 /* And now we define the two forms of copying: copyFile and appendFile. In each case, we are going to punt to ourCopyAppendFile, with the appropriate flags being passed. */ #define CopyOperation 0 #define AppendOperation 1 #define copyFile(f,t) ourCopyAppendFile((f),(t),CopyOperation) #define appendFile(f,t) ourCopyAppendFile((f),(t),AppendOperation) #define CopyAppendPerms 0666 /* bugfix for checkpoint code */ #ifndef STAT_SUCCESS #define STAT_SUCCESS 0 #endif /* We define some enumerated types that enable us to keep track of the type of checkpointing that is taking/took place, and of the calling sequence that lead to it */ typedef enum { normalRun , checkpointedRun } checkpointType ; checkpointType checkpointStatus ; typedef enum { iterationLocation , functionLocation } checkpointLocation ; struct ckptTupleType { checkpointLocation ckptLocation ; int ckptAttribute ; int iplace ; int jplace ; } ; struct ckptTupleType ckptTuple ; typedef enum { iterped_call_before = 0, iterped_call_after = 1, fCP_outf = 2 , fCP_gem_init = 3 , fCP_gem_iter_st_first = 4 , fCP_gem_iter_st_decr = 5 , fCP_gem_iter_st_incr = 6 , fCP_gem_iter_gcen1 = 7 , fCP_gem_iter_gfor = 8 , fCP_gem_gfor = 9 , fCP_gem_iter_gcen2 = 10 , fCP_gem_ , fCP_gem_iter_ , fCP_gem_iter_gcen1_ , fCP_gem_iter_gcen2_ } funCallPathType ; funCallPathType funCallPath ; /* This needs to be prototyped to get rid of warnings -- cgh */ #if !defined(KNR_PROTO) void ourCopyAppendFile(char*, char*, int); #else void ourCopyAppendFile(); #endif /* !defined(KNR_PROTO) */ /* These used to be in {ilink,mlink,linkmap}.c -- cgh */ int statReturnCode ; struct stat statBuffer ; char dateTimeStamp [ DateTimeStampStringLength ] ; FILE * scriptCheckpoint ; int scriptRun , scriptToSleep ; FILE * fileTester; int iterpeds_counter; int checkpoint_counter; int checkpoint_place; #endif /* _CHECKPOINTDEFS_H */ fastlink-4.1P-fix95/4.1P/src/compar.h0000644000265600020320000000635506737460341016265 0ustar tilleaadmin/* This file contains common parallel routine and variable declarations for use with the parallel versions of the FASTLINK programs ILINK, LINKMAP, and MLINK. Sequential FASTLINK is an improved version of LINKAGE. Improvements are described in described in: R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer Faster Sequential Genetic Linkage Computations American Journal of Human Genetics, 53(1993), pp. 252--263 and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Linkage Analysis Human Heredity 44(1994), pp. 225-237. The parallel implementations of ILINK are described in: S. Dwarkadas, A. A. Schaffer, R. W. Cottingham Jr., A. L. Cox, P. Keleher, and W. Zwaenepoel, Parallelization of General Linkage Analysis Problems, Human Heredity 44(1994), pp. 127-141 and S. K. Gupta, A. A. Schaffer, A. L. Cox, S. Dwarkadas, and W. Zwaenepoel, Integerating Parallelization Strategies for Linkage Analysis, Computers and Biomedical Research, to appear. The code in this file was written by Chris Hyams. */ #if !defined(COMPAR_H) #define COMPAR_H /* index into executionTimes array */ int eTimeIndex; /* Shared memory allocation macros */ #define oneMeg (1 << 20) #define tenMegs (10 * oneMeg) /* When allocating shared memory, we determine at run-time a good approximation of the total number of bytes we will request using Tmk_malloc(). Then, we add a fudge factor to take into account other run-time allocations, like the string buffers, etc. The fudge factor is either some percentage of the total usage calculated, or the maximum we allow -- whichever is smaller. Next, we make sure to allocate at least the minimum we allow. */ #define minMemNeeded oneMeg /* minimum shared memory we allocate */ #define maxMemFudge tenMegs /* maximum fudge factor */ #define memFudgePercentage 0.25 /* fudge percentage */ #if !defined(ILINK) /* Assign thetas, etc. Function is called only by processor 0. This function is analagous to gemini() in ILINK */ void iterpedControl(); #endif /* !defined(ILINK) */ /* parallel startup/initialization code */ #if !defined(KNR_PROTO) void parStartup(int argc, char** argv); #else void parStartup(); #endif /* !defined(KNR_PROTO) */ /* parallel ending/cleanup code */ void parFinish(); /* Parallel library startup code */ #if !defined(KNR_PROTO) void initParLib(int argc, char** argv); #else void initParLib(); #endif /* !defined(KNR_PROTO) */ /* Allocate and initialize barriers, and allocate global memory */ void gMemAndBarrierAlloc(); /* procedure to manage child processes in parallel computation */ void child(); /* iterates over processes, creating children */ void childLoop(); /* Set up data structures for parallel theta evaluations -- used to be SandeepSetup() */ void parThetaSetup(); /* Called after inputdata() to check to see if there are any constants set that provide situations we have not yet implemented */ void checkNotImplemented(); #if !defined(KNR_PROTO) void printBarrier(char*, int); #else void printBarrier(); #endif /* !defined(KNR_PROTO) */ #if defined(ILINK) void outf(); void gemini(); void gcentral(); void gforward(); #endif /* defined(ILINK) */ #endif /* if !defined(COMPAR_H) */ fastlink-4.1P-fix95/4.1P/src/check.c0000644000265600020320000005103110321544621016027 0ustar tilleaadmin/* This file contains the various routines used to perform checkpointing in ILINK, LODSCORE, LINKMAP, or MLINK. When compiling it, provide either ILINK. LODSCORE, LINKMAP, or MLINK LODSCORE as a #define'd value; this can be done on the command line for standard Unix C compilers with % cc -DILINK Some of the checkpointing code is also to be found in ilink.c, lodscore.c, linkmap.c, and mlink.c within the specific functions that deal with checkpointing. */ /* The code in this file was written by K. Shriram */ /* The checkpointing scheme is described in the paper: */ /* A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis,*/ /* Hum. Hered. 44(1994), pp. 225-237*/ #include "commondefs.h" #include "checkpointdefs.h" #include "gemdefs.h" #include "ildefs.h" /* While copying or appending files, if we have an error, we refer it to fileErrorHelp(). */ void fileErrorHelp ( fileName , problemType ) char * fileName ; int problemType ; { char theLine [ 256 ] ; puts ( "A problem was encountered with the file" ) ; printf ( " %s\n" , fileName ) ; printf ( "while attempting to " ) ; switch ( problemType ) { case 1: puts ( "open it for reading." ) ; break ; case 2: puts ( "open it for writing to." ) ; break ; case 3: puts ( "append to it." ) ; break ; case 4: puts ( "write data to it." ) ; break ; } printf ( "\nThis will possibly cause further errors, and will also\n" ) ; puts ( "prevent correct recovery from a checkpoint. Hence, it is" ) ; puts ( "recommended that you break the execution of this program at" ) ; puts ( "this time and re-start computation." ) ; gets ( theLine ) ; } /* In the process of checkpointing, we need to make copies of files; sometimes we also need to append one file to another, to mimic the operations that take place in the scripts. ourCopyAppendFile() does that; it is front-ended by the macro definitions copyFile() and appendFile() in checkpointdefs.h. */ void ourCopyAppendFile ( fromName , toName , operationType ) char * fromName ; char * toName ; int operationType ; { int flags ; int fromFile ; int toFile ; int bytesRead ; char theBuffer [ CopyBlockSize ] ; if ( CopyOperation == operationType ) flags = O_WRONLY | O_CREAT ; else /* AppendOperation == operationType */ flags = O_WRONLY | O_APPEND | O_CREAT ; #ifdef vms fromFile = open ( fromName , O_RDONLY, 0, "ctx=rec", "shr=get,put,upd" ) ; #else fromFile = open ( fromName , O_RDONLY ) ; #endif if ( -1 == fromFile ) fileErrorHelp ( fromName , 1 ) ; toFile = open ( toName , flags , CopyAppendPerms ) ; if ( -1 == toFile ) fileErrorHelp ( toName , ( CopyOperation == operationType ) ? 2 : 3 ) ; do { bytesRead = read ( fromFile , theBuffer , CopyBlockSize ) ; if ( 0 < bytesRead ) if ( bytesRead != write ( toFile , theBuffer , bytesRead ) ) fileErrorHelp ( toName , 4 ) ; } while ( 0 < bytesRead ) ; close ( fromFile ) ; close ( toFile ) ; } /* Another routine to deal with errors; this time if the checkpoint file being read in isn't complete (ie, the end marker is not found at the appropriate point). There are two options; either a backup file is found or it isn't. The authenticity of the backup is not examined. */ void recoveryErrorHelp ( ) { char theLine [ 256 ] ; FILE * helpTextFile ; FILE * checkpointBackup ; #ifdef ILINK checkpointBackup = fopen ( CheckpointILINKFileBackup , "r" ) ; #elif LODSCORE checkpointBackup = fopen ( CheckpointLODSCOREFileBackup , "r" ) ; #elif LINKMAP checkpointBackup = fopen ( CheckpointLINKMAPFileBackup , "r" ) ; #elif MLINK checkpointBackup = fopen ( CheckpointMLINKFileBackup , "r" ) ; #endif if ( NULL == checkpointBackup ) { fprintf(stderr,"\nIn the process of recovering, an error has been detected. The most"); fprintf(stderr,"\nlikely reason is that a system error such as a machine crash took"); fprintf(stderr,"\nplace while the program was saving certain important information"); fprintf(stderr,"\nnecessary for the recovery process."); fprintf(stderr,"\n"); fprintf(stderr,"\nThis program attempts to create back-ups of such information from time"); fprintf(stderr,"\nto time. However, no such backup is to be found. The most likely"); fprintf(stderr,"\nreasons for this are:"); fprintf(stderr,"\n"); fprintf(stderr,"\n(a) The program had not been executing for long enough when the crash"); fprintf(stderr,"\noccurred."); fprintf(stderr,"\n(b) The file was deleted during the crash."); fprintf(stderr,"\n(c) This run is taking place in a different directory than the"); fprintf(stderr,"\nprevious one did."); fprintf(stderr,"\n"); fprintf(stderr,"\nThe program will now await your input. The best course of action"); fprintf(stderr,"\nmight be to 'break' this run, delete the checkpoint file and resume."); fprintf(stderr,"\nShould this error occur repeatedly, please report it to the distributors."); fprintf(stderr,"\nTo continue, hit or ."); fprintf(stderr,"\n"); } else { fprintf(stderr,"\nIn the process of recovering, an error has been detected. The most"); fprintf(stderr,"\nlikely reason is that a system error (such as a machine crash) took"); fprintf(stderr,"\nplace while the program was saving certain important information"); fprintf(stderr,"\nnecessary for the recovery process."); fprintf(stderr,"\n"); fprintf(stderr,"\nA backup from an earlier save has been located. The program will"); fprintf(stderr,"\nsuspend after displaying this message and will await your input; the"); fprintf(stderr,"\nfollowing course of action is suggested:"); fprintf(stderr,"\n"); fprintf(stderr,"\n(a) Stop execution by 'breaking' the program."); fprintf(stderr,"\n(b) Copy the backup file to the primary file."); fprintf(stderr,"\n(c) Run the program again, as before."); fprintf(stderr,"\n"); fprintf(stderr,"\nHopefully, the data recovery will now proceed smoothly. Should you"); fprintf(stderr,"\nstill get this error, however, please contact the distributors of this"); fprintf(stderr,"\nprogram so that the problem may be evaluated."); fprintf(stderr,"\n"); fprintf(stderr,"\nIf you wish to continue execution with the existing recovered data,"); fprintf(stderr,"\nhit or ."); fprintf(stderr,"\n"); } fclose ( checkpointBackup ) ; checkpointBackup = NULL; gets ( theLine ) ; } /* Puts the information tuple at the head of the checkpoint file. */ void putCkptTuple ( ) { fprintf ( checkpointDatafile , "%d %d %d %d\n" , ckptTuple . ckptLocation , ckptTuple . ckptAttribute , ckptTuple . iplace , ckptTuple . jplace ) ; } /* Reads the information tuple. */ void getCkptTuple ( ) { int newlineDummy ; /* cgh -- cast &ckptTuple.ckptLocation to int* for gcc warning */ fscanf ( checkpointDatafile , "%d %d %d %d" , (int*) & ckptTuple . ckptLocation , & ckptTuple . ckptAttribute , & ckptTuple . iplace , & ckptTuple . jplace ) ; newlineDummy = getc ( checkpointDatafile ) ; if ( '\n' != newlineDummy ) recoveryErrorHelp ( ) ; } /* Macro front-ends to putCkptNumber(). */ #define putCkptFloat(f) ( putCkptNumber ( & (f) , sizeof ( float ) ) ) #define putCkptDouble(d) ( putCkptNumber ( & (d) , sizeof ( double ) ) ) #define putCkptInt(i) ( putCkptNumber ( & (i) , sizeof ( int ) ) ) #define putCkptLong(l) ( putCkptNumber ( & (l) , sizeof ( long ) ) ) #define putCkptBoolean(b) ( putCkptNumber ( & (b) , sizeof ( boolean ) ) ) /* General routine for putting the internal representation of a number. */ void putCkptNumber ( numberPtr , numberSize ) void * numberPtr ; int numberSize ; { fwrite ( numberPtr , numberSize , 1 , checkpointDatafile ) ; } /* Routine for putting an object of type vector. */ void putCkptVector ( theVector ) vector theVector ; { int vectorRef ; for ( vectorRef = 0 ; vectorRef < maxn ; vectorRef ++ ) putCkptDouble ( theVector [ vectorRef ] ) ; } /* Code to put a matrix, vector-by-vector. */ void putCkptMatrix ( theMatrix ) matrix theMatrix ; { int matrixRef ; for ( matrixRef = 0 ; matrixRef < maxn ; matrixRef ++ ) putCkptVector ( theMatrix [ matrixRef ] ) ; } /* Code to put an iter type. */ void putCkptIter ( theIter ) itertype theIter ; { int iterRef ; for ( iterRef = 0 ; iterRef < maxn ; iterRef ++ ) putCkptInt ( theIter [ iterRef ] ) ; } /* Routine that makes calls to write out all the variables we are going to checkpoint. Large and boring. */ void writeCheckpointInformation () { int rowCtr , colCtr ; /* from MIN1 */ putCkptMatrix ( tl ) ; putCkptVector ( d ) ; putCkptVector ( g ) ; putCkptVector ( gsave ) ; putCkptVector ( y ) ; putCkptVector ( p ) ; /* from MIN2 */ putCkptInt ( nit ) ; putCkptInt ( nfe ) ; putCkptInt ( idg ) ; putCkptInt ( idif ) ; putCkptInt ( isw ) ; putCkptInt ( iret ) ; putCkptInt ( ibnd ) ; putCkptInt ( ihess ) ; putCkptInt ( ivar ) ; putCkptInt ( ihx ) ; putCkptInt ( maxit ) ; putCkptDouble ( tol ) ; putCkptDouble ( tmin ) ; putCkptDouble ( h ) ; putCkptDouble ( trupb ) ; putCkptDouble ( ptg ) ; /* from GEMINI */ putCkptVector ( xall ) ; putCkptVector ( x ) ; putCkptVector ( v ) ; putCkptVector ( se ) ; putCkptIter ( itp ) ; for ( rowCtr = 0 ; rowCtr < maxn ; rowCtr ++ ) for ( colCtr = 0 ; colCtr < 2 ; colCtr ++ ) putCkptDouble ( bnd [ rowCtr ] [ colCtr ] ) ; putCkptInt ( nall ) ; putCkptInt ( n ) ; putCkptInt ( icall ) ; putCkptDouble ( tbnd ) ; putCkptDouble ( f ) ; putCkptDouble ( fsmf ) ; putCkptDouble ( fsav2 ) ; putCkptDouble ( t ) ; putCkptDouble ( hx ) ; putCkptDouble ( xsave ) ; putCkptDouble ( fxph ) ; putCkptDouble ( fxmh ) ; putCkptDouble ( xp ) ; putCkptDouble ( xpm ) ; putCkptDouble ( ytp ) ; /* from ALEX */ putCkptVector ( outsavex ) ; putCkptDouble ( outsavefvalue ) ; for ( rowCtr = 0 ; rowCtr < maxlocus ; rowCtr ++ ) putCkptDouble ( savedf [ rowCtr ] ) ; /* from UPDATE */ putCkptVector ( wtil ) ; putCkptVector ( ztil ) ; putCkptVector ( w ) ; putCkptVector ( z ) ; putCkptVector ( wtjp1 ) ; putCkptVector ( ztjp1 ) ; putCkptVector ( s ) ; putCkptVector ( dp ) ; putCkptDouble ( nu ) ; putCkptDouble ( muj ) ; putCkptDouble ( lambj ) ; putCkptDouble ( lambj2 ) ; putCkptDouble ( sb ) ; putCkptDouble ( sc ) ; putCkptDouble ( sd ) ; putCkptDouble ( fbcd ) ; putCkptDouble ( alpha ) ; putCkptDouble ( sa ) ; putCkptDouble ( thet1 ) ; putCkptDouble ( thet2 ) ; putCkptDouble ( aa ) ; putCkptDouble ( bb ) ; putCkptDouble ( cc ) ; putCkptDouble ( del2 ) ; putCkptDouble ( alph1 ) ; putCkptDouble ( alph2 ) ; putCkptDouble ( rdiv ) ; putCkptDouble ( eta ) ; putCkptDouble ( aj ) ; putCkptDouble ( thj ) ; putCkptDouble ( bj ) ; putCkptDouble ( gamlj ) ; putCkptDouble ( betlj ) ; putCkptDouble ( del ) ; putCkptInt ( iswup ) ; /* from STEP */ putCkptVector ( xt ) ; putCkptDouble ( fsave ) ; putCkptDouble ( sumt ) ; putCkptDouble ( twot ) ; putCkptDouble ( ft ) ; putCkptDouble ( f2t ) ; putCkptDouble ( ft2 ) ; putCkptDouble ( scal ) ; /* from CHKBND */ putCkptDouble ( clb ) ; putCkptDouble ( check ) ; putCkptDouble ( eh ) ; putCkptDouble ( teq ) ; /* from OTHERS */ putCkptInt ( itsys ) ; /* from INIB */ putCkptMatrix ( bmat ) ; /* Miscellaneous */ putCkptInt ( continue_ ) ; putCkptBoolean ( firstapprox ) ; putCkptBoolean ( firsttime ) ; putCkptBoolean ( lasttime ) ; putCkptBoolean ( inconsistent ) ; putCkptBoolean ( dolod ) ; putCkptInt ( thisc ) ; putCkptDouble ( penlike ) ; putCkptDouble ( like ) ; for ( rowCtr = 0 ; rowCtr < maxped ; rowCtr ++ ) { putCkptDouble ( likebyped [ rowCtr ] ) ; putCkptDouble ( outsavelike [ rowCtr ] ) ; } for ( rowCtr = 0 ; rowCtr < maxlocus ; rowCtr ++ ) { putCkptDouble ( maletheta -> theta [ rowCtr ] ) ; putCkptDouble ( femaletheta -> theta [ rowCtr ] ) ; } for ( rowCtr = 0 ; rowCtr < nuneed ; rowCtr ++ ) { putCkptDouble ( maletheta -> segprob [ rowCtr ] ) ; putCkptDouble ( femaletheta -> segprob [ rowCtr ] ) ; } } /* The actual routine that gets called when we want to checkpoint. It takes arguments telling it how where the checkpoint is being made, and what sequence of calls got us there. The extra variable takes some extra information about local variables; whatever value is sent is always written, and it is for the call to recoverCheckpoint() to ignore it or not. */ void performCheckpoint ( locationType , locationDatum , extra ) checkpointLocation locationType ; int locationDatum ; int extra ; { time_t secondsNow ; if ( iterationLocation == locationType ) return ; /* printf ( "Checkpointing: type %d location %d\n" , locationType , locationDatum ) ; */ #ifdef ILINK rename ( CheckpointILINKFilename , CheckpointILINKFileBackup ); #elif LODSCORE rename ( CheckpointLODSCOREFilename , CheckpointLODSCOREFileBackup ) ; #elif LINKMAP rename ( CheckpointLINKMAPFilename , CheckpointLINKMAPFileBackup ) ; #elif MLINK rename ( CheckpointMLINKFilename , CheckpointMLINKFileBackup ) ; #endif #ifdef ILINK checkpointDatafile = fopen ( CheckpointILINKFilename , "w" ) ; #elif LODSCORE checkpointDatafile = fopen ( CheckpointLODSCOREFilename , "w" ) ; #elif LINKMAP checkpointDatafile = fopen ( CheckpointLINKMAPFilename , "w" ) ; #elif MLINK checkpointDatafile = fopen ( CheckpointMLINKFilename , "w" ) ; #endif if ( NULL != checkpointDatafile ) { time ( & secondsNow ) ; fprintf ( checkpointDatafile , "%s" , ctime ( & secondsNow ) ) ; /* ctime() automatically adds a newline at the end of the string */ /* fprintf ( checkpointDatafile , "%d %d\n" , locationType , locationDatum ) ; */ ckptTuple . ckptLocation = locationType ; ckptTuple . ckptAttribute = locationDatum ; putCkptTuple ( ) ; #ifdef ILINK writeCheckpointInformation ( ) ; #elif LODSCORE writeCheckpointInformation ( ) ; #endif fprintf ( checkpointDatafile , "\n%d\n" , extra ) ; fprintf ( checkpointDatafile , "%s\n" , EndOfDataString ) ; ensureWrite ( checkpointDatafile ) ; fclose ( checkpointDatafile ) ; checkpointDatafile = NULL; } } /* Front-ends to retrieve numbers. */ #define getCkptFloat(f) ( getCkptNumber ( & (f) , sizeof ( float ) ) ) #define getCkptDouble(d) ( getCkptNumber ( & (d) , sizeof ( double ) ) ) #define getCkptInt(i) ( getCkptNumber ( & (i) , sizeof ( int ) ) ) #define getCkptLong(l) ( getCkptNumber ( & (l) , sizeof ( long ) ) ) #define getCkptBoolean(b) ( getCkptNumber ( & (b) , sizeof ( boolean ) ) ) /* Get a number in machine-representation form. */ void getCkptNumber ( numberPtr , numberSize ) void * numberPtr ; int numberSize ; { fread ( numberPtr , numberSize , 1 , checkpointDatafile ) ; } /* Get a vector. */ void getCkptVector ( theVector ) vector theVector ; { int vectorRef ; for ( vectorRef = 0 ; vectorRef < maxn ; vectorRef ++ ) getCkptDouble ( theVector [ vectorRef ] ) ; } /* Get a matrix by vector. */ void getCkptMatrix ( theMatrix ) matrix theMatrix ; { int matrixRef ; for ( matrixRef = 0 ; matrixRef < maxn ; matrixRef ++ ) getCkptVector ( theMatrix [ matrixRef ] ) ; } /* Get an iter type. */ void getCkptIter ( theIter ) itertype theIter ; { int iterRef ; for ( iterRef = 0 ; iterRef < maxn ; iterRef ++ ) getCkptInt ( theIter [ iterRef ] ) ; } /* Read back all the variables we wrote. */ /* cgh -- made this void */ void readCheckpointInformation () { int rowCtr , colCtr ; /* from MIN1 */ getCkptMatrix ( tl ) ; getCkptVector ( d ) ; getCkptVector ( g ) ; getCkptVector ( gsave ) ; getCkptVector ( y ) ; getCkptVector ( p ) ; /* from MIN2 */ getCkptInt ( nit ) ; getCkptInt ( nfe ) ; getCkptInt ( idg ) ; getCkptInt ( idif ) ; getCkptInt ( isw ) ; getCkptInt ( iret ) ; getCkptInt ( ibnd ) ; getCkptInt ( ihess ) ; getCkptInt ( ivar ) ; getCkptInt ( ihx ) ; getCkptInt ( maxit ) ; getCkptDouble ( tol ) ; getCkptDouble ( tmin ) ; getCkptDouble ( h ) ; getCkptDouble ( trupb ) ; getCkptDouble ( ptg ) ; /* from GEMINI */ getCkptVector ( xall ) ; getCkptVector ( x ) ; getCkptVector ( v ) ; getCkptVector ( se ) ; getCkptIter ( itp ) ; for ( rowCtr = 0 ; rowCtr < maxn ; rowCtr ++ ) for ( colCtr = 0 ; colCtr < 2 ; colCtr ++ ) getCkptDouble ( bnd [ rowCtr ] [ colCtr ] ) ; getCkptInt ( nall ) ; getCkptInt ( n ) ; getCkptInt ( icall ) ; getCkptDouble ( tbnd ) ; getCkptDouble ( f ) ; getCkptDouble ( fsmf ) ; getCkptDouble ( fsav2 ) ; getCkptDouble ( t ) ; getCkptDouble ( hx ) ; getCkptDouble ( xsave ) ; getCkptDouble ( fxph ) ; getCkptDouble ( fxmh ) ; getCkptDouble ( xp ) ; getCkptDouble ( xpm ) ; getCkptDouble ( ytp ) ; /* from ALEX */ getCkptVector ( outsavex ) ; getCkptDouble ( outsavefvalue ) ; for ( rowCtr = 0 ; rowCtr < maxlocus ; rowCtr ++ ) getCkptDouble ( savedf [ rowCtr ] ) ; /* from UPDATE */ getCkptVector ( wtil ) ; getCkptVector ( ztil ) ; getCkptVector ( w ) ; getCkptVector ( z ) ; getCkptVector ( wtjp1 ) ; getCkptVector ( ztjp1 ) ; getCkptVector ( s ) ; getCkptVector ( dp ) ; getCkptDouble ( nu ) ; getCkptDouble ( muj ) ; getCkptDouble ( lambj ) ; getCkptDouble ( lambj2 ) ; getCkptDouble ( sb ) ; getCkptDouble ( sc ) ; getCkptDouble ( sd ) ; getCkptDouble ( fbcd ) ; getCkptDouble ( alpha ) ; getCkptDouble ( sa ) ; getCkptDouble ( thet1 ) ; getCkptDouble ( thet2 ) ; getCkptDouble ( aa ) ; getCkptDouble ( bb ) ; getCkptDouble ( cc ) ; getCkptDouble ( del2 ) ; getCkptDouble ( alph1 ) ; getCkptDouble ( alph2 ) ; getCkptDouble ( rdiv ) ; getCkptDouble ( eta ) ; getCkptDouble ( aj ) ; getCkptDouble ( thj ) ; getCkptDouble ( bj ) ; getCkptDouble ( gamlj ) ; getCkptDouble ( betlj ) ; getCkptDouble ( del ) ; getCkptInt ( iswup ) ; /* from STEP */ getCkptVector ( xt ) ; getCkptDouble ( fsave ) ; getCkptDouble ( sumt ) ; getCkptDouble ( twot ) ; getCkptDouble ( ft ) ; getCkptDouble ( f2t ) ; getCkptDouble ( ft2 ) ; getCkptDouble ( scal ) ; /* from CHKBND */ getCkptDouble ( clb ) ; getCkptDouble ( check ) ; getCkptDouble ( eh ) ; getCkptDouble ( teq ) ; /* from OTHERS */ getCkptInt ( itsys ) ; /* from INIB */ getCkptMatrix ( bmat ) ; /* Miscellaneous */ getCkptInt ( continue_ ) ; getCkptBoolean ( firstapprox ) ; getCkptBoolean ( firsttime ) ; getCkptBoolean ( lasttime ) ; getCkptBoolean ( inconsistent ) ; getCkptBoolean ( dolod ) ; getCkptInt ( thisc ) ; getCkptDouble ( penlike ) ; getCkptDouble ( like ) ; for ( rowCtr = 0 ; rowCtr < maxped ; rowCtr ++ ) { getCkptDouble ( likebyped [ rowCtr ] ) ; getCkptDouble ( outsavelike [ rowCtr ] ) ; } for ( rowCtr = 0 ; rowCtr < maxlocus ; rowCtr ++ ) { getCkptDouble ( maletheta -> theta [ rowCtr ] ) ; getCkptDouble ( femaletheta -> theta [ rowCtr ] ) ; } for ( rowCtr = 0 ; rowCtr < nuneed ; rowCtr ++ ) { getCkptDouble ( maletheta -> segprob [ rowCtr ] ) ; getCkptDouble ( femaletheta -> segprob [ rowCtr ] ) ; } } /* Function called when recovery is desired. The only argument is a pointer to the extra data which (the pointer), if null, ignores the value recovered. Note the check being made for the end of data marker. */ void recoverCheckpoint ( extra ) int * extra ; { char dateTimeStamp [ DateTimeStampStringLength ] ; char theLine [ 80 ] ; /* cgh -- unused variables checkpointLocation locationType ; int locationDatum ; */ int dummy ; #ifdef ILINK checkpointDatafile = fopen ( CheckpointILINKFilename , "r" ) ; #elif LODSCORE checkpointDatafile = fopen ( CheckpointLODSCOREFilename , "r" ) ; #elif LINKMAP checkpointDatafile = fopen ( CheckpointLINKMAPFilename , "r" ) ; #elif MLINK checkpointDatafile = fopen ( CheckpointMLINKFilename , "r" ) ; #endif fgets ( dateTimeStamp , DateTimeStampStringLength , checkpointDatafile ) ; getCkptTuple ( ) ; #ifdef ILINK readCheckpointInformation ( ) ; #elif LODSCORE readCheckpointInformation ( ) ; #endif if ( NULL != extra ) fscanf ( checkpointDatafile , "%d" , extra ) ; else fscanf ( checkpointDatafile , "%d" , & dummy ) ; fscanf ( checkpointDatafile , "%s" , theLine ) ; if ( ! ( strcmp ( theLine , EndOfDataString ) ) ) puts ( "Data recovered" ) ; else recoveryErrorHelp ( ) ; fclose ( checkpointDatafile ) ; checkpointDatafile = NULL; #ifdef ILINK checkpointStatus = normalRun ; #elif LODSCORE checkpointStatus = normalRun ; #endif } fastlink-4.1P-fix95/4.1P/src/lodscore.c0000644000265600020320000016057610517437772016622 0ustar tilleaadmin/* This file contains some modifications to the LODSCORE program */ /* described in the papers: */ /* R. W. Cottingham Jr., R. M. Idury, And A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Gentics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis */ /* Human Heredity 44(1994), pp. 225-237. */ #include "commondefs.h" #if !defined(DOS) #include "checkpointdefs.h" #endif #include "gemdefs.h" #include "lodefs.h" #ifndef LESSMEMORY #include "moddefs.h" #endif Void setiterate(); static Void getinformative() { int i, j, k, l, m, count, nchild; thisperson *child; int FORLIM1, FORLIM3; phenotype *WITH; locusvalues *WITH1; if (fitmodel) { for (i = 0; i < nuped; i++) informative[i] = true; return; } for (i = 0; i < nuped; i++) { informative[i] = false; FORLIM1 = endped[i]; /*Is there any data to use*/ for (j = startped[i]; j <= FORLIM1; j++) { count = 0; for (k = 0; k < mlocus; k++) { WITH = person[j]->phen[k]; WITH1 = thislocus[k]; switch (WITH1->which) { case binary_: if (WITH->phenf != 0) count++; break; case affection: if (WITH->aff != missaff) count++; break; case quantitative: if (person[j]->male && sexlink) { if (WITH->x[0] != missaff) count++; else if (!WITH->missing) count++; } break; /* cgh - gcc */ case null_: default: break; } } if (count > 1) informative[i] = true; } if (informative[i]) { informative[i] = false; FORLIM1 = endped[i]; for (j = startped[i]; j <= FORLIM1; j++) { if (person[j]->foff != NULL) { nchild = 0; child = person[j]->foff; do { nchild++; if (person[j]->male) child = child->nextpa; else child = child->nextma; } while (child != NULL); count = 0; if (nchild > 1 || (nchild == 1 && person[j]->pa != NULL)) { for (k = 0; k < mlocus; k++) { WITH = person[j]->phen[k]; WITH1 = thislocus[k]; if (WITH1->which != binary_) count++; else { if (WITH->phenf == 0) count++; else { l = 0; FORLIM3 = WITH1->nallele; if (binformat == WITH1->format) { for (m = 1; m <= FORLIM3; m++) { if ((unsigned int)m < 32 && ((1L << m) & WITH->phenf) != 0) l++; } } else if ((WITH->allele1 > 0) && (WITH->allele2 > 0) && (WITH->allele1 != WITH->allele2)) l = 2; if (l > 1) count++; } } } } if (count > 1) informative[i] = true; } } } } } static Void setlods(ilocus, jlocus) int ilocus, jlocus; { /*setup for lods; does not work with disequilibrium*/ int i, j, thisperson_; thisperson *WITH; locusvalues *WITH1; mlocus = 2; for (thisperson_ = 1; thisperson_ <= totperson; thisperson_++) { WITH = person[thisperson_]; WITH->phen[0] = WITH->holdphen[ilocus - 1]; WITH->phen[1] = WITH->holdphen[jlocus - 1]; } thislocus[0] = holdlocus[ilocus - 1]; thislocus[1] = holdlocus[jlocus - 1]; if (ilocus == holdmutsys) { mutsys = 1; mutmale = holdmutmale; mutfemale = holdmutfemale; } else { if (jlocus == holdmutsys) { mutsys = 2; mutmale = holdmutmale; mutfemale = holdmutfemale; } } increment[mlocus - 1] = 1; for (i = mlocus - 1; i >= 1; i--) increment[i - 1] = increment[i] * thislocus[i]->nallele; fgeno = 1; for (j = 0; j < mlocus; j++) fgeno *= thislocus[j]->nallele; mgeno = fgeno; nuhap = fgeno; for (i = 0; i < mlocus; i++) { nohom[i] = false; WITH1 = thislocus[i]; if (WITH1->which == affection || WITH1->which == quantitative) { if (WITH1->freq[affall - 1] < minfreq) nohom[i] = true; } } fgeno = fgeno * (fgeno + 1) / 2; if (!sexlink) mgeno = fgeno; maletheta->theta[0] = holdmtheta; maletheta->theta[1] = 0.0; femaletheta->theta[1] = 0.0; if (sexdif) { if (!readfemale) distratio = holdratio; else femaletheta->theta[0] = holdftheta; } memcpy(itp, holditp, sizeof(itertype)); if (ilocus == hitsys) itsys = 1; else { if (jlocus == hitsys) itsys = 2; else itsys = 0; } getinformative(); } static Void outcontrol(z) double *z; { int i, j; j = 0; for (i = 0; i < n; i++) { fprintf(outfile, "% .5e", z[i]); j++; if (j == 4) { putc('\n', outfile); j = 0; } } if (j != 0) putc('\n', outfile); } double mapfunction(theta1, theta2) double theta1, theta2; { /*User defined function giving recombination between flanking markers as a function of recombination between adjacent markers*/ return ((theta1 + theta2) / (1 + 4 * theta1 * theta2)); } double getdist(theta) double *theta; { if (*theta < 0.5) return (log(1.0 - 2.0 * *theta) / -2.0); else return 10.0; } double invdist(dist) double *dist; { if (*dist != 10.0) return ((1.0 - exp(-2 * *dist)) / 2.0); else return 0.5; } /* saveparams saves the parameter values at the beginning of gforward or gcentral, so we catch the optimal thetas */ Local Void saveparams() { int i; for(i = 0; i < nall; i++) outsavex[i] = x[i]; } static Void fun(f, x) double *f; double *x; { int i, k; k = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; xall[i] = x[k - 1]; } } setparam(); if (penalty) { *f = 1.5 * penlike; return; } for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } recombination(); alike = 0.0; thisc = minint; for (i = 1; i <= nuped; i++) { likelihood(i, proband[i - 1]); alike += like; likebyped[i-1] = like; /*Store likelihood for later*/ } if (firsttime) { if (thisc < maxcensor) printf("Maxcensor can be reduced to %12d\n", thisc); else { if (thisc > maxcensor) printf("You may gain efficiency by increasing maxcensor\n"); } } firsttime = false; *f = -2 * alike; penlike = *f; firsttime = false; } /* Local variables for outf: */ struct LOC_outf { double lods; double thisval[maxped]; } ; Local Void getlods(f, x, LINK) double *f; double *x; struct LOC_outf *LINK; { int i, k; firstapprox = true; k = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; xall[i] = x[k - 1]; } } for (i = 0; i < nuped; i++) LINK->thisval[i] = 0.0; setparam(); if (!penalty) { if (byfamily) { for (i = 1; i <= 35; i++) putc('-', final); fprintf(final, "\nPEDIGREE | LN LIKE | LOG 10 LIKE\n"); for (i = 1; i <= 35; i++) putc('-', final); putc('\n', final); } if (byfamily) { /*Then need to redo likelihoods on a by-family basis*/ for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } recombination(); thisc = minint; for (i = 1; i <= nuped; i++) { likelihood(i, proband[i - 1]); LINK->thisval[i - 1] = like; } } } firsttime = true; for (i = 0; i < mlocus; i++) { maletheta->theta[i] = 0.5; femaletheta->theta[i] = 0.5; } if (penalty) { *f = 1.5 * penlike; return; } dolod = true; for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } recombination(); alike = 0.0; thisc = minint; for (i = 0; i < nuped; i++) { likelihood(i + 1, proband[i]); alike += like; if (byfamily) { fprintf(final, "%9d %9d %12.6f", i + 1, proband[i]->ped, LINK->thisval[i] - like); fprintf(final, "%12.6f", (LINK->thisval[i] - like) / log10_); if (like == zerolike) fprintf(final, " inconsistent data\n"); else putc('\n', final); if (byfamily) /* Need to compute family lodscore*/ if (like != zerolike) LINK->thisval[i] -= like; } } *f = -2 * alike; penlike = *f; dolod = false; } Local Void streamout(LINK) struct LOC_outf *LINK; { int i, j, k, l; double dist; int FORLIM; locusvalues *WITH; int FORLIM1, FORLIM2; thetavalues *WITH1; inconsistent = false; setparam(); recombination(); firstapprox = true; /*Start lodscore stream*/ fprintf(stream, "LODSCORE\n"); /*Gemini information*/ fprintf(stream, "% .5e %12d % .5e %12d %12d %12d\n", f, nit, ptg, idg, nall, n); /*Valid or not*/ if ((nit > 1 && fabs(ptg) < 0.001) || n == 0) fprintf(stream, " 2\n"); else { if (nit > 1 && fabs(ptg) < 0.1) fprintf(stream, " 1\n"); else fprintf(stream, " 0\n"); } for (i = 0; i < nall; i++) fprintf(stream, " % .5e\n", xall[i]); putc('\n', stream); for (i = 0; i < nall; i++) fprintf(stream, " %2d\n", itp[i]); putc('\n', stream); for (i = 0; i < n; i++) fprintf(stream, " % .5e\n", g[i]); putc('\n', stream); /*Variance-covariance calculated if ivar=1 and icall=0*/ if (ivar == 1 && icall == 0) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); if (inconsistent) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); /*Control parameters for sexlink,interference and sex difference*/ if (sexlink) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); if (sexdif && readfemale) fprintf(stream, "2 "); else { if (sexdif) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); } /*Genetic information*/ fprintf(stream, "%12d %12d\n", iplace, jplace); if (itsys != 0) fprintf(stream, "%3d\n", itsys); else fprintf(stream, " 0\n"); if (itsys != 0) { if (disequi) { fprintf(stream, "1 %12d %12d\n", thislocus[itsys - 1]->nallele, nuhap); for (i = 0; i < nuhap; i++) fprintf(stream, "%9.6f", hapfreq->genarray[i]); } else { WITH = thislocus[itsys - 1]; fprintf(stream, "0 %12d\n", WITH->nallele); FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) fprintf(stream, "%9.6f", WITH->freq[i]); } WITH = thislocus[itsys - 1]; if (WITH->which == binary_ && WITH->format == allformat) fprintf(stream, " 3\n"); else { if (WITH->which == binary_ && WITH->format == binformat) fprintf(stream, " 2\n"); else { if (WITH->which == quantitative) { fprintf(stream, "0 %12ld\n", WITH->UU.U1.ntrait); invert(WITH->UU.U1.vmat, WITH->UU.U1.ntrait, &WITH->UU.U1.det); FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->nallele; for (j = 1; j <= FORLIM1; j++) { FORLIM2 = WITH->nallele; for (k = j - 1; k < FORLIM2; k++) fprintf(stream, "%6.3f ", WITH->UU.U1.pm[j][k][i]); } putc('\n', stream); } FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->UU.U1.ntrait; for (j = i; j < FORLIM1; j++) fprintf(stream, "%6.3f ", WITH->UU.U1.vmat[i][j]); putc('\n', stream); } } else { if (WITH->which == affection) { fprintf(stream, "1 %12ld\n", WITH->UU.U0.nclass); FORLIM = WITH->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH->nallele; for (j = i - 1; j < FORLIM2; j++) fprintf(stream, " %5.3f", WITH->UU.U0.pen[i][j][2][l]); } putc('\n', stream); if (sexlink) { FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) fprintf(stream, "%5.3f ", WITH->UU.U0.pen[0][i][2][l]); } putc('\n', stream); } } } } } } WITH1 = maletheta; FORLIM = mlocus - 2; /*Recombination*/ for (i = 0; i <= FORLIM; i++) fprintf(stream, " %5.3f", WITH1->theta[i]); putc('\n', stream); if (sexdif) { WITH1 = femaletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(stream, " %5.3f", WITH1->theta[i]); putc('\n', stream); if (readfemale) { FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { dist = getdist(&maletheta->theta[i]); if (dist != 0.0) dist = getdist(&femaletheta->theta[i]) / dist; else dist = 0.0; fprintf(stream, " %5.3f\n", dist); } } else fprintf(stream, "%5.3f\n", distratio); } /*Valid parameters or not*/ /*Lod scores are valid only if penalty is false*/ if (penalty) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); /*Number of pedigrees*/ fprintf(stream, "%12d\n", nuped); for (i = 0; i < nuped; i++) fprintf(stream, "%12d % .5e % .5e\n", proband[i]->ped, outsavelike[i], outsavelike[i] / log10_); /*Total lod-score*/ fprintf(stream, "% .5e\n", (LINK->lods - f) / (2 * log10_)); if (ivar != 1 || icall != 0) return; /*Stop stream*/ for (i = 0; i < n; i++) { for (j = i; j < n; j++) fprintf(stream, " % .5e\n", 2.0 * bmat[i][j]); putc('\n', stream); } /*sexdif=true and readfemale=false*/ } static Void outf() { struct LOC_outf V; int i, j, k, l; double dist; thetavalues *WITH; int FORLIM; locusvalues *WITH1; int FORLIM1, FORLIM2; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_outf ; performCheckpoint ( functionLocation , funCallPath , 0 ) ; fclose ( recfile ) ; copyFile ( "recfile.dat" , OutfLODSCORERecfileDat ) ; #ifdef vms recfile = fopen ( "recfile.dat" , "a", "ctx=rec", "shr = get,put,upd") ; #else recfile = fopen ( "recfile.dat" , "a") ; #endif if ( dostream ) { fclose ( stream ) ; copyFile ( "stream.dat" , OutfLODSCOREStreamDat ) ; #ifdef vms stream = fopen ( "stream.dat" , "a", "ctx=rec", "shr=get,put,upd") ; #else stream = fopen ( "stream.dat" , "a" ) ; #endif } } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_outf == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( NULL ) ; fclose ( recfile ) ; copyFile ( OutfLODSCORERecfileDat , "recfile.dat" ) ; #ifdef vms recfile = fopen ( "recfile.dat" , "a", "ctx=rec", "shr=get,put,upd") ; #else recfile = fopen ( "recfile.dat" , "a" ) ; #endif if ( dostream ) { fclose ( stream ) ; copyFile ( OutfLODSCOREStreamDat , "stream.dat" ) ; #ifdef vms stream = fopen ( "stream.dat" , "a", "ctx=rec", "shr=get,put,upd") ; #else stream = fopen ( "stream.dat" , "a" ) ; #endif } } } /* Shriram: end */ #endif firstapprox = true; lasttime = true; /*recover optimal x and f values, put x value into xall*/ f = outsavefvalue; k = 0; for (i = 0; i< nall; i++) { if (itp[i] == 1) { k++; xall[i] = outsavex[k - 1]; } } /*recover xall values into maletheta and femaletheta*/ setparam(); fprintf(recfile, "%3d%3d", ilocus, jlocus); WITH = maletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(recfile, " %5.3f", WITH->theta[i]); if (interfer) fprintf(recfile, " %5.3f", maletheta->theta[mlocus - 1]); WITH = femaletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(recfile, " %5.3f", WITH->theta[i]); if (interfer) fprintf(recfile, " %5.3f", femaletheta->theta[mlocus - 1]); fprintf(final, "CHROMOSOME ORDER OF LOCI : \n"); fprintf(final, "%3d%3d\n\n", ilocus, jlocus); if (itsys != 0) { fprintf(final, "****************** FINAL VALUES **********************\n"); fprintf(final, "PROVIDED FOR LOCUS %3d (CHROMOSOME ORDER)\n", itsys); fprintf(final, "******************************************************\n"); WITH1 = thislocus[itsys - 1]; if (disequi) { fprintf(final, "HAPLOTYPE FREQUENCIES:\n"); for (i = 0; i < nuhap; i++) fprintf(final, "%9.6f", hapfreq->genarray[i]); } else { fprintf(final, "GENE FREQUENCIES :\n"); FORLIM = WITH1->nallele; for (i = 0; i < FORLIM; i++) fprintf(final, "%9.6f", WITH1->freq[i]); } putc('\n', final); if (WITH1->which == quantitative) { fprintf(final, "VALUES FOR GENOTYPE MEANS:\n"); invert(WITH1->UU.U1.vmat, WITH1->UU.U1.ntrait, &WITH1->UU.U1.det); FORLIM = WITH1->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH1->nallele; for (j = 1; j <= FORLIM1; j++) { FORLIM2 = WITH1->nallele; for (k = j - 1; k < FORLIM2; k++) fprintf(final, "%6.3f ", WITH1->UU.U1.pm[j][k][i]); } putc('\n', final); } fprintf(final, "COVARIANCE MATRIX:\n"); FORLIM = WITH1->UU.U1.ntrait; for (i = 1; i <= FORLIM; i++) { for (j = 0; j < i; j++) fprintf(final, "%6.3f ", WITH1->UU.U1.vmat[i - 1][j]); putc('\n', final); } } else { if (WITH1->which == affection) { fprintf(final, "PENETRANCES:\n"); FORLIM = WITH1->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH1->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH1->nallele; for (j = i - 1; j < FORLIM2; j++) fprintf(final, "%5.3f ", WITH1->UU.U0.pen[i][j][2][l]); } putc('\n', final); if (sexlink) { FORLIM1 = WITH1->nallele; for (i = 0; i < FORLIM1; i++) fprintf(final, "%5.3f ", WITH1->UU.U0.pen[0][i][2][l]); } putc('\n', final); } } } } fprintf(final, "******************************************************\n"); fprintf(final, "THETAS:\n"); WITH = maletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(final, " %5.3f", WITH->theta[i]); if (interfer) fprintf(final, " %5.3f\n", maletheta->theta[mlocus - 1]); else putc('\n', final); if (sexdif) { fprintf(final, "FEMALE:\n"); WITH = femaletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(final, " %5.3f", WITH->theta[i]); if (interfer) fprintf(final, " %5.3f\n", femaletheta->theta[mlocus - 1]); else putc('\n', final); if (readfemale) { fprintf(final, "FEMALE/MALE DIST RATIO :\n"); FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { dist = getdist(&maletheta->theta[i]); if (dist != 0.0) dist = getdist(&femaletheta->theta[i]) / dist; else dist = 0.0; fprintf(final, " %5.3f", dist); } } else { fprintf(final, "CONSTANT FEMALE/MALE DIST RATIO :\n"); fprintf(final, "%5.3f\n", distratio); } } fprintf(final, "******************************************************\n"); fprintf(final, "-2 LN(LIKE) = % .5e\n", f); getlods(&V.lods, x, &V); if (mlocus != 2) fprintf(final, "OTTS GENERALIZED LOD SCORE =% .5e\n", (V.lods - f) / (2 * log10_)); else fprintf(final, "LOD SCORE =% .5e\n", (V.lods - f) / (2 * log10_)); fprintf(recfile, " %8.3f % .5e % .5e\n", (V.lods - f) / (2 * log10_), f, ptg); fprintf(final, "NUMBER OF ITERATIONS = %5d\n", nit); fprintf(final, "NUMBER OF FUNCTION EVALUATIONS = %5d\n", nfe); fprintf(final, "PTG = % .5e\n", ptg); idg++; fprintf(outfile, "EXIT CONDITION%12d\n", idg); switch (idg) { case 1: fprintf(outfile, "Maximum possible accuracy reached\n"); break; case 2: fprintf(outfile, "Search direction no longer downhill\n"); break; case 3: fprintf(outfile, "Accumulation of rounding error prevents further progress\n"); break; case 4: fprintf(outfile, "All significant differences lost through cancellation in conditioning\n"); break; case 5: fprintf(outfile, "Specified tolerance on normalized gradient met\n"); break; case 6: fprintf(outfile, "Specified tolerance on gradient met\n"); break; case 7: fprintf(outfile, "Maximum number of iterations reached\n"); break; case 8: fprintf(outfile, "Excessive cancellation in gradient\n"); break; } if (ivar == 1 && icall == 0) { fprintf(final, "VARIANCE-COVARIANCE OF THE ESTIMATES\n"); if (interfer && !mapping) fprintf(final, "VALUES GIVEN FOR P VALUES\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) fprintf(final, "% .5e ", 2.0 * bmat[i][j]); putc('\n', final); } } fprintf(final, "******************************************************\n"); fprintf(final, "******************************************************\n"); if (dostream) streamout(&V); } /* Local variables for step: */ struct LOC_step { /* If this structure is changed, */ enum { /* some code may have to be altered */ go_, exit1, exit2, exit3 /* in performCheckpoint() and */ } cont; /* recoverCheckpoint(). */ } ; /* --Shriram */ Local Void firststep(LINK) struct LOC_step *LINK; { int i; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_gem_iter_st_first ; performCheckpoint ( functionLocation , funCallPath , LINK -> cont ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_iter_st_first == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( & LINK -> cont ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif sumt = 0.0; idg = 0; for (i = 0; i < n; i++) xt[i] = x[i] + t * p[i]; fun(&ft, xt); /*save likelihood values for later*/ for (i=0; i < nuped; i++) outsavelike[i] = likebyped[i]; nfe++; } Local Void decreaset(LINK) struct LOC_step *LINK; { int i; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_gem_iter_st_decr ; performCheckpoint ( functionLocation , funCallPath , LINK -> cont ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_iter_st_decr == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( & LINK -> cont ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif /*Modified by M. Lathrop 29/04/86 to trap tmin=0 problem*/ if (tmin < small) tmin = small; LINK->cont = go_; while (LINK->cont == go_) { if (f - fsave == 0.0 && idif == 2) idg = 2; if (t < tmin) { LINK->cont = exit3; break; } t = 0.5 * t; for (i = 0; i < n; i++) xt[i] = x[i] + t * p[i]; fun(&ft2, xt); nfe++; if (ft2 < f) { sumt += t; f = ft2; idg = 0; memcpy(x, xt, sizeof(vector)); /*save likelihood values for later*/ for(i=0; i< nuped; i++) outsavelike[i] = likebyped[i]; if (sumt < tmin) LINK->cont = exit3; else LINK->cont = exit2; continue; } if (ft + f - ft2 - ft2 <= 0.0) scal = 0.1; else { scal = 1.0 + 0.5 * (f - ft) / (f + ft - ft2 - ft2); if (scal < 0.1) scal = 0.1; } t = scal * t; for (i = 0; i < n; i++) xt[i] = x[i] + t * p[i]; fun(&ft, xt); nfe++; if (f <= ft) continue; sumt += t; idg = 0; f = ft; memcpy(x, xt, sizeof(vector)); /*save likelihood values for later*/ for(i=0; i< nuped; i++) outsavelike[i] = likebyped[i]; if (t < tmin) LINK->cont = exit3; else LINK->cont = exit2; } } Local Void increaset(LINK) struct LOC_step *LINK; { int i; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_gem_iter_st_incr ; performCheckpoint ( functionLocation , funCallPath , LINK -> cont ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_iter_st_incr == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( & LINK -> cont ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif sumt += t; LINK->cont = go_; while (LINK->cont == go_) { twot = t + t; if (ibnd > 0 && tbnd >= 0.0 && twot > tbnd) { f = ft; memcpy(x, xt, sizeof(vector)); fprintf(outfile, "****** ACTIVE BOUNDARY CONSTRAINT *****\n"); LINK->cont = exit1; continue; } memcpy(x, xt, sizeof(vector)); for (i = 0; i < n; i++) xt[i] = x[i] + t * p[i]; fun(&f2t, xt); nfe++; if (f2t > ft) { f = ft; LINK->cont = exit2; break; } if (f2t + f - ft - ft < 0.0 || ft - f2t + curv * (ft - f) >= 0.0) { sumt += t; t += t; ft = f2t; } else { sumt += t; f = f2t; memcpy(x, xt, sizeof(vector)); /*save likelihood values for later*/ for(i=0; i< nuped; i++) outsavelike[i] = likebyped[i]; LINK->cont = exit2; } } } static Void step() { struct LOC_step V; #if !defined(DOS) /* Shriram: begin */ int ckptFunCallPath = ckptTuple . ckptAttribute ; if ( ( checkpointedRun == checkpointStatus ) && ( functionLocation == ckptTuple . ckptLocation ) ) { if ( fCP_gem_iter_st_first == ckptFunCallPath ) goto FunRecover3 ; else if ( fCP_gem_iter_st_decr == ckptFunCallPath ) goto FunRecover4 ; else if ( fCP_gem_iter_st_incr == ckptFunCallPath ) goto FunRecover5 ; } /* Shriram: end */ #endif firstapprox = true; #if !defined(DOS) /* cgh - gcc */ FunRecover3: #endif /* !defined(DOS) */ firststep(&V); if (f > ft) #if !defined(DOS) /* cgh - gcc */ FunRecover5: #endif /* !defined(DOS) */ increaset(&V); else #if !defined(DOS) /* cgh - gcc */ FunRecover4: #endif /* !defined(DOS) */ decreaset(&V); if (V.cont == exit2) t = sumt; if (V.cont == exit3) { iret = 1; return; } memcpy(gsave, g, sizeof(vector)); isw = 0; iret = 2; } /* Local variables for update: */ struct LOC_update { int j, jm1; boolean cont, dfp; } ; Local Void prep(LINK) struct LOC_update *LINK; { int i, k; iswup = 1; wtil[0] = -gsave[0]; ztil[0] = y[0]; for (k = 2; k <= n; k++) { wtil[k - 1] = -gsave[k - 1]; ztil[k - 1] = y[k - 1]; for (i = 0; i <= k - 2; i++) { tl[i][k - 1] = tl[k - 1][i]; wtil[k - 1] -= tl[k - 1][i] * wtil[i]; ztil[k - 1] -= tl[k - 1][i] * ztil[i]; } } sb = 0.0; sc = 0.0; sd = 0.0; for (i = 0; i < n; i++) { sb += t * ztil[i] * wtil[i] / d[i]; sc += t * t * wtil[i] * wtil[i] / d[i]; sd += ztil[i] * ztil[i] / d[i]; } } Local Void sr1update(LINK) struct LOC_update *LINK; { alpha = -1.0; if (sc - sb == 0.0 || sb - sd == 0.0 || sd - 2.0 * sb + sc == 0.0) { idg = 3; return; } sa = 1.0 / (sqrt(fabs(sc - sb)) * sqrt(fabs(sb - sd))); thet1 = ((sd - sb) * sa + 1.0) / (2.0 * sb - sd - sc); thet2 = sa + (sa * (sb - sc) + 1.0) / (sd - 2.0 * sb + sc); } Local Void sr2update(LINK) struct LOC_update *LINK; { aa = sb / sc - 2.0 * (sd / sb) + sd / sc; bb = sb / sc - 1.0; cc = 1.0 - sb / sd; del2 = bb * bb - aa * cc; LINK->dfp = true; if (del2 > 0.00000001) { LINK->dfp = false; del = sqrt(del2); alph1 = (del - bb) / aa; alph2 = (-bb - del) / aa; if (fabs(alph1) < fabs(alph2)) alpha = alph1; else alpha = alph2; if (fabs(alpha) < 0.00001) LINK->dfp = true; else { sa = (alpha + 1.0) * (alpha + 1.0) + sc / sb - alpha * alpha * (sc / sb) * (sd / sb) - 1.0 + alpha * alpha * sd / sb; if (sa <= 0.0) sa = 0.0; else { sa = sqrt(sa); sa = 1.0 / (sa * sb); } rdiv = 1.0 / (alpha * alpha * sd + 2.0 * alpha * sb + sc); thet1 = -(sa * alpha * (alpha * sd + sb) + 1.0) * rdiv; thet2 = sa + (alpha * sa * (sc + alpha * sb) - alpha) * rdiv; } } if (!LINK->dfp) return; alpha = 0.0; sa = 1.0 / (sqrt(sb) * sqrt(sc)); thet1 = -1.0 / sc; thet2 = sa; } Local Void getwzs(LINK) struct LOC_update *LINK; { int i, k; for (i = 0; i < n; i++) { w[i] = t * wtil[i] + alpha * ztil[i]; z[i] = t * thet1 * wtil[i] + thet2 * ztil[i]; } s[n - 1] = 0.0; for (k = 1; k < n; k++) { LINK->j = n - k + 1; LINK->jm1 = LINK->j - 1; s[LINK->jm1 - 1] = s[LINK->j - 1] + w[LINK->j - 1] * w[LINK->j - 1] / d[LINK->j - 1]; } nu = 1.0; eta = 0.0; } Local Void recur(LINK) struct LOC_update *LINK; { int i, k; LINK->cont = true; while (LINK->cont) { LINK->cont = false; if (iswup < 2) { for (i = 0; i < n; i++) wtjp1[i] = -gsave[i]; memcpy(ztjp1, y, sizeof(vector)); } else { for (i = 0; i < n; i++) { wtil[i] = alpha * y[i] - t * g[i]; ztil[i] = thet2 * y[i] - t * thet1 * g[i]; } } LINK->j = 0; lambj2 = 0.0; while (LINK->j < n - 1) { LINK->j++; if (iswup < 2) { for (k = LINK->j; k < n; k++) { wtjp1[k] -= wtil[LINK->j - 1] * tl[k][LINK->j - 1]; ztjp1[k] -= ztil[LINK->j - 1] * tl[k][LINK->j - 1]; } } else { for (k = LINK->j; k < n; k++) { wtjp1[k] = wtil[k] - w[LINK->j - 1] * tl[k][LINK->j - 1]; ztjp1[k] = ztil[k] - z[LINK->j - 1] * tl[k][LINK->j - 1]; } } aj = nu * z[LINK->j - 1] - eta * w[LINK->j - 1]; thj = 1.0 + aj * w[LINK->j - 1] / d[LINK->j - 1]; lambj2 = thj * thj + aj * aj * s[LINK->j - 1] / d[LINK->j - 1]; if (iswup < 2) { if (lambj2 > 10.0) { LINK->cont = true; iswup = 2; for (k = 2; k <= n; k++) { for (i = 0; i <= k - 2; i++) tl[k - 1][i] = tl[i][k - 1]; } LINK->j = n; } } if (LINK->cont) continue; dp[LINK->j - 1] = d[LINK->j - 1] * lambj2; lambj = sqrt(lambj2); if (thj > 0.0) lambj = -lambj; muj = thj - lambj; bj = thj * w[LINK->j - 1] + aj * s[LINK->j - 1]; gamlj = bj * nu / (lambj2 * d[LINK->j - 1]); betlj = (aj - bj * eta) / (lambj2 * d[LINK->j - 1]); nu = -(nu / lambj); eta = -((eta + aj * aj / (muj * d[LINK->j - 1])) / lambj); if (iswup < 2) { for (k = LINK->j; k < n; k++) tl[k][LINK->j - 1] += t * (betlj + thet1 * gamlj) * wtjp1[k] + (alpha * betlj + thet2 * gamlj) * ztjp1[k]; } else { for (k = LINK->j; k < n; k++) { tl[k][LINK->j - 1] = tl[k][LINK->j - 1] / lambj2 + betlj * wtil[k] + gamlj * ztil[k]; wtil[k] = wtjp1[k]; ztil[k] = ztjp1[k]; } } } } aj = nu * z[n - 1] - eta * w[n - 1]; lambj = 1.0 + aj * w[n - 1] / d[n - 1]; dp[n - 1] = d[n - 1] * lambj * lambj; memcpy(d, dp, sizeof(vector)); } /*UPDATE*/ static Void update() { struct LOC_update V; prep(&V); if (sb < sc) fbcd = sb; else fbcd = sc; if (sd < fbcd) fbcd = sd; if (fbcd > small) { fbcd = 2.0 * sc * (sd / sb) / (sc + sd); if (fbcd < 1.0) sr1update(&V); else sr2update(&V); } else sr1update(&V); if (idg != 3) { getwzs(&V); recur(&V); } } Local Void bldlt(b) vector *b; { int i, j, ic, k; double su, tlic, ff, hh, temp, temp1; matrix s; vector tu, xvec; firstapprox = true; ff = f; if (icall > 0 && ihess <= 0) { memcpy(xvec, xall, sizeof(vector)); hh = 10 * h; for (i = 0; i < n; i++) { temp = x[i]; x[i] += hh; fun(&f, x); tu[i] = f; for (j = 0; j < i + 1; j++) { temp1 = x[j]; x[j] += hh; fun(&f, x); b[i][j] = f; b[j][i] = b[i][j]; x[j] = temp1; } x[i] = temp; } memcpy(xall, xvec, sizeof(vector)); for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) { b[i][j] = (ff + b[i][j] - tu[i] - tu[j]) / (hh * hh); b[j][i] = b[i][j]; } } } ic = 1; while (b[ic - 1][ic - 1] > 0.0 && ic <= n) { temp = b[ic - 1][ic - 1]; d[ic - 1] = b[ic - 1][ic - 1]; tl[ic - 1][ic - 1] = 1.0; if (ic != n) { for (k = ic; k < n; k++) tl[k][ic - 1] = b[k][ic - 1] / temp; for (i = ic; i < n; i++) { tlic = tl[i][ic - 1]; for (k = i; k < n; k++) b[k][i] -= tlic * tl[k][ic - 1] * temp; } } ic++; } if (ic > n) { icall--; fprintf(outfile, "FACTORIZATION SUCCEEDED\n"); } else { icall++; fprintf(outfile, "FACTORIZATION FAILED\n"); } if (icall != 0) return; s[0][0] = 1.0; for (i = 2; i <= n; i++) { for (k = 0; k <= i - 2; k++) { su = 0.0; for (j = k; j <= i - 2; j++) su += tl[i - 1][j] * s[j][k]; s[i - 1][k] = -su; } s[i - 1][i - 1] = 1.0; } for (i = 0; i < n; i++) { for (j = i; j < n; j++) { su = 0.0; for (k = j; k < n; k++) su += s[k][i] * s[k][j] / d[k]; b[i][j] = su; b[j][i] = su; } } fprintf(outfile, "B-MATRIX\n"); for (i = 1; i <= n; i++) { for (j = 0; j < i; j++) fprintf(outfile, "% .5e", b[i - 1][j]); putc('\n', outfile); } if (ivar != 1) return; k = 0; for (i = 0; i < nall; i++) { se[i] = 0.0; if (itp[i] == 1) { k++; se[i] = sqrt(b[k - 1][k - 1]); } } } Local Void inib() { int i, j; FILE *in1; in1 = NULL; if (icall != 1 && ihess > 1) { if (in1 != NULL) in1 = freopen("in1.dat", "r", in1); else in1 = fopen("in1.dat", "r"); if (in1 == NULL) exit(FileNotFound); for (i = 1; i <= n; i++) { for (j = 0; j < i; j++) fscanf(in1, "%lf", &bmat[i - 1][j]); } for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) bmat[j][i] = bmat[i][j]; } } bldlt(bmat); if (icall == 1) { for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) tl[i][j] = 0.0; tl[i][i] = 1.0; d[i] = 1.0; } } if (in1 != NULL) fclose(in1); } Void initialize() { int i, j; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_gem_init ; performCheckpoint ( functionLocation , funCallPath , 0 ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_init == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( NULL ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif firstapprox = true; fprintf(outfile, "DIFFER INTER = % .5e TRUNC UPPER = % .5e\n", h, trupb); nit = 0; idg = 0; idif = 1; t = 0.1; tmin = 0.0; fsmf = 0.0; fun(&f, x); /*save likelihood values for later*/ for(i=0; i< nuped; i++) outsavelike[i] = likebyped[i]; nfe = 1; for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) tl[i][j] = 0.0; tl[i][i] = 1.0; d[i] = 1.0; } if (ihess <= 0) return; icall = 0; inib(); icall = 1; t = 1.0; } Local Void gforward() { int i, k; /*The following definition was introduced by A. A. Schaffer 7/27/94 to fix a bug inherited from LINKAGE*/ double xallsave[maxn]; /*Save xall, so it can be recovered at end*/ firstapprox = true; outsavefvalue = f; saveparams(); k = 0; for (i = 0; i< maxn; i++) { if (itp[i] == 1) { k++; xallsave[i] = outsavex[k - 1]; } else xallsave[i] = outsavex[k -1]; } for (i = 0; i < n; i++) { #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { if ( fCP_gem_iter_ == funCallPath ) funCallPath = fCP_gem_iter_gfor ; else if ( fCP_gem_ == funCallPath ) funCallPath = fCP_gem_gfor ; performCheckpoint ( functionLocation , funCallPath , i ) ; } else if ( ( functionLocation == ckptTuple . ckptLocation ) && ( ( fCP_gem_iter_gfor == ckptTuple . ckptAttribute ) || ( fCP_gem_gfor == ckptTuple . ckptAttribute ) ) ) { recoverCheckpoint ( & i ) ; if ( i >= n ) break ; funCallPath = ckptTuple . ckptAttribute ; } /* Shriram: end */ #endif hx = h; if (ihx == 1) { if (fabs(x[i]) < 0.1) hx = h * 0.1; else hx = h * fabs(x[i]); } xsave = x[i]; x[i] += hx; if (continue_ != quit) { fun(&fxph, x); savedf[i] = fxph; } else fxph = savedf[i]; firstapprox = false; g[i] = (fxph - f) / hx; x[i] = xsave; } for(i=0; i < maxn; i++) xall[i] = xallsave[i]; if (continue_ != quit) nfe += n; } Local Void gcentral() { int i, k; double xallsave[maxn]; firstapprox = true; outsavefvalue = f; saveparams(); k = 0; for (i = 0; i< maxn; i++) { if (itp[i] == 1) { k++; xallsave[i] = outsavex[k - 1]; } else xallsave[i] = xall[i]; } for (i = 0; i < n; i++) { #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { if ( fCP_gem_iter_gcen1_ == funCallPath ) funCallPath = fCP_gem_iter_gcen1 ; else if ( fCP_gem_iter_gcen2_ == funCallPath ) funCallPath = fCP_gem_iter_gcen2 ; performCheckpoint ( functionLocation , funCallPath, i ) ; } else if ( ( functionLocation == ckptTuple . ckptLocation ) && ( ( fCP_gem_iter_gcen1 == ckptTuple . ckptAttribute ) || ( fCP_gem_iter_gcen2 == ckptTuple . ckptAttribute ) ) ) { recoverCheckpoint ( & i ) ; if ( i >= n) break ; funCallPath = ckptTuple . ckptAttribute ; } /* Shriram: end */ #endif hx = h; if (ihx == 1) { if (fabs(x[i]) < 0.1) hx = h * 0.1; else hx = h * fabs(x[i]); } xsave = x[i]; x[i] += hx; if (continue_ != quit) { fun(&fxph, x); savedf[2*i] = fxph; } else fxph = savedf[2*i]; firstapprox = false; x[i] = xsave - hx; if (continue_ != quit) { fun(&fxmh, x); savedf[2*i + 1] = fxmh; } else fxmh = savedf[2*i + 1]; g[i] = (fxph - fxmh) / (hx + hx); x[i] = xsave; } for(i=0; i < maxn; i++) xall[i] = xallsave[i]; if (continue_ != quit) nfe += 2 * n ; /* Shriram */ } Local Void getp() { int i, nmj, j; nit++; fsav2 = fsave; fsave = f; fprintf(outfile, "\nITERATION %5d T = %10.3f NFE = %5d F = % .5e\n", nit, t, nfe, f); printf("ITERATION %5d T = %10.3f NFE = %5d F = % .5e\n", nit, t, nfe, f); if (nit > maxit) { idg = 6; return; } if (n < 20) { fprintf(outfile, "X= "); outcontrol(x); fprintf(outfile, "G= "); outcontrol(g); } if (n == 1) p[0] = -(g[0] / d[0]); else { v[0] = -g[0]; for (i = 2; i <= n; i++) { v[i - 1] = -g[i - 1]; for (j = 0; j <= i - 2; j++) v[i - 1] -= tl[i - 1][j] * v[j]; } p[n - 1] = v[n - 1] / d[n - 1]; for (j = 1; j < n; j++) { nmj = n - j; p[nmj - 1] = v[nmj - 1] / d[nmj - 1]; for (i = nmj; i < n; i++) p[nmj - 1] -= tl[i][nmj - 1] * p[i]; } } fprintf(outfile, "P= "); outcontrol(p); if (ibnd == 1) { for (i = 0; i < n; i++) { if (p[i] == 0.0) idg = 7; } } if (idg == 7) return; ptg = 0.0; for (i = 0; i < n; i++) ptg += p[i] * g[i]; if (ptg >= 0.0) { idg = 1; return; } if (fabs(ptg) < tol) { idg = 4; fsmf = fsav2 - f; fprintf(outfile, "FSMF = % .5e PTG = % .5e TMIN = % .5e\n", fsmf, ptg, tmin); return; } xpm = xpmcon; if (nit == 1) return; for (i = 0; i < n; i++) { if (ihx == 1) { xp = fabs(x[i]); if (xp < 0.1) xp = 0.1; xp /= fabs(p[i]); if (xp < xpm) xpm = xp; } else { if (xpm > fabs(1.0 / p[i])) xpm = fabs(1.0 / p[i]); } } tmin = 0.5 * xpm * h / trupb; if (idif == 2) t = 1.0; else { t = -2.0 * fsmf / ptg; if (t <= 0.0) t = 1.0; else { if (1.0 < t) t = 1.0; } } fprintf(outfile, "FSMF = % .5e PTG =% .5e TMIN=% .5e\n", fsmf, ptg, tmin); fprintf(outfile, "INITIAL T = % .5e\n", t); } Local Void getytp() { int i; ytp = 0.0; fsmf = fsave - f; for (i = 0; i < n; i++) { y[i] = g[i] - gsave[i]; ytp += y[i] * p[i]; } } Local Void chkbnd() { /*This procedure modified by M. Lathrop 29/04/86 with the introduction of continue and repeat*/ int i, j, k, ik, ii, jk; boolean continue_; do { clb = clbcon; for (j = 1; j <= 2; j++) { k = 0; for (i = 1; i <= nall; i++) { if (itp[i - 1] == 1) { k++; check = fabs(x[k - 1] - bnd[i - 1][j - 1]); if (check <= clb) { clb = check; ik = k; ii = i; jk = j; } } } } if (clb < 0.1 * h) { ihess = 0; if (jk == 2) eh = -h - h; else eh = h + h; x[ik - 1] = bnd[ii - 1][jk - 1] + eh; xall[ii - 1] = x[ik - 1]; itp[ii - 1] = 0; for(k = ik; k < nall; k++) outsavex[k-1] = outsavex[k]; k = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; x[k - 1] = xall[i]; } } n = k; tol = tolconst; /* tol:=tolconst*sqrt(n);*/ continue_ = true; fprintf(outfile, "******* A VARIABLE WAS SET TO A BOUND ***********\n"); } else { tbnd = tbndcon; for (j = 0; j <= 1; j++) { k = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; teq = (bnd[i][j] - x[k - 1]) / p[k - 1]; if (teq < tbnd && teq > 0.0) tbnd = teq; } } } continue_ = false; if (t * (2.0 + h) >= tbnd) t = tbnd * (0.5 - h); fprintf(outfile, "TBND = % .5e RESET T = % .5e\n", tbnd, t); } } while (continue_); } Local Void iterate() { #if !defined(DOS) /* Shriram: begin */ int ckptFunCallPath = ckptTuple . ckptAttribute ; if ( normalRun == checkpointStatus ) funCallPath = fCP_gem_iter_ ; /* Shriram: end */ #endif while (continue_ == go) { active = false; #if !defined(DOS) /* Shriram: begin */ if ( checkpointedRun == checkpointStatus ) { if ( iterationLocation == ckptTuple . ckptLocation ) checkpointStatus = normalRun ; else /* checkpointedRun AND functionLocation */ { if ( ( fCP_gem_iter_st_first == ckptFunCallPath ) || ( fCP_gem_iter_st_decr == ckptFunCallPath ) || ( fCP_gem_iter_st_incr == ckptFunCallPath ) ) goto FunRecover345 ; else if ( fCP_gem_iter_gcen1 == ckptFunCallPath ) goto FunRecover6 ; else if ( fCP_gem_iter_gfor == ckptFunCallPath ) goto FunRecover7 ; else if ( fCP_gem_iter_gcen2 == ckptFunCallPath ) goto FunRecover9 ; } } else performCheckpoint ( iterationLocation , nit , 0 ) ; #endif getp(); /* Shriram: end */ if (idg != 0) continue_ = quit; else { /*idg == 0*/ /*Shriram*/ iret = 2; if (ibnd == 1) chkbnd(); if (n == 0) continue_ = quit; if (!active) { #if !defined(DOS) FunRecover345: funCallPath = fCP_gem_iter_ ; #endif step(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif } } /* THE NEXT IS NOT TRUE IF ACTIVE */ if (iret != 2) { if (idif != 1) { continue_ = quit; break; } idif = 2; isw = 1; #if !defined(DOS) FunRecover9: funCallPath = fCP_gem_iter_gcen2_ ; #endif gcentral(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif fprintf(outfile, "***** SWITCHING TO CENTRAL DIFFERERENCE*****\n"); continue; } if (active) { continue_ = restart; break; } if (idif == 1) { #if !defined(DOS) FunRecover7: funCallPath = fCP_gem_iter_ ; #endif gforward(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif } else { #if !defined(DOS) FunRecover6: funCallPath = fCP_gem_iter_gcen1_ ; #endif gcentral(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif } if (isw != 0) continue; getytp(); if (ytp <= 0.0) continue; if (n == 1) d[0] = -(y[0] * d[0] / (t * gsave[0])); else update(); if (idg == 3) continue_ = quit; } } /*START GEMINI*/ static Void gemini() { #if !defined(DOS) /* Shriram: begin */ int ckptFunCallPath = ckptTuple . ckptAttribute ; if ( normalRun == checkpointStatus ) funCallPath = fCP_gem_ ; /* Shriram: end */ #endif continue_ = go; while (continue_ != quit) { #if !defined(DOS) /* Shriram: begin */ if ( ( checkpointedRun == checkpointStatus ) && ( iterationLocation == ckptTuple . ckptLocation ) ) recoverCheckpoint ( NULL ) ; else { if ( checkpointedRun == checkpointStatus ) { /* must be a functionLocation checkpoint, but which? */ if ( fCP_gem_init == ckptFunCallPath ) goto FunRecover2 ; else if ( ( fCP_gem_iter_st_first == ckptFunCallPath ) || ( fCP_gem_iter_st_decr == ckptFunCallPath ) || ( fCP_gem_iter_st_incr == ckptFunCallPath ) || ( fCP_gem_iter_gcen1 == ckptFunCallPath ) || ( fCP_gem_iter_gcen2 == ckptFunCallPath ) || ( fCP_gem_iter_gfor == ckptFunCallPath ) ) goto FunRecover34567 ; else if ( fCP_gem_gfor == ckptFunCallPath ) goto FunRecover8 ; } FunRecover2: #endif initialize(); #if !defined(DOS) funCallPath = fCP_gem_ ; FunRecover8: #endif isw = 0; gforward(); #if !defined(DOS) funCallPath = fCP_gem_ ; } /* Shriram: end */ #endif continue_ = go; #if !defined(DOS) /* cgh - gcc */ FunRecover34567: #endif /* !defined(DOS) */ iterate(); #if !defined(DOS) funCallPath = fCP_gem_ ; #endif } if (ivar == 1) inib(); } static void printVersion() { printf("\nProgram LODSCORE version%6.2f (1-Feb-1991)\n\n", fVersion); printf("\nFASTLINK "); #if defined(LESSMEMORY) printf("(slow) "); #endif printf("version %s (6-Oct-1997)\n\n", fastversion); } static Void initilink() { printVersion(); printf("The program constants are set to the following maxima:\n"); printf("%6d loci in mapping problem\n", (int)maxsys); printf("%6d alleles at a single locus\n", (int)maxall); /* printf("%6ld recombination probabilities (maxneed)\n", (int)maxneed); */ printf("%6d maximum of censoring array (maxcensor)\n", (int)maxcensor); printf("%6d individuals in all pedigrees combined\n", (int)maxind); printf("%6d pedigrees (maxped\n", (int)maxped); printf("%6d quantitative factor(s) at a single locus\n", (int)maxtrait); printf("%6d liability classes\n", (int)maxliab); printf("%6d binary codes at a single locus\n", (int)maxfact); printf("%8.2f base scaling factor for likelihood (scale)\n", scale); printf("%8.2f scale multiplier for each locus (scalemult)\n", scalemult); printf("%8.5f frequency for elimination of heterozygotes (minfreq)\n", minfreq); if (minfreq != 0.0) { printf("IMPORTANT : RECOMPILE THIS PROGRAM WITH MINFREQ=0.0\n"); printf("FOR THE ANALYSIS OF RECESSIVE TRAITS\n"); } putchar('\n'); } static void printLoInfo() { printVersion(); printf("\nLODSCORE has been compiled with the following options:\n\n"); printf(" CHECKPOINTING is "); #if defined(DOS) printf("disabled (DOS defined)\n"); #else printf("enabled (DOS not defined)\n"); #endif /* defined(DOS) */ #if defined(LESSMEMORY) printf(" SLOW version (LESSMEMORY defined)\n"); #else printf(" FAST version (LESSMEMORY not defined)\n"); #endif /* defined(LESSMEMORY) */ printf("\nProgram constants are set to the following maxima:\n\n"); printf("%6d maximum number of loci (maxlocus)\n", (int)maxlocus); printf("%6d maximum number of alleles at a single locus (maxall)\n", (int)maxall); printf("%6d maximum number of individuals in a pedigree (maxind)\n", (int)maxind); printf("%6d maximum number of loops (maxloop)\n", (int)maxloop); printf("%6d maximum number of children in a nuclear family (maxchild)\n", (int)maxchild); printf("\n"); exit(0); } static boolean checkdone(ilocus, jlocus) int ilocus, jlocus; { int i, j; if (ilocus == locuslist1[0]) return false; else { i = 0; do { i++; } while (jlocus != locuslist1[i - 1] && locuslist1[i - 1] != ilocus); j = 0; do { j++; } while (ilocus != locuslist2[j - 1] && j != nlocus2); return (locuslist1[i - 1] == jlocus && locuslist2[j - 1] == ilocus); } } int main(argc, argv) int argc; char *argv[]; { #if !defined(DOS) /* cgh - gcc */ /* K. Shriram: begin */ char dateTimeStamp [ DateTimeStampStringLength ] ; FILE * scriptCheckpoint ; int scriptRun , scriptToSleep ; FILE * fileTester ; /* K. Shriram: end */ #endif /* !defined(DOS) */ /* cgh -- seqStartup() from commoncode.c */ int c; #ifdef vms ; #else while ((c = getopt(argc, argv, "i")) != -1) switch (c) { case 'i': printLoInfo(); break; case '?': exit(-1); default: break; } #endif #ifdef vms recfile = fopen("recfile.dat", "w", "ctx=rec", "shr=get,put,upd") ; #else recfile = fopen("recfile.dat", "w"); /* If you change things in */ #endif if (recfile == NULL) /* connexion with either final */ exit(FileNotFound); /* or stream, be sure to make */ if (dostream) { /* the appropriate modifications */ #ifdef vms stream = fopen("stream.dat", "w", "ctx=rec", "shr=get,put,upd") ; #else stream = fopen("stream.dat", "w"); /* to the checkpointing code near */ #endif if (stream == NULL) /* the beginning of outf(). */ exit(FileNotFound); /* --Shriram */ } else stream = NULL; #if !defined(DOS) /* Shriram: begin */ /* We perform the script-level checkpointing work here because we want the files recfile and stream, which will be used by external scripts, to have been created at this point. */ scriptCheckpoint = NULL; #ifdef vms scriptCheckpoint = fopen ( ScriptLODSCORECheckpointFilename , "r", "ctx=rec", "shr=get,put,upd") ; #else scriptCheckpoint = fopen ( ScriptLODSCORECheckpointFilename , "r" ) ; #endif if ( NULL != scriptCheckpoint ) { fscanf ( scriptCheckpoint , "%d %d" , & scriptRun , & scriptToSleep ) ; fclose ( scriptCheckpoint ) ; if ( 0 != scriptToSleep ) { #ifdef vms scriptCheckpoint = fopen ( ScriptLODSCORECheckpointFilename , "w", "ctx=rec", "shr=get,put,upd") ; #else scriptCheckpoint = fopen ( ScriptLODSCORECheckpointFilename , "w" ) ; #endif scriptRun ++ ; scriptToSleep -- ; fprintf ( scriptCheckpoint , "%d %d\n" , scriptRun , scriptToSleep ) ; fclose ( scriptCheckpoint ) ; printf ( "Recovering to checkpoint: %d more run(s)\n" , scriptToSleep + 1 ) ; if ( NULL != recfile ) fclose ( recfile ) ; if ( NULL != stream ) fclose ( stream ) ; if ( 0 == scriptToSleep ) { #ifdef vms fileTester = fopen ( ScriptLODSCOREFinalOut , "r", "ctx=rec", "shr=get,put,upd") ; #else fileTester = fopen ( ScriptLODSCOREFinalOut , "r" ) ; #endif if ( NULL != fileTester ) { fclose ( fileTester ) ; copyFile ( ScriptLODSCOREFinalOut , "final.out" ) ; } if ( dostream ) { #ifdef vms fileTester = fopen ( ScriptLODSCOREStreamOut , "r", "ctx=rec", "shr=get,put,upd") ; #else fileTester = fopen ( ScriptLODSCOREStreamOut , "r" ) ; #endif if ( NULL != fileTester ) { fclose ( fileTester ) ; copyFile ( ScriptLODSCOREStreamOut , "stream.out" ) ; } } } exit ( EXIT_FAILURE ) ; } } /* Shriram: end */ #endif init_ped_loc_all(); /* dwix */ datafile = fopen("datafile.dat", "r"); if (datafile == NULL) exit(FileNotFound); pedfile = fopen("pedfile.dat", "r"); if (pedfile == NULL) exit(FileNotFound); #ifdef vms outfile = fopen("outfile.dat", "w", "ctx=rec", "shr=get,put,upd") ; #else outfile = fopen("outfile.dat", "w"); #endif if (outfile == NULL) exit(FileNotFound); #ifdef vms final = fopen("final.dat", "w", "ctx=rec", "shr=get,put,upd") ; #else final = fopen("final.dat", "w"); #endif if (recfile == NULL) exit(FileNotFound); if (dostream) fprintf(stream, "@\n"); initilink(); ihess = 0; ibnd = 1; icall = 1; ivar = 0; ihx = 1; inconsistent = false; inputdata(); if (datafile != NULL) fclose(datafile); datafile = NULL; if (pedfile != NULL) fclose(pedfile); pedfile = NULL; /* dwix */ if (DIAGNOSTIC) allele_downcode_check(); #if ALLELE_SPEED adjust_alleles(); allele_adjust_persons(); #endif /* end dwix */ #if !defined(DOS) /* Shriram: begin */ #ifdef vms checkpointDatafile = fopen ( CheckpointLODSCOREFilename , "r", "ctx=rec", "shr=get,put,upd") ; #else checkpointDatafile = fopen ( CheckpointLODSCOREFilename , "r" ) ; #endif if ( NULL != checkpointDatafile ) { checkpointStatus = checkpointedRun ; puts ( "NOTE: attempting to continue previous (unfinished) run" ) ; fgets ( dateTimeStamp , DateTimeStampStringLength , checkpointDatafile ) ; printf ( " from %s" , dateTimeStamp ) ; getCkptTuple ( ) ; } /* Shriram: end */ #endif #if !defined(DOS) if ( checkpointStatus != checkpointedRun ) /* Shriram */ { #endif h = sqrt(exp(-nbit * log(2.0))); tol = tolconst; /* tol:=tolconst*sqrt(n);*/ trupb = sqrt(h); #if !defined(DOS) } #endif nlocus = 2; censorstruct = (censorrec *)Malloc(sizeof(censorrec)); if (censorstruct == NULL) malloc_err("censorstruct"); #if !defined(DOS) /* Shriram: begin */ if ( checkpointedRun == checkpointStatus ) iplace = ckptTuple . iplace ; else #endif iplace = 1 ; for ( /* do nothing */ ; iplace <= nlocus1; iplace++) { #if !defined(DOS) if ( checkpointedRun == checkpointStatus ) jplace = ckptTuple . jplace ; else #endif jplace = 1 ; for ( /* do nothing */ ; jplace <= nlocus2; jplace++) { #if !defined(DOS) ckptTuple . iplace = iplace ; ckptTuple . jplace = jplace ; if ( normalRun == checkpointStatus ) { fclose ( recfile ) ; copyFile ( "recfile.dat" , MainLODSCORERecfileDat ) ; #ifdef vms recfile = fopen ( "recfile.dat" , "a", "ctx=rec", "shr=get,put,upd") ; #else recfile = fopen ( "recfile.dat" , "a" ) ; #endif if ( dostream ) { fclose ( stream ) ; copyFile ( "stream.dat" , MainLODSCOREStreamDat ) ; #ifdef vms stream = fopen ( "stream.dat" , "a", "ctx=rec", "shr=get,put,upd") ; #else stream = fopen ( "stream.dat" , "a" ) ; #endif } } else { fclose ( recfile ) ; copyFile ( MainLODSCORERecfileDat , "recfile.dat" ) ; #ifdef vms recfile = fopen ( "recfile.dat" , "a", "ctx=rec", "shr=get,put,upd") ; #else recfile = fopen ( "recfile.dat" , "a" ) ; #endif if ( dostream ) { fclose ( stream ) ; copyFile ( MainLODSCOREStreamDat , "stream.dat" ) ; #ifdef vms stream = fopen ( "stream.dat" , "a", "ctx=rec", "shr=get,put,upd") ; #else stream = fopen ( "stream.dat" , "a" ) ; #endif } } /* Shriram: end */ #endif if (locuslist1[iplace - 1] != locuslist2[jplace - 1]) { if (!checkdone(locuslist1[iplace - 1], locuslist2[jplace - 1])) { printf("loci %4d%4d\n", locuslist1[iplace - 1], locuslist2[jplace - 1]); #if !defined(DOS) if ( normalRun == checkpointStatus ) { #endif ihess = 0; ibnd = 1; icall = 1; ivar = 0; ihx = 1; f = 0.0; ptg = 0.0; inconsistent = false; #if !defined(DOS) } #endif ilocus = locuslist1[iplace - 1]; jlocus = locuslist2[jplace - 1]; #if !defined(DOS) if ( normalRun == checkpointStatus ) { #endif firsttime = true; lasttime = false; dolod = false; firstapprox = true; #if !defined(DOS) } #endif setlods(ilocus, jlocus); setiterate(); maxit = n * iterationMultiple; if (DIAGNOSTIC) /*A. A. Schaffer*/ check_constants(); #if !ALLELE_SPEED allocategenetables(); getlocations(); #endif getgeneindices(); /*R. M. Idury*/ allocate_loopbreaker_vectors(); /* A. A. Schaffer*/ #if !defined(DOS) /* K. Shriram: begin */ if ( ( checkpointedRun == checkpointStatus ) && ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_outf == ckptTuple . ckptAttribute ) ) ) goto FunRecover1 ; /* K. Shriram: end */ #endif gemini(); #if !defined(DOS) /* cgh - gcc */ FunRecover1: #endif /* !defined(DOS) */ outf(); freegenetables(); } } } } if (dostream) { fprintf(stream, "~\n"); if (stream != NULL) fclose(stream); } if (recfile != NULL) fclose(recfile); #if !defined(DOS) /* Shriram: begin */ /* This is the time at which to update the script-level checkpointing routine, since we have closed recfile and stream; any disasters that occur after this are "safe". */ #ifdef vms scriptCheckpoint = fopen ( ScriptLODSCORECheckpointFilename , "r+", "ctx=rec", "shr=get,put,upd" ) ; #else scriptCheckpoint = fopen ( ScriptLODSCORECheckpointFilename , "r+" ) ; #endif if ( NULL != scriptCheckpoint ) { rewind ( scriptCheckpoint ) ; scriptRun ++ ; fprintf ( scriptCheckpoint , "%d 0\n" , scriptRun ) ; fclose ( scriptCheckpoint ) ; copyFile ( "final.out" , ScriptLODSCOREFinalOut ) ; appendFile ( "recfile.dat" , ScriptLODSCOREFinalOut ) ; if ( dostream ) { copyFile ( "stream.out" , ScriptLODSCOREStreamOut ) ; appendFile ( "stream.dat" , ScriptLODSCOREStreamOut ) ; } } if ( NULL != checkpointDatafile ) fclose ( checkpointDatafile ) ; unlink ( CheckpointLODSCOREFileBackup ) ; unlink ( CheckpointLODSCOREFilename ) ; unlink ( OutfLODSCORERecfileDat ) ; unlink ( OutfLODSCOREStreamDat ) ; unlink ( MainLODSCORERecfileDat ) ; unlink ( MainLODSCOREStreamDat ) ; /* Shriram: end */ #endif if (final != NULL) fclose(final); final = NULL; if (outfile != NULL) fclose(outfile); if (pedfile != NULL) fclose(pedfile); if (datafile != NULL) fclose(datafile); exit(EXIT_SUCCESS); } /* End. */ fastlink-4.1P-fix95/4.1P/src/oldsegup.c0000644000265600020320000000535006737460342016614 0ustar tilleaadmin/* This file contains the original C versions of segup*/ /* and segsexup used in LODSCORE, ILINK, and LINKMAP*/ /* They are separated out so as to have the same file structure*/ /* as is used for the new versions*/ Void oldsegsexup(LINK) struct LOC_seg *LINK; { double segval; long first, second; censorrec *WITH; thisarray *WITH1; long FORLIM; thisarray *WITH2; long FORLIM1; initseg(LINK); WITH = censorstruct; if ((*LINK->p)->male) { WITH1 = (*LINK->p)->gen; FORLIM = LINK->nfirst; for (first = 1; first <= FORLIM; first++) { if (WITH1->genarray[first - 1] != 0.0) { segval = 0.0; LINK->fseg = first; second = 1; WITH2 = (*LINK->q)->gen; FORLIM1 = LINK->nsecond; for (second = 0; second < FORLIM1; second++) { if (WITH2->genarray[second] != 0.0) { LINK->sstart = probstart[second]; LINK->send = probend[second]; LINK->sseg = segstart[second]; if (mutsys != 0) segval += WITH2->genarray[second] * msegsex(LINK); else segval += WITH2->genarray[second] * segsex(LINK); } } WITH1->genarray[first - 1] *= segval * segscale; } } } else { WITH1 = (*LINK->p)->gen; FORLIM = LINK->nfirst; for (first = 0; first < FORLIM; first++) { if (WITH1->genarray[first] != 0.0) { segval = 0.0; LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; WITH2 = (*LINK->q)->gen; FORLIM1 = LINK->nsecond; for (second = 1; second <= FORLIM1; second++) { if (WITH2->genarray[second - 1] != 0.0) { LINK->sseg = second; if (mutsys != 0) segval += WITH2->genarray[second - 1] * msegsex(LINK); else segval += WITH2->genarray[second - 1] * segsex(LINK); } } WITH1->genarray[first] *= segval * segscale; } } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexup*/ Void oldsegup(LINK) struct LOC_seg *LINK; { double segval; long first, second; censorrec *WITH; thisarray *WITH1; thisarray *WITH2; initseg(LINK); WITH = censorstruct; WITH1 = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH1->genarray[first] != 0.0) { segval = 0.0; LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; WITH2 = (*LINK->q)->gen; for (second = 0; second < fgeno; second++) { if (WITH2->genarray[second] != 0.0) { LINK->sstart = probstart[second]; LINK->send = probend[second]; LINK->sseg = segstart[second]; if (mutsys != 0) segval += WITH2->genarray[second] * msegfun(LINK); else segval += WITH2->genarray[second] * segfun(LINK); } } WITH1->genarray[first] *= segval * segscale; } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segup*/ fastlink-4.1P-fix95/4.1P/src/outbuff.c0000644000265600020320000000400406737460342016437 0ustar tilleaadmin/* outbuff.c -- Support code for outBuff class Random access buffer for output in iterpeds() loop of parallel MLINK and LINKMAP. Output from iterations on different processors is buffered so it can be written out in the specific order intended, as opposed to the order it is produced. */ #include "commondefs.h" /* outBuff object "constructor". Determines the number of calls to iterpeds(), and allocates space for an array of strBuffs. */ outBuff* newOutBuff() { int i; outBuff* newBuff; /* Allocate space for our buffer */ #if PARALLEL newBuff = (outBuff*) Tmk_malloc(sizeof(outBuff)); if (newBuff == NULL) Tmk_errexit("MALLOC ERROR - newOutBuff\n"); newBuff->numIpeds = numIpeds; newBuff->ipeds = (strBuff**) Tmk_malloc(numIpeds * sizeof(strBuff*)); if (newBuff->ipeds == NULL) Tmk_errexit("MALLOC ERROR - newBuff->ipeds"); #else /* if PARALLEL */ newBuff = (outBuff*) malloc(sizeof(outBuff)); if (newBuff == NULL) errExit("couldn't malloc newBuff"); newBuff->numIpeds = numIpeds; newBuff->ipeds = (strBuff**) calloc(numIpeds, sizeof(strBuff*)); if (newBuff->ipeds == NULL) errExit("couldn't malloc newBuff->ipeds"); #endif /* if PARALLEL */ for (i = 0; i < numIpeds; i++) newBuff->ipeds[i] = newStrBuff(); return newBuff; } /* initialize outBuffs for all 3 outfiles */ void initOutBuffs() { stdoutBuff = newOutBuff(); outfileBuff = newOutBuff(); streamBuff = newOutBuff(); #if PARALLEL Tmk_distribute((char*) &stdoutBuff, sizeof(stdoutBuff)); Tmk_distribute((char*) &outfileBuff, sizeof(outfileBuff)); Tmk_distribute((char*) &streamBuff, sizeof(streamBuff)); #endif /* if PARALLEL */ } /* write an outBuff out to its appropriate file */ void writeBuff(oBuff, f) outBuff* oBuff; FILE* f; { int i; for (i = 0; i < numIpeds; i++) fprintf(f, oBuff->ipeds[i]->string); } /* write all three buffd files out */ void writeOutBuffs() { writeBuff(stdoutBuff, stdout); writeBuff(outfileBuff, outfile); writeBuff(streamBuff, stream); } fastlink-4.1P-fix95/4.1P/src/slowautomodified.c0000644000265600020320000007200210517437642020344 0ustar tilleaadmin/* This file contains new versions of the routines segup, segdown, */ /* and some auxiliary routines for use with */ /* LODSCORE, ILINK, LINKMAP, and MLINK */ /* The modifications are described in the papers: */ /* R. W. Cotiingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237. */ /* The versions in this file do not incorporate some of the changes */ /* described in the paper that require lots of memory */ /* Faster versions that use more memory are in automodified.c */ /*Most of the code in this file was written by R. M. Idury*/ #include "commondefs.h" /*segsum2 is used in segup to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class of both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ Local void segsum2(first,second,fslength) unsigned first,second, fslength; { int g1, g2, g3, g4; /*indices to store gene numbers*/ int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM = fence[first]; /*end of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ /*iterate over isozygotes of i*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1] + tempwith3[g3 - 1] + tempwith3[g4 - 1]); } index++; /*increment isozygote class counter*/ } } } /*segsumdown2 is used in segdown to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class for both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ Local void segsumdown2(first,second,fslength) unsigned first,second, fslength; { int g1, g2, g3, g4; /*indices to store gene numbers*/ int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int index2; /*used as index for isozygote class*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM = fence[first]; /*end of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ index2 = 0; /*iterate over isozygotes of i*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*store these gene numbers for later use; the key point is that we will want these numbers consecutively later, so we store them consecutively in segindex*/ segindex[index2++] = g1; segindex[index2++] = g2; segindex[index2++] = g3; segindex[index2++] = g4; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1] + tempwith3[g3 - 1] + tempwith3[g4 - 1]); } index++; /*increment isozygote class counter*/ } } } /*lsegfun2 does a logical test similar to the computation done in the original segfun to determine whether segfun would return 0.0. If segfun would return 0.0, then lsegfun2 return 0 (FALSE), while if segfun would not return 0.0., lsegfun2 returns 1 (TRUE). Given, a combined isozygote class, we want to know whether any elements of that isozygote class are possible joint genotypes for the parents. This will be the case if and only if each child has a nonzero probability for at least one of the joint genotypes that the parents can produce given their isozygote class. first and second are the joint genotypes for the parents.*/ unsigned lsegfun2(first,second) unsigned first, second; { int g1, g2, g3, g4; /*four gene numbers*/ int i, j, k; /* loop indices*/ int f1, f2, s1, s2; /*haplotype numbers*/ int FORLIM; /*loop bound*/ int FORLIM1, FORLIM2; /*loop bounds*/ int *TEMPGENE1, *TEMPGENE2; /* store pointers into genenumber*/ unsigned char *tempflag3; /*stores sparsity pattern for child's genarray*/ FORLIM = fence[first]; /*find end of isozygote class for first*/ FORLIM1 = base[second];/*find beginning and end of isozygote class for second*/ FORLIM2 = fence[second]; /*try to find a non-zero value for each child*/ for (k = 0; k < nchild; k++) { /*code for the non-boolean version is shown in comments tempwith3 = thischild[k]->genarray;*/ /*retrieve sparsity pattern for child k*/ tempflag3 = thischild[k]->sparseflag; /*iterate over all recombined isozygotes of first*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve the haplotypes of this genotype*/ f2 = haps2[i]; TEMPGENE1 = genenumber[f1 - 1];/*get pointer into genenumber for this haplotype*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over all the recombined isozygotes of second*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*get haplotypes of this genotype*/ s2 = haps2[j]; /*retrieve the four genes that this combination of joint haplotypes can produce*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*if(tempwith3[g1 - 1] != 0.0 || tempwith3[g2 - 1] != 0.0 || tempwith3[g3 - 1] != 0.0 || tempwith3[g4 - 1] != 0.0) goto notzero;*/ /*if any of the flags is TRUE, then this child can have this genotype, and we move immediately to testing the next child*/ if(tempflag3[g1 - 1] != 0 || tempflag3[g2 - 1] != 0 || tempflag3[g3 - 1] != 0 || tempflag3[g4 - 1] != 0) goto notzero; } } return 0; /*this child failed to have any of the genotypes for the isozygote class, so this isozygote class is not possible*/ notzero: continue; } return 1; /*all children passed the test and have a possible joint genotype*/ } /*segup updates the genotype probabilities for a parent (p) based on the probabilities of children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children*/ Void segup(LINK) struct LOC_seg *LINK; { int findex, sindex; int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ double val, temp1; /*temporaries to store intermediate values*/ int i, j, first, second; /*genotype indices*/ int fslength; /*size of product isozygote class for p and q*/ int k; /*index to loop over children*/ char skip; /*used to skip iterations of a loop*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr, *newsegr; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for p*/ thetavalues *WITH5; /*store theta values for q*/ boolean depend; /*used to handle loops*/ unsigned char *newflag2, *newflag3; /*store sparsity patterns for p and q genarrays*/ /* newsegprob, newsegprob1, and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob1, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p and q genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get genarray for p*/ newwith3=WITH3->genarray; /*get genarray for q*/ WITH4 = LINK->firstsex; /*get recomb. probabilities for p*/ WITH5 = LINK->secondsex; /*get recomb. probabilities for q*/ /*The case of 1 child is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ { /*nchild is bigger than 1*/ /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilities needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob1 = WITH4->segprob; /*get p recomb. probabilities*/ newsegprob2 = WITH5->segprob; /*get q recomb. probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < fgeno; first += step1) { /*number of distinct probabilties needed for first's isoz. class*/ step1 = probend[first] - probstart[first] + 1; skip = 1; /*work only on those isozygotes that are possible*/ for(i = first; i < first+step1; i++) if(newflag2[i] != 0) { skip = 0; break; /*go to next isozygote in class*/ } if(skip) continue; /*initialize update multiple for each isozygote in class*/ for(i = 0; i < step1; i++) segval[i] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; fslength = step1 * step2; /*number of probs. for combined isozygote class*/ /*call segsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsum2(first,second,fslength); newsegr = tempseg2; tempprob = tempseg; for(k = 0; k < nchild; k++) { for(i = 0; i < step1; i++) { newwithr = tempprob; findex = probstart[first+i]-1; temp1 = newsegprob1[findex]; for(sindex = 0; sindex < step2; sindex++) newsegr[sindex] = temp1*(*newwithr++); FORLIM = probend[first+i]; for(findex++; findex < FORLIM; findex++) { temp1 = newsegprob1[findex]; for(sindex = 0; sindex < step2; sindex++) newsegr[sindex] += temp1*(*newwithr++); } newsegr += step2; } tempprob += fslength; } /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) continue; /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the tempseg array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = 1.0; newwithr = tempseg2 + i*step2; tempprob = newsegprob2 + probstart[second+j] - 1; for(k = 0; k < nchild; k++) { temp1 = 0.0; for(sindex = 0; sindex < step2; sindex++) temp1 += tempprob[sindex] * newwithr[sindex]; val *= temp1; newwithr += fslength; } /*update segval entry for this isozygote of first*/ segval[i] += newwith3[second+j] * val; } } } /*update p's genarray for each isozygote in this class*/ for(i = 0; i < step1; i++) newwith2[first+i] *= segval[i] * segscale; } } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < fgeno; i++) if((newflag2[i] != 0) && (newwith2[i] == 0.0)) newflag2[i] = 0; /*Added by Alex to handle loops */ if (loopfirstgen && (!(*LINK->p)->loopdepend)) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->p)->loopdepend = depend; (*LINK->p)->loopneeded = false; } } if ((*LINK->p)->loopdepend) { if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segup*/ /* segdown updates the genotype probabilities for a child based on the probabilities of parents and other children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children */ Void segdown(LINK) struct LOC_seg *LINK; { unsigned int findex, sindex; int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ double valtemp; /*intermediate value in probability updates*/ double val, temp1; /*temporaries to store intermediate values*/ int f1,f2; int here, i, j, first, second; /*genotype indices*/ int fslength; /*number of probs. for product isoz. class of p,q*/ int jointisoindex; /*index to work within isozygote classes*/ int currentindex; /*index to update genarray within isozygote class*/ int k; /*index to loop over children*/ char skip; /*used to skip iterations of a loop*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr, *newsegr, *newwithc; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for p*/ thetavalues *WITH5; /*store theta values for q*/ int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ /* newsegprob, newsegprob1, and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob, *newsegprob1, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ boolean depend; /*used to handle loops*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p, q, and child genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; newflagr = (*LINK->r)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ newwithr = (*LINK->r)->gen->genarray; /*get genarray for first child*/ WITH4 = LINK->firstsex; /*get p recomb. probabilities*/ WITH5 = LINK->secondsex; /*get q recomb. probabilities*/ /*The case of 1 child (nchild==0) is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 0) { /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; psumcache[i] = 0.0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ for(i = 0; i < fgeno; i++) { gene[i] = 0.0; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } /*This section of the code precomputes for each haplotype the the probability that the child will inherit this haplotype from p. Each genotype has two haplotypes, but can produce others by recombination. Therefore, for each genotype we must sum over the different haplotypes that can be produced by its isozygote class. The contributions for each haplotype are stored in psumcache. Afterwards a similar computation is done for the inheritance from q with the results stored in qsumcache.*/ newsegprob = WITH4->segprob; /*get probabilities for recomb. patterns for p*/ for (first = 0; first < fgeno; first++) { if(newflag2[first] == 0) continue; /*use only possible genotypes*/ FORLIM = fence[first]; /*find end of isozygote class of first*/ valtemp = newwith2[first]; /*probability of getting this genotype*/ /*iterate over all members of first's isozygote calss*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*get haplotypes*/ f2 = haps2[i]; if ((flag[f1-1] !=0) || (flag[f2-1] != 0)) { /*get probability offset for i*/ /*multiply probability of getting genotype times probability of this recombination pattern and haplo. choice*/ val = valtemp * newsegprob[hind[i]]; /*add to psumcache*/ if(flag[f1-1] != 0) { psumcache[f1-1] += val; } if(flag[f2-1] != 0) { psumcache[f2-1] += val; } } } } newsegprob = WITH5->segprob; /*get probabilities for q*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] !=0) || (flag[f2-1] !=0)) { /*condition probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ /*get probability offset for i*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the child based on the probabilities for the parents*/ /*Iterate over all joint genotypes of the child*/ for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*probability of child getting genotype here as a result of p passing on c1 and q passing on c2 is summed to gene[here] */ gene[here] += psumcache[c1-1] * qsumcache[c2-1]; /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { gene[here] += psumcache[c2-1] * qsumcache[c1-1]; } } /*set up new genarray for r; it is gene scaled by segscale*/ for (first = 0; first < fgeno; first++) { if(newflagr[first] == 0) continue; if(gene[first] == 0.0) newflagr[first] = 0; newwithr[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 0*/ /*initialize genarray entries for child to 0*/ for(i = 0; i < fgeno; i++) { gene[i] = 0.0; } /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; newwith3=(*LINK->q)->gen->genarray; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob1 = WITH4->segprob; /*get p probabilities*/ newsegprob2 = WITH5->segprob; /*get q probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < fgeno; first += step1) { /*number of distinct probabilties needed for first's isoz. class*/ step1 = probend[first] - probstart[first] + 1; skip = 1; /*work only on those isozygotes that are possible*/ for(i = first; i < first+step1; i++) if(newflag2[i] != 0) { skip = 0; break; /*go to next isozygote in class*/ } if(skip) continue; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; fslength = step1 * step2; /*number of probs. of combined isozygote class*/ /*call segsumdown2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsumdown2(first,second,fslength); for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) segval[jointisoindex] = 0.0; newsegr = tempseg2; tempprob = tempseg; for(k = 0; k < nchild; k++) { for(i = 0; i < step1; i++) { newwithr = tempprob; findex = probstart[first+i]-1; temp1 = newsegprob1[findex]; for(sindex = 0; sindex < step2; sindex++) newsegr[sindex] = temp1*(*newwithr++); for(findex++; findex < probend[first+i]; findex++) { temp1 = newsegprob1[findex]; for(sindex = 0; sindex < step2; sindex++) newsegr[sindex] += temp1*(*newwithr++); } newsegr += step2; } tempprob += fslength; } /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) { continue; } /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ /*combine for all children*/ val = 1.0; newwithc = tempseg2 + i * step2; tempprob = newsegprob2 + probstart[second+j] - 1; for(k = 0; k < nchild; k++) { temp1 = 0.0; for(sindex = 0; sindex < step2; sindex++) temp1 += tempprob[sindex] * newwithc[sindex]; val *= temp1; newwithc += fslength; } /*probability of this combination of parent genotypes*/ val *= newwith2[first+i] * newwith3[second+j]; jointisoindex = 0; for(findex = probstart[first+i]-1; findex < probend[first+i]; findex++) for(sindex = probstart[second+j]-1; sindex < probend[second+j]; sindex++) /*probability of this recombination pattern (based on other children)*/ segval[jointisoindex++] += newsegprob1[findex] * newsegprob2[sindex] * val; } } /*update the probabilities of four joint genotypes the child might get; each different choice of recombination pattern will lead to a different set of four genotypes*/ currentindex = 0; for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) { temp1 = segval[jointisoindex]; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; } } } /*finally update child's real genarray by coppy gene multiplied by scale factor segscale*/ newwithr = (*LINK->r)->gen->genarray; /*get genarray for first child*/ for(i = 0; i < fgeno; i++) { if(gene[i] == 0.0) newflagr[i] = 0; /*if probability changes from nonzero to 0.0 change flag to 0*/ newwithr[i] *= segscale * gene[i]; } } /*Added by A. A. Schaffer to handle loops */ if (loopfirstgen && (!((*LINK->r)->loopdepend))) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->p)->loopdepend) || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->r)->loopdepend = depend; (*LINK->r)->loopneeded = false; } } if ((*LINK->r)->loopdepend) { if (!((*LINK->p)->loopdepend)) (*LINK->p)->loopneeded = true; if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->p, LINK->LINK); cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segdown*/ fastlink-4.1P-fix95/4.1P/src/ilgetvect.c0000644000265600020320000000402006737460341016750 0ustar tilleaadmin/* This file contains the low-level probability routines in */ /* a modified version of the ILINK program*/ #include "commondefs.h" /* Local variables for getvect: */ struct LOC_getvect { struct LOC_likelihood *LINK; thisperson *p; hapvector hap1, hap2; } ; /*Local Void getgene PP((int syste, double val, struct LOC_getvect *LINK)); Local Void ugetgene PP((int syste, double val, struct LOC_getvect *LINK));*/ /*static void getgene (int syste, double val, struct LOC_getvect *LINK); static void ugetgene (int syste, double val, struct LOC_getvect *LINK);*/ static void getgene (); static void ugetgene (); Local double quanfun(phen, thislocus, i, j, mean, LINK) phenotype *phen; locusvalues *thislocus; int i, j; double *mean; struct LOC_getvect *LINK; { double val; int it, jt, FORLIM, FORLIM1; val = 1.0; if (phen->missing) return val; val = 0.0; FORLIM = thislocus->UU.U1.ntrait; for (it = 0; it < FORLIM; it++) { FORLIM1 = thislocus->UU.U1.ntrait; for (jt = 0; jt < FORLIM1; jt++) { if (i == j) val += thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); else val += thislocus->UU.U1.conmat * thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); } } val = thislocus->UU.U1.det * exp(-val * 0.5); if (i != j) val *= thislocus->UU.U1.contrait; return val; } /*quanfun*/ Local Void getval(syste, i, j, val, LINK) int syste, i, j; double *val; struct LOC_getvect *LINK; { locusvalues *WITH; phenotype *WITH1; WITH = thislocus[syste - 1]; switch (WITH->which) { case quantitative: *val *= quanfun(LINK->p->phen[syste - 1], thislocus[syste - 1], i, j, WITH->UU.U1.pm[i][j - 1], LINK); break; case affection: WITH1 = LINK->p->phen[syste - 1]; *val *= WITH->UU.U0.pen[i][j - 1][WITH1->aff] [WITH1->liability - 1]; break; /* cgh -- gcc warning fix */ case binary_: case null_: default: break; } } /*getval*/ #include "comgetvect.c" fastlink-4.1P-fix95/4.1P/src/ildefs.h0000644000265600020320000000200306737460341016234 0ustar tilleaadmin#ifndef _ILDEFS_H #define _ILDEFS_H 1 /* Output from p2c, the Pascal-to-C translator */ /* From input file "ilink.p" */ /* This file cocntains definitions for a modified version of the ILINK program*/ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, Human Heredity */ /* 44(1994), pp. 225-237. */ #ifndef _COMMONDEFS_H #include #endif #define scale 3.0 /*SCALE FACTOR*/ #ifndef byfamily #define byfamily false #endif #define epsilon 1.0e-6 boolean inconsistent; extern FILE *outfile, *ipedfile, *datafile, *stream, *speedfile; /*ILINK*/ extern FILE *final; boolean penalty; double penlike; /*GEMINI*/ enum { go, quit, restart } continue_; #endif /* _ILDEFS_H */ fastlink-4.1P-fix95/4.1P/src/Makefile0000644000265600020320000007653306737460342016301 0ustar tilleaadmin# Makefile for FASTLINK 3.0P # Chris Hyams (cgh@cs.rice.edu) # # History: # 5/23/95 cgh -- created # 6/7/95 cgh -- added comments for v2.3P beta release # 7/17/95 cgh -- updated for portability to most versions of make # consolidated Makefile.common # 7/18/95 cgh -- added VMS-specific section written by # Kimmo Kallio (Kimmo.Kallio@ktl.fi) # 12/95 aas -- eliminated MAXWORKINGSET and maxhap # 2/97 Anna Becker/aas -- added llopbrk.c for use in unknown # # Please read the file README.makefile that came # with your FASTLINK distribution for an overview # on using this Makefile # If you plan to run parallel FASTLINK, please refer # to README.parallel for more details. # One note: # Most versions of make allows you to override Makefile variables # from the command line. This Makefile includes a variable EXTRAFLAGS # that is intentionally left empty to allow you to add command-line # flags without editing the Makefile. EXTRAFLAGS is automatically # passed to each of the different targets. # # For example, if you wanted to pass along an additional include # directive to the compiler when making ILINK, you could type: # # make ilink EXTRAFLAGS="-I/usr/ucb/include -I/usr/lib/include" # # Note that if you want to add more than one flag, you need to protect # the argument in double quotes (") as above. ###################################################### ################## Miscellaneous ##################### ###################################################### # The following variables apply to compilation of # *both* sequential *and* parallel FASTLINK # Destination bin directory for executables. Note: this # directory *must* exist, or compilation will fail during # linkage. BINDIR = ./ # Compiler optimization flag. Comment this out # if your compiler OPTFLAG = -O # If you use the cc compiler, uncomment this flag # to use K&R style function prototypes. # Note: FASTLINK will *not* compile under cc without # this flag set. #PROTO = -DKNR_PROTO # System-dependent compilation flags. # - Uncomment -DSOLARIS here if you are compiling on a # Sun Solaris platform. # - If you are using gcc under SunOS 4.1.x, you can # use -DSUNOS_4_1_X_GCC to get rid of compiler # warnings. # - Uncomment -D_POSIX_SOURCE if you are compiling for AIX. # - If you have other system-specific compiler flags that you # need to pass to FASTLINK, uncomment the line "SYSDEP =", # and add the flag there. # Otherwise, leave this alone. #SYSDEP = -DSUNOS_4_1_X_GCC #SYSDEP = -DSOLARIS #SYSDEP = -D_POSIX_SOURCE #SYSDEP = ###################################################### ############### Sequential Code Variables ############ ###################################################### # Edit the following when compiling sequential FASTLINK. # C compiler for sequential code CC = gcc # Uncomment this if you are compiling for DOS, or if # you want to turn off checkpointing in FASTLINK. #CKPT = -DDOS ###################################################### ############ Parallel Code Variables ################# ###################################################### # These variables apply only to parallel FASTLINK. # C compiler for parallel code PARCC = cc # Parallel support library. # If you are using TreadMarks, leave these # commented out. # If you are using P4 or PARMACS, uncomment the # appropriate variable. Make sure that no more than # one of the following lines is uncommented! #PARLIB = -DIS_PARMACS=1 PARLIB = -DIS_P4=1 # Parallel include path. # If you are using TreadMarks or P4, uncomment the # appropriate variable. If you are using PARMACS, # comment these out, or supply your own, appropriate path. # Make sure that no more than one of these variables # is uncommented! #PARINCLPATH = -I$(TmkDIR)/include #PARINCLPATH = -I$(P4_INCLDIR) ########### TreadMarks specifics ############### # Set this to the root directory of your TreadMarks installation TmkDIR = /net/blitzen/Tmk-0.9.6.FASTLINK # Target architecture. # For example, if your TreadMarks library is in # $(TmkDIR)/lib.mips, you should set this variable # to mips. Consult your TreadMarks documentation # for more details. ARCH = sparc # If you are using TreadMarks on an ATM network, # set this to the location of libatm.a on your # system. ATMDIR = /usr/fore/lib ########### p4 specifics ####################### # Set this to the root of your p4 installation P4_HOME_DIR = /usr/local/lib/p4 # Uncomment this if you are running in parallel on SOLARIS # This is *very* important -- FASTLINK will not compile # without it. #P4_MDEP_LD = -lsocket -lnsl -lthread ######### Parallel C Compiler Flags ############# # Edit the following variables when compiling # parallel FASTLINK to suit your particular run. # # There are 3 sets of variables provided -- one each for # ILINK, MLINK, and LINKAP. The variables are # **PARMEM, **PRECOMP, where ** represents one of IL, ML, # or LI, for ILINK, MLINK and LINKMAP respectively. # They are briefly described below. Please refer to the # files README.constants, README.memory, README.parallel, # and README.makefile for more details. # # **PARMEM # Defines the variable LESSMEMORY, instructing FASTLINK # to use an alternate algorithm which requires less memory, # but is slower. Please refer to the README.memory # and README.makefile for details. # Uncomment this if you wish to use less memory. # Note: setting this value to 0 *or* 1 will both have the # same effect of defining LESSMEMORY. If you don't want # less memory, be sure to comment this out. # **PRECOMPUTE # Defines the variable PRECOMPUTE as 1 or 0. PRECOMPUTE=1 # instructs FASTLINK to use an alternate algorithm which # requires more memory, and is faster. PRECOMPUTE=0 # uses the normal approach. Please refer to the README.makefile, # and README.parallel for details. # Unlike **PARMEM, this value must be set to 0 or 1. ### ILINK flags -- used when ILFLAGS is chosen # edit these as you wish #ILPARMEM = -DLESSMEMORY ILPRECOMP = -DPRECOMPUTE=1 ### MLINK flags -- used when MLFLAGS is chosen # edit these as you wish #MLPARMEM = -DLESSMEMORY MLPRECOMP = -DPRECOMPUTE=1 ## LINKMAP flags -- used when LIFLAGS is chosen # edit these as you wish #LIPARMEM = -DLESSMEMORY LIPRECOMP = -DPRECOMPUTE=1 ###################################################### ############ Unix Utilities on Your System ########### ###################################################### # If any of the following utilities are different on # your system, you can change them here. # RM is used for "make clean", so if you want to # use that, you'll need something defined here. RM = rm -f ###################################################### ################## VMS Specific ###################### ###################################################### # 18-Jul-1995 Kimmo Kallio (Kimmo.Kallio@ktl.fi) # Uncomment following lines if compiling on VMS # system, up to (but not including) the line that starts # "END: VMS". # #CC = mcr sys$disk:[]maketool_vms. #BINDIR = #%ifndef CKPT ## ## If CKPT is not defined, use empty value ## #CKPT = #%endif # ## Unix C-compiler environment, not needed on VMS #PROTO = #SYSDEP = #CFLAGS = #SMALLCFLAGS = #OPTFLAG = #LDFLAGS = #DEBUGFLAG = #WARNFLAG = #BAR_OUT = #LOAD_OUT = # ## Parallel stuff, not in use on VMS #PARCC = #PARLIB = #PARINCLPATH = #P4_INCLDIR = #P4_MDEP_LD = #MDEP_LIBS = #PARDEBUG = #PARTHETAS = #ILPARMEM = #MLPARMEM = #LIPARMEM = #DO_LOAD = # #vmsfast: maketool_vms installfast # #vmsslow: maketool_vms installslow # #vmscleanexe: # delete/log ilink.;* # delete/log mlink.;* # delete/log linkmap.;* # delete/log lodscore.;* # #vmsclean: # purge/log *.o,*./exclude=(makefile.) # #maketool_vms: maketool_vms.c # @maketool_vms "-O maketool_vms maketool_vms.c" # # END: VMS -- uncomment lines above here for VMS # ############################################################ #/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\# ############################################################ # # # You shouldn't need to change anything beyond this point. # # # ############################################################ #/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\# ############################################################ ###################################################### ################## miscellaneous ##################### ###################################################### # "Slow" compiler flag SFLAG = -DLESSMEMORY # Extra flags passed to each target. Do not change this! EXTRAFLAGS = ###################################################### ############### sequential code variables ############ ###################################################### # For debugging #DEBUGFLAG = -g # Compiler flags for sequential code CFLAGS = \ $(CKPT) \ $(DEBUGFLAG) \ $(EXTRAFLAGS) \ $(OPTFLAG) \ $(PROTO) \ $(SYSDEP) \ $(WARNFLAG) # For sequential programs that don't take -DDOS, etc. SMALLCFLAGS = \ $(DEBUGFLAG) \ $(EXTRAFLAGS) \ $(OPTFLAG) \ $(PROTO) \ $(SYSDEP) \ $(WARNFLAG) # Linker flags LDFLAGS = -lm ###################################################### ############ parallel code variables ################# ###################################################### ################# TreadMarks stuff ################### # TreadMarks library location TmkLIB = $(TmkDIR)/lib.$(ARCH) # TreadMarks profiling directories PROFDIR = /home/rrk/Ymk PROFLIB = $(PROFDIR)/$(ARCH) LIBPERF = /home/rrk/Ymk/gdb-4.13 ################# P4 stuff ########################### # p4 include path, library directory, and libraries P4_INCLDIR = $(P4_HOME_DIR)/include P4_LIBDIR = $(P4_HOME_DIR)/lib P4_LIBS = $(P4_LIBDIR)/libp4.a $(MDEP_LIBS) ################# linker flags ####################### # LDFLAGS for each library ATMLD = $(LDFLAGS) -L$(TmkLIB) -lTmk_atm -L$(ATMDIR) -latm UDPLD = $(LDFLAGS) -L$(TmkLIB) -lTmk_udp P4LD = $(LDFLAGS) -L$(P4_LIBDIR) -lp4 $(P4_MDEP_LD) ########### Various compiler flags ################### # Parallel flag DOPAR = -DPARALLEL=1 # Supress checkpointing NOCKPT = -DDOS # Supress Barrier output #BAR_OUT = -DBARRIER_OUTPUT=0 # Debugging #PARDEBUG = -g3 # Do parallel thetas #PARTHETAS = -DDO_PARALLELTHETAS=0 # Turn off loadbalancing # not needed now because set to 0 in commondefs.h #DO_LOAD = -DDO_LOADBALANCE=0 # Suppress loadbalance output #LOAD_OUT = -DLOADBALANCE_OUTPUT=0 # Compiler warnings #WARNFLAG = -Wall ############## parallel CFLAGS ######################## # Required parallel flags PARFLAGS = \ $(BAR_OUT) \ $(PARDEBUG) \ $(DO_LOAD) \ $(DOPAR) \ $(EXTRAFLAGS) \ $(LOAD_OUT) \ $(OPTFLAG) \ $(NOCKPT) \ $(PARINCLPATH) \ $(PARLIB) \ $(PARTHETAS) \ $(PROTO) \ $(SYSDEP) \ $(WARNFLAG) # parallel ILINK CFLAGS ILCFLAGS = \ $(ILPARMEM) \ $(ILPRECOMP) \ $(PARFLAGS) # parallel MLINK CFLAGS MLCFLAGS = \ $(MLPARMEM) \ $(MLPRECOMP) \ $(PARFLAGS) # parallel LINKMAP CFLAGS LICFLAGS = \ $(LIPARMEM) \ $(LIPRECOMP) \ $(PARFLAGS) # Program-specific CFLAGS PARILCFLAGS = $(ILCFLAGS) -DILINK PARMLCFLAGS = $(MLCFLAGS) -DMLINK PARLICFLAGS = $(LICFLAGS) -DLINKMAP ###################################################### ################# common object files ################ ###################################################### # Object files common to all sequential programs, # each of which has a "slow" counterpart. FASTCOMOBJS = \ automodified.o \ comlike.o \ sexmodified.o # "Slow" versions of FASTCOMOBJS. SLOWCOMOBJS = \ slowautomodified.o \ slowcomlike.o \ slowsexmodified.o ###################################################### ################# ILINK object files ################# ###################################################### # Object files common to "fast" and "slow" versions of ILINK. ILCOMOBJS = \ iliostuff.o \ ilcheck.o \ ilcominputcode.o \ ilcomrec.o \ ilgetvect.o \ ilinputcode.o \ iloldnuclear.o # "Fast" versions of ILINK-specific object files that # have corresponding "slow" versions FASTILOBJS = \ ilcommoncode.o \ ilink.o # Object files for "fast" ILINK. ILOBJS = \ $(ILCOMOBJS) \ $(FASTCOMOBJS) \ $(FASTILOBJS) # Object files for "slow" ILINK ILSLOWOBJS = \ $(ILCOMOBJS) \ $(SLOWCOMOBJS) \ slowilcommoncode.o \ slowilink.o # Object files for parallel ILINK PARILOBJS = \ parilcominputcode.o \ parilcomlike.o \ parilcommoncode.o \ parilcompar.o \ parilcomrec.o \ parilgetvect.o \ parilink.o \ parilinputcode.o \ pariliostuff.o \ parilmodified.o \ pariloldnuclear.o ###################################################### ################ LINKMAP object files ################ ###################################################### # Object files common to "fast" and "slow" versions of LINKMAP. LICOMOBJS = \ liiostuff.o \ licheck.o \ licominputcode.o \ licomrec.o \ ligetvect.o \ liinputcode.o \ lioldnuclear.o # "Fast" versions of LINKMAP-specific object files that # have corresponding "slow" versions FASTLIOBJS = \ licommoncode.o \ linkmap.o # Object files for "fast" LINKMAP. LIOBJS = \ $(LICOMOBJS) \ $(FASTCOMOBJS) \ $(FASTLIOBJS) # Object files for "slow" LINKMAP LISLOWOBJS = \ $(LICOMOBJS) \ $(SLOWCOMOBJS) \ slowlicommoncode.o \ slowlinkmap.o # Object files for parallel LINKMAP PARLIOBJS = \ parlicheck.o \ parlicominputcode.o \ parlicomlike.o \ parlicommoncode.o \ parlicomoutput.o \ parlicompar.o \ parlicomrec.o \ parligetvect.o \ parliinputcode.o \ parliiostuff.o \ parlimodified.o \ parlinkmap.o \ parlioldnuclear.o \ parlioutbuff.o \ parlistrbuff.o ###################################################### ################# MLINK object files ################# ###################################################### # Object files common to "fast" and "slow" versions of MLINK. MLCOMOBJS = \ mliostuff.o \ mlcheck.o \ mlcominputcode.o \ mlcomrec.o \ mlgetvect.o \ mlinputcode.o \ mloldnuclear.o # "Fast" versions of MLINK-specific object files that # have corresponding "slow" versions FASTMLOBJS = \ mlcommoncode.o \ mlink.o # Object files for "fast" MLINK. MLOBJS = \ $(MLCOMOBJS) \ $(FASTCOMOBJS) \ $(FASTMLOBJS) # Object files for "slow" MLINK MLSLOWOBJS = \ $(MLCOMOBJS) \ $(SLOWCOMOBJS) \ slowmlcommoncode.o \ slowmlink.o # Object files for parallel MLINK PARMLOBJS = \ parmlcheck.o \ parmlcominputcode.o \ parmlcomlike.o \ parmlcommoncode.o \ parmlcomoutput.o \ parmlcompar.o \ parmlcomrec.o \ parmlgetvect.o \ parmlink.o \ parmlinputcode.o \ parmliostuff.o \ parmlmodified.o \ parmloldnuclear.o \ parmloutbuff.o \ parmlstrbuff.o ###################################################### ############### LODSCORE object files ################ ###################################################### # Object files common to "fast" and "slow" versions of LODSCORE. LOCOMOBJS = \ loiostuff.o \ locheck.o \ locomrec.o \ logetvect.o \ loinputcode.o \ looldnuclear.o LOOBJS = \ $(LOCOMOBJS) \ automodified.o \ locomlike.o \ sexmodified.o \ lodscore.o LOSLOWOBJS = \ $(LOCOMOBJS) \ slowautomodified.o \ slowlocomlike.o \ slowsexmodified.o \ slowlodscore.o ###################################################### #################### targets ######################### ###################################################### # Executables FASTEXE = lodscore ilink linkmap mlink unknown SLOWEXE = slowlodscore slowilink slowlinkmap slowmlink unknown UDPEXE = ilink.udp linkmap.udp mlink.udp unknown ATMEXE = ilink.atm linkmap.atm mlink.atm unknown P4EXE = ilink.p4 linkmap.p4 mlink.p4 unknown CLEANEXE = \ $(BINDIR)/lodscore \ $(BINDIR)/ilink \ $(BINDIR)/linkmap \ $(BINDIR)/mlink \ $(BINDIR)/slowlodscore \ $(BINDIR)/slowilink \ $(BINDIR)/slowlinkmap \ $(BINDIR)/slowmlink \ $(BINDIR)/ofm \ $(BINDIR)/unknown installfast: $(FASTEXE) installslow: $(SLOWEXE) installudp: $(UDPEXE) installatm: $(ATMEXE) installp4: $(P4EXE) ################## sequential targets ############### ilink: $(ILOBJS) $(CC) $(CFLAGS) $(ILOBJS) -o $(BINDIR)/ilink $(LDFLAGS) slowilink: $(ILSLOWOBJS) $(CC) $(CFLAGS) $(SFLAG) $(ILSLOWOBJS) -o $(BINDIR)/ilink $(LDFLAGS) lodscore: $(LOOBJS) $(CC) $(CFLAGS) $(LOOBJS) -o $(BINDIR)/lodscore $(LDFLAGS) slowlodscore: $(LOSLOWOBJS) $(CC) $(CFLAGS) $(SFLAG) $(LOSLOWOBJS) -o $(BINDIR)/lodscore $(LDFLAGS) linkmap: $(LIOBJS) $(CC) $(CFLAGS) $(LIOBJS) -o $(BINDIR)/linkmap $(LDFLAGS) slowlinkmap: $(LISLOWOBJS) $(CC) $(CFLAGS) $(SFLAG) $(LISLOWOBJS) -o $(BINDIR)/linkmap $(LDFLAGS) mlink: $(MLOBJS) $(CC) $(CFLAGS) $(MLOBJS) -o $(BINDIR)/mlink $(LDFLAGS) slowmlink: $(MLSLOWOBJS) $(CC) $(CFLAGS) $(SFLAG) $(MLSLOWOBJS) -o $(BINDIR)/mlink $(LDFLAGS) ofm: ofm.c $(CC) $(SMALLCFLAGS) ofm.c -o $(BINDIR)/ofm loopbrk.o: loopbrk.c unknown.h $(CC) $(SMALLCFLAGS) loopbrk.c -c -o loopbrk.o unknown.o: unknown.c unknown.h $(CC) $(SMALLCFLAGS) unknown.c -c -o unknown.o unknown: unknown.o loopbrk.o $(CC) $(SMALLCFLAGS) loopbrk.o unknown.o -o $(BINDIR)/unknown $(LDFLAGS) ################## parallel targets ############### ilink.atm: $(PARILOBJS) $(TmkLIB)/libTmk_atm.a $(PARCC) $(PARILCFLAGS) -o $(BINDIR)/$(@) $(PARILOBJS) $(ATMLD) ilink.udp: $(PARILOBJS) $(TmkLIB)/libTmk_udp.a $(PARCC) $(PARILCFLAGS) -o $(BINDIR)/$(@) $(PARILOBJS) $(UDPLD) ilink.p4: $(PARILOBJS) $(P4_LIBS) $(PARCC) $(PARILCFLAGS) -o $(BINDIR)/$(@) $(PARILOBJS) $(P4LD) linkmap.atm: $(PARLIOBJS) $(TmkLIB)/libTmk_atm.a $(PARCC) $(PARLICFLAGS) -o $(BINDIR)/$(@) $(PARLIOBJS) $(ATMLD) linkmap.udp: $(PARLIOBJS) $(TmkLIB)/libTmk_udp.a $(PARCC) $(PARLICFLAGS) -o $(BINDIR)/$(@) $(PARLIOBJS) $(UDPLD) linkmap.p4: $(PARLIOBJS) $(P4_LIBS) $(PARCC) $(PARLICFLAGS) -o $(BINDIR)/$(@) $(PARLIOBJS) $(P4LD) mlink.atm: $(PARMLOBJS) $(TmkLIB)/libTmk_atm.a $(PARCC) $(PARMLCFLAGS) -o $(BINDIR)/$(@) $(PARMLOBJS) $(ATMLD) mlink.udp: $(PARMLOBJS) $(TmkLIB)/libTmk_udp.a $(PARCC) $(PARMLCFLAGS) -o $(BINDIR)/$(@) $(PARMLOBJS) $(UDPLD) mlink.p4: $(PARMLOBJS) $(P4_LIBS) $(PARCC) $(PARMLCFLAGS) -o $(BINDIR)/$(@) $(PARMLOBJS) $(P4LD) ###################################################### ############## implicit rules for object files ####### ###################################################### ############## ILINK rules ilcheck.o: $(CC) $(CFLAGS) -DILINK -c check.c -o ilcheck.o ilcominputcode.o: $(CC) $(CFLAGS) -DILINK -c cominputcode.c -o ilcominputcode.o ilcommoncode.o: $(CC) $(CFLAGS) -DILINK -c commoncode.c -o ilcommoncode.o ilcomrec.o: $(CC) $(CFLAGS) -DILINK -c comrec.c -o ilcomrec.o ilgetvect.o: $(CC) $(CFLAGS) -DILINK -c ilgetvect.c -o ilgetvect.o ilink.o: $(CC) $(CFLAGS) -DILINK -c ilink.c -o ilink.o ilinputcode.o: $(CC) $(CFLAGS) -DILINK -c ilinputcode.c -o ilinputcode.o iliostuff.o: $(CC) $(CFLAGS) -DILINK -c iostuff.c -o iliostuff.o iloldnuclear.o: $(CC) $(CFLAGS) -DILINK -c iloldnuclear.c -o iloldnuclear.o slowilcommoncode.o: $(CC) $(CFLAGS) $(SFLAG) -DILINK -c commoncode.c -o slowilcommoncode.o slowilink.o: $(CC) $(CFLAGS) $(SFLAG) -c ilink.c -o slowilink.o parilcominputcode.o: $(PARCC) $(PARILCFLAGS) -c cominputcode.c -o parilcominputcode.o parilcomlike.o: $(PARCC) $(PARILCFLAGS) -c comlike.c -o parilcomlike.o parilcommoncode.o: $(PARCC) $(PARILCFLAGS) -c commoncode.c -o parilcommoncode.o parilcompar.o: $(PARCC) $(PARILCFLAGS) -c compar.c -o parilcompar.o parilcomrec.o: $(PARCC) $(PARILCFLAGS) -c comrec.c -o parilcomrec.o parilgetvect.o: $(PARCC) $(PARILCFLAGS) -c ilgetvect.c -o parilgetvect.o parilink.o: $(PARCC) $(PARILCFLAGS) -c ilink.c -o parilink.o parilinputcode.o: $(PARCC) $(PARILCFLAGS) -c ilinputcode.c -o parilinputcode.o pariliostuff.o: $(PARCC) $(PARILCFLAGS) -c iostuff.c -o pariliostuff.o parilmodified.o: $(PARCC) $(PARILCFLAGS) -c parmodified.c -o parilmodified.o pariloldnuclear.o: $(PARCC) $(PARILCFLAGS) -c iloldnuclear.c -o pariloldnuclear.o ############## LINKMAP rules licheck.o: $(CC) $(CFLAGS) -DLINKMAP -c check.c -o licheck.o licominputcode.o: $(CC) $(CFLAGS) -DLINKMAP -c cominputcode.c -o licominputcode.o licommoncode.o: $(CC) $(CFLAGS) -DLINKMAP -c commoncode.c -o licommoncode.o licomrec.o: $(CC) $(CFLAGS) -DLINKMAP -c comrec.c -o licomrec.o ligetvect.o: $(CC) $(CFLAGS) -DLINKMAP -c ligetvect.c -o ligetvect.o liinputcode.o: $(CC) $(CFLAGS) -DLINKMAP -c liinputcode.c -o liinputcode.o liiostuff.o: $(CC) $(CFLAGS) -DLINKMAP -c iostuff.c -o liiostuff.o linkmap.o: $(CC) $(CFLAGS) -DLINKMAP -c linkmap.c -o linkmap.o lioldnuclear.o: $(CC) $(CFLAGS) -DLINKMAP -c lioldnuclear.c -o lioldnuclear.o slowlicommoncode.o: $(CC) $(CFLAGS) $(SFLAG) -DLINKMAP -c commoncode.c -o slowlicommoncode.o slowlinkmap.o: $(CC) $(CFLAGS) $(SFLAG) -c linkmap.c -o slowlinkmap.o parlicheck.o: $(PARCC) $(PARLICFLAGS) -c check.c -o parlicheck.o parlicominputcode.o: $(PARCC) $(PARLICFLAGS) -c cominputcode.c -o parlicominputcode.o parlicomlike.o: $(PARCC) $(PARLICFLAGS) -c comlike.c -o parlicomlike.o parlicommoncode.o: $(PARCC) $(PARLICFLAGS) -c commoncode.c -o parlicommoncode.o parlicomoutput.o: $(PARCC) $(PARLICFLAGS) -c comoutput.c -o parlicomoutput.o parlicompar.o: $(PARCC) $(PARLICFLAGS) -c compar.c -o parlicompar.o parlicomrec.o: $(PARCC) $(PARLICFLAGS) -c comrec.c -o parlicomrec.o parligetvect.o: $(PARCC) $(PARLICFLAGS) -c ligetvect.c -o parligetvect.o parliinputcode.o: $(PARCC) $(PARLICFLAGS) -c liinputcode.c -o parliinputcode.o parliiostuff.o: $(PARCC) $(PARLICFLAGS) -c iostuff.c -o parliiostuff.o parlimodified.o: $(PARCC) $(PARLICFLAGS) -c parmodified.c -o parlimodified.o parlinkmap.o: $(PARCC) $(PARLICFLAGS) -c linkmap.c -o parlinkmap.o parlioldnuclear.o: $(PARCC) $(PARLICFLAGS) -c lioldnuclear.c -o parlioldnuclear.o parlioutbuff.o: $(PARCC) $(PARLICFLAGS) -c outbuff.c -o parlioutbuff.o parlistrbuff.o: $(PARCC) $(PARLICFLAGS) -c strbuff.c -o parlistrbuff.o ############## MLINK rules mlcheck.o: $(CC) $(CFLAGS) -DMLINK -c check.c -o mlcheck.o mlcominputcode.o: $(CC) $(CFLAGS) -DMLINK -c cominputcode.c -o mlcominputcode.o mlcommoncode.o: $(CC) $(CFLAGS) -DMLINK -c commoncode.c -o mlcommoncode.o mlcomrec.o: $(CC) $(CFLAGS) -DMLINK -c comrec.c -o mlcomrec.o mlgetvect.o: $(CC) $(CFLAGS) -DMLINK -c mlgetvect.c -o mlgetvect.o mlink.o: $(CC) $(CFLAGS) -DMLINK -c mlink.c -o mlink.o mlinputcode.o: $(CC) $(CFLAGS) -DMLINK -c mlinputcode.c -o mlinputcode.o mliostuff.o: $(CC) $(CFLAGS) -DMLINK -c iostuff.c -o mliostuff.o mloldnuclear.o: $(CC) $(CFLAGS) -DMLINK -c mloldnuclear.c -o mloldnuclear.o slowmlcommoncode.o: $(CC) $(CFLAGS) $(SFLAG) -DMLINK -c commoncode.c -o slowmlcommoncode.o slowmlink.o: $(CC) $(CFLAGS) $(SFLAG) -c mlink.c -o slowmlink.o parmlcheck.o: $(PARCC) $(PARMLCFLAGS) -c check.c -o parmlcheck.o parmlcominputcode.o: $(PARCC) $(PARMLCFLAGS) -c cominputcode.c -o parmlcominputcode.o parmlcomlike.o: $(PARCC) $(PARMLCFLAGS) -c comlike.c -o parmlcomlike.o parmlcommoncode.o: $(PARCC) $(PARMLCFLAGS) -c commoncode.c -o parmlcommoncode.o parmlcomoutput.o: $(PARCC) $(PARMLCFLAGS) -c comoutput.c -o parmlcomoutput.o parmlcompar.o: $(PARCC) $(PARMLCFLAGS) -c compar.c -o parmlcompar.o parmlcomrec.o: $(PARCC) $(PARMLCFLAGS) -c comrec.c -o parmlcomrec.o parmlgetvect.o: $(PARCC) $(PARMLCFLAGS) -c mlgetvect.c -o parmlgetvect.o parmlink.o: $(PARCC) $(PARMLCFLAGS) -c mlink.c -o parmlink.o parmlinputcode.o: $(PARCC) $(PARMLCFLAGS) -c mlinputcode.c -o parmlinputcode.o parmliostuff.o: $(PARCC) $(PARMLCFLAGS) -c iostuff.c -o parmliostuff.o parmlmodified.o: $(PARCC) $(PARMLCFLAGS) -c parmodified.c -o parmlmodified.o parmloldnuclear.o: $(PARCC) $(PARMLCFLAGS) -c mloldnuclear.c -o parmloldnuclear.o parmloutbuff.o: $(PARCC) $(PARMLCFLAGS) -c outbuff.c -o parmloutbuff.o parmlstrbuff.o: $(PARCC) $(PARMLCFLAGS) -c strbuff.c -o parmlstrbuff.o ############# LODSCORE rules locheck.o: $(CC) $(CFLAGS) -DLODSCORE -c check.c -o locheck.o locomlike.o: $(CC) $(CFLAGS) -DLODSCORE -c comlike.c -o locomlike.o locomrec.o: $(CC) $(CFLAGS) -DLODSCORE -c comrec.c -o locomrec.o lodscore.o: $(CC) $(CFLAGS) -DLODSCORE -c lodscore.c -o lodscore.o logetvect.o: $(CC) $(CFLAGS) -DLODSCORE -c logetvect.c -o logetvect.o loinputcode.o: $(CC) $(CFLAGS) -DLODSCORE -c loinputcode.c -o loinputcode.o loiostuff.o: $(CC) $(CFLAGS) -DLODSCORE -c iostuff.c -o loiostuff.o looldnuclear.o: $(CC) $(CFLAGS) -DLODSCORE -c looldnuclear.c -o looldnuclear.o slowlocomlike.o: $(CC) $(CFLAGS) $(SFLAG) -DLODSCORE -c comlike.c -o slowlocomlike.o slowlodscore.o: $(CC) $(CFLAGS) $(SFLAG) -DLODSCORE -c lodscore.c -o slowlodscore.o ############# generic sequential code rules automodified.o: $(CC) $(CFLAGS) -c automodified.c -o automodified.o comlike.o: $(CC) $(CFLAGS) -c comlike.c -o comlike.o sexmodified.o: $(CC) $(CFLAGS) -c sexmodified.c -o sexmodified.o slowautomodified.o: $(CC) $(CFLAGS) $(SFLAG) -c slowautomodified.c -o slowautomodified.o slowcomlike.o: $(CC) $(CFLAGS) $(SFLAG) -c comlike.c -o slowcomlike.o slowsexmodified.o: $(CC) $(CFLAGS) $(SFLAG) -c slowsexmodified.c -o slowsexmodified.o ###################################################### ############# cleanup rules ########################## ###################################################### clean: $(RM) *.o parclean: $(RM) \ $(PARILOBJS) $(PARMLOBJS) $(PARLIOBJS) \ $(BINDIR)/*.atm $(BINDIR)/*.udp $(BINDIR)/*.p4 allclean: clean parclean $(RM) $(CLEANEXE) ###################################################### ############## dependencies ########################## ###################################################### automodified.o : automodified.c commondefs.h moddefs.h comlike.o : comlike.c commondefs.h moddefs.h ilcheck.o : check.c commondefs.h checkpointdefs.h gemdefs.h ildefs.h ilcominputcode.o : cominputcode.c commondefs.h checkpointdefs.h gemdefs.h ilcommoncode.o : commoncode.c commondefs.h gemdefs.h moddefs.h checkpointdefs.h \ ildefs.h ilcomrec.o : comrec.c commondefs.h checkpointdefs.h ilgetvect.o : ilgetvect.c commondefs.h comgetvect.c ilink.o : ilink.c commondefs.h checkpointdefs.h gemdefs.h ildefs.h moddefs.h ilinputcode.o : ilinputcode.c commondefs.h gemdefs.h ildefs.h iliostuff.o : iostuff.c commondefs.h iloldnuclear.o : iloldnuclear.c commondefs.h ildefs.h comnuclear.c oldsegup.c licheck.o : check.c commondefs.h checkpointdefs.h gemdefs.h ildefs.h licominputcode.o : cominputcode.c commondefs.h checkpointdefs.h gemdefs.h licommoncode.o : commoncode.c commondefs.h gemdefs.h moddefs.h checkpointdefs.h \ lidefs.h licomrec.o : comrec.c commondefs.h checkpointdefs.h ligetvect.o : ligetvect.c commondefs.h comgetvect.c liinputcode.o : liinputcode.c commondefs.h gemdefs.h lidefs.h liiostuff.o : iostuff.c commondefs.h linkmap.o : linkmap.c commondefs.h gemdefs.h lidefs.h checkpointdefs.h moddefs.h lioldnuclear.o : lioldnuclear.c commondefs.h lidefs.h comnuclear.c oldsegup.c locheck.o : check.c commondefs.h checkpointdefs.h gemdefs.h ildefs.h locomlike.o : comlike.c commondefs.h moddefs.h locomrec.o : comrec.c commondefs.h checkpointdefs.h lodefs.h lodscore.o : lodscore.c commondefs.h checkpointdefs.h gemdefs.h lodefs.h moddefs.h logetvect.o : logetvect.c commondefs.h lodefs.h comgetvect.c loinputcode.o : loinputcode.c commondefs.h checkpointdefs.h gemdefs.h lodefs.h loiostuff.o : iostuff.c commondefs.h lodefs.h looldnuclear.o : looldnuclear.c commondefs.h lodefs.h comnuclear.c oldsegup.c mlcheck.o : check.c commondefs.h checkpointdefs.h gemdefs.h ildefs.h mlcominputcode.o : cominputcode.c commondefs.h checkpointdefs.h gemdefs.h mlcommoncode.o : commoncode.c commondefs.h gemdefs.h moddefs.h checkpointdefs.h \ mldefs.h mlcomrec.o : comrec.c commondefs.h checkpointdefs.h mlgetvect.o : mlgetvect.c commondefs.h comgetvect.c mlink.o : mlink.c commondefs.h gemdefs.h mldefs.h checkpointdefs.h moddefs.h mlinputcode.o : mlinputcode.c commondefs.h gemdefs.h mldefs.h mliostuff.o : iostuff.c commondefs.h mloldnuclear.o : mloldnuclear.c commondefs.h mldefs.h comnuclear.c oldsegup.c parilcominputcode.o : cominputcode.c commondefs.h strbuff.h gemdefs.h parilcomlike.o : comlike.c commondefs.h strbuff.h moddefs.h parilcommoncode.o : commoncode.c commondefs.h strbuff.h gemdefs.h moddefs.h \ ildefs.h compar.h parilcompar.o : compar.c commondefs.h strbuff.h gemdefs.h moddefs.h compar.h parilcomrec.o : comrec.c commondefs.h strbuff.h parilgetvect.o : ilgetvect.c commondefs.h strbuff.h comgetvect.c parilink.o : ilink.c commondefs.h strbuff.h gemdefs.h ildefs.h moddefs.h \ compar.h parilinputcode.o : ilinputcode.c commondefs.h strbuff.h gemdefs.h ildefs.h pariliostuff.o : iostuff.c commondefs.h strbuff.h parilmodified.o : parmodified.c commondefs.h strbuff.h moddefs.h pariloldnuclear.o : iloldnuclear.c commondefs.h strbuff.h ildefs.h comnuclear.c \ oldsegup.c parlicheck.o : check.c commondefs.h strbuff.h checkpointdefs.h gemdefs.h ildefs.h parlicominputcode.o : cominputcode.c commondefs.h strbuff.h gemdefs.h parlicomlike.o : comlike.c commondefs.h strbuff.h moddefs.h parlicommoncode.o : commoncode.c commondefs.h strbuff.h gemdefs.h moddefs.h \ lidefs.h compar.h parlicomoutput.o : comoutput.c commondefs.h strbuff.h gemdefs.h moddefs.h lidefs.h parlicompar.o : compar.c commondefs.h strbuff.h gemdefs.h moddefs.h lidefs.h \ compar.h parlicomrec.o : comrec.c commondefs.h strbuff.h parligetvect.o : ligetvect.c commondefs.h strbuff.h comgetvect.c parliinputcode.o : liinputcode.c commondefs.h strbuff.h gemdefs.h lidefs.h parliiostuff.o : iostuff.c commondefs.h strbuff.h parlimodified.o : parmodified.c commondefs.h strbuff.h moddefs.h parlinkmap.o : linkmap.c commondefs.h strbuff.h gemdefs.h lidefs.h moddefs.h \ compar.h parlioldnuclear.o : lioldnuclear.c commondefs.h strbuff.h lidefs.h comnuclear.c \ oldsegup.c parlioutbuff.o : outbuff.c commondefs.h strbuff.h parlistrbuff.o : strbuff.c strbuff.h commondefs.h parmlcheck.o : check.c commondefs.h strbuff.h checkpointdefs.h gemdefs.h ildefs.h parmlcominputcode.o : cominputcode.c commondefs.h strbuff.h gemdefs.h parmlcomlike.o : comlike.c commondefs.h strbuff.h moddefs.h parmlcommoncode.o : commoncode.c commondefs.h strbuff.h gemdefs.h moddefs.h \ mldefs.h compar.h parmlcomoutput.o : comoutput.c commondefs.h strbuff.h gemdefs.h moddefs.h mldefs.h parmlcompar.o : compar.c commondefs.h strbuff.h gemdefs.h moddefs.h mldefs.h \ compar.h parmlcomrec.o : comrec.c commondefs.h strbuff.h parmlgetvect.o : mlgetvect.c commondefs.h strbuff.h comgetvect.c parmlink.o : mlink.c commondefs.h strbuff.h gemdefs.h mldefs.h moddefs.h \ compar.h parmlinputcode.o : mlinputcode.c commondefs.h strbuff.h gemdefs.h mldefs.h parmliostuff.o : iostuff.c commondefs.h strbuff.h parmlmodified.o : parmodified.c commondefs.h strbuff.h moddefs.h parmloldnuclear.o : mloldnuclear.c commondefs.h strbuff.h mldefs.h comnuclear.c \ oldsegup.c parmloutbuff.o : outbuff.c commondefs.h strbuff.h parmlstrbuff.o : strbuff.c strbuff.h commondefs.h sexmodified.o : sexmodified.c commondefs.h moddefs.h slowautomodified.o : slowautomodified.c commondefs.h slowcomlike.o : comlike.c commondefs.h slowilcommoncode.o : commoncode.c commondefs.h gemdefs.h checkpointdefs.h ildefs.h slowilink.o : ilink.c commondefs.h checkpointdefs.h gemdefs.h ildefs.h slowlicommoncode.o : commoncode.c commondefs.h gemdefs.h checkpointdefs.h lidefs.h slowlinkmap.o : linkmap.c commondefs.h gemdefs.h lidefs.h checkpointdefs.h slowlocomlike.o : comlike.c commondefs.h slowlodscore.o : lodscore.c commondefs.h checkpointdefs.h gemdefs.h lodefs.h slowmlcommoncode.o : commoncode.c commondefs.h gemdefs.h checkpointdefs.h mldefs.h slowmlink.o : mlink.c commondefs.h gemdefs.h mldefs.h checkpointdefs.h slowsexmodified.o : slowsexmodified.c commondefs.h fastlink-4.1P-fix95/4.1P/src/lioldnuclear.c0000644000265600020320000000151506737460342017446 0ustar tilleaadmin/* This file contains old nuclear family update routines */ /* used in the LINKMAP program */ #include "commondefs.h" #include "lidefs.h" Local Void getapprox(LINK) struct LOC_seg *LINK; { int first; double maxval; thisarray *WITH; maxval = (*LINK->p)->gen->genarray[0]; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH->genarray[first] > maxval) maxval = WITH->genarray[first]; } WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { approxarray[LINK->LINK->thisped - 1][first] = (WITH->genarray[first] > (maxval * epsilon)); } if (lasttime) return; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (!(approxarray[LINK->LINK->thisped - 1][first])) WITH->genarray[first] = 0.0; } } /*getapprox*/ #include "comnuclear.c" fastlink-4.1P-fix95/4.1P/src/looldnuclear.c0000644000265600020320000000151406737460342017453 0ustar tilleaadmin/* This file contains some old nuclear family update routines for the LODSCORE program */ #include "commondefs.h" #include "lodefs.h" Local Void getapprox(LINK) struct LOC_seg *LINK; { long first; double maxval; thisarray *WITH; maxval = (*LINK->p)->gen->genarray[0]; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH->genarray[first] > maxval) maxval = WITH->genarray[first]; } WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { approxarray[LINK->LINK->thisped - 1][first] = WITH->genarray[first] > (maxval *epsilon); } if (lasttime) return; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (!(approxarray[LINK->LINK->thisped - 1][first])) WITH->genarray[first] = 0.0; } } /*getapprox*/ #include "comnuclear.c" fastlink-4.1P-fix95/4.1P/src/parmodified.c0000644000265600020320000033655506737460342017273 0ustar tilleaadmin/*This file contains new versions of the routines segup and segdown, */ /* and some auxiliary routines for use with parallel FASTLINK*/ /* The seqential modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottinghm, Jr., */ /* Avoiding Recomputation In Linkage Analysis,*/ /* Hum. Hered. 44(1994), pp. 225-237 */ /* Code in this file was written by R. M. Idury, A. A. Schaffer, S. Dwarkadas, and S. K. Gupta */ #include #include "commondefs.h" #include "moddefs.h" #define PAR_SIZE1 6000 #define PAR_SIZEMANY 3000 #ifndef OVERHEAD #define OVERHEAD 10000 /* Approximate time for overhead in microsec */ #endif int pnonzcount, qnonzcount; void loadbalance(); #if !defined(LESSMEMORY) void onechildup(); #endif void onechilddown(); void manychilddown(); void manychildup(); #if PRECOMPUTE void allocprob() { probtable = (double**) Tmk_malloc(Tmk_nprocs * (sizeof(double *))); if (!probtable) Tmk_errexit("MALLOC ERROR - probtable\n"); Tmk_distribute((char *) &probtable, sizeof(probtable)); for(i = 0; i < Tmk_nprocs; i++) { probtable[i] = (double *) Tmk_malloc((maxisozygclass * nuneed * nuneed) * sizeof(double)); if (!probtable[i]) Tmk_errexit("MALLOC ERROR - probtable[%d]\n",i); } if (!sexlink) { probtableindex = (unsigned **) Tmk_malloc(Tmk_nprocs * (sizeof(unsigned *))); if (!probtableindex) Tmk_errexit("MALLOC ERROR - probtableindex, use the slower version\n"); Tmk_distribute((char *) &probtableindex, sizeof(probtableindex)); for(i = 0; i < Tmk_nprocs; i++) { probtableindex[i] = (unsigned *) Tmk_malloc((nuneed * nuneed) * sizeof(unsigned)); if (!probtableindex[i]) Tmk_errexit("MALLOC ERROR - probtableindex[%d]\n",i); } if (sexdif) { probtabledif = (double**) Tmk_malloc(Tmk_nprocs * (sizeof(double *))); if (!probtabledif) Tmk_errexit("MALLOC ERROR - probtabledif\n"); Tmk_distribute((char *) &probtabledif, sizeof(probtabledif)); for(i = 0; i < Tmk_nprocs; i++) { probtabledif[i] = (double *) Tmk_malloc((maxisozygclass * nuneed * nuneed) * sizeof(double)); if (!probtabledif[i]) Tmk_errexit("MALLOC ERROR - probtabledif[%d]\n",i); } } classsize = (unsigned *) Tmk_malloc(nuprobclass * sizeof(unsigned)); if (!classsize) Tmk_errexit("MALLOC ERROR - classsize\n"); Tmk_distribute((char *) &classsize, sizeof(classsize)); classbase = (unsigned *) Tmk_malloc(nuprobclass * sizeof(unsigned)); if (!classbase) Tmk_errexit("MALLOC ERROR - classbase\n"); Tmk_distribute((char *) &classbase, sizeof(classbase)); } } #endif #if PRECOMPUTE void getprobtable() /* compute joint recombination probabilities */ { static int size = 0, firsttime = 1; int indey, i, j, ii, jj; char *recomb_flag; if(firsttime && !sexlink) { if (!AUTOSOMAL_RUN) fprintf(stderr, "\nWARNING: You are doing an autosomal run but have AUTOSOMAL_RUN set to 0"); if ((!SEXDIF_RUN) && sexdif) fprintf(stderr, "\nWARNING: You are doing a sexdif run but have SEXDIF_RUN set to 0"); firsttime = 0; recomb_flag = (char *) malloc(nuneed * sizeof(char)); if (recomb_flag == NULL) malloc_err("recomb_flag in getprobtable"); for(i = 0; i < nuneed; i++) recomb_flag[i] = 0; for(i = 0; i < fgeno; i++) recomb_flag[probstart[i]-1] = 1; size = 0; for(i = 0; i < nuneed; i++) if(recomb_flag[i] == 1) classbase[size++] = i; classsize[size-1] = nuneed - classbase[size-1]; for(i = size-2; i >= 0; i--) classsize[i] = classbase[i+1] - classbase[i]; } indey = 0; if (!sexlink) { for(i = 0; i < size; i++) { for(j = 0; j < size; j++) { probtableindex[mymaster][classbase[i]* nuneed+classbase[j]] = indey; for(ii = classbase[i]; ii < classbase[i]+classsize[i]; ii++) { for(jj = classbase[j]; jj < classbase[j]+classsize[j]; jj++) { probtable[mymaster][indey++] = segprob2[ii* nuneed+jj]; } } } } } if (sexdif) { indey = 0; for(i = 0; i < size; i++) { for(j = 0; j < size; j++) { for(ii = classbase[i]; ii < classbase[i]+classsize[i]; ii++) { for(jj = classbase[j]; jj < classbase[j]+classsize[j]; jj++) { probtabledif[mymaster][indey++] = segprob2[jj * nuneed + ii]; } } } } } } #endif /*segsum2 is used in segup to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class of both parental genotypes; fs stands for the product of first and second. */ /* cgh -- made void for gcc */ Local void segsum2(first,second,fslength) unsigned first, second, fslength; { int g1, g2, g3, g4; /*indices to store gene numbers*/ int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int indey; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM = fence[first]; /*start of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ indey = 0; /*start with first isozygote in the class*/ /*iterate over isozygotes of i*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = indey, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1] + tempwith3[g3 - 1] + tempwith3[g4 - 1]); } indey++; /*increment isozygote class counter*/ } } } /*segsum2*/ /*segsumdown2 is used in segdown to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class for both parental genotypes; fs stands for the product of first and second. */ /* cgh -- void for gcc */ Local void segsumdown2(first,second,fslength) unsigned first, second, fslength; { int g1, g2, g3, g4; /*indices to store gene numbers*/ int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int indey; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int index2; /*used as index for isozygote class*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM = fence[first]; /*start of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ indey = 0; /*start with first isozygote in the class*/ index2 = 0; /*iterate over isozygotes of i*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*store these gene numbers for later use; the key point is that we will want these numbers consecutively later, so we store them consecutively in segindex*/ segindex[index2++] = g1; segindex[index2++] = g2; segindex[index2++] = g3; segindex[index2++] = g4; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = indey, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1] + tempwith3[g3 - 1] + tempwith3[g4 - 1]); } indey++; /*increment isozygote class counter*/ } } } /*segsumdown2*/ /*lsegfun2 does a logical test similar to the computation done in the original segfun to determine whether segfun would return 0.0. If segfun would return 0.0, then lsegfun2 return 0 (FALSE), while if segfun would not return 0.0., lsegfun2 returns 1 (TRUE). Given, a combined isozygote class, we want to know whether any elements of that isozygote class are possible joint genotypes for the parents. This will be the case if and only if each child has a nonzero probability for at least one of the joint genotypes that the parents can produce given their isozygote class. first and second are the joint genotypes for the parents. */ unsigned lsegfun2(first,second) unsigned first, second; { int g1, g2, g3, g4; /*four gene numbers*/ int i, j, k; /* loop indices*/ int f1, f2, s1, s2; /*haplotype numbers*/ int FORLIM; /*loop bound*/ int FORLIM1, FORLIM2; /*loop bounds*/ int *TEMPGENE1, *TEMPGENE2; /* store pointers into genenumber*/ unsigned char *tempflag3; /*stores sparsity pattern for child's genarray*/ FORLIM = fence[first]; /*find end of isozygote class for first*/ FORLIM1 = base[second];/*find beginning and end of isozygote class for second*/ FORLIM2 = fence[second]; /*try to find a non-zero value for each child*/ for (k = 0; k < nchild; k++) { /*code for the non-boolean version is shown in comments tempwith3 = thischild[k]->genarray;*/ /*retrieve sparsity pattern for child k*/ tempflag3 = thischild[k]->sparseflag; /*iterate over all recombined isozygotes of first*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve the haplotypes of this genotype*/ f2 = haps2[i]; TEMPGENE1 = genenumber[f1 - 1];/*get pointer into genenumber for this haplotype*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over all the recombined isozygotes of second*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*get haplotypes of this genotype*/ s2 = haps2[j]; /*retrieve the four genes that this combination of joint haplotypes can produce*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*if(tempwith3[g1 - 1] != 0.0 || tempwith3[g2 - 1] != 0.0 || tempwith3[g3 - 1] != 0.0 || tempwith3[g4 - 1] != 0.0) goto notzero;*/ /*if any of the flags is TRUE, then this child can have this genotype, and we move immediately to testing the next child*/ if(tempflag3[g1 - 1] != 0 || tempflag3[g2 - 1] != 0 || tempflag3[g3 - 1] != 0 || tempflag3[g4 - 1] != 0) goto notzero; } } return 0; /*this child failed to have any of the genotypes for the isozygote class, so this isozygote class is not possible*/ notzero: continue; } return 1; /*all children passed the test and have a possible joint genotype*/ } /*segup updates the genotype probabilities for a parent (p) based on the probabilities of children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children*/ void segup(LINK) struct LOC_seg *LINK; { int step1, step2; /*size of isozygote classes*/ unsigned int i, j; /*genotype indices*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ unsigned char *newflag2, *newflag3; /*store sparsity patterns for p and q genarrays*/ boolean depend; /*used to handle loops*/ initseg(LINK); /*get data about this p,q,children triple*/ gMem->trav_flag[mymaster] = MANYUP; /*get sparsity patterns for p and q genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get genarray for p*/ newwith3=WITH3->genarray; /*get genarray for q*/ newwithr=thischild[0]->genarray; /*get genarray for first child*/ /*The case of 1 child is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ #if !defined(LESSMEMORY) if(nchild == 1) { gMem->trav_flag[mymaster] = ONEUP; pnonzcount = qnonzcount = 0; /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ if (*firstfe) { /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i++) { if(newflag3[i] != 0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ } } /*iterate over genotypes for p*/ for (i = 0; i < fgeno; i++) { if(newflag2[i] != 0) { pnonzgens[pnonzcount++] = i; /* store index of nonzero value */ } } } loadbalance(LINK); } else { /*nchild is bigger than 1*/ #endif newwith2=(*LINK->p)->gen->genarray; /*get p's genarray*/ /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ pnonzcount = qnonzcount = 0; if (*firstfe) { /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } /*iterate over genotypes for p*/ for (i = 0; i < fgeno; i += step1) { /*number of distinct probabilties needed for i's isoz. class*/ step1 = probend[i] - probstart[i]+1; /*work only on those isozygotes that are possible*/ for(j = i; j < i+step1; j++) if(newflag2[j] != 0) { pnonzgens[pnonzcount++] = i; /* store index of nonzero value */ break; /*go to next isozygote in class*/ } } } loadbalance(LINK); #if !defined(LESSMEMORY) } #endif /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ /* Not parallelized because we're dealing with characters - memo diffs on words */ for(i = 0; i < fgeno; i++) if((newflag2[i] != 0) && (newwith2[i] == 0.0)) { newflag2[i] = 0; } /*Added by Alex to handle loops */ if (loopfirstgen && (!(*LINK->p)->loopdepend)) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->p)->loopdepend = depend; (*LINK->p)->loopneeded = false; } } if ((*LINK->p)->loopdepend) { if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segup*/ #if !defined(LESSMEMORY) void onechildup() { int FORLIM; /*loop bound*/ int pnonzindex, qnonzindex; /*loop index and counter for nonzero values*/ double valtemp; /*intermediate values in probability updates*/ double val, temp1, tempr; /*temporaries to store intermediate values*/ static unsigned current; unsigned int f1, f2; /*two haplotypes from parents*/ unsigned int here, i, j, first; /*genotype indices*/ int procindex; thisarray *WITH2, *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for p parent*/ thetavalues *WITH5; /*store theta values for q parent*/ unsigned int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflagr; /*store sparsity patterns for p and q genarrays*/ /* newsegprob is used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob; int ind; /*used to store offset for probability array*/ /* Structures to store start and end time for rows */ struct timeval starttime, endtime; int pbase, pfence, qbase, qfence; pbase = gMem->pprocbase[Tmk_proc_id]; pfence = gMem->pprocfence[Tmk_proc_id]; qbase = gMem->qprocbase[Tmk_proc_id]; qfence = gMem->qprocfence[Tmk_proc_id]; nchild = gMem->nchild[mymaster]; WITH2 = gMem->pgenptr[mymaster]; /*get genetic data for p*/ WITH3 = gMem->qgenptr[mymaster]; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get genarray for p*/ newwith3=WITH3->genarray; /*get genarray for q*/ newflag2 = gMem->pgenptr[mymaster]->sparseflag; newflagr = gMem->rgenptr[mymaster]->sparseflag; newwithr=thischild[0]->genarray; /*get genarray for first child*/ if ((!sexdif) || (!readfemale)) WITH4 = WITH5 = maletheta; else { if (gMem->pmale[mymaster]) { WITH4 = maletheta; /*get male probabilities for p*/ WITH5 = femaletheta; /*get female probabilities for q*/ } else { WITH4 = femaletheta; /*get female probabilities for p*/ WITH5 = maletheta; /*get male probabilities for q*/ } } newsegprob = WITH5->segprob; /*use q probabilities to work with q*/ if(!*firstfe) { /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ qnonzgens = privateqnonzgens; qnonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i++) { if(newwith3[i] != 0.0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ } } pnonzgens = privatepnonzgens; pnonzcount = 0; /*iterate over genotypes for p*/ for (i = 0; i < fgeno; i++) { if(newwith2[i] != 0.0) { pnonzgens[pnonzcount++] = i; /* store index of nonzero value */ } } if (!onlymaster) { /*stripe pnonzgens array*/ j = 0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ for(i = procindex; i < pnonzcount; i+=Tmk_nprocs) stripe_pnonzgens[j++]=pnonzgens[i]; } for(i = 0; i < pnonzcount; i++) pnonzgens[i] = stripe_pnonzgens[i]; j =0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ for(i = procindex; i < qnonzcount; i+=Tmk_nprocs) stripe_qnonzgens[j++]=qnonzgens[i]; } for(i = 0; i < qnonzcount; i++) qnonzgens[i] = stripe_qnonzgens[i]; } } else { pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; } /*initialize cache data structures*/ for(i=0; i 1) && (!onlymaster)) { for(i = 0; i < maxhaplo;i++) { arrqsumcache[Tmk_proc_id][i] = onechildupqsumcache[i]; onechildupqsumcache[i] = 0; } if(((*slavesPerGroup) > 1) && (!onlymaster)) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at middle of onechildup\n",++barnum); #endif #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif } for(j=mymaster; j<(mymaster + (*slavesPerGroup));j++) for(i = 0;i < maxhaplo;i++) onechildupqsumcache[i] += arrqsumcache[j][i]; } /*In this section of the code we update the probabilities for the parent p based on the probabilities for the child*/ newsegprob = WITH4->segprob; /*use p probabilities to work with p*/ /*Iterate over all joint genotypes of the child*/ newflagr=thischild[0]->sparseflag; for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; c1 = invgenenum1[here]; c2 = invgenenum2[here]; temp1 = tempr * onechildupqsumcache[c2 - 1]; /*multiply probabilities for haplotype c2 from q*/ /*now find all the values of first that as genotypes of the father could have passed on the other haplotype c1; multiply by their probabilties, which are stored in phapcache, and add to the entry gene[first], which will be used to form the new genarray for p*/ for(i=phapcache1[c1-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { temp1 = tempr * onechildupqsumcache[c1 - 1]; for(i=phapcache1[c2-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } } } /*set up new genarray for p; it is gene scaled by segscale*/ for (pnonzindex = pbase; pnonzindex < pfence; pnonzindex++) { first = pnonzgens[pnonzindex]; newwith2[first] *= segscale*gene[first]; } /* Commented out since no summation is needed (all gene computations are independent and this parent will not be a parent in the next computation call. The synchronization necessary for these updates will be achieved through seg_barrier at the time each process waits for more work - Sandhya */ if ((*slavesPerGroup > 1) && (!onlymaster)) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at end of onechildup\n", ++barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else /*!IS_SHMEM*/ Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif /*IS_SHMEM*/ } } /* onechildup */ #endif /* manychildup handles the case of updating one parent from spouse and children when the parents p and q have more than one child (nchild > 0) */ void manychildup() { int pnonzindex, qnonzindex; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ unsigned int *tempstart; /*temporary index to probability array*/ double val, temp1; /*temporaries to store intermediate values*/ unsigned int i, j, first, second; /*genotype indices*/ int procindex; unsigned int fslength; /*size of product isozygote class for p and q*/ #if !PRECOMPUTE int findex, sindex; #endif int jointisoindex, fisoindex; /*indices to work within isozygote classes*/ unsigned l; /*increment used to manage offset into probtableindex l is the number of probability values needed for the current isozygote class. This is obtained by multplying the number of probabilities (maxneed) times the size of the class*/ unsigned k; /*index to loop over children*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ #if !PRECOMPUTE /* cgh - gcc */ double* newsegr; /* store genarrays for p,q, and children */ #endif /* !PRECOMPUTE */ thetavalues *WITH4; /*stores theta values for p parent*/ thetavalues *WITH5; /*store theta values for q parent*/ unsigned char *newflag2, *newflag3; /*store sparsity patterns for p and q genarrays*/ #if !PRECOMPUTE double *newsegprob1, *newsegprob2; #endif double *tempprob; /*temporary holder for probability array*/ int pbase, pfence, qbase, qfence; /*bounds for p and q genotypes for this processor to work on*/ /* Structures to store start and end time for rows */ struct timeval starttime, endtime; pbase = gMem->pprocbase[Tmk_proc_id]; pfence = gMem->pprocfence[Tmk_proc_id]; qbase = gMem->qprocbase[Tmk_proc_id]; qfence = gMem->qprocfence[Tmk_proc_id]; nchild = gMem->nchild[mymaster]; /*get sparsity patterns for p, q, and child genarrays*/ WITH2 = gMem->pgenptr[mymaster]; /*get genetic data for p*/ WITH3 = gMem->qgenptr[mymaster]; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get p's genarray*/ newwith3=WITH3->genarray; /* get q's genarray */ newflag2 = gMem->pgenptr[mymaster]->sparseflag; newflag3 = gMem->qgenptr[mymaster]->sparseflag; /* newwithr=thischild[0]->genarray; get genarray for first child*/ if ((!sexdif) || (!readfemale)) WITH4 = WITH5 = maletheta; else { if (gMem->pmale[mymaster]) { WITH4 = maletheta; /*get male probabilities for p*/ WITH5 = femaletheta; /*get female probabilities for q*/ } else { WITH4 = femaletheta; /*get female probabilities for p*/ WITH5 = maletheta; /*get male probabilities for q*/ } } #if !PRECOMPUTE newsegprob1 = WITH4->segprob; /*get p probabilities*/ newsegprob2 = WITH5->segprob; /*get q probabilties*/ #endif if(!*firstfe) { /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ qnonzgens = privateqnonzgens; qnonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } qfence = qnonzcount; /* Set qfence to correct value */ pnonzgens = privatepnonzgens; pnonzcount = 0; /*iterate over genotypes for p*/ for (i = 0; i < fgeno; i += step1) { /*number of distinct probabilties needed for i's isoz. class*/ step1 = probend[i] - probstart[i]+1; /*work only on those isozygotes that are possible*/ for(j = i; j < i+step1; j++) if(newflag2[j] != 0) { pnonzgens[pnonzcount++] = i; /* store index of nonzero value */ break; /*go to next isozygote in class*/ } } /*stripe pnonzgens array*/ if (!onlymaster) { j = 0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ for(i = procindex; i < pnonzcount; i+=Tmk_nprocs) stripe_pnonzgens[j++]=pnonzgens[i]; } for(i = 0; i < pnonzcount; i++) pnonzgens[i] = stripe_pnonzgens[i]; } } else { pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; } /*iterate over genotypes for p*/ for (pnonzindex = pbase; pnonzindex < pfence; pnonzindex++) { #if LOADBALANCE_OUTPUT if(mymaster == 0) #else if((*secondfe)&&(mymaster == 0)) #endif gettimeofday(&starttime, NULL); /* Get start time */ first = pnonzgens[pnonzindex]; step1 = probend[first] - probstart[first]+1; /*initialize update multiple for each isozygote in class*/ for(i = 0; i < step1; i++) segval[i] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (qnonzindex = qbase; qnonzindex < qfence; qnonzindex++) { second = qnonzgens[qnonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; fslength = step1 * step2; /*number of probs. for combined isozygote class*/ #if PRECOMPUTE fisoindex = (probstart[first] - 1) * nuneed - 1; /*probability array offset*/ #endif /*PRECOMPUTE*/ tempstart = probstart + second; /*set tempstart to the start of the section of probstart that we want*/ l = step1 * nuneed; /*call segsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsum2(first,second,fslength); #if !PRECOMPUTE newsegr = tempseg2; tempprob = tempseg; for (k = 0;k < nchild; k++) { for(i = 0; i < step1; i++) { newwithr = tempprob; findex = probstart[first + i] - 1; temp1 = newsegprob1[findex]; for (sindex = 0; sindex < step2; sindex++) newsegr[sindex] = temp1*(*newwithr++); for(findex++; findex < probend[first +i]; findex++) { temp1 = newsegprob1[findex]; for(sindex = 0; sindex < step2; sindex++) newsegr[sindex] += temp1*(*newwithr++); } newsegr += step2; } tempprob += fslength; } #endif /*!PRECOMPUTE*/ /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { #if PRECOMPUTE fisoindex += l; /*increment by number of probabilities needed for this iso. class*/ #endif /*PRECOMPUTE*/ continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) continue; /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ #if PRECOMPUTE #if AUTOSOMAL_RUN if ((!sexdif) || (gMem->pmale[mymaster])) tempprob = probtable[mymaster] + probtableindex[mymaster][fisoindex+tempstart[j]]; #if SEXDIF_RUN else tempprob = probtabledif[mymaster] + probtableindex[mymaster][fisoindex+tempstart[j]]; #endif /*SEXDIF_RUN*/ #endif /*AUTOSOMAL_RUN*/ /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the newwithr array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + fslength; /*move the base of newwithr*/ #else /* !PRECOMPUTE */ val = 1.0; newwithr = tempseg2 + i*step2; tempprob = newsegprob2 + probstart[second + j] -1; #endif /* PRECOMPUTE */ #if PRECOMPUTE /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; #else /* !PRECOMPUTE*/ for(k = 0; k < nchild; k++) { temp1 = 0.0; for(sindex = 0; sindex < step2; sindex++) temp1 += tempprob[sindex] * newwithr[sindex]; #endif /* PRECOMPUTE */ val *= temp1; newwithr += fslength; } /*update segval entry for this isozygote of first*/ segval[i] += newwith3[second+j] * val; } #if PRECOMPUTE fisoindex += l; /*go to next isozygote for p*/ #endif /* PRECOMPUTE */ } } /*update p's genarray for each isozygote in this class*/ for(i = 0; i < step1; i++) { newwith2[first+i] *= segval[i] * segscale; } #if LOADBALANCE_OUTPUT if(mymaster == 0) { #else /* !LOADBALANCE_OUTPUT */ if((*secondfe)&&(mymaster == 0)) { #endif /* LOADBALANCE_OUTPUT */ gettimeofday(&endtime, NULL); /* Get end time */ rowtime[pnonzindex] = 1000000*(endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec); } } /* Commented out since no summation is needed (all gene computations are independent and this parent will not be a parent in the next computation call. The synchronization necessary for these updates will be achieved through seg_barrier at the time each process waits for more work - Sandhya */ if ((*slavesPerGroup > 1) && (!onlymaster)) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at end of manychildup\n", ++barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else /* !IS_SHMEM*/ Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif } } /*manychildup*/ /* loadbalancer that splits according to the p index evenly*/ void loadbalance(LINK) struct LOC_seg *LINK; { /*B+1*/ int procindex; int fenceindex; int i,j; /*loop indices*/ static int currentfamilynum = -1; double totaltime, accumtime; /* Add computation time for each row */ int remainder; static int printout = 0; int oh; /* gettimeofday(&starttime, NULL); */ /* Get start time */ /* printf("Entering loadbalance with numnuclear = %d, nfe = %d\n",*numNuclear,gnfe[currentthetanum]);*/ if(pnonzcount > fgeno) { /*B+2*/ Tmk_errexit("rowtime cannot hold %d times\n",pnonzcount); } /*B+2*/ if(((qnonzcount) > fgeno) && ((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN))) { /*B+2*/ Tmk_errexit("qrowtime cannot hold %d times\n",qnonzcount); } /*B+2*/ gMem->pgenptr[mymaster] = (*LINK->p)->gen; gMem->qgenptr[mymaster] = (*LINK->q)->gen; gMem->rgenptr[mymaster] = (*LINK->r)->gen; gMem->pmale[mymaster] = (*LINK->p)->male; /*retrieve thetas to propagate to all processors in group*/ #if (defined(MLINK) || defined(LINKMAP)) /* cgh */ if (sexdif && readfemale) for(j=0;jtheta[j] = gmaletheta[absoluteThetanum][j]; femaletheta->theta[j] = gfemaletheta[absoluteThetanum][j]; } /*B+2*/ else for(j=0;jtheta[j] = gmaletheta[absoluteThetanum][j]; #else /* if (defined(MLINK) || defined(LINKMAP)) */ if (sexdif && readfemale) for(j=0;jtheta[j] = gmaletheta[currentthetanum][j]; femaletheta->theta[j] = gfemaletheta[currentthetanum][j]; } /*B+2*/ else for(j=0;jtheta[j] = gmaletheta[currentthetanum][j]; #endif /* if (defined(MLINK) || defined(LINKMAP)) -- cgh */ if (*firstfe) { /*B+2*/ (*numNuclear)++; currentfamilynum++; currentfamilynum = currentfamilynum % MAXNUMFAM; } /*B+2*/ else currentfamilynum = (currentfamilynum + 1) % (*numNuclear); if (*firstfe) { /*B=2*/ /*stripe pnonzgens array*/ j = 0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ /*B+3*/ for(i = procindex; i < pnonzcount; i+=Tmk_nprocs) stripe_pnonzgens[j++]=pnonzgens[i]; } /*B+3*/ for(i = 0; i < pnonzcount; i++) pnonzgens[i] = stripe_pnonzgens[i]; if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) { /*B+3*/ /*stripe qnonzgens array*/ j =0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ /*B+4*/ for(i = procindex; i < qnonzcount; i+=Tmk_nprocs) stripe_qnonzgens[j++]=qnonzgens[i]; } /*B+4*/ for(i = 0; i < qnonzcount; i++) qnonzgens[i] = stripe_qnonzgens[i]; } /*B+3*/ } /*B+2*/ if (*firstfe) {/* If this is the first function evaluation */ /*B+2*/ /*schaffer changed test here to avoid int overflow in product*/ if((((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) &&((pnonzcount <= PAR_SIZE1) && (qnonzcount <= PAR_SIZE1) && (pnonzcount*qnonzcount)<=PAR_SIZE1) ||(((gMem->trav_flag[mymaster] != ONEUP) && (gMem->trav_flag[mymaster] != ONEDOWN)) &&((pnonzcount <= PAR_SIZEMANY) && (qnonzcount <= PAR_SIZEMANY) && (pnonzcount*qnonzcount)<=PAR_SIZEMANY)))) for(procindex = 0; procindex < (Tmk_nprocs); procindex++) { /*B+3*/ (*rowfence)[currentfamilynum][procindex] = pnonzcount; (*qfence)[currentfamilynum][procindex] = qnonzcount; } /*B+3*/ else { /*B+3*/ remainder = pnonzcount % Tmk_nprocs; /* Setup base/fence values */ (*rowfence)[currentfamilynum][0] = pnonzcount/Tmk_nprocs; for(procindex = 1; procindex < (Tmk_nprocs); procindex++) { /*B+4*/ (*rowfence)[currentfamilynum][procindex] = (*rowfence)[currentfamilynum][procindex-1] + pnonzcount/Tmk_nprocs; if(remainder > 0) { /*B+5*/ (*rowfence)[currentfamilynum][procindex]++; remainder--; } /*B+5*/ } /*B+4*/ if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) { /*B+ 4*/ remainder = qnonzcount % Tmk_nprocs; /* Setup base/fence values */ (*qfence)[currentfamilynum][0] = qnonzcount/Tmk_nprocs; for(procindex = 1; procindex < Tmk_nprocs; procindex++) { /*B+5*/ (*qfence)[currentfamilynum][procindex] = (*qfence)[currentfamilynum][procindex-1] + qnonzcount/Tmk_nprocs; if(remainder > 0) { /*B+6*/ (*qfence)[currentfamilynum][procindex]++; remainder--; } /*B+6*/ } /*B+5*/ } /*B+4*/ } /*B+3*/ } /*B+2*/ gMem->pprocbase[Tmk_proc_id] = 0; gMem->qprocbase[Tmk_proc_id] = 0; for(procindex=Tmk_proc_id,fenceindex = (Tmk_nprocs / (*slavesPerGroup)); procindex < (Tmk_proc_id + (*slavesPerGroup)); procindex++, fenceindex += (Tmk_nprocs / (*slavesPerGroup))){ /*B+2*/ /* distribute q only if in onechildup or onechilddown since the p and q iterations are not nested in the onechild case */ if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) { /*B+3*/ if (procindex > Tmk_proc_id) gMem->qprocbase[procindex] = gMem->qprocfence[procindex - 1]; gMem->qprocfence[procindex] = (*qfence)[currentfamilynum][fenceindex - 1]; } /*B+3*/ else { /*B+3*/ gMem->qprocbase[procindex] = 0; gMem->qprocfence[procindex] = qnonzcount; } /*B+3*/ if (procindex > Tmk_proc_id) gMem->pprocbase[procindex] = gMem->pprocfence[procindex - 1]; gMem->pprocfence[procindex] = (*rowfence)[currentfamilynum][fenceindex - 1]; } /*B+2*/ if((gMem->pprocfence[Tmk_proc_id] == gMem->pprocfence[Tmk_proc_id+*slavesPerGroup-1]) && (gMem->qprocfence[Tmk_proc_id] == gMem->qprocfence[Tmk_proc_id+*slavesPerGroup-1])) onlymaster = 1; /* schaffer && cgh -- Added this loop here to zero out these arrays to fix bug. In case with only one processor working on theta, even though others are available, *after* other processor has made changes too arr{p,q}sumcache arrays from *previous* iteration, these values were incorrectly added in the next time around. */ if ((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) for (j = mymaster; j< (mymaster + (*slavesPerGroup)); j++) for (i = 0; i < maxhaplo; i++) { arrqsumcache[j][i] = 0.0; arrpsumcache[j][i] = 0.0; } /*Make sure that all loop bounds are passed to all processors*/ if ((*slavesPerGroup > 1) && (!onlymaster)) { /*B+2*/ #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at middle of loadbalance\n",++barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else /* !IS_SHMEM */ Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif /* IS_SHMEM */ } /*B+2*/ switch(gMem->trav_flag[mymaster]) { /*B+2*/ case ONEDOWN: onechilddown(); break; case MANYDOWN: manychilddown(); break; case ONEUP: #if defined(LESSMEMORY) manychildup(); #else onechildup(); #endif break; case MANYUP: manychildup(); break; default: printf("ERROR: unknown flag in child\n"); exit(1); break; } /*B+2*/ /* Print out times for each processor */ #if LOADBALANCE_OUTPUT if(Tmk_proc_id == 0) printout = 1; #endif /* LOADBALANCE_OUTPUT */ if (printout && !*firstfe) { printf("\n"); for(procindex = 0; procindex < (*slavesPerGroup); procindex++) { if(procindex == 0) j = 0; else j = gMem->pprocfence[procindex-1]; printf("Nuclear family %d: Processor %d: rowtime:\n",currentfamilynum, procindex); accumtime = 0; i = 0; for(; j < gMem->pprocfence[procindex]; j++) { if (i == 0) { printf("%.0f", rowtime[j]); i = 1; } else printf(" + %.0f", rowtime[j]); accumtime += rowtime[j]; } printf(" = %.0f\n",accumtime); } if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) for(procindex = 0; procindex < (*slavesPerGroup); procindex++) { if(procindex == 0) j = 0; else j = gMem->qprocfence[procindex-1]; printf("Nuclear family %d: Processor %d: qrowtime:\n",currentfamilynum, procindex); accumtime = 0; i = 0; for(; j < gMem->qprocfence[procindex]; j++) { if (i == 0) { printf("%.0f", qrowtime[j]); i = 1; } else printf(" + %.0f", qrowtime[j]); accumtime += qrowtime[j]; } printf(" = %.0f\n",accumtime); } } if ((*secondfe)&&(currentthetanum == 0)) { for(procindex = Tmk_proc_id; procindex < (Tmk_proc_id+(*slavesPerGroup)); procindex++) /* Remove overhead */ if((gMem->pprocfence[procindex] - gMem->pprocbase[procindex]) > 1) rowtime[gMem->pprocbase[procindex]] = rowtime[gMem->pprocbase[procindex] + 1]; if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) for(procindex = Tmk_proc_id; procindex < (Tmk_proc_id+(*slavesPerGroup)); procindex++) /* Remove overhead */ if((gMem->qprocfence[procindex] - gMem->qprocbase[procindex]) > 1) qrowtime[gMem->pprocbase[procindex]] = qrowtime[gMem->pprocbase[procindex] + 1]; totaltime = 0; /* Try to balance work more evenly */ for(i=0; i < pnonzcount; i++) totaltime += rowtime[i]; if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) for(i=0; i < qnonzcount; i++) totaltime += qrowtime[i]; oh = 40000 + 10000 * (Tmk_nprocs - 2); if((Tmk_nprocs == 1) || (totaltime < (oh*Tmk_nprocs/(Tmk_nprocs - 1))) || ((pnonzcount < (2*Tmk_nprocs)) && (!((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) || (qnonzcount < (2*Tmk_nprocs))))) { /* if(onlymaster) {*/ for(procindex = 0; procindex < Tmk_nprocs; procindex++) (*temprowfence)[currentfamilynum][procindex] = pnonzcount; if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) for(procindex = 0; procindex < Tmk_nprocs; procindex++) (*tempqfence)[currentfamilynum][procindex] = qnonzcount; } else { totaltime = 0; /* Try to balance work more evenly */ for(i=0; i < pnonzcount; i++) totaltime += rowtime[i]; accumtime = 0; procindex = 0; for(i=0; i < pnonzcount; i++) { accumtime += rowtime[i]; if(accumtime >= ((totaltime * (procindex + 1)) / Tmk_nprocs)) (*temprowfence)[currentfamilynum][procindex++] = i + 1; } /* saveindex = procindex;*/ for(; procindex < Tmk_nprocs; procindex++) (*temprowfence)[currentfamilynum][procindex] = pnonzcount; /* In case the times for the last few rows is 0 */ (*temprowfence)[currentfamilynum][Tmk_nprocs-1] = pnonzcount; if((gMem->trav_flag[mymaster] == ONEUP) || (gMem->trav_flag[mymaster] == ONEDOWN)) { totaltime = 0; /* Try to balance work more evenly */ for(i=0; i < qnonzcount; i++) totaltime += qrowtime[i]; accumtime = 0; procindex = 0; for(i=0; i < qnonzcount; i++) { accumtime += qrowtime[i]; if(accumtime >= ((totaltime * (procindex + 1)) / Tmk_nprocs)) (*tempqfence)[currentfamilynum][procindex++] = i + 1; } for(; procindex < Tmk_nprocs; procindex++) (*tempqfence)[currentfamilynum][procindex] = qnonzcount; /* In case the times for the last few rows is 0 */ (*tempqfence)[currentfamilynum][Tmk_nprocs-1] = qnonzcount; } } } if (gMem->trav_flag[mymaster] != MANYDOWN) onlymaster = 0; } /* segdown updates the genotype probabilities for a child based on the probabilities of parents and other children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children */ void segdown(LINK) struct LOC_seg *LINK; { int step1, step2; /*size of isozygote classes*/ unsigned int here, i, j, first; /*genotype indices*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for male parent*/ thetavalues *WITH5; /*store theta values for female parent*/ unsigned int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ int proc; /*processor number index*/ /* The arrays localpsumcache and localqsumcache store conditional probabilities of different haplotypes being passed on from p and q respectively */ double *localpsumcache, *localqsumcache; boolean depend; int loopprocbound; initseg(LINK); /*get data about this p,q,children triple*/ gMem->trav_flag[mymaster] = MANYDOWN; /*get sparsity patterns for p, q, and child genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; newflagr = (*LINK->r)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ newwithr = (*LINK->r)->gen->genarray; /*get genarray for first child*/ if ((!sexdif) || (!readfemale)) WITH4 = WITH5 = maletheta; else { if (gMem->pmale[mymaster]) { WITH4 = maletheta; /*get male probabilities for p*/ WITH5 = femaletheta; /*get female probabilities for q*/ } else { WITH4 = femaletheta; /*get female probabilities for p*/ WITH5 = maletheta; /*get male probabilities for q*/ } } /*The case of 1 child (nchild==0) is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 0) { gMem->trav_flag[mymaster] = ONEDOWN; /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ pnonzcount = qnonzcount = 0; if (*firstfe) { /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i++) { if(newflag3[i] != 0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ } } /*iterate over genotypes for p*/ for (i = 0; i < fgeno; i++) { if(newflag2[i] != 0) { pnonzgens[pnonzcount++] = i; /* store index of nonzero value */ } } } loadbalance(LINK); localqsumcache = arrqsumcache[mymaster]; localpsumcache = arrpsumcache[mymaster]; for(j=(mymaster + 1); j<(mymaster + (*slavesPerGroup));j++) { for (i = 0; i < maxhaplo; i++) { localqsumcache[i] += arrqsumcache[j][i]; localpsumcache[i] += arrpsumcache[j][i]; } } /*In this section of the code we update the probabilities for the child based on the probabilities for the parents*/ /*initialize gene array */ for(i = 0; i < fgeno; i++) { gene[i] = 0.0; } /*Iterate over all joint genotypes of the child*/ for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*probability of child getting genotype here as a result of p passing on c1 and q passing on c2 is summed to gene[here] */ gene[here] += localpsumcache[c1-1] * localqsumcache[c2-1]; /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { gene[here] += localpsumcache[c2-1] * localqsumcache[c1-1]; } } /*set up new genarray for r; it is gene scaled by segscale*/ for (first = 0; first < fgeno; first++) { if(newflagr[first] == 0) continue; if(gene[first] == 0.0) newflagr[first] = 0; newwithr[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 0*/ /*find nonzero entries in p's genarray and make a list of them stored in pnonzgens; just get one per isozygote class*/ qnonzcount = pnonzcount = 0; if (*firstfe) { /*iterate over genotypes for p*/ for(i = 0; i < fgeno; i += step1) { /*number of distinct probabilties needed for i's isoz. class*/ step1 = probend[i] - probstart[i] + 1; for(j = i; j < i+step1; j++) if(newflag2[j] != 0) { pnonzgens[pnonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } } loadbalance(LINK); if (onlymaster) loopprocbound = mymaster +1; else loopprocbound = mymaster + (*slavesPerGroup); /*sum up different contributions to gene*/ for(i=0; i < fgeno; i++){ if(newflagr[i] == 0) continue; else { gene[i] = 0.0; for(proc=mymaster; proc < loopprocbound; proc++) gene[i] += arrgene[proc][i]; } } onlymaster =0; /*finally update child's real genarray by copying gene multiplied by scale factor segscale*/ for(i = 0; i < fgeno; i++) { if(newflagr[i] == 0) continue; if(gene[i] == 0.0) newflagr[i] = 0; /*if probability changes from nonzero to 0.0 change flag to 0*/ newwithr[i] *= segscale * gene[i]; } } /*Added by A. A. Schaffer to handle loops */ if (loopfirstgen && (!((*LINK->r)->loopdepend))) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->p)->loopdepend) || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->r)->loopdepend = depend; (*LINK->r)->loopneeded = false; } } if ((*LINK->r)->loopdepend) { if (!((*LINK->p)->loopdepend)) (*LINK->p)->loopneeded = true; if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->p, LINK->LINK); cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segdown*/ /*onechilddown handles the case up updating a child from both parents, when there is just one child */ void onechilddown() { int FORLIM; /*loop bound*/ int pnonzindex, qnonzindex; /*loop indices for nonzero values*/ double valtemp; /*intermediate values in probability updates*/ double val; /*temporaries to store intermediate values*/ unsigned int f1, f2; /*two haplotypes from parents*/ unsigned int i, j, first; /*genotype indices*/ int procindex; thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for male parent*/ thetavalues *WITH5; /*store theta values for female parent*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ /* newsegprob is used to hold segprob arrays, which contains the probabilities for various patterns of recombination events*/ double *newsegprob; int ind; /*used to store offset for probability array*/ /* Structures to store start and end time for rows */ struct timeval starttime, endtime; /* The arrays localpsumcache and localqsumcache store conditional probabilities of different haplotypes being passed on from p and q respectively */ double *localpsumcache, *localqsumcache; int pbase, pfence, qbase, qfence; /*bounds for p and q genotypes for this processor to work on*/ pbase = gMem->pprocbase[Tmk_proc_id]; pfence = gMem->pprocfence[Tmk_proc_id]; qbase = gMem->qprocbase[Tmk_proc_id]; qfence = gMem->qprocfence[Tmk_proc_id]; nchild = gMem->nchild[mymaster]; /*get sparsity patterns for p, q, and child genarrays*/ newflag2 = gMem->pgenptr[mymaster]->sparseflag; newflag3 = gMem->qgenptr[mymaster]->sparseflag; newflagr = gMem->rgenptr[mymaster]->sparseflag; WITH2 = gMem->pgenptr[mymaster]; /*get genetic data for p*/ WITH3 = gMem->qgenptr[mymaster]; /*get genetic data for q*/ newwithr = gMem->rgenptr[mymaster]->genarray; /*get genarray for first child*/ newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ if ((!sexdif) || (!readfemale)) WITH4 = WITH5 = maletheta; else { if (gMem->pmale[mymaster]) { WITH4 = maletheta; /*get male probabilities for p*/ WITH5 = femaletheta; /*get female probabilities for q*/ } else { WITH4 = femaletheta; /*get female probabilities for p*/ WITH5 = maletheta; /*get male probabilities for q*/ } } localpsumcache = arrpsumcache[Tmk_proc_id]; localqsumcache = arrqsumcache[Tmk_proc_id]; /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; localpsumcache[i] = 0.0; localqsumcache[i] = 0.0; } /*set up flag array*/ for(i = 0; i < fgeno; i++) { if(newwithr[i] == 0.0) continue; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } if(!*firstfe) { /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ /*iterate over genotypes for q*/ qnonzgens = privateqnonzgens; qnonzcount = 0; for(i = 0; i < fgeno; i++) { if(newwith3[i] != 0.0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ } } pnonzgens = privatepnonzgens; pnonzcount = 0; /*iterate over genotypes for p*/ for (i = 0; i < fgeno; i++) { if(newwith2[i] != 0.0) { pnonzgens[pnonzcount++] = i; /* store index of nonzero value */ } } /*stripe pnonzgens array*/ if (!onlymaster) { j = 0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ for(i = procindex; i < pnonzcount; i+=Tmk_nprocs) stripe_pnonzgens[j++]=pnonzgens[i]; } for(i = 0; i < pnonzcount; i++) pnonzgens[i] = stripe_pnonzgens[i]; /*stripe qnonzgens array*/ j =0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ for(i = procindex; i < qnonzcount; i+=Tmk_nprocs) stripe_qnonzgens[j++]=qnonzgens[i]; } for(i = 0; i < qnonzcount; i++) qnonzgens[i] = stripe_qnonzgens[i]; } } else { pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; } /*This section of the code precomputes for each haplotype the the probability that the child will inherit this haplotype from p. Each genotype has two haplotypes, but can produce others by recombination. Therefore, for each genotype we must sum over the different haplotypes that can be produced by its isozygote class. The contributions for each haplotype are stored in localpsumcache. Afterwards a similar computation is done for the inheritance from q with the results stored in localqsumcache.*/ newsegprob = WITH4->segprob; /*get p probabilities for recomb. patterns*/ for (pnonzindex = pbase; pnonzindex < pfence; pnonzindex++) { #if LOADBALANCE_OUTPUT if(mymaster == 0) #else /* !LOADBALANCE_OUTPUT */ if((*secondfe)&&(mymaster == 0)) #endif /* LOADBALANCE_OUTPUT */ gettimeofday(&starttime, NULL); /* Get start time */ first = pnonzgens[pnonzindex]; FORLIM = fence[first]; /*find end of isozygote class of first*/ valtemp = newwith2[first]; /*probability of getting this genotype*/ /*iterate over all members of first's isozygote calss*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*get haplotypes*/ f2 = haps2[i]; if ((flag[f1-1] !=0) || (flag[f2-1] != 0)) { ind = hind[i]; /*get probability offset for i*/ /*multiply probability of getting genotype times probability of this recombination pattern and haplo. choice*/ val = valtemp * newsegprob[ind]; /*add to psumcache*/ if(flag[f1-1] != 0) { localpsumcache[f1-1] += val; } if(flag[f2-1] != 0) { localpsumcache[f2-1] += val; } } } #if LOADBALANCE_OUTPUT if(mymaster == 0) { #else /* ! LOADBALANCE_OUTPUT */ if((*secondfe)&&(mymaster == 0)) { #endif /* LOADBALANCE_OUTPUT */ gettimeofday(&endtime, NULL); /* Get end time */ rowtime[pnonzindex] = 1000000*(endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec); } } newsegprob = WITH5->segprob; /*get q probabilities*/ /*iterate over all joint genotypes*/ for (qnonzindex = qbase; qnonzindex < qfence; qnonzindex++) { #if LOADBALANCE_OUTPUT if(mymaster == 0) #else /* ! LOADBALANCE_OUTPUT */ if((*secondfe)&&(mymaster == 0)) #endif /* LOADBALANCE_OUTPUT */ gettimeofday(&starttime, NULL); /* Get start time */ first = qnonzgens[qnonzindex]; valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] !=0) || (flag[f2-1] !=0)) { /*condition probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ ind = hind[i]; /*get probability offset for i*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { localqsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { localqsumcache[f2 - 1] += val; } } } #if LOADBALANCE_OUTPUT if(mymaster == 0) { #else /* !LOADBALANCE_OUTPUT */ if((*secondfe)&&(mymaster == 0)) { #endif /*LOADBALANCE_OUTPUT */ gettimeofday(&endtime, NULL); /* Get end time */ qrowtime[qnonzindex] = 1000000*(endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec); } } if (((*slavesPerGroup) > 1)&&(!onlymaster)) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at end of onechilddown\n", ++barnum); #endif /* BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else /* !IS_SHMEM */ Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif /* IS_SHMEM */ } } /* segdown updates the genotype probabilities for a child based on the probabilities of parents and other children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children manychilddown handles the case when p and q have more than one child (nchild > 0) */ void manychilddown() { int pbase, pfence, qbase, qfence; /*bounds for p and q genotypes for this processor to work on*/ #if !PRECOMPUTE int findex, sindex; #endif int pnonzindex, qnonzindex; /*loop index for nonzero values*/ int step1, step2; /*size of isozygote classes*/ unsigned int *tempstart; /*temporary index to probability array*/ double val, temp1; /*temporaries to store intermediate values*/ unsigned int i, j, first, second; /*genotype indices*/ int procindex; unsigned int fslength; /*number of probs. for product isoz. class of p,q*/ int jointisoindex, fisoindex; /*indices to work within isozygote classes*/ unsigned currentindex; /*index to update genarray within isozygote class*/ unsigned l; /*increment used to manage offset into probtableindex l is the number of probability values needed for the current isozygote class. This is obtained by multplying the number of probabilities (maxneed) times the size of the class*/ unsigned k; /*index to loop over children*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr, *newwithc; /*store genarrays for p,q, and children*/ #if !PRECOMPUTE /* cgh - gcc */ double* newsegr; /* store genarrays for p,q, and children */ #endif /* !PRECOMPUTE */ thetavalues *WITH4; /*stores theta values for p parent*/ thetavalues *WITH5; /*store theta values for q parent*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ double *localgene; /* newsegprob1, and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob1, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ /* Structures to store start and end time for rows */ struct timeval starttime, endtime; pbase = gMem->pprocbase[Tmk_proc_id]; pfence = gMem->pprocfence[Tmk_proc_id]; qbase = gMem->qprocbase[Tmk_proc_id]; qfence = gMem->qprocfence[Tmk_proc_id]; nchild = gMem->nchild[mymaster]; /*get sparsity patterns for p, q, and child genarrays*/ WITH2 = gMem->pgenptr[mymaster]; /*get genetic data for p*/ WITH3 = gMem->qgenptr[mymaster]; /*get genetic data for q*/ newflag2 = gMem->pgenptr[mymaster]->sparseflag; newflag3 = gMem->qgenptr[mymaster]->sparseflag; newflagr = gMem->rgenptr[mymaster]->sparseflag; newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ newwithr = gMem->rgenptr[mymaster]->genarray; /*get genarray for first child*/ if ((!sexdif) || (!readfemale)) WITH4 = WITH5 = maletheta; else { if (gMem->pmale[mymaster]) { WITH4 = maletheta; /*get male probabilities for p*/ WITH5 = femaletheta; /*get female probabilities for q*/ } else { WITH4 = femaletheta; /*get female probabilities for p*/ WITH5 = maletheta; /*get male probabilities for q*/ } } newsegprob1 = WITH4->segprob; /*get p probabilities*/ newsegprob2 = WITH5->segprob; /*get q probabilties*/ /*initialize genarray entries for child to 0*/ /* if(onlymaster) for(i = 0; i < fgeno; i++) { if(newflagr[i] == 0) continue; for(j=(Tmk_proc_id+1);j<(Tmk_proc_id+*slavesPerGroup);j++) arrgene[j][i] = 0.0; }*/ for(i = 0; i < fgeno; i++) { arrgene[Tmk_proc_id][i] = 0.0; } localgene = arrgene[Tmk_proc_id]; if(!*firstfe) { /*find nonzero entries in p's genarray and make a list of them stored in pnonzgens; just get one per isozygote class*/ pnonzgens = privatepnonzgens; pnonzcount = 0; /*iterate over genotypes for p*/ for(i = 0; i < fgeno; i += step1) { /*number of distinct probabilties needed for i's isoz. class*/ step1 = probend[i] - probstart[i] + 1; for(j = i; j < i+step1; j++) if(newflag2[j] != 0) { pnonzgens[pnonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } /*find nonzero entries in q's genarray and make a list of them stored in qnonzgens; just get one per isozygote class*/ qnonzgens = privateqnonzgens; qnonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { qnonzgens[qnonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } qfence = qnonzcount; /* Set qfence to correct value */ /*stripe pnonzgens array*/ if (!onlymaster) { j = 0; for(procindex = 0; procindex < Tmk_nprocs; procindex++){ for(i = procindex; i < pnonzcount; i+=Tmk_nprocs) stripe_pnonzgens[j++]=pnonzgens[i]; } for(i = 0; i < pnonzcount; i++) pnonzgens[i] = stripe_pnonzgens[i]; } } else { pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; } /*iterate over genotypes for p*/ for (pnonzindex = pbase; pnonzindex < pfence; pnonzindex++) { #if LOADBALANCE_OUTPUT if(mymaster == 0) #else /* !LOADBALANCE_OUTPUT */ if((*secondfe)&&(mymaster == 0)) #endif /* LOADBALANCE_OUTPUT */ gettimeofday(&starttime, NULL); /* Get start time */ first = pnonzgens[pnonzindex]; step1 = probend[first] - probstart[first]+1; /*iterate over the genotypes representing isozygote classes that q may have*/ for (qnonzindex = qbase; qnonzindex < qfence; qnonzindex++) { second = qnonzgens[qnonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; fslength = step1 * step2; /*number of probs. of combined isozygote class*/ #if PRECOMPUTE fisoindex = (probstart[first] - 1) * nuneed - 1; /*probability array offset*/ #endif tempstart = probstart + second; /*set tempstart to the start of the section of probstart that we want*/ l = step1 * nuneed; /*number of probabilities for this isozygote class*/ /*call segsumdown2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsumdown2(first,second,fslength); for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) segval[jointisoindex] = 0.0; #if !PRECOMPUTE newsegr = tempseg2; tempprob = tempseg; for (k = 0;k < nchild; k++) { for(i = 0; i < step1; i++) { newwithr = tempprob; findex = probstart[first + i] - 1; temp1 = newsegprob1[findex]; for (sindex = 0; sindex < step2; sindex++) newsegr[sindex] = temp1*(*newwithr++); for(findex++; findex < probend[first + i]; findex++) { temp1 = newsegprob1[findex]; for(sindex = 0; sindex < step2; sindex++) newsegr[sindex] += temp1*(*newwithr++); } newsegr += step2; } tempprob += fslength; } #endif /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { #if PRECOMPUTE fisoindex += l; /*increment by number of probabilities needed for this iso. class*/ #endif continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) { continue; } /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ #if PRECOMPUTE #if AUTOSOMAL_RUN if ((!sexdif) || (gMem->pmale[mymaster])) tempprob = probtable[mymaster] + probtableindex[mymaster][fisoindex+tempstart[j]]; #if SEXDIF_RUN else tempprob = probtabledif[mymaster] + probtableindex[mymaster][fisoindex+tempstart[j]]; #endif /*SEXDIF_RUN*/ #endif /*AUTOSOMAL_RUN*/ #endif /*PRECOMPUTE*/ /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the newwithr array. the number of contributions is fslength which is the number of probabilties needed for the joint isozygote class for the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ #if PRECOMPUTE val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithc = tempseg + fslength; /*move the base of newwithc*/ #else val = 1.0; newwithc = tempseg2 + i * step2; tempprob = newsegprob2 + probstart[second+j] - 1; #endif /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithc has the effect of incrementing the child*/ #if PRECOMPUTE for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithc[0]; for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithc[jointisoindex]; #else for(k = 0; k < nchild; k++) { temp1 = 0.0; for(sindex = 0; sindex < step2; sindex++) temp1 += tempprob[sindex] * newwithc[sindex]; #endif val *= temp1; newwithc += fslength; } /*probability of this combination of parent genotypes*/ val *= newwith2[first+i] * newwith3[second+j]; #if PRECOMPUTE for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) { /*probability of this recombination pattern (based on other children)*/ segval[jointisoindex] += tempprob[jointisoindex] * val; } #else jointisoindex = 0; for(findex = probstart[first+i]-1; findex < probend[first+i]; findex++) for(sindex = probstart[second + j]-1; sindex < probend[second + j]; sindex++) segval[jointisoindex++] +=newsegprob1[findex] * newsegprob2[sindex] * val; #endif } #if PRECOMPUTE fisoindex += l; /*go to next isozygote for p*/ #endif } /*update the probabilities of four joint genotypes the child might get; each different choice of recombination pattern will lead to a different set of four genotypes*/ currentindex = 0; for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) { temp1 = segval[jointisoindex]; localgene[segindex[currentindex++]-1] += temp1; localgene[segindex[currentindex++]-1] += temp1; localgene[segindex[currentindex++]-1] += temp1; localgene[segindex[currentindex++]-1] += temp1; } } #if LOADBALANCE_OUTPUT if(mymaster == 0) { #else /* !LOADBALANCE_OUTPUT */ if((*secondfe)&&(mymaster == 0)) { #endif /* LOADBALANCE_OUTPUT */ gettimeofday(&endtime, NULL); /* Get end time */ rowtime[pnonzindex] = 1000000*(endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec); } } if (((*slavesPerGroup) > 1)&&(!onlymaster)) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at end of manychilddown\n", ++barnum); #endif /* BARRIER_OUTPUT */ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else /* !IS_SHMEM */ Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif /* IS_SHMEM */ } } /*manychilddown*/ unsigned lsegsexfun2(first,second,LINK) int first, second; struct LOC_seg *LINK; { int g1, g2; /*four gene numbers*/ int j, k; /* loop indices*/ int s1, s2; /*haplotype numbers*/ int FORLIM1, FORLIM2; /*loop bounds*/ int *TEMPGENE1; /* store pointers into genenumber*/ unsigned char *tempflag3; /*stores sparsity pattern for child's genarray*/ FORLIM1 = base[second];/*find beginning and end of isozygote class for second*/ FORLIM2 = fence[second]; TEMPGENE1 = genenumber[first];/*get pointer into genenumber for this haplotype*/ /*try to find a non-zero value for each child*/ for (k = 0; k < nchild; k++) { /*retrieve sparsity pattern for child k*/ tempflag3 = thischild[k]->sparseflag; /*iterate over all the recombined isozygotes of second*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*get haplotypes of this genotype*/ s2 = haps2[j]; if(malechild[k]) { if(tempflag3[s1 - 1] != 0 || tempflag3[s2 - 1] != 0) goto notzero; else continue; } g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*if any of the flags is TRUE, then this child can have this genotype, and we move immediately to testing the next child*/ if(tempflag3[g1 - 1] != 0 || tempflag3[g2 - 1] != 0) goto notzero; } return 0; /*this child failed to have any of the genotypes for the isozygote class, so this isozygote class is not possible*/ notzero: continue; } return 1; /*all children passed the test and have a possible joint genotype*/ } /* segsexsum2 is used in segsexup to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class of both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ /* cgh -- made void for gcc */ Local void segsexsum2(first,second,fslength,LINK) int first, second, fslength; struct LOC_seg *LINK; { int g1, g2; /*indices to store gene numbers*/ int f1, s1, s2; /*indices to store haplotype numbers*/ int indey; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int i, j, k, l; /*loop indices*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ indey = 0; /*start with first isozygote in the class*/ i = base[first]; f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = indey, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ if(malechild[k]) tempseg[l] = (tempwith3[s1 - 1] + tempwith3[s2 - 1]); else tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1]); } indey++; /*increment isozygote class counter*/ } } /*segsexsumdown2 is used in segdown to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class for both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ /* cgh -- void for gcc */ Local void segsexsumdown2(first,second,fslength,male,LINK) int first, second, fslength, male; struct LOC_seg *LINK; { int g1, g2; /*indices to store gene numbers*/ int f1, s1, s2; /*indices to store haplotype numbers*/ int indey; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int index2; /*used as index for isozygote class*/ int i, j, k, l; /*loop indices*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ indey = 0; /*start with first isozygote in the class*/ index2 = 0; /*iterate over isozygotes of i*/ i = base[first]; f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*store these gene numbers for later use; the key point is that we will want these numbers consecutively later, so we store them consecutively in segindex*/ if(male) { segindex[index2++] = s1; segindex[index2++] = s2; } else { segindex[index2++] = g1; segindex[index2++] = g2; } /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = indey, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ if(malechild[k]) tempseg[l] = (tempwith3[s1 - 1] + tempwith3[s2 - 1]); else tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1]); } indey++; /*increment isozygote class counter*/ } } /*segsexup updates the genotype probabilities for a parent (p) based on the probabilities of children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children*/ void segsexup(LINK) struct LOC_seg *LINK; { int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ double valtemp; /*intermediate values in probability updates*/ double val, temp1, tempr; /*temporaries to store intermediate values*/ unsigned int f1, f2; /*four haplotypes from parents*/ unsigned int here, i, j, first, second; /*genotype indices*/ int jointisoindex; /*indices to work within isozygote classes*/ unsigned k; /*index to loop over children*/ unsigned char skip; /*used to skip iterations of a loop*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ unsigned int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ static unsigned current; /* newsegprob, newsegprob1, and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ int ind; /*used to store offset for probability array*/ initseg(LINK); /*get data about this p,q,children triple*/ /*clear out pools, debugging for(i=0; i<= current; i++){ indpool[i]=0; invpool[i]=0; nextpool[i]=0; } */ /*get sparsity patterns for p and q genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get genarray for p*/ newwith3=WITH3->genarray; /*get genarray for q*/ newwithr=thischild[0]->genarray; /*get genarray for first child*/ if((*LINK->p)->male) { /*The case of 1 child is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 1) { /*initialize cache data structures*/ for(i=0;isegprob; /*use female probabilities to work with q*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] != 0) || (flag[f2-1] != 0)) { /*conditional probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the parent p based on the probabilities for the child*/ /*Iterate over all joint genotypes of the child*/ if(malechild[0]) { newflagr=thischild[0]->sparseflag; temp1 = 0.0; for(here = 0; here < mgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; temp1 = tempr * qsumcache[here]; } for(here = 0; here < mgeno; here++) gene[here] = temp1; } else { newflagr=thischild[0]->sparseflag; for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; c1 = invgenenum1[here]; c2 = invgenenum2[here]; gene[c1 - 1] += tempr * qsumcache[c2 - 1]; if(c1 != c2) gene[c2 - 1] += tempr * qsumcache[c1 - 1]; } } /*set up new genarray for p; it is gene scaled by segscale*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0.0) continue; newwith2[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 1*/ newwith2=(*LINK->p)->gen->genarray; /*get p's genarray*/ /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; newwith3=(*LINK->q)->gen->genarray; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob2 = femaletheta->segprob; /*get female probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0) continue; /*initialize update multiple for each isozygote in class*/ segval[0] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(first,second,LINK) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; /*call segsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsum2(first,second,step2,LINK); /*now specialize update for each member of first's class*/ /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) continue; /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ tempprob = newsegprob2 + probstart[second+j] - 1; /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the newwithr array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + step2; /*move the base of newwithr*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; val *= temp1; newwithr += step2; } /*update segval entry for this isozygote of first*/ segval[0] += newwith3[second+j] * val; } } /*update p's genarray for each isozygote in this class*/ newwith2[first] *= segval[0] * segscale; } } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < mgeno; i++) if((newflag2[i]==1) && (newwith2[i] == 0.0)) newflag2[i] = 0; } else { /* p is female */ if(nchild == 1) { /*initialize cache data structures*/ for(i=0;isegprob; /*use male probabilities to work with p*/ /*Iterate over all joint genotypes of the child*/ newflagr=thischild[0]->sparseflag; if(malechild[0]) { for(here = 0; here < mgeno; here++) { if(newflagr[here] == 0) continue; tempr = qsumcache[0] * newwithr[here]; for(i=phapcache1[here].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += tempr*newsegprob[indpool[i]]; } } } else { for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*now find all the values of first that as genotypes of the father could have passed on the other haplotype c1; multiply by their probabilties, which are stored in phapcache, and add to the entry gene[first], which will be used to form the new genarray for p*/ temp1 = tempr * newwith3[c2 - 1]; for(i=phapcache1[c1-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { temp1 = tempr * newwith3[c1 - 1]; for(i=phapcache1[c2-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } } } } /*set up new genarray for p; it is gene scaled by segscale*/ for (first = 0; first < fgeno; first++) { if(newflag2[first] == 0.0) continue; newwith2[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 1*/ newwith2=(*LINK->p)->gen->genarray; /*get p's genarray*/ /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; newwith3=(*LINK->q)->gen->genarray; /*iterate over genotypes for q*/ for(i = 0; i < mgeno; i++) if(newflag3[i] != 0) nonzgens[nonzcount++] = i; /*store index of nonzero value*/ newsegprob2 = femaletheta->segprob; /*get female probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < fgeno; first += step1) { /*number of distinct probabilties needed for first's isoz. class*/ step1 = probend[first] - probstart[first]+1; skip = 1; /*work only on those isozygotes that are possible*/ for(i = first; i < first+step1; i++) if(newflag2[i] != 0) { skip = 0; break; /*go to next isozygote in class*/ } if(skip) continue; /*initialize update multiple for each isozygote in class*/ for(i = 0; i < step1; i++) segval[i] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(second,first,LINK) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ /*call segsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsum2(second,first,step1,LINK); /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ /*skip if this isozygote not possible*/ if(newflag3[second] == 0) continue; /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ tempprob = newsegprob2 + probstart[first+i] - 1; /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the newwithr array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step1; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + step1; /*move the base of newwithr*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < step1; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; val *= temp1; newwithr += step1; } /*update segval entry for this isozygote of first*/ segval[i] += newwith3[second] * val; } } /*update p's genarray for each isozygote in this class*/ for(i = 0; i < step1; i++) newwith2[first+i] *= segval[i] * segscale; } } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < fgeno; i++) if((newflag2[i]==1) && (newwith2[i] == 0.0)) newflag2[i] = 0; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexup*/ /* segdown updates the genotype probabilities for a child based on the probabilities of parents and other children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children */ void segsexdown(LINK) struct LOC_seg *LINK; { int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ unsigned cgeno; int step2; /*size of isozygote classes*/ double valtemp; /*intermediate values in probability updates*/ double val, temp1; /*temporaries to store intermediate values*/ unsigned int f1, f2; /*four haplotypes from parents*/ unsigned int here, i, j, first, second; /*genotype indices*/ int jointisoindex; /*indices to work within isozygote classes*/ unsigned currentindex; /*index to update genarray within isozygote class*/ unsigned k; /*index to loop over children*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr, *newwithc; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for male parent*/ thetavalues *WITH5; /*store theta values for female parent*/ unsigned int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ unsigned char male; /* newsegprob, newsegprob1, and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ int ind; /*used to store offset for probability array*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p, q, and child genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; newflagr = (*LINK->r)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ newwithr = (*LINK->r)->gen->genarray; /*get genarray for first child*/ WITH4 = maletheta; /*get male probabilities*/ WITH5 = femaletheta; /*get female probabilities*/ male = (*LINK->r)->male; if(male) cgeno = mgeno; else cgeno = fgeno; /*The case of 1 child (nchild==0) is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 0) { /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; psumcache[i] = 0.0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ for(i = 0; i < cgeno; i++) { if(newwithr[i] == 0.0) continue; gene[i] = 0.0; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } newsegprob = femaletheta->segprob; /*use female probabilities to work with q*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] !=0) || (flag[f2-1] !=0)) { /*condition probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ ind = hind[i]; /*get probability offset for i*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the child based on the probabilities for the parents*/ /*Iterate over all joint genotypes of the child*/ if(male) { double temp1 = 0.0; for(here = 0; here < mgeno; here++) { temp1 += newwith2[here]; } for(here = 0; here < mgeno; here++) { if(newflagr[here] == 0) continue; gene[here] = temp1 * qsumcache[here]; } } else { for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*probability of child getting genotype here as a result of p passing on c1 and q passing on c2 is summed to gene[here] */ gene[here] += newwith2[c1-1] * qsumcache[c2-1]; /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { gene[here] += newwith2[c2-1] * qsumcache[c1-1]; } } } /*set up new genarray for r; it is gene scaled by segscale*/ for (first = 0; first < cgeno; first++) { if(newflagr[first] == 0) continue; if(gene[first] == 0.0) newflagr[first] = 0; newwithr[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 0*/ newwith2=(*LINK->p)->gen->genarray; /*get p's genarray*/ /*initialize genarray entries for child to 0*/ for(i = 0; i < cgeno; i++) { if(newflagr[i] == 0) continue; gene[i] = 0.0; } /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; newwith3=(*LINK->q)->gen->genarray; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob2 = femaletheta->segprob; /*get female probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0) continue; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(first,second,LINK) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; /*call segsumdown2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsumdown2(first,second,step2,male,LINK); for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) segval[jointisoindex] = 0.0; /*now specialize update for each member of first's class*/ if(newflag2[first] == 0) continue; /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) { continue; } tempprob = newsegprob2 + probstart[second+j] - 1; /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the newwithr array. the number of contributions is fslength which is the number of probabilties needed for the joint isozygote class for the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithc = tempseg + step2; /*move the base of newwithc*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithc has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithc[0]; for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithc[jointisoindex]; val *= temp1; newwithc += step2; } /*probability of this combination of parent genotypes*/ val *= newwith2[first] * newwith3[second+j]; for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) { /*probability of this recombination pattern (based on other children)*/ segval[jointisoindex] += tempprob[jointisoindex] * val; } } /*update the probabilities of four joint genotypes the child might get; each different choice of recombination pattern will lead to a different set of four genotypes*/ currentindex = 0; for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) { temp1 = segval[jointisoindex]; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; } } } /*finally update child's real genarray by coppy gene multiplied by scale factor segscale*/ for(i = 0; i < cgeno; i++) { if(newflagr[i] == 0) continue; if(gene[i] == 0.0) newflagr[i] = 0; /*if probability changes from nonzero to 0.0 change flag to 0*/ newwithr[i] *= segscale * gene[i]; } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexdown*/ fastlink-4.1P-fix95/4.1P/src/sexmodified.c0000644000265600020320000010637010517437665017301 0ustar tilleaadmin/* This file contains new versions of the routines */ /* segsexup, segsexdown, and some auxiliary routines for use with */ /* LODSCORE, ILINK, LINKMAP, and MLINK */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analaysis, */ /* Human Heredity 44(1994), pp. 225-237. */ /* The versions in this file use a lot of memory */ /* Somewhat slower versions that use less memory */ /* are in slowsexmodified.c */ /* 2-8-94; fixed two bugs AAS*/ /*Most of the code in this file was written by R. M. Idury */ #include "commondefs.h" #include "moddefs.h" unsigned lsegsexfun2(first,second) unsigned first, second; { int g1, g2; /*two gene numbers*/ int j, k; /* loop indices*/ int s1, s2; /*haplotype numbers*/ int FORLIM1, FORLIM2; /*loop bounds*/ int *TEMPGENE1; /* store pointers into genenumber*/ unsigned char *tempflag3; /*stores sparsity pattern for child's genarray*/ FORLIM1 = base[second];/*find beginning and end of isozygote class for second*/ FORLIM2 = fence[second]; TEMPGENE1 = genenumber[first];/*get pointer into genenumber for this haplotype*/ /*try to find a non-zero value for each child*/ for (k = 0; k < nchild; k++) { /*retrieve sparsity pattern for child k*/ tempflag3 = thischild[k]->sparseflag; /*iterate over all the recombined isozygotes of second*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*get haplotypes of this genotype*/ s2 = haps2[j]; if(malechild[k]) { if(tempflag3[s1 - 1] != 0 || tempflag3[s2 - 1] != 0) goto notzero; else continue; } g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*if any of the flags is TRUE, then this child can have this genotype, and we move immediately to testing the next child*/ if(tempflag3[g1 - 1] != 0 || tempflag3[g2 - 1] != 0) goto notzero; } return 0; /*this child failed to have any of the genotypes for the isozygote class, so this isozygote class is not possible*/ notzero: continue; } return 1; /*all children passed the test and have a possible joint genotype*/ } /* segsexsum2 is used in segsexup to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class of both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ Local void segsexsum2(first,second,fslength) unsigned first,second, fslength; { int g1, g2; /*indices to store gene numbers*/ int f1, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int i, j, k, l; /*loop indices*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ i = base[first]; f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the two ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the two joint genotypes that the child can get from the current parental joint genotypes*/ if(malechild[k]) tempseg[l] = (tempwith3[s1 - 1] + tempwith3[s2 - 1]); else tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1]); } index++; /*increment isozygote class counter*/ } } /*segsexsumdown2 is used in segsexdown to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class for both parental genotypes; fs stands for the product of first and second. */ Local void segsexsumdown2(first,second,fslength,male) unsigned first,second,fslength; unsigned char male; { int g1, g2; /*indices to store gene numbers*/ int f1, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int index2; /*used as index for isozygote class*/ int i, j, k, l; /*loop indices*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ index2 = 0; /*iterate over isozygotes of i*/ i = base[first]; f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the two ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*store these gene numbers for later use; the key point is that we will want these numbers consecutively later, so we store them consecutively in segindex*/ if(male) { segindex[index2++] = s1; segindex[index2++] = s2; } else { segindex[index2++] = g1; segindex[index2++] = g2; } /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the two joint genotypes that the child can get from the current parental joint genotypes*/ if(malechild[k]) tempseg[l] = (tempwith3[s1 - 1] + tempwith3[s2 - 1]); else tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1]); } index++; /*increment isozygote class counter*/ } } /*segsexup updates the genotype probabilities for a parent (p) based on the probabilities of children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children*/ Void segsexup(LINK) struct LOC_seg *LINK; { int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ static int current; /*index for haplotype pools*/ double valtemp; /*intermediate value in probability updates*/ double val, temp1, tempr; /*temporaries to store intermediate values*/ int f1, f2; /*two haplotypes from parent*/ int here, i, j, first, second; /*genotype indices*/ int jointisoindex; /*index to work within isozygote classes*/ int k; /*index to loop over children*/ char skip; /*used to skip iterations of a loop*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ int c1, c2; /*haplotypes*/ boolean depend; /*used to handle loops*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ /* newsegprob and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ int ind; /*used to store offset for probability array*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p and q genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get genarray for p*/ newwith3=WITH3->genarray; /*get genarray for q*/ newwithr=thischild[0]->genarray; /*get genarray for first child*/ if((*LINK->p)->male) { /*The case of 1 child is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 1) { /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; phapcache1[i].first = 0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ if(malechild[0]) { for(i = 0; i < mgeno; i++) { gene[i] = 0.0; if(newwithr[i] == 0.0) continue; flag[i] = 1; } } else { for(i = 0; i < fgeno; i++) { gene[i] = 0.0; if(newwithr[i] == 0.0) continue; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } } /*This section of the code precomputes for each haplotype the the probability that the child will inherit this haplotype from q. Each genotype has two haplotypes, but can produce others by recombination. Therefore, for each genotype we must sum over the different haplotypes that can be produced by its isozygote class. The contributions for each haplotype are stored in qsumcache.*/ newsegprob = femaletheta->segprob; /*get probabilities to work with q*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] != 0) || (flag[f2-1] != 0)) { /*conditional probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the parent p based on the probabilities for the child*/ /*Iterate over all joint genotypes of the child*/ if(malechild[0]) { newflagr=thischild[0]->sparseflag; temp1 = 0.0; for(here = 0; here < mgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; temp1 += tempr * qsumcache[here]; /*Fixed bug here 2-10-94, AAS*/ } for(here = 0; here < mgeno; here++) gene[here] = temp1; } else { newflagr=thischild[0]->sparseflag; for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; c1 = invgenenum1[here]; c2 = invgenenum2[here]; gene[c1 - 1] += tempr * qsumcache[c2 - 1]; if(c1 != c2) gene[c2 - 1] += tempr * qsumcache[c1 - 1]; } } /*set up new genarray for p; it is gene scaled by segscale*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0.0) continue; newwith2[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 1*/ /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob2 = maletheta->segprob; /*get p probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0) continue; /*initialize update multiple for each isozygote in class*/ segval[0] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; /*call segsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsum2(first,second,step2); /*now specialize update for each member of first's class*/ /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) continue; /*get offset into newsegprob2; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ tempprob = newsegprob2 + probstart[second+j] - 1; /*combine for all children*/ /*due to the arrangement in segsexsum all the probability contributions for a given child are contiguous in the tempseg array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + step2; /*move the base of newwithr*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; val *= temp1; newwithr += step2; } /*update segval entry for this isozygote of first*/ segval[0] += newwith3[second+j] * val; } } /*update p's genarray for each isozygote in this class*/ newwith2[first] *= segval[0] * segscale; } } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < mgeno; i++) if((newflag2[i]==1) && (newwith2[i] == 0.0)) newflag2[i] = 0; } else { /* p is female */ if(nchild == 1) { /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; phapcache1[i].first = 0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ for(i = 0; i < fgeno; i++) /*Fixed bug here 2-8-94, AAS*/ gene[i] = 0.0; if(malechild[0]) { for(i = 0; i < mgeno; i++) { if(newwithr[i] == 0.0) continue; flag[i] = 1; } } else { for(i = 0; i < fgeno; i++) { if(newwithr[i] == 0.0) continue; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } } current = 1; /* current should start with 1, since 0 means a null ptr */ for (first = 0; first < fgeno; first++) { if(newflag2[first] == 0) continue; /*use only possible genotypes*/ FORLIM = fence[first]; /*find end of isozygote class of first*/ /*iterate over all members of first's isozygote calss*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*get haplotypes*/ f2 = haps2[i]; ind = hind[i]; /*get probability offset for i*/ /*if f1 is a possible haplotype for child add the probability offset and value of first to the cache*/ if(flag[f1-1] != 0) { indpool[current] = ind; /*store values in cache*/ invpool[current] = first; nextpool[current] = 0; /* increment cache indices*/ if(phapcache1[f1-1].first == 0) { phapcache1[f1-1].first = current; phapcache1[f1-1].last = current; } else { nextpool[phapcache1[f1-1].last] = current; phapcache1[f1-1].last = current; } current++; } /*similar to f1, if f2 is a possible haplotype for a child, cache the ind and first values for it*/ if(flag[f2-1] != 0) { indpool[current] = ind; invpool[current] = first; nextpool[current] = 0; if(phapcache1[f2-1].first == 0) { phapcache1[f2-1].first = current; phapcache1[f2-1].last = current; } else { nextpool[phapcache1[f2-1].last] = current; phapcache1[f2-1].last = current; } current++; } } } for(i = 0; i < mgeno; i++) { qsumcache[0] += newwith3[i]; } /*In this section of the code we update the probabilities for the parent p based on the probabilities for the child*/ newsegprob = femaletheta->segprob; /*use female probabilities to work with p*/ /*Iterate over all joint genotypes of the child*/ newflagr=thischild[0]->sparseflag; if(malechild[0]) { for(here = 0; here < mgeno; here++) { if(newflagr[here] == 0) continue; tempr = qsumcache[0] * newwithr[here]; for(i=phapcache1[here].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += tempr*newsegprob[indpool[i]]; } } } else { for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*now find all the values of first that as genotypes of the father could have passed on the other haplotype c1; multiply by their probabilties, which are stored in phapcache, and add to the entry gene[first], which will be used to form the new genarray for p*/ temp1 = tempr * newwith3[c2 - 1]; for(i=phapcache1[c1-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { temp1 = tempr * newwith3[c1 - 1]; for(i=phapcache1[c2-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } } } } /*set up new genarray for p; it is gene scaled by segscale*/ for (first = 0; first < fgeno; first++) { if(newflag2[first] == 0.0) continue; newwith2[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 1*/ /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < mgeno; i++) if(newflag3[i] != 0) nonzgens[nonzcount++] = i; /*store index of nonzero value*/ newsegprob2 = maletheta->segprob; /*get male probabilties for q*/ /*iterate over genotypes for p*/ for (first = 0; first < fgeno; first += step1) { /*number of distinct probabilties needed for first's isoz. class*/ step1 = probend[first] - probstart[first] + 1; skip = 1; /*work only on those isozygotes that are possible*/ for(i = first; i < first+step1; i++) if(newflag2[i] != 0) { skip = 0; break; /*go to next isozygote in class*/ } if(skip) continue; /*initialize update multiple for each isozygote in class*/ for(i = 0; i < step1; i++) segval[i] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(second,first) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ /*call segsexsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsum2(second,first,step1); /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ /*skip if this isozygote not possible*/ if(newflag3[second] == 0) continue; /*get offset into newsegprob2; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ tempprob = newsegprob2 + probstart[first+i] - 1; /*combine for all children*/ /*due to the arrangement in segsexsum2 all the probability contributions for a given child are contiguous in the newwithr array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step1; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + step1; /*move the base of newwithr*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < step1; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; val *= temp1; newwithr += step1; } /*update segval entry for this isozygote of first*/ segval[i] += newwith3[second] * val; } } /*update p's genarray for each isozygote in this class*/ for(i = 0; i < step1; i++) newwith2[first+i] *= segval[i] * segscale; } } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < fgeno; i++) if((newflag2[i]==1) && (newwith2[i] == 0.0)) newflag2[i] = 0; } /*Added by A. A. Schaffer to handle loops */ if (loopfirstgen && (!(*LINK->p)->loopdepend)) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->p)->loopdepend = depend; (*LINK->p)->loopneeded = false; } } if ((*LINK->p)->loopdepend) { if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexup*/ /* segsexdown updates the genotype probabilities for a child based on the probabilities of parents and other children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children */ Void segsexdown(LINK) struct LOC_seg *LINK; { int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int cgeno; int step2; /*size of isozygote class*/ double valtemp; /*intermediate values in probability updates*/ double val, temp1; /*temporaries to store intermediate values*/ int f1, f2; /*four haplotypes from parents*/ int here, i, j, first, second; /*genotype indices*/ int jointisoindex; /*indices to work within isozygote classes*/ int currentindex; /*index to update genarray within isozygote class*/ int k; /*index to loop over children*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr, *newwithc; /*store genarrays for p,q, and children*/ int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ char male; /* newsegprob and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ boolean depend; /*used to handle loops*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p, q, and child genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; newflagr = (*LINK->r)->gen->sparseflag; /*In segsexdown p is always male and q is always female; This is not true for segsexup*/ WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ newwithr = (*LINK->r)->gen->genarray; /*get genarray for first child*/ male = (*LINK->r)->male; if(male) cgeno = mgeno; else cgeno = fgeno; /*The case of 1 child (nchild==0) is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 0) { /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; psumcache[i] = 0.0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ for(i = 0; i < cgeno; i++) { gene[i] = 0.0; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } newsegprob = femaletheta->segprob; /*use female probabilities to work with q*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that p has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] !=0) || (flag[f2-1] !=0)) { /*condition probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ /*get probability offset for i*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the child based on the probabilities for the parents*/ /*Iterate over all joint genotypes of the child*/ if(male) { double temp1 = 0.0; for(here = 0; here < mgeno; here++) { temp1 += newwith2[here]; } for(here = 0; here < mgeno; here++) { if(newflagr[here] == 0) continue; gene[here] = temp1 * qsumcache[here]; } } else { for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*probability of child getting genotype here as a result of p passing on c1 and q passing on c2 is summed to gene[here] */ gene[here] += newwith2[c1-1] * qsumcache[c2-1]; /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { gene[here] += newwith2[c2-1] * qsumcache[c1-1]; } } } /*set up new genarray for r; it is gene scaled by segscale*/ for (first = 0; first < cgeno; first++) { if(newflagr[first] == 0) continue; if(gene[first] == 0.0) newflagr[first] = 0; newwithr[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 0*/ /*initialize genarray entries for child to 0*/ for(i = 0; i < cgeno; i++) { gene[i] = 0.0; } /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob2 = maletheta->segprob; /*get p probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0) continue; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; /*call segsexsumdown2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsumdown2(first,second,step2,male); for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) segval[jointisoindex] = 0.0; /*now specialize update for each member of first's class*/ if(newflag2[first] == 0) continue; /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) { continue; } tempprob = newsegprob2 + probstart[second+j] - 1; /*combine for all children*/ /*due to the arrangement in segsexsumdown2 all the probability contributions for a given child are contiguous in the newwithr array. the number of contributions is fslength which is the number of probabilties needed for the joint isozygote class for the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithc = tempseg + step2; /*move the base of newwithc*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithc has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithc[0]; for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithc[jointisoindex]; val *= temp1; newwithc += step2; } /*probability of this combination of parent genotypes*/ val *= newwith2[first] * newwith3[second+j]; for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) { /*probability of this recombination pattern (based on other children)*/ segval[jointisoindex] += tempprob[jointisoindex] * val; } } /*update the probabilities of two joint genotypes the child might get; each different choice of recombination pattern will lead to a different set of two genotypes*/ currentindex = 0; for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) { temp1 = segval[jointisoindex]; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; } } } /*finally update child's real genarray by coppy gene multiplied by scale factor segscale*/ for(i = 0; i < cgeno; i++) { if(newflagr[i] == 0) continue; if(gene[i] == 0.0) newflagr[i] = 0; /*if probability changes from nonzero to 0.0 change flag to 0*/ newwithr[i] *= segscale * gene[i]; } } /*Added by A. A. Schaffer to handle loops */ if (loopfirstgen && (!((*LINK->r)->loopdepend))) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->p)->loopdepend) || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->r)->loopdepend = depend; (*LINK->r)->loopneeded = false; } } if ((*LINK->r)->loopdepend) { if (!((*LINK->p)->loopdepend)) (*LINK->p)->loopneeded = true; if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexdown*/ fastlink-4.1P-fix95/4.1P/src/comoutput.c0000644000265600020320000001774606737460341017044 0ustar tilleaadmin/* This file contains common output routines for use with the parallel versions of the FASTLINK programs ILINK, LINKMAP, and MLINK. Sequential FASTLINK is an improved version of LINKAGE. Improvements are described in described in: R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer Faster Sequential Genetic Linkage Computations American Journal of Human Genetics, 53(1993), pp. 252--263 and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Linkage Analysis Human Heredity 44(1994), pp. 225-237. The parallel implementations of ILINK are described in: S. Dwarkadas, A. A. Schaffer, R. W. Cottingham Jr., A. L. Cox, P. Keleher, and W. Zwaenepoel, Parallelization of General Linkage Analysis Problems, Human Heredity 44(1994), pp. 127-141 and S. K. Gupta, A. A. Schaffer, A. L. Cox, S. Dwarkadas, and W. Zwaenepoel, Integerating Parallelization Strategies for Linkage Analysis, Computers and Biomedical Research, to appear. The code in this file was written by Chris Hyams. */ #include "commondefs.h" #include "gemdefs.h" #if !defined(LESSMEMORY) #include "moddefs.h" #endif /* if !defined(LESSMEMORY) */ #if defined(MLINK) #include "mldefs.h" #endif /* if defined(MLINK) */ #if defined(LINKMAP) #include "lidefs.h" #endif /* if defined(LINKMAP) */ #if PARALLEL /* cgh */ void preLikeBufferOutput() { int i; /* temporary output buffer */ char tempBuff[TEMPBUFF_SIZE]; /* pointers to specific entries in each iped array for this iteration */ strBuff* stdBuff = stdoutBuff->ipeds[absoluteThetanum]; strBuff* outfBuff = outfileBuff->ipeds[absoluteThetanum]; #if defined(MLINK) strBuff* strmBuff = streamBuff->ipeds[absoluteThetanum]; #endif /* defined(MLINK) */ sprintf(tempBuff, "%s\n%s\n", LINE, LINE); append(stdBuff, tempBuff); append(outfBuff, tempBuff); if (sexdif) { append(stdBuff, "MALE THETAS "); append(outfBuff, "MALE THETAS "); } else { append(stdBuff, "THETAS "); append(outfBuff, "THETAS "); } for (i = 0; i <= mlocus - 2; i++) { sprintf(tempBuff, "%6.3f", maletheta->theta[i]); append(stdBuff, tempBuff); append(outfBuff, tempBuff); } #if defined(MLINK) if (interfer) { sprintf(tempBuff, "%6.3f", maletheta->theta[mlocus - 1]); append(stdBuff, tempBuff); append(outfBuff, tempBuff); } #endif /* if defined(MLINK) */ append(stdBuff, "\n"); append(outfBuff, "\n"); #if defined(MLINK) if (dostream) { for (i = 0; i <= mlocus - 2; i++) { sprintf(tempBuff, "%6.3f\n", maletheta->theta[i]); append(strmBuff, tempBuff); } if (interfer) { sprintf(tempBuff, "%6.3f\n", maletheta->theta[mlocus - 1]); append(strmBuff, tempBuff); } } #endif /* if defined(MLINK) */ if (sexdif) { append(stdBuff, "FEMALE THETAS "); append(outfBuff, "FEMALE THETAS "); for (i = 0; i <= mlocus - 2; i++) { sprintf(tempBuff, "%6.3f", femaletheta->theta[i]); append(stdBuff, tempBuff); append(outfBuff, tempBuff); } if (interfer) { sprintf(tempBuff, "%6.3f", femaletheta->theta[mlocus - 1]); append(stdBuff, tempBuff); #if defined(MLINK) append(outfBuff, tempBuff); #endif /* if defined(MLINK) */ } append(outfBuff, "\n"); #if defined(MLINK) append(stdBuff, "\n"); if (dostream) { for (i = 0; i <= mlocus - 2; i++) { sprintf(tempBuff, "%6.3f\n", femaletheta->theta[i]); append(strmBuff, tempBuff); } if (interfer) { sprintf(tempBuff, "%6.3f\n", femaletheta->theta[mlocus - 1]); append(strmBuff, tempBuff); } } #endif /* if defined(MLINK) */ } sprintf(tempBuff, "%s\nPEDIGREE | LN LIKE | LOG 10 LIKE\n%s\n", LINE, LINE); append(stdBuff, tempBuff); append(outfBuff, tempBuff); } void bufferPedOutput(currThisped, currLike) int currThisped; double currLike; { /* temporary output buffer */ char tempBuff[TEMPBUFF_SIZE]; if (dostream) { #if defined(MLINK) sprintf(tempBuff, "%12d % .5e", proband[currThisped]->ped, currLike); #elif defined(LINKMAP) sprintf(tempBuff, "%12d % .5e ", proband[currThisped]->ped, currLike); #endif append(streamBuff->ipeds[absoluteThetanum], tempBuff); } sprintf(tempBuff, "%9d %12.6f ", proband[currThisped]->ped, currLike); append(stdoutBuff->ipeds[absoluteThetanum], tempBuff); if (byfamily) append(outfileBuff->ipeds[absoluteThetanum], tempBuff); } #if defined(MLINK) void bufferLikeOutput(currLike, eachlodII) double currLike, eachlodII; #else /* if defined(MLINK) */ void bufferLikeOutput(currLike) double currLike; #endif /* if defined(MLINK) */ { /* temporary output buffer */ char tempBuff[TEMPBUFF_SIZE]; if (dostream) { sprintf(tempBuff, "%12.6f\n", currLike); append(streamBuff->ipeds[absoluteThetanum], tempBuff); } #if defined(MLINK) if (lodbyfamily) sprintf(tempBuff, "%12.6f LOD= %12.6f\n", currLike, ((currLike - eachlodII) > BIGNEGATIVE) ? currLike - eachlodII : -999.999999); else #endif /* if defined(MLINK) */ sprintf(tempBuff, "%12.6f\n", currLike); append(stdoutBuff->ipeds[absoluteThetanum], tempBuff); if (byfamily) append(outfileBuff->ipeds[absoluteThetanum], tempBuff); } void bufferTotalsOutput(currAlike, currTlike) double currAlike, currTlike; { /* temporary output buffer */ char tempBuff[TEMPBUFF_SIZE]; sprintf(tempBuff, "%s\nTOTALS %12.6f %12.6f\n", LINE, currAlike, currTlike); append(stdoutBuff->ipeds[absoluteThetanum], tempBuff); append(outfileBuff->ipeds[absoluteThetanum], tempBuff); if (dostream) { #if defined(MLINK) sprintf(tempBuff, "% .5e % .5e\n", currAlike, currTlike); #elif defined(LINKMAP) sprintf(tempBuff, "% .5e % .5e\n", -2 * currAlike, currTlike); #endif append(streamBuff->ipeds[absoluteThetanum], tempBuff); } } void bufferLodOutput(currAlike, currTlike, currFirsttime) double currAlike, currTlike; boolInt currFirsttime; { /* temporary output buffer */ char tempBuff[TEMPBUFF_SIZE]; /* pointers to specific entries in each iped array for this iteration */ strBuff* stdBuff = stdoutBuff->ipeds[absoluteThetanum]; strBuff* outfBuff = outfileBuff->ipeds[absoluteThetanum]; #if defined(MLINK) strBuff* strmBuff = streamBuff->ipeds[absoluteThetanum]; #endif /* defined(MLINK) */ sprintf(tempBuff, "-2 LN(LIKE) = % .5e", currAlike); append(stdBuff, tempBuff); append(outfBuff, tempBuff); #if defined(LINKMAP) append(stdBuff, "\n"); append(outfBuff, "\n"); #endif /* if defined(LINKMAP) */ #if defined(MLINK) /* Note: the reason that unlinkedLike is declared shared (replacing scorevalue) is that the lodscore computations depend on the evaluation at theta == 0.5. This evaluation must done first. Since the loadbalancing algorithm requires an intitial theta evaluation, this is taken care of by ensuring that the 0.5 theta evaluation corresponds to absoluteThetanum 0. */ if (score && (!risk)) { if (mlocus == 2) { if (maletheta->theta[which - 1] == 0.5) *unlinkedLike = currTlike; currAlike = currTlike - *unlinkedLike; sprintf(tempBuff, " LOD SCORE = %12.6f", currAlike); append(stdBuff, tempBuff); append(outfBuff, tempBuff); } else { if (maletheta->theta[which - 1] == 0.5) *unlinkedLike = currAlike; currAlike = *unlinkedLike - currAlike; sprintf(tempBuff, " LOG LIKE DIFFERENCE = %12.6f", currAlike); append(stdBuff, tempBuff); append(outfBuff, tempBuff); } if (dostream) { sprintf(tempBuff, "% .5e\n", currTlike - *unlinkedLike); append(strmBuff, tempBuff); } } append(stdBuff, "\n"); append(outfBuff, "\n"); #endif /* if defined(MLINK) */ if (Tmk_proc_id == 0) { if (currFirsttime) { if (thisc < maxcensor) { sprintf(tempBuff, "Maxcensor can be reduced to %12d\n", thisc); append(stdBuff, tempBuff); } else { if (thisc > maxcensor) append(stdBuff, "you may gain efficiency by increasing maxcensor\n"); } } } } #endif /* if PARALLEL -- cgh */ fastlink-4.1P-fix95/4.1P/src/ckpt.c0000644000265600020320000000626506737460341015740 0ustar tilleaadmin/*This file contains a short program written by K. Shriram to do */ /* script-level checkpointing of the ILINK and LODSCORE program */ /* The checkpointing process is described in the paper: */ /* A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, */ /* Hum. Hered. 44(1994), pp. 225-237. */ #include #include #include "commondefs.h" #include "checkpointdefs.h" #define ILINKRun 1 #define LODSCORERun 2 #define LINKMAPRun 3 #define MLINKRun 4 void main ( argCount , argList ) int argCount ; char * argList [ ] ; { FILE * scriptCheckpoint ; char * scriptCheckpointFilename ; int scriptRun ; int scriptSkip ; int argNumber ; int status ; int runType ; if ( ( 1 == argCount ) ) { printf ( "usage: %s [ ilink | lodscore | linkmap | mlink] scriptname\n" , argList [ 0 ] ) ; exit ( EXIT_FAILURE) ; } if ( 2 == argCount ) runType = ILINKRun ; else { if ( 0 == strcasecmp ( argList [ 1 ] , "ilink" ) ) runType = ILINKRun ; else if ( 0 == strcasecmp ( argList [ 1 ] , "lodscore" ) ) runType = LODSCORERun ; else if ( 0 == strcasecmp ( argList [ 1 ] , "linkmap" ) ) runType = LINKMAPRun ; else if ( 0 == strcasecmp ( argList [ 1 ] , "mlink" ) ) runType = MLINKRun ; else { printf ( "usage: %s [ ilink | lodscore | linkmap | mlink ] scriptname\n" , argList[ 0 ] ) ; exit ( EXIT_FAILURE ) ; } } if (ILINKRun == runType) scriptCheckpointFilename = ScriptILINKCheckpointFilename; else if (LODSCORERun == runType) scriptCheckpointFilename = ScriptLODSCORECheckpointFilename; else if (LINKMAPRun == runType) scriptCheckpointFilename = ScriptLINKMAPCheckpointFilename; else if (MLINKRun == runType) scriptCheckpointFilename = ScriptMLINKCheckpointFilename; scriptCheckpoint = fopen ( scriptCheckpointFilename , "r+" ) ; if ( NULL == scriptCheckpoint ) { scriptCheckpoint = fopen ( scriptCheckpointFilename , "w" ) ; fprintf ( scriptCheckpoint , "0 0\n" ) ; } else { fscanf ( scriptCheckpoint , "%d %d" , & scriptRun , & scriptSkip ) ; scriptSkip += scriptRun ; scriptRun = 0 ; rewind ( scriptCheckpoint ) ; fprintf ( scriptCheckpoint , "%d %d\n" , scriptRun , scriptSkip ) ; } fclose ( scriptCheckpoint ) ; systemCallString [ 0 ] = '\0' ; argNumber = ( 2 == argCount ? 1 : 2 ) ; for ( /* do nothing */ ; argNumber < argCount ; argNumber ++ ) { strcat ( systemCallString , argList [ argNumber ] ) ; strcat ( systemCallString , " " ) ; } status = ( int ) system ( systemCallString ) ; if ( EXIT_SUCCESS == status ) { unlink ( scriptCheckpointFilename ) ; if (ILINKRun == runType) { unlink( ScriptILINKFinalOut); unlink( ScriptILINKStreamOut); } else if (LODSCORERun == runType){ unlink( ScriptLODSCOREFinalOut); unlink( ScriptLODSCOREStreamOut); } else if (LINKMAPRun == runType){ unlink( ScriptLINKMAPFinalOut); unlink( ScriptLINKMAPStreamOut); } else if (MLINKRun == runType) { unlink( ScriptMLINKFinalOut); unlink( ScriptMLINKStreamOut); } } } fastlink-4.1P-fix95/4.1P/src/iloldnuclear.c0000644000265600020320000000167506737460342017455 0ustar tilleaadmin/* Output from p2c, the Pascal-to-C translator */ /* From input file "ilink.p" */ /* This file contains some of the old nuclear family update routines */ /* used in a modified version of the ILINK program*/ #include "commondefs.h" #include "ildefs.h" Local Void getapprox(LINK) struct LOC_seg *LINK; { int first; double maxval; thisarray *WITH; maxval = (*LINK->p)->gen->genarray[0]; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH->genarray[first] > maxval) maxval = WITH->genarray[first]; } WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { approxarray[LINK->LINK->thisped - 1][first] = (WITH->genarray[first] > maxval * epsilon); } if (lasttime) return; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (!(approxarray[LINK->LINK->thisped - 1][first])) WITH->genarray[first] = 0.0; } } /*getapprox*/ #include "comnuclear.c" fastlink-4.1P-fix95/4.1P/src/moddefs.h0000644000265600020320000000323306737460342016416 0ustar tilleaadmin/*This file contains definitions for new versions of the routines */ /*segup, segdown, segsexup, segsexdown, and some auxiliary routines */ /* for use with LODSCORE, ILINK, LINKMAP, and MLINK. */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993) pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237. */ /* The versions using this file use a lot of memory */ /* Definitions for somewhat slower versions that use less memory */ /* are in slowmoddefs.h */ #ifndef _MODDEFS_H #define _MODDEFS_H 1 #ifndef AUTOSOMAL_RUN #define AUTOSOMAL_RUN 1 /*1 is safe; can be set to 0 to make sexlinked runs space efficient*/ #endif #ifndef SEXDIF_RUN #define SEXDIF_RUN 1 /*1 is safe; can be set to 0 on sexlinked runs or runs in which maletheta and femaletheta will be the same*/ #endif /*segprob2 stores products of recombination or nonrecombination probabilities; one probability comes from each parent */ double *segprob2; /*used in the autosomal case when sexdif=1*/ #if PARALLEL double **probtabledif; double **probtable; unsigned **probtableindex; #else double *probtabledif; double *probtable; unsigned *probtableindex; #endif unsigned *classsize; unsigned *classbase; typedef double childprob[maxchild]; childprob **partialprob; unsigned *invpool, *nextpool, *indpool; /* _MODDEFS_H */ #endif fastlink-4.1P-fix95/4.1P/src/loopbrk.c0000644000265600020320000027366710761541633016457 0ustar tilleaadmin#include "unknown.h" static FILE *pedfile; static FILE *countfile; static FILE *tpedfile; #define MAX_RANDOM_RUNS 100 static int NumOfNodesInGraph; /* one more than the number of nodes in undirected graph */ static int NumOfIndividualsWC; /* one more than the number of individuals with copies of loopbreakers*/ static DNODE DirectedGraph[maxnode]; /* directed graph */ static NODE GraphForGreedy[maxnode]; /* undirected graph used for greedy algorithm */ static NODE GraphForRandom[maxnode]; /* undirected graph used for random algorithm */ static NODE OriginalGraph[maxnode]; /* undirected input graph */ static NODE BranchyGraph[maxnode]; /* undirected branchy graph */ static NODE OutputGraph[maxnode]; /* undirected graph for output */ static NODE TREE[maxnode]; /* undirected tree */ static NODE GraphForRedundantNodes[maxnode]; /*internal graph copy for local work*/ static int cycle[maxnode]; /* cycle[cycleIndex] = individual */ static int recycle[maxnode]; /* recycle[individual] = cycleIndex */ static int numCycle; /* number of cycles */ static int proband; /* id of proband */ static int table[maxindperpedigree]; /* global strucure for lines table[LineIndex]= individual */ static long line[maxindperpedigree][LINEN]; /* array of lines of relevant fields */ static char *rest[maxindperpedigree]; /* array of genotype fields */ static PERSON ped[maxindperpedigree]; /* array of persons */ static int pedLineLength; /*Overestimate of length of a line in the pedigree file*/ /*Procedure for testing the ending of a file; used also in unknown.c, taken originally from the p2c library*/ static int P_eof(FILE *f) { register int ch; if (feof(f)) return 1; if (f == stdin) return 0; /* not safe to look-ahead on the keyboard! */ ch = getc(f); if (ch == EOF) return 1; ungetc(ch, f); return 0; } /****************************************************************************** * * function close_files * parameters none * output none * description closes files * creation Thu Mar 27 18:52:00 1997 * changes changed by A. A. Schaffer in June 1999 to test file descriptors for NULL and set descriptor values to NULL * comments ******************************************************************************/ void close_files() { if (NULL != pedfile) fclose(pedfile); pedfile = NULL; if (NULL != countfile); fclose(countfile); countfile = NULL; if (NULL != tpedfile) fclose(tpedfile); tpedfile = NULL; } /****************************************************************************** * * function open_files * parameters countfileWrite determines whether * to open contfile for reading * or writing * output none * description opens files, if file doesn't exist program exits and * returns alert * creation Thu Mar 27 18:51:00 1997 * changes * comments * ******************************************************************************/ void open_files(boolean countfileWrite) { if (countfile != NULL) { fclose(countfile); printf("Reopening COUNTFILE.DAT\n"); if (countfileWrite) countfile = fopen("countfile.dat", "w"); else countfile = fopen("countfile.dat", "r"); } else { printf("Opening COUNTFILE.DAT\n"); if (countfileWrite) countfile = fopen("countfile.dat", "w"); else countfile = fopen("countfile.dat", "r"); } if (NULL == countfile) { printf( "ERROR: File nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } if (pedfile != NULL) { fclose(pedfile); printf("Reopening PEDFILE.DAT\n"); pedfile = fopen(pedfilename, "r"); } else { printf("Opening PEDFILE.DAT\n"); pedfile = fopen(pedfilename, "r"); } if ((pedfile == NULL) || (P_eof(pedfile))) { printf( "ERROR: File empty or nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } printf("Opening TPEDFILE.DAT\n"); tpedfile = fopen("tpedfile.dat", "w"); } /* Additive random number generator Modelled after "Algorithm A" in Knuth, D. E. (1981). The art of computer programming, volume 2, page 27. 7/26/90 Warren Gish */ static long state[33] = { (long)0xd53f1852, (long)0xdfc78b83, (long)0x4f256096, (long)0xe643df7, (long)0x82c359bf, (long)0xc7794dfa, (long)0xd5e9ffaa, (long)0x2c8cb64a, (long)0x2f07b334, (long)0xad5a7eb5, (long)0x96dc0cde, (long)0x6fc24589, (long)0xa5853646, (long)0xe71576e2, (long)0xdae30df, (long)0xb09ce711, (long)0x5e56ef87, (long)0x4b4b0082, (long)0x6f4f340e, (long)0xc5bb17e8, (long)0xd788d765, (long)0x67498087, (long)0x9d7aba26, (long)0x261351d4, (long)0x411ee7ea, (long)0x393a263, (long)0x2c5a5835, (long)0xc115fcd8, (long)0x25e9132c, (long)0xd0c6e906, (long)0xc2bc5b2d, (long)0x6c065c98, (long)0x6e37bd55 }; #define r_off 12 #define DIM(A) (sizeof(A)/sizeof((A)[0])) static long *rJ = &state[r_off], *rK = &state[DIM(state)-1]; /*adapted from ncbitime.c of NCBI toolkit*/ time_t GetSecs (void) { return time(NULL); } /*Next two functions adapted from ncbimath.c of NCBI toolkit*/ long RandomNum(void) { register long r; r = *rK; r += *rJ--; *rK-- = r; if (rK < state) rK = &state[DIM(state)-1]; else if (rJ < state) rJ = &state[DIM(state)-1]; return (r>>1)&0x7fffffff; /* discard the least-random bit */ } void RandomSeed(long x) { size_t i; state[0] = x; /* linear congruential initializer */ for (i=1; i 2) break; /* if no individuals have more than one marriage then run spanning tree algorithm */ if (numNodes && NodeIndex == NumOfNodesInGraph) { cycleIndex = SpanningTreeWithReference(GraphForGreedy, cycleIndex, weight, weight_log); break; } /* otherwise individuals with degree > 2 exist, and must start with Greedy algorithm */ else if (first) { first = 0; /*printf("Greedy Algorithm: \n");*/ } returnValue = TRUE; if (numNodes) { /* if graph is not empty */ /* pick individual with smallest ratio of log(w) and degree */ for (minRatio = MAXIN, NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) /*limitation to avoid founders*/ if (GraphForGreedy[NodeIndex].fSelected && minRatio > ped[NodeIndex].weight_log/GraphForGreedy[NodeIndex].degree) { minRatio = ped[NodeIndex].weight_log/GraphForGreedy[NodeIndex].degree; minRatioIndex = NodeIndex; } /* update resulting weight of VFS */ tempWeight = (*weight); (*weight) *= ped[minRatioIndex].weight; if ((*weight) < tempWeight) (*weight) = tempWeight; (*weight_log) += ped[minRatioIndex].weight_log; /* remove this node from graph */ DeleteNode(GraphForGreedy, minRatioIndex); numNodes--; /* add node to VFS */ cycle[cycleIndex] = minRatioIndex; recycle[minRatioIndex] = cycleIndex; cycleIndex++; } /* end of if(numNodes) */ } /* end of for on cycles*/ numCycle = cycleIndex - 2; RemoveRedundant(weight, weight_log); printf("Greedy algorithm:\n"); for (cycleIndex = 2; cycleIndex < numCycle + 2; cycleIndex++) { printf("cycle[%d] = %ld", cycleIndex, ped[cycle[cycleIndex]].weight); if (cycleIndex < numCycle + 1) printf(", "); else printf("\n"); } return(returnValue); } /****************************************************************************** * * function ReduceToBranchyGraph * parameters int *pNumNodes * output none * description Reduces graph to brapnchy graph * delete nodes with degree 0 and 1 * remove linkpoints * creation Sat Mar 01 20:19:00 1999 * changes * comments * ******************************************************************************/ void ReduceToBranchyGraph(NODE graph[maxnode], int *pNumNodes) { int NodeIndex; /* loop index over nodes in copied graph */ int NeighIndex; /* loop index to find the nigher of a node with degree 0 or 1 */ int NeighIndex2; /* loop index to look for neighbors of NeighIndex */ int numNodes = 0; /* number of nodes */ int fEndPointRemoved; /* Flag is some endpoint node removed */ int fLinkPointRemoved; /* Flag is some linkpoint node removed */ numNodes = (*pNumNodes); /* delete nodes with degree 0 and 1 */ fEndPointRemoved = TRUE; while(fEndPointRemoved) for (fEndPointRemoved = FALSE, NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (graph[NodeIndex].fSelected && graph[NodeIndex].degree < 2) { DeleteNode(graph, NodeIndex); fEndPointRemoved = TRUE; numNodes--; } /* replace each linkpoints with lightest linkpoint; i.e. every vertex of degree == 2 has as neighbors only vertices of degree > 2 or linkpoints with heavier weights */ fLinkPointRemoved = TRUE; while(fLinkPointRemoved) for (fLinkPointRemoved = FALSE, NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (graph[NodeIndex].fSelected && graph[NodeIndex].degree == 2) { for (NeighIndex = 1; NeighIndex < NumOfNodesInGraph; NeighIndex++) if (graph[NeighIndex].fSelected && graph[NodeIndex].D[NeighIndex]) break; /* if it is not a loop consisting of two paraller edges between NeighIndex and NodeIndex */ if (graph[NodeIndex].D[NeighIndex] != 2) { for (NeighIndex2 = NeighIndex + 1; NeighIndex2 < NumOfNodesInGraph; NeighIndex2++) if (graph[NeighIndex2].fSelected && graph[NodeIndex].D[NeighIndex2]) break; if ((DirectedGraph[NeighIndex].fFamilyNode && DirectedGraph[NeighIndex2].fFamilyNode && !DirectedGraph[NodeIndex].fFamilyNode) || (!DirectedGraph[NeighIndex].fFamilyNode && DirectedGraph[NeighIndex2].fFamilyNode && !DirectedGraph[NodeIndex].fFamilyNode && ped[NeighIndex].weight_log > ped[NodeIndex].weight_log) || (DirectedGraph[NeighIndex].fFamilyNode && !DirectedGraph[NeighIndex2].fFamilyNode && !DirectedGraph[NodeIndex].fFamilyNode && ped[NeighIndex2].weight_log > ped[NodeIndex].weight_log) || (!DirectedGraph[NeighIndex].fFamilyNode && !DirectedGraph[NeighIndex2].fFamilyNode && !DirectedGraph[NodeIndex].fFamilyNode && ped[NeighIndex].weight_log > ped[NodeIndex].weight_log && ped[NeighIndex2].weight_log > ped[NodeIndex].weight_log)) continue; DeleteNode(graph, NodeIndex); fLinkPointRemoved = TRUE; graph[NeighIndex2].D[NeighIndex]++; graph[NeighIndex].D[NeighIndex2]++; graph[NeighIndex2].degree++; graph[NeighIndex].degree++; numNodes--; } } *pNumNodes = numNodes; } /****************************************************************************** * * function SingleWeightedGuess * parameters long *weight * double *weight_log * output none * description runs single random guess algorithm * In each iteration * if graph is not empty * if exist self-loop (loop of size 2, with two paraller edges) * then * pick one of the self loop nodes to FVS * else * pick individual randomly by first choosing an edge, and then the vertex * update resulting weight of VFS * remove this node from graph * add node to VFS * reduce to branchy graph * if no individuals have more than one marriage * then run spanning tree algorithm * * creation Sat Mar 01 20:19:00 1999 * changes * comments * ******************************************************************************/ void SingleWeightedGuess(int numNodes, long *weight, double *weight_log) { int NodeIndex; /*loop index over nodes in copied graph*/ int NeighIndex; /*loop index to find the nigher of a node with degree 0 or 1*/ int chosenIndex; /* index of the node chosen to FVS */ long numEdges; /* number of edges */ long selectedEdge; /* number of secelted edge */ long EdgeIndex; /* index of the edge */ int cycleIndex; /* index of cycle */ int RandomValue; /*holds value returned by random-number generator*/ copy_graphs(BranchyGraph, GraphForRandom); /* put 0 as a cycle number for each node */ for (NodeIndex = 0; NodeIndex < NumOfNodesInGraph; NodeIndex++) { recycle[NodeIndex] = 0; cycle[NodeIndex] = 0; } for (cycleIndex = 2; numNodes; ) { chosenIndex = -1; /* check for self-loops */ for (NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (GraphForRandom[NodeIndex].fSelected && GraphForRandom[NodeIndex].degree == 2) for (NeighIndex = 1; NeighIndex < NumOfNodesInGraph; NeighIndex++) if (GraphForRandom[NeighIndex].fSelected && GraphForRandom[NodeIndex].D[NeighIndex] == 2) { if (DirectedGraph[NeighIndex].fFamilyNode) chosenIndex = NodeIndex; else if (DirectedGraph[NodeIndex].fFamilyNode || ped[NeighIndex].weight > ped[NodeIndex].weight) chosenIndex = NeighIndex; else chosenIndex = NodeIndex; break; } if (numNodes) /* if graph is not empty */ { if (chosenIndex == -1) { /* count edges */ numEdges = 0; for (NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (GraphForRandom[NodeIndex].fSelected) for (NeighIndex = NodeIndex + 1; NeighIndex < NumOfNodesInGraph; NeighIndex++) if (GraphForRandom[NeighIndex].fSelected && GraphForRandom[NodeIndex].D[NeighIndex]) numEdges += GraphForRandom[NodeIndex].D[NeighIndex]; /* pick an edge */ selectedEdge = Random(numEdges); /* select picked edge */ for (EdgeIndex = 0, NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (GraphForRandom[NodeIndex].fSelected) { for (NeighIndex = NodeIndex + 1; NeighIndex < NumOfNodesInGraph; NeighIndex++) if (GraphForRandom[NeighIndex].fSelected && GraphForRandom[NodeIndex].D[NeighIndex]) { EdgeIndex += GraphForRandom[NodeIndex].D[NeighIndex]; if (EdgeIndex >= selectedEdge) break; } if (NeighIndex < NumOfNodesInGraph) break; } /* pick an node */ if (DirectedGraph[NodeIndex].fFamilyNode && DirectedGraph[NeighIndex].fFamilyNode) printf("ERROR in LOOPBRK function: family node is chosen!\n"); if (!DirectedGraph[NodeIndex].fFamilyNode && DirectedGraph[NeighIndex].fFamilyNode) chosenIndex = NodeIndex; if (DirectedGraph[NodeIndex].fFamilyNode && !DirectedGraph[NeighIndex].fFamilyNode) chosenIndex = NeighIndex; if (!DirectedGraph[NodeIndex].fFamilyNode && !DirectedGraph[NeighIndex].fFamilyNode) { RandomValue = Random(8); if (RandomValue < 4) chosenIndex = NodeIndex; else chosenIndex = NeighIndex; } } /* remove this node from graph */ DeleteNode(GraphForRandom, chosenIndex); numNodes--; /* add node to VFS */ cycle[cycleIndex] = chosenIndex; recycle[chosenIndex] = cycleIndex; cycleIndex++; /* reduce to branchy graph */ ReduceToBranchyGraph(GraphForRandom, &numNodes); for (NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (GraphForRandom[NodeIndex].fSelected && !DirectedGraph[NodeIndex].fFamilyNode && GraphForRandom[NodeIndex].degree > 2) break; /* if no individuals have more than one marriage then run spanning tree algorithm */ if (numNodes && NodeIndex == NumOfNodesInGraph) { cycleIndex = SpanningTreeWithReference(GraphForRandom, cycleIndex, weight, weight_log); break; } } /* end of if */ } /* end of for */ numCycle = cycleIndex - 2; RemoveRedundant(weight, weight_log); } /****************************************************************************** * * function RepeatedWeightedGuess * parameters long *weight returns weight of selected node * double *weight_log returns log(weight) of selected node * long weight_greedy weight of greedy solution * for comparison * long numCycle_greedy size of greedy solution * for comparison * output none * description runs single random guess algorithm MAX_RANDOM_RUNS times * and chooses the FVS with minimal weight * * creation Mon Mar 01 20:19:00 1999 * changes * comments * ******************************************************************************/ void RepeatedWeightedGuess(long *weight, double *weight_log, long weight_greedy, int numCycle_greedy) { int min_cycle[maxnode]; /*stores copy of cycle array for minimum weight solution*/ int min_recycle[maxnode]; /*stores copy of recycle array for minimum weight solution*/ int numCycle_min; /*number of loopbreakers in minimum weight solution*/ int cycleIndex; /*index for printing diagnostics*/ long weight_min; /*mininum weight of a solution seen so far*/ double weight_min_log; /*approximate log of mininum weight of a solution seen so far*/ long weight_rand; /*weight of current randomized solution*/ double weight_rand_log; /*placeholder for log(weight_rand)*/ int NodeIndex; /*loop index to copy out arrays for best solution*/ int iTimes; /*index over iterations of SingleWeightedGuess*/ int numNodes; weight_min = weight_greedy; numCycle_min = numCycle_greedy; /* copy loop breaker set from greedy algorithm */ for (NodeIndex = 0; NodeIndex < maxnode; NodeIndex++) { min_cycle[NodeIndex] = cycle[NodeIndex]; min_recycle[NodeIndex] = recycle[NodeIndex]; } /* count number the nodes in original graph */ for (numNodes = 0, NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (OriginalGraph[NodeIndex].fSelected) numNodes++; copy_graphs(OriginalGraph, BranchyGraph); /* reduce to branchy graph */ ReduceToBranchyGraph(BranchyGraph, &numNodes); for (iTimes = 1; iTimes < MAX_RANDOM_RUNS; iTimes++) { SingleWeightedGuess(numNodes, &weight_rand, &weight_rand_log); if ((weight_rand < weight_min) || ((weight_rand == weight_min) && (numCycle < numCycle_min)) || (1 == iTimes)) { weight_min = weight_rand; weight_min_log = weight_rand_log; numCycle_min = numCycle; for (NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) { min_cycle[NodeIndex] = cycle[NodeIndex]; min_recycle[NodeIndex] = recycle[NodeIndex]; } } } /* the result is */ numCycle = numCycle_min; for (NodeIndex = 0; NodeIndex < maxnode; NodeIndex++) { cycle[NodeIndex] = min_cycle[NodeIndex]; recycle[NodeIndex] = min_recycle[NodeIndex]; } *weight = weight_min; *weight_log = weight_min_log; if ((weight_min < weight_greedy) || ((weight_min == weight_greedy) && (numCycle < numCycle_greedy))) { printf("Random algorithm:\n"); for (cycleIndex = 2; cycleIndex < numCycle + 2; cycleIndex++) { printf("cycle[%d] = %ld", cycleIndex, ped[cycle[cycleIndex]].weight); if (cycleIndex < numCycle + 1) printf(", "); else printf("\n"); } } } /****************************************************************************** * * function arrangeFVS * parameters * output none * description arranges loopbreakers * combine copies of new loopbreakers to get a connected graph * creation Mon Mar 01 20:25:00 1999 * changes modification of what used to be cleanVFS, called * only from loopbreakers, the part that removed * loopbreakers and reordered them is now in * procedure RemoveRedundant * comments ******************************************************************************/ void arrangeFVS() { int NodeIndex; /* index of the node */ int NeighIndex; /* index of the node's neighbor */ int numNodes = 0; /*number of nodes*/ int cycleIndex; /* loop indices for cycles */ /* combine copies of new loopbreakers to get a connected graph */ for (numNodes = 0, NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (OriginalGraph[NodeIndex].fSelected) numNodes++; copy_graphs(OriginalGraph, OutputGraph); for (cycleIndex = 2; cycleIndex < numCycle + 2; cycleIndex++) { /*Test the loop breaker for cycle number cycleIndex*/ NodeIndex = cycle[cycleIndex]; ped[NodeIndex].numCopies = 0; for (NeighIndex = 1; NeighIndex < NumOfNodesInGraph; NeighIndex++) if (OutputGraph[NodeIndex].D[NeighIndex]) { /*Tentatively delete this edge incident to NodeIndex to see if it disconnects the graph*/ DeleteEdge(OutputGraph, NodeIndex, NeighIndex); if (OutputGraph[NodeIndex].degree > 0) { /* it was not the last edge */ if (NumOfNodes(OutputGraph, NeighIndex) < numNodes) /*Graph became disconnected, put the edge back*/ AddEdge(OutputGraph, NodeIndex, NeighIndex); else ped[NodeIndex].numCopies++; } else { numNodes--; if (NumOfNodes(OutputGraph, NeighIndex) < numNodes) { /*Graph became disconnected, put the edge back*/ numNodes++; AddEdge(OutputGraph, NodeIndex, NeighIndex); } else ped[NodeIndex].numCopies++; } /* end if OutputGraph[NodeIndex].degree > 0 */ } } /* end for */ } /****************************************************************************** * * function Read_homoz_heteroz * parameters none * output next PedigreeWithLoops or 0 * description reads number of homozygous and heterozygous at each * individual and locus and assigns weights for each individual * creation Thu Mar 27 18:35:00 1997 * changes * comments ******************************************************************************/ int Read_homoz_heteroz() { int NumOfLoci; /* number of loci */ int LocusIndex; /* Index of locus */ int PersonId; /* id of individual */ int tempid1, tempid2; /* help integers */ long numgeno; /* number of genotypes per individual */ long homozProduct; /* produc of homoz per individual */ int PedigreeWithLoops = 0; /* count number of next pedigree with loops */ char str[COUNTFILE_WORD_LENGTH]; char str1[COUNTFILE_LINE_LENGTH]; /*pedigree string from countfile*/ char str2[COUNTFILE_LINE_LENGTH]; /*person line from countfile*/ while (!P_eof(countfile)) { fgets(str1, COUNTFILE_LINE_LENGTH, countfile); /*Find the number of the next pedigree with loops*/ if (str1[0] == 'P') { sscanf(str1, "%s %d\n", str, &PedigreeWithLoops); break; } fgets(str2, COUNTFILE_LINE_LENGTH -1, countfile); sscanf(str1, "%s %s %d %s %d %s %d %s %s %s", str, str, &LocusIndex, str, &PersonId, str, &tempid1, str, str, str); sscanf(str2, "%d %s %s\n", &tempid2, str ,str); ped[PersonId].homoz[LocusIndex] = tempid1; ped[PersonId].heteroz[LocusIndex] = tempid2; } NumOfLoci = LocusIndex; /* Compute weight to ped which is number of possible genotypes for each person */ for (PersonId = 1; PersonId < NumOfIndividualsWC; PersonId++) { for (homozProduct = numgeno = LocusIndex = 1; LocusIndex <= NumOfLoci; LocusIndex++) { homozProduct *= ped[PersonId].homoz[LocusIndex]; numgeno *= (2 * ped[PersonId].heteroz[LocusIndex] + ped[PersonId].homoz[LocusIndex]); } ped[PersonId].weight = (numgeno - homozProduct)/2 + homozProduct; ped[PersonId].weight_log = log((double)ped[PersonId].weight) + epsilon; } return PedigreeWithLoops; } /****************************************************************************** * * function read_write_ped_non_loop * parameters long currentPedigreeId current pedigree id * long *nextPedigreeId next pedigree id * output none * description copies current pedigree from pedfile to outputFile * and saves id of next pedigree in nextPedigreeId * creation Thu Mar 27 18:40:00 1997 * changes A.A. Schaffer added parameter outputFile in June 1999 * comments ******************************************************************************/ void read_write_ped_non_loop(long currentPedigreeId, long *nextPedigreeId, FILE *outputFile) { long PersonInfo; /* individual's information */ int PersonInfoIndex; /* id of individual */ char *rest; long line[LINEN]; rest = (char *) malloc(pedLineLength * sizeof(char)); while (!P_eof(pedfile) && currentPedigreeId == *nextPedigreeId) { line[0] = currentPedigreeId; for (PersonInfoIndex = 1; PersonInfoIndex < LINEN; PersonInfoIndex++) { fscanf(pedfile, "%ld", &PersonInfo); line[PersonInfoIndex] = PersonInfo; } fgets(rest, pedLineLength - 1, pedfile); fprintf(outputFile, "%5ld%4ld%4ld%4ld%4ld%4ld", line[LINE_PEDIGREE], line[LINE_ID], line[LINE_PA], line[LINE_MA], line[LINE_FOFF], line[LINE_NEXTPA]); /* 3 spaces needed for profield, when >= 9 loop breakers*/ fprintf(outputFile, "%4ld%2ld%3ld ", line[LINE_NEXTMA], line[LINE_GENDER], line[LINE_PROFIELD]); fputs(rest, outputFile); if (!P_eof(pedfile)) fscanf(pedfile, "%ld", nextPedigreeId); } /* end of while */ free(rest); } /* end of read_write_ped_non_loop */ /****************************************************************************** * * function coalesce_parents * parameters keptParent id of a copy of a loop breaker that should * be retained * deletedParent id of another copy of the same loop breaker that should be deleted * long numPersons (number of people in pedigree counting * duplicates) * output * * description Code assumes that keptParent < deletedParent * merge list of deletedParent's children into the * list for keptParent * decrement by 1 all numbers larger than deletedParent * in ped and line and rest arrays, so that id numbers * remain consecutive * creation June 1999 * changes * comments * ******************************************************************************/ void coalesce_parents(int keptParent, int deletedParent, int numPersons) { int sex; /*gender of this parent*/ int lastChild; /*last child on the implicit linked list kept by the foff, nextpa, nextma fields*/ int PersonId, fieldId; /*loop indices*/ sex = ped[keptParent].sex; if (MALE == sex) { lastChild = ped[keptParent].foff; while(ped[lastChild].nextpa > 0) lastChild = ped[lastChild].nextpa; ped[lastChild].nextpa = ped[deletedParent].foff; line[lastChild][LINE_NEXTPA] = line[deletedParent][LINE_FOFF]; for(PersonId = 1; PersonId <= numPersons; PersonId++) if(ped[PersonId].paid == deletedParent) { ped[PersonId].paid = keptParent; line[PersonId][LINE_PA] = keptParent; } } else { lastChild = ped[keptParent].foff; while(ped[lastChild].nextma > 0) lastChild = ped[lastChild].nextma; ped[lastChild].nextma = ped[deletedParent].foff; line[lastChild][LINE_NEXTMA] = line[deletedParent][LINE_FOFF]; for(PersonId = 1; PersonId <= numPersons; PersonId++) if(ped[PersonId].maid == deletedParent) { ped[PersonId].maid = keptParent; line[PersonId][LINE_MA] = keptParent; } } for(PersonId = 1; PersonId <= numPersons; PersonId++) { if (ped[PersonId].id > deletedParent) { ped[PersonId].id --; line[PersonId][LINE_ID]--; } if (ped[PersonId].paid > deletedParent) { ped[PersonId].paid--; line[PersonId][LINE_PA]--; } if (ped[PersonId].maid > deletedParent) { ped[PersonId].maid--; line[PersonId][LINE_MA]--; } if (ped[PersonId].foff > deletedParent) { ped[PersonId].foff--; line[PersonId][LINE_FOFF]--; } if (ped[PersonId].nextpa > deletedParent) { ped[PersonId].nextpa--; line[PersonId][LINE_NEXTPA]--; } if (ped[PersonId].nextma > deletedParent) { ped[PersonId].nextma--; line[PersonId][LINE_NEXTMA]--; } } for(PersonId = deletedParent; PersonId < numPersons; PersonId++) { for(fieldId = LINE_ID; fieldId <= LINE_PROFIELD; fieldId++) line[PersonId][fieldId] = line[PersonId+1][fieldId]; ped[PersonId].id = ped[PersonId+1].id; ped[PersonId].paid = ped[PersonId+1].paid; ped[PersonId].maid = ped[PersonId+1].maid; ped[PersonId].foff = ped[PersonId+1].foff; ped[PersonId].nextpa = ped[PersonId+1].nextpa; ped[PersonId].nextma = ped[PersonId+1].nextma; ped[PersonId].sex = ped[PersonId+1].sex; ped[PersonId].cycle = ped[PersonId+1].cycle; strcpy(rest[PersonId], rest[PersonId+1]); } if (proband == deletedParent) proband = keptParent; if (proband > deletedParent) proband--; } /****************************************************************************** * * function coalesce_breakers * parameters long numPersons (number of people in pedigree counting * duplicates) * output returns adjusted value of numberPersons * subtracting 1 for each person coalesced * description Whenever there are 2 person numbers that are * copies of the same loop breaker and both are parents * they are coalesced to keep the lower-numbered person * the field for first offspring, next offspring of * same father and next offspring of same mother * are updated * Details of a single coalesced pair are carried out * in coalesce_parents * creation June 1999 * changes fixed in October 2002 to wipe out coalesced ped entries * comments * ******************************************************************************/ int coalesce_breakers(int numPersons) { int firstParentAsBreaker[maxloop+2]; /*what is the lowest id of a parent whose cyce (profield) field is this index*/ int otherIdentity[maxindperpedigree]; /*if 17 and 34 are both parents with cycle field 3, then firstParentAsBreaker[3] ==17 otherIdentity[34] == 17 when there is no duplicate, otherIdentity stores a 0*/ int i, PersonId, PersonId2; int origNumPersons; /*value of numPersons passed in*/ origNumPersons = numPersons; for(i = 2; i < maxloop +2; i++) firstParentAsBreaker[i] = 0; for(PersonId = 1; PersonId <= numPersons; PersonId++) otherIdentity[PersonId] = 0; for(PersonId = 1; PersonId <= numPersons; PersonId++) { if ((ped[PersonId].cycle > 1) && (ped[PersonId].foff > 0)) { if (0 == firstParentAsBreaker[ped[PersonId].cycle]) firstParentAsBreaker[ped[PersonId].cycle] = PersonId; else otherIdentity[PersonId] = firstParentAsBreaker[ped[PersonId].cycle]; } } PersonId = 1; while(PersonId <= numPersons) { if (otherIdentity[PersonId]) { /*have to coalesce this pair, adjust id numbers, before looking for next pair*/ coalesce_parents(otherIdentity[PersonId], PersonId, numPersons); numPersons--; for(i = 2; i < maxloop +2; i++) firstParentAsBreaker[i] = 0; for(PersonId2 = 1; PersonId2 <= numPersons; PersonId2++) otherIdentity[PersonId2] = 0; for(PersonId2 = 1; PersonId2 <= numPersons; PersonId2++) { if ((ped[PersonId2].cycle > 1) && (ped[PersonId2].foff > 0)) { if (0 == firstParentAsBreaker[ped[PersonId2].cycle]) firstParentAsBreaker[ped[PersonId2].cycle] = PersonId2; else otherIdentity[PersonId2] = firstParentAsBreaker[ped[PersonId2].cycle]; } } } else /*if Personid is coalesced, new one may be duplicate also*/ PersonId++; } for(PersonId = numPersons+1; PersonId <= origNumPersons; PersonId++) { ped[PersonId].foff = 0; ped[PersonId].nextpa = 0; ped[PersonId].nextma = 0; ped[PersonId].sex = 0; ped[PersonId].cycle = 0; } return(numPersons); } /****************************************************************************** * * function order_children * parameters long numPersons (number of people in pedigree counting * duplicates) * output none * description arranges foff, nextpa, and next ma fields so that * all children of the same pair of parents are consecutive * This is achieved by sorting the children by parent pair. * creation April 23, 1997 * changes * comments * ******************************************************************************/ void order_children(int numPersons) { int numChildren; /*number of people with parents in the pedigree*/ int p; /*index over persons*/ int c, c2; /*indices over children*/ int minChild; /*current minimum father, mother for sorting*/ int childrenSorted[maxindperpedigree][2]; /*children sorted by pa and ma */ int parent, otherParent; /*0 for father, 1 for mother*/ int temp; /*used for swapping*/ numChildren = 0; /*Count number of children and list them*/ for (p = 1; p <= numPersons; p++) { line[p][LINE_FOFF] = line[p][LINE_NEXTPA] = line[p][LINE_NEXTMA] = 0; if (0 != line[p][LINE_PA]) { childrenSorted[numChildren][0] = p; childrenSorted[numChildren][1] = p; numChildren++; } } if (0 == numChildren) { fprintf(stderr, "Cannot have a pedigree with 0 children"); exit(EXIT_FAILURE); } /*Sort children according to the father and mother*/ for(parent = 0; parent <= 1; parent++) { otherParent = 1 - parent; for(c = 0; c < numChildren; c++) { minChild = c; for(c2 = c+1; c2 < numChildren; c2++) { if ((line[childrenSorted[c2][parent]][LINE_PA+parent] < line[childrenSorted[minChild][parent]][LINE_PA+parent]) || ((line[childrenSorted[c2][parent]][LINE_PA+parent] == line[childrenSorted[minChild][parent]][LINE_PA+parent]) && (line[childrenSorted[c2][parent]][LINE_PA+otherParent] < line[childrenSorted[minChild][parent]][LINE_PA+otherParent])) || ((line[childrenSorted[c2][parent]][LINE_PA+parent] == line[childrenSorted[minChild][parent]][LINE_PA+parent]) && (line[childrenSorted[c2][parent]][LINE_PA+otherParent] == line[childrenSorted[minChild][parent]][LINE_PA+otherParent]) && (childrenSorted[c2][parent] < childrenSorted[minChild][parent]))) minChild = c2; } /*swap c and minChild*/ if (c != minChild){ temp = childrenSorted[c][parent]; childrenSorted[c][parent] = childrenSorted[minChild][parent]; childrenSorted[minChild][parent] = temp; } } } /*adjust foff, nextpa, and nextma fields in sorted order*/ for(parent = 0; parent <= 1; parent++) { for(c = 0; c < numChildren; c++) { if ((0 == c) || (line[childrenSorted[c][parent]][LINE_PA+parent] != line[childrenSorted[c - 1][parent]][LINE_PA+parent])) { line[line[childrenSorted[c][parent]][LINE_PA+parent]][LINE_FOFF] = childrenSorted[c][parent]; line[childrenSorted[c][parent]][LINE_NEXTPA + parent] = 0; } else /*same parent as preceding child*/ line[childrenSorted[c - 1][parent]][LINE_NEXTPA + parent] = childrenSorted[c][parent]; } line[childrenSorted[numChildren - 1][parent]][LINE_NEXTPA + parent] = 0; } /*Copy from line to ped*/ for(p = 1; p <= numPersons; p++) { ped[p].foff = line[p][LINE_FOFF]; ped[p].nextpa = line[p][LINE_NEXTPA]; ped[p].nextma = line[p][LINE_NEXTMA]; } } /*end order_children*/ /****************************************************************************** * * function readped_with_loop * parameters long currentPedigreeId current pedigree id * long *nextPedigreeId next pedigree id * output none * description reads pedigree and fills persons structures * creation Thu Mar 27 18:43:00 1997 * changes * comments * ******************************************************************************/ void readped_with_loop(long currentPedigreeId, long *nextPedigreeId) { long PersonInfo; /* individual's information */ int PersonId; /* id of individual */ int LineIndex; /*Index of field column in person line*/ int numBreakers[maxloop+3]; /*number of breakers for each loop*/ int l; /*loop index*/ proband = 0; for (l = 0; l < maxloop+3; l++) numBreakers[l] = 0; /*read lines as long as pedigree number stays the same*/ for(LineIndex = 0; LineIndex < maxindperpedigree; LineIndex++) rest[LineIndex] = NULL; rest[0] = (char *) malloc(pedLineLength * sizeof(char)); for (NumOfIndividualsWC = 1; !P_eof(pedfile) && currentPedigreeId == *nextPedigreeId; NumOfIndividualsWC++) { /* have already scanned pedigree number for first person in pedigree*/ fscanf(pedfile, "%ld", &PersonInfo); PersonId = PersonInfo; line[PersonId][LINE_PEDIGREE] = currentPedigreeId; line[PersonId][LINE_ID] = PersonId; for (LineIndex = 2; LineIndex < LINEN; LineIndex++) { fscanf(pedfile, "%ld", &PersonInfo); line[PersonId][LineIndex] = PersonInfo; } rest[PersonId] = (char *) malloc(pedLineLength * sizeof(char)); fgets(rest[PersonId], pedLineLength, pedfile); ped[PersonId].id = line[PersonId][LINE_ID]; ped[PersonId].paid = line[PersonId][LINE_PA]; ped[PersonId].maid = line[PersonId][LINE_MA]; ped[PersonId].foff = line[PersonId][LINE_FOFF]; ped[PersonId].nextpa = line[PersonId][LINE_NEXTPA]; ped[PersonId].nextma = line[PersonId][LINE_NEXTMA]; ped[PersonId].sex = line[PersonId][LINE_GENDER]; ped[PersonId].numCopies = 0; if ((ped[PersonId].cycle = line[PersonId][LINE_PROFIELD]) == 1) proband = PersonId; if (ped[PersonId].cycle > 1) numBreakers[ped[PersonId].cycle]++; if ((ped[PersonId].cycle > 1) && (ped[PersonId].cycle > (maxloop + 1))) { /*Is this loopbreaker a proband*/ ped[PersonId].cycle -= maxloop; proband = PersonId; } if (PersonId == (maxindperpedigree - 1)) { printf("\n About to exceed the maximum number of individuals per pedigree"); exit(EXIT_FAILURE); } if (!P_eof(pedfile)) fscanf(pedfile, "%ld", nextPedigreeId); else *nextPedigreeId = 0; } /* end for */ /*find that proband labeled as 1 is really a loop breaker also*/ for (l = 2; l < maxloop+3; l++) if (1 == numBreakers[l]) { ped[proband].cycle = l; } if (!proband) /* no proband was found */ proband = 1; NumOfIndividualsWC = 1 + coalesce_breakers(NumOfIndividualsWC -1); order_children(NumOfIndividualsWC - 1); } /****************************************************************************** * * function Convert_to_undirected_graph * parameters none * output none * description creates OriginalGraph of undirected graph that * corresponds to directed graph DirectedGraph * creation Thu Mar 27 18:44:00 1997 * changes * comments * ******************************************************************************/ void Convert_to_undirected_graph() { int NodeIndex, NeighIndex; /*loop indices*/ for (NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) { OriginalGraph[NodeIndex].fSelected = FALSE; OriginalGraph[NodeIndex].degree = 0; for (NeighIndex = 1; NeighIndex < NumOfNodesInGraph; NeighIndex++) OriginalGraph[NodeIndex].D[NeighIndex] = FALSE; } for (NodeIndex = 1; NodeIndex < NumOfNodesInGraph; NodeIndex++) if (DirectedGraph[NodeIndex].fSelected) { OriginalGraph[NodeIndex].fSelected = TRUE; OriginalGraph[NodeIndex].degree = DirectedGraph[NodeIndex].outdegree + DirectedGraph[NodeIndex].indegree; for (NeighIndex = 1; NeighIndex < NumOfNodesInGraph; NeighIndex++) if (DirectedGraph[NodeIndex].out[NeighIndex] || DirectedGraph[NodeIndex].in[NeighIndex]) OriginalGraph[NodeIndex].D[NeighIndex] = TRUE; } } /****************************************************************************** * * function Convert_to_graph * parameters none * output none * description creates directed graph that corresponds to pedigree's topology * and unifies copies of loopbreakers * creation Thu Mar 27 18:47:00 1997 * changes * comments * ******************************************************************************/ void Convert_to_graph() { int NodeIndex, NeighIndex, kNodeIndex; /*loop incides*/ int motherIndex, fatherIndex; /*father and mother in current nuclear family */ int FamilyIndex; /* an index of node that represents a nuclear family in which paid(maid) is the father(mother)*/ int NumOfFamilies; /* number of nuclear families */ for (NodeIndex = 1; NodeIndex < maxnode; NodeIndex++) { DirectedGraph[NodeIndex].fSelected = FALSE; DirectedGraph[NodeIndex].outdegree = DirectedGraph[NodeIndex].indegree = 0; for (NeighIndex = 1; NeighIndex < maxnode; NeighIndex++) DirectedGraph[NodeIndex].out[NeighIndex] = DirectedGraph[NodeIndex].in[NeighIndex] = FALSE; } NumOfFamilies = 0; for (NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) { DirectedGraph[NodeIndex].fSelected = TRUE; DirectedGraph[NodeIndex].fFamilyNode = FALSE; if (ped[NodeIndex].paid || ped[NodeIndex].maid) { for (NeighIndex = 0; NeighIndex < NumOfFamilies; NeighIndex++) { FamilyIndex = NumOfIndividualsWC + NeighIndex; /* index of node that represents a nuclear family in which paid(maid) is the father(mother)*/ if ((!ped[NodeIndex].paid || (ped[NodeIndex].paid && DirectedGraph[FamilyIndex].in[ped[NodeIndex].paid])) && (!ped[NodeIndex].maid || (ped[NodeIndex].maid && DirectedGraph[FamilyIndex].in[ped[NodeIndex].maid]))) break; } /*end of for loop */ FamilyIndex = NumOfIndividualsWC + NeighIndex; if (NeighIndex == NumOfFamilies) { /* new family */ NumOfFamilies++; DirectedGraph[FamilyIndex].fSelected = TRUE; DirectedGraph[FamilyIndex].fFamilyNode = TRUE; if (fatherIndex = ped[NodeIndex].paid) { DirectedGraph[FamilyIndex].in[fatherIndex] = DirectedGraph[fatherIndex].out[FamilyIndex] = TRUE; DirectedGraph[FamilyIndex].indegree++; DirectedGraph[fatherIndex].outdegree++; } if (motherIndex = ped[NodeIndex].maid) { DirectedGraph[FamilyIndex].in[motherIndex] = DirectedGraph[motherIndex].out[FamilyIndex] = TRUE; DirectedGraph[FamilyIndex].indegree++; DirectedGraph[motherIndex].outdegree++; } } DirectedGraph[FamilyIndex].outdegree++; DirectedGraph[NodeIndex].indegree++; DirectedGraph[NodeIndex].in[FamilyIndex] = DirectedGraph[FamilyIndex].out[NodeIndex] = TRUE; } /* end if paid || maid */ } /* end of saving into directed graph */ /* unify cycle copies */ NumOfFamilies++; NumOfNodesInGraph = NumOfIndividualsWC + NumOfFamilies; for (NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) if (ped[NodeIndex].cycle > 1 && DirectedGraph[NodeIndex].fSelected) for (NeighIndex = NodeIndex + 1; NeighIndex < NumOfIndividualsWC; NeighIndex++) if (ped[NeighIndex].cycle == ped[NodeIndex].cycle && DirectedGraph[NeighIndex].fSelected){ DirectedGraph[NeighIndex].fSelected = FALSE; for (kNodeIndex = NumOfIndividualsWC; kNodeIndex < NumOfNodesInGraph; kNodeIndex++) { if (DirectedGraph[kNodeIndex].in[NeighIndex]) { DirectedGraph[kNodeIndex].in[NeighIndex] = FALSE; DirectedGraph[kNodeIndex].in[NodeIndex] = DirectedGraph[NodeIndex].out[kNodeIndex] = TRUE; DirectedGraph[NodeIndex].outdegree++; } if (DirectedGraph[kNodeIndex].out[NeighIndex]) { DirectedGraph[kNodeIndex].out[NeighIndex] = FALSE; DirectedGraph[kNodeIndex].out[NodeIndex] = DirectedGraph[NodeIndex].in[kNodeIndex] = TRUE; DirectedGraph[NodeIndex].indegree++; } } } } /****************************************************************************** * * function copy_line * parameters int FromLineIndex * int ToLineIndex * output none * description copy line of pedigree file (FromLineIndex) to line (ToLineIndex) * * creation Sun Mar 30 15:47:06 1997 * changes * comments * ******************************************************************************/ void copy_line(int FromLineIndex, int ToLineIndex) { int FieldIndex; /*index for column in pedigree file*/ int charIndex; /*loop index over characters*/ if (rest[ToLineIndex] == NULL) rest[ToLineIndex] = (char *) malloc(pedLineLength * sizeof(char)); for (FieldIndex = 0; FieldIndex < LINEN; FieldIndex++) line[ToLineIndex][FieldIndex] = line[FromLineIndex][FieldIndex]; for (charIndex = 0; charIndex < pedLineLength; charIndex++) rest[ToLineIndex][charIndex] = rest[FromLineIndex][charIndex]; } /****************************************************************************** * * function rearrange_children * parameters int NodeIndex index of new loopbreaker * int SpouseIndex index of spouse of NodeIndex * int *firstchild index of first child to * be updated * output none * description rearrange children, in particular the nextpa, nextma, and * foff fields of full sibs who are children * of NodeIndex and SpouseIndex * creation thu apr 18 12:33:02 1997 * changes * comments * ******************************************************************************/ void Rearrange_children(int NodeIndex, int SpouseIndex, int *firstchild) { int ChildIndex; /*current child*/ int nextChild; /*next half sibling*/ /*male and female cases are symmetric, comments are in male case*/ if (line[NodeIndex][LINE_GENDER] == MALE) { /*start at *firstchild */ ChildIndex = (*firstchild); (*firstchild) = -1; /*Iterate over the half-siblings with same parent NodeIndex*/ for (; ChildIndex != 0; ChildIndex = nextChild) { nextChild = line[ChildIndex][LINE_NEXTPA]; if (line[ChildIndex][LINE_MA] == SpouseIndex) { /* siblings of this family */ if (line[NodeIndex][LINE_FOFF] == -1) /*set foff field for the parent NodeIndex*/ line[NodeIndex][LINE_FOFF] = ChildIndex; line[ChildIndex][LINE_PA] = NodeIndex; } else /* for stranger siblings */ { if ((*firstchild) == -1) (*firstchild) = ChildIndex; } } /* end of for children index */ /*clean up last full sibling*/ } /* end of if male */ else /* if Node is FEMALE */ { ChildIndex = (*firstchild); (*firstchild) = -1; for ( ; ChildIndex != 0; ChildIndex = nextChild) { nextChild = line[ChildIndex][LINE_NEXTMA]; if (line[ChildIndex][LINE_PA] == SpouseIndex) { /* siblings of this family */ if (line[NodeIndex][LINE_FOFF] == -1) line[NodeIndex][LINE_FOFF] = ChildIndex; line[ChildIndex][LINE_MA] = NodeIndex; } else /* for stranger siblings */ { if ((*firstchild) == -1) (*firstchild) = ChildIndex; } } /* end of for children index */ } /* end of if female */ } /****************************************************************************** * * function Set_up_new_copies * parameters int NodeIndex index of new loopbreaker * int combine_with_father flag that says that father shouldn't be disconnected * int *NumOfInd number of individuals (includes new opies of loopbreakers) * output none * description set up copies of new loopbreaker * for each marriage (if needed) creates new copy of lb * if creating new copy will disconnect pedigree * and if combine_with_father is TRUE then creates copy * that connects father with this marriage * * creation Sun Mar 30 16:56:02 1997 * changes * comments * ******************************************************************************/ void Set_up_new_copies(int NodeIndex, int combine_with_father, int *NumOfInd) { int firstchild; /* index of first child */ int MarriageIndex, SpouseMarriage; /* indices over spouses*/ int SpouseIndex; /*members of a nuclear family*/ int FamilyIndex; /*index of node for a nuclear family*/ int CopyIndex; /* ondex of copy of loopbreaker */ int TableIndex; /*index into table*/ int start = 0; /*0 on first time */ firstchild = line[0][LINE_FOFF]; for (MarriageIndex = 0; MarriageIndex < ped[NodeIndex].numMarriages; MarriageIndex++) { SpouseIndex = ped[NodeIndex].marriages[MarriageIndex]; /* find FamilyIndex of family that includes Node and Node's spouse as parents */ for (SpouseMarriage = 0; SpouseMarriage < ped[SpouseIndex].numMarriages; SpouseMarriage++) if (ped[SpouseIndex].marriages[SpouseMarriage] == NodeIndex) break; for (FamilyIndex = 1; FamilyIndex < NumOfNodesInGraph; FamilyIndex++) if (DirectedGraph[FamilyIndex].fSelected && DirectedGraph[FamilyIndex].in[NodeIndex] && DirectedGraph[FamilyIndex].in[SpouseIndex]) break; if (!OutputGraph[NodeIndex].D[FamilyIndex]) { /* no edge to this family, build a new copy */ for (CopyIndex = 1; CopyIndex < maxindperpedigree; CopyIndex++) if (!table[CopyIndex] && (!combine_with_father || NodeIndex != CopyIndex)) break; (*NumOfInd)++; copy_line(0, CopyIndex); table[CopyIndex] = CopyIndex; line[CopyIndex][LINE_PA] = line[CopyIndex][LINE_MA] = line[CopyIndex][LINE_NEXTPA] = line[CopyIndex][LINE_NEXTMA] = 0; line[CopyIndex][LINE_GENDER] = line[0][LINE_GENDER]; Rearrange_children(CopyIndex, SpouseIndex, &firstchild); line[CopyIndex][LINE_PROFIELD] = NumOfIndividualsWC + recycle[NodeIndex]; line[CopyIndex][LINE_ID] = CopyIndex; /* id */ /* fix the rest of the individuals */ ped[SpouseIndex].marriages[SpouseMarriage] = CopyIndex; ped[CopyIndex].marriages[ped[CopyIndex].numMarriages] = SpouseIndex; if (NodeIndex != CopyIndex) /*avoid making an extra copy of the founder*/ ped[CopyIndex].numMarriages++; DirectedGraph[FamilyIndex].in[NodeIndex] = FALSE; DirectedGraph[FamilyIndex].in[CopyIndex] = TRUE; } /* if end for build a new copy */ else { if (!start) { /* create new copy */ start = 1; if (combine_with_father) TableIndex = NodeIndex; else { (*NumOfInd)++; for (TableIndex = 1; TableIndex < maxindperpedigree; TableIndex++) if (!table[TableIndex]) break; } copy_line(0, TableIndex); table[TableIndex] = TableIndex; if (!combine_with_father) line[TableIndex][LINE_PA] = line[TableIndex][LINE_MA] = line[TableIndex][LINE_NEXTPA] = line[TableIndex][LINE_NEXTMA] = 0; line[TableIndex][LINE_GENDER] = line[0][LINE_GENDER]; line[TableIndex][LINE_PROFIELD]=NumOfIndividualsWC + recycle[NodeIndex]; line[TableIndex][LINE_ID] = TableIndex; } /* end if !start */ /* fix the rest of the individuals */ Rearrange_children(TableIndex, SpouseIndex, &firstchild); ped[SpouseIndex].marriages[SpouseMarriage] = TableIndex; ped[TableIndex].marriages[ped[TableIndex].numMarriages] = SpouseIndex; if (NodeIndex != TableIndex) /*avoid making an extra copy of the founder*/ ped[TableIndex].numMarriages++; DirectedGraph[FamilyIndex].in[NodeIndex] = FALSE; DirectedGraph[FamilyIndex].in[TableIndex] = TRUE; } /* else end for build a new copy for big marriages*/ } /* end for */ } /* end of Set_up_new_copies */ /****************************************************************************** * * function write_to_file * parameters long weight_new * double weight_log_new * output none * description writes pedigree with new loopbreakers to tpedfile * initialises structure of marriages for each person * sets marriages for each person * sorts marriages by time using list of sons * unifies old loopbreakers * creates copies for new loopbreakers * prints lines to tpedfile * * creation Sun Mar 30 16:26:24 1997 * changes A.A. Schaffer added parameter outputFile in June 1999 * comments * ******************************************************************************/ void write_to_file(long weight_new, double weight_log_new, FILE *outputFile) { int NodeIndex, NeighIndex; /*Indices for a node and a neighbor*/ int MarriageIndex; /*Index for spouse*/ int FatherIndex, MotherIndex; /*A father and mother in a nuclear family*/ int CopyIndex; /*Index over copies of a loop breaker*/ int NumOfInd; /* one more than the number of Individuals with new loopbreakers copies */ long weight_old = 1; /*loop breaker weight in input pedigree*/ double weight_log_old = 0; /*log loop breaker weight in input pedigree*/ int FieldIndex, FieldInfo; /*Index of field among first 9 on a line and contents*/ int personIndex; /*index for a an individual*/ int cycleIndex; /*index for loops*/ int FamilyIndex; /*index for nuclear families*/ int tempWeight; /*used to avoid wraparound in weights*/ NumOfInd = NumOfIndividualsWC; /* initialize table of lines */ for (NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) table[NodeIndex] = NodeIndex; for (; NodeIndex < maxindperpedigree; NodeIndex++) table[NodeIndex] = 0; /* initialize marriages for each person */ for (NodeIndex = 1; NodeIndex < maxindperpedigree; NodeIndex++) { ped[NodeIndex].numMarriages = 0; for (NeighIndex = 0; NeighIndex < maxmar; NeighIndex++) ped[NodeIndex].marriages[NeighIndex] = -1; } /* set marriages for each person */ for (NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) if ((FatherIndex = ped[NodeIndex].paid) && (MotherIndex = ped[NodeIndex].maid)) { for (MarriageIndex = 0; MarriageIndex < ped[FatherIndex].numMarriages; MarriageIndex++) if (ped[FatherIndex].marriages[MarriageIndex] == MotherIndex) break; if (MarriageIndex == ped[FatherIndex].numMarriages) { ped[FatherIndex].marriages[ped[FatherIndex].numMarriages] = MotherIndex; ped[FatherIndex].numMarriages++; } for (MarriageIndex = 0; MarriageIndex < ped[MotherIndex].numMarriages; MarriageIndex++) if (ped[MotherIndex].marriages[MarriageIndex] == FatherIndex) break; if (MarriageIndex == ped[MotherIndex].numMarriages) { ped[MotherIndex].marriages[ped[MotherIndex].numMarriages] = FatherIndex; ped[MotherIndex].numMarriages++; } } /* unify old loopbreakers */ for (NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) if (ped[NodeIndex].cycle > 1 && ped[NodeIndex].cycle < NumOfIndividualsWC) { tempWeight = weight_old; weight_old *= ped[NodeIndex].weight; if (weight_old < tempWeight) weight_old = tempWeight; weight_log_old += (ped[NodeIndex].weight_log - epsilon); line[NodeIndex][LINE_PROFIELD] = 0; for (CopyIndex = NodeIndex + 1; CopyIndex < maxindperpedigree; CopyIndex++) if (ped[NodeIndex].cycle == ped[CopyIndex].cycle) { ped[CopyIndex].cycle = 0; line[CopyIndex][LINE_PROFIELD] = 0; NumOfInd--; table[CopyIndex] = 0; line[CopyIndex][LINE_ID] = 0; ped[NodeIndex].numCopies = ped[CopyIndex].numCopies; if (!ped[NodeIndex].numMarriages) { ped[NodeIndex].numMarriages = ped[CopyIndex].numMarriages; for (MarriageIndex = 0; MarriageIndex < ped[CopyIndex].numMarriages; MarriageIndex++) { ped[NodeIndex].marriages[MarriageIndex] = ped[CopyIndex].marriages[MarriageIndex]; /*AAS*/ ped[CopyIndex].marriages[MarriageIndex] = -1; } ped[CopyIndex].numMarriages = 0; } for (FieldIndex = LINE_PA; FieldIndex < LINE_GENDER; FieldIndex++) if (0 == line[NodeIndex][FieldIndex]) line[NodeIndex][FieldIndex] = line[CopyIndex][FieldIndex]; /* unify lines */ for (personIndex = 1; personIndex < NumOfIndividualsWC; personIndex++) /* fix the rest */ if (table[personIndex]) { for (FieldIndex = LINE_PA; FieldIndex < LINE_GENDER; FieldIndex++) if (line[personIndex][FieldIndex] == CopyIndex) line[personIndex][FieldIndex] = NodeIndex; for (MarriageIndex = 0; MarriageIndex < ped[personIndex].numMarriages; MarriageIndex++) if (ped[personIndex].marriages[MarriageIndex] == CopyIndex) ped[personIndex].marriages[MarriageIndex] = NodeIndex; } break; /* if CopyIndex is a second copy */ } ped[NodeIndex].cycle = 0; } /* create copies for new loopbreakers */ for (cycleIndex = 2; cycleIndex < numCycle + 2; cycleIndex++) { NodeIndex = cycle[cycleIndex]; /* copy line of Node to line 0 (zero line is reserved for tmp line)*/ copy_line(NodeIndex, 0); for (FamilyIndex = 1; FamilyIndex < NumOfNodesInGraph; FamilyIndex++) if (DirectedGraph[FamilyIndex].fSelected && DirectedGraph[FamilyIndex].out[NodeIndex]) break; if (FamilyIndex != NumOfNodesInGraph) { /* Node is not a founder (has parents) */ if (OutputGraph[NodeIndex].D[FamilyIndex]) { /* no separation to the parent family */ table[NodeIndex] = 0; Set_up_new_copies(NodeIndex, 1, &NumOfInd); } else { /* separate from to the parent family */ Set_up_new_copies(NodeIndex, 0, &NumOfInd); line[NodeIndex][LINE_FOFF] = 0; /* Node stays chiledless son */ line[NodeIndex][LINE_PROFIELD] = NumOfIndividualsWC + recycle[NodeIndex]; } } else { /* Node is a founder (no parents) */ table[NodeIndex] = 0; Set_up_new_copies(NodeIndex, 0, &NumOfInd); NumOfInd--; } } /* uncode loopbreakers */ for (NodeIndex = 1; NodeIndex < maxindperpedigree; NodeIndex++) if (table[NodeIndex] && line[NodeIndex][LINE_PROFIELD] > NumOfIndividualsWC) line[NodeIndex][LINE_PROFIELD] -= NumOfIndividualsWC; /* * if there are gaps in lines (empty lines) * then repeatedly swap last last line with first gap */ if (NumOfIndividualsWC > NumOfInd) for (; NumOfIndividualsWC > NumOfInd; NumOfIndividualsWC--) { for (NeighIndex = 1; NeighIndex < NumOfIndividualsWC; NeighIndex++) if (!table[NeighIndex]) break; for (NodeIndex = NumOfIndividualsWC - 1; NodeIndex > NeighIndex; NodeIndex--) if (table[NodeIndex]) break; copy_line(NodeIndex, NeighIndex); line[NeighIndex][LINE_ID] = NeighIndex; table[NodeIndex]=0; for (personIndex = 1; personIndex < NumOfIndividualsWC; personIndex++) /* fix the rest */ if (table[personIndex]) for (FieldIndex = 2; FieldIndex < 7; FieldIndex++) if (line[personIndex][FieldIndex] == NodeIndex) line[personIndex][FieldIndex] = NeighIndex; table[NeighIndex] = NeighIndex; } /* set proband */ if (line[proband][LINE_PROFIELD] == 0) line[proband][LINE_PROFIELD] = 1; if (line[proband][LINE_PROFIELD] > 1) for (NeighIndex = 1; NeighIndex < NumOfIndividualsWC; NeighIndex++) if (line[proband][LINE_PROFIELD] == line[NodeIndex][LINE_PROFIELD] && line[proband][LINE_PA] == 0) for (FieldIndex = 0; FieldIndex < LINEN; FieldIndex++) { FieldInfo = line[1][FieldIndex]; line[1][FieldIndex] = line[NodeIndex][FieldIndex]; line[NodeIndex][FieldIndex] = FieldInfo; } /*Fix foff, nextpa, nextma fields that may be disconnected*/ order_children(NumOfInd - 1); /* print lines to tpedfile */ for (NodeIndex = 1; NodeIndex < NumOfInd; NodeIndex++) { fprintf(outputFile, "%5ld %6ld %6ld %6ld %6ld %6ld ", line[NodeIndex][LINE_PEDIGREE],line[NodeIndex][LINE_ID],line[NodeIndex][LINE_PA], line[NodeIndex][LINE_MA], line[NodeIndex][LINE_FOFF],line[NodeIndex][LINE_NEXTPA]); /* 3 spaces needed for profield, when >= 9 loop breakers*/ fprintf(outputFile, "%6ld %6ld %6ld", line[NodeIndex][LINE_NEXTMA],line[NodeIndex][LINE_GENDER], line[NodeIndex][LINE_PROFIELD]); fputs(rest[NodeIndex],outputFile); free(rest[NodeIndex]); } weight_log_new -= numCycle * epsilon; printf("Old weight is %ld\nNew weight is %ld\n", weight_old, weight_new); printf("Old log(weight) is %f\nNew log(weight) is %f\n", weight_log_old, weight_log_new); } /****************************************************************************** * * function computeLineLength * parameters none * output none * description reads pedigree file and puts an overestimate of the * line length into the global variable pedLineLength * * creation Mon Apr 7 1997 * changes * comments * ******************************************************************************/ void computeLineLength() { char c; int count; count = 0; do { fscanf(pedfile,"%c", &c); count++; } while (c != '\n'); pedLineLength = 2 * count; rewind(pedfile); } /****************************************************************************** * * function computePositionsForLoci * parameters none * output returns an array showing * how many positions in pedigree file * occupied by each locus * description * * * * * creation June 1999 * changes * comments * ******************************************************************************/ int *computePositionsForLoci() { int l; /*loop index*/ int *returnArray; /*array to return*/ returnArray = (int *) malloc(nsystem * sizeof(int)); for (l = 0; l < nsystem; l++) { switch(thislocus[l]->which) { case quantitative: returnArray[l] = thislocus[l]->UU.ntrait; break; case affection: if (thislocus[l]->UU.U0.nclass == 1) returnArray[l] = 1; else returnArray[l] = 2; break; case binary_: if (thislocus[l]->UU.U2.format == 3) returnArray[l] = 2; else returnArray[l] = thislocus[l]->UU.U2.nfactor; break; } } return(returnArray); } /****************************************************************************** * * function computeInitialWeight * parameters p index of person whose weight we need * output returns a weight * description Figure out for how many loci p has * unknown phenotype, call it numUnknown * and returns a weight of 4^u * * creation June 1999 * changes * comments * ******************************************************************************/ int computeInitialWeight(int p, int *positionsForLoci) { int numUnknown; /*number of loci for which p is unknown*/ int u; /*loop index*/ int l; /*index over loci*/ int returnWeight; /*weight to return*/ int numPositions; /*number of positions for the phenotype of this locus*/ int pos; /*loop index over positions*/ double quanValue; /*quantitative value read*/ int discreteValue, junk; /*discrete value read*/ boolean thisKnown; /*is this person known at this locus*/ char *lineCopy; /*copy of genotype part of line*/ char *token, *lineStatus, *thisValue; /*used to read items in lineCopy*/ numUnknown = 0; lineCopy = (char *) malloc(pedLineLength * sizeof(char)); strcpy(lineCopy, rest[p]); lineStatus = lineCopy; returnWeight = 1; for (l = 0; l < nsystem; l++) { numPositions = positionsForLoci[l]; switch(thislocus[l]->which) { case quantitative: for (pos = 0; pos < numPositions; pos++) { token = strtok(lineStatus, WHITE_SPACE); if (NULL != lineStatus) lineStatus =NULL; thisValue = (char*) strdup(token); quanValue = atof(thisValue); if ((0 == pos) && (quanValue == missval)) numUnknown++; } break; case affection: token = strtok(lineStatus, WHITE_SPACE); if (NULL != lineStatus) lineStatus =NULL; thisValue = (char*) strdup(token); discreteValue = atoi(thisValue); if (numPositions > 1) { token = strtok(lineStatus, WHITE_SPACE); thisValue = (char*) strdup(token); junk = atoi(thisValue); } if (0 == discreteValue) numUnknown++; break; case binary_: if (thislocus[l]->UU.U2.format == 3) { token = strtok(lineStatus, WHITE_SPACE); if (NULL != lineStatus) lineStatus =NULL; thisValue = (char*) strdup(token); discreteValue = atoi(thisValue); token = strtok(lineStatus, WHITE_SPACE); thisValue = (char*) strdup(token); junk = atoi(thisValue); if (0 == discreteValue) numUnknown++; } else { thisKnown = FALSE; for(pos = 0; pos < numPositions; pos++) { token = strtok(lineStatus, WHITE_SPACE); if (NULL != lineStatus) lineStatus =NULL; thisValue = (char*) strdup(token); discreteValue = atoi(thisValue); if (0 != discreteValue) thisKnown = TRUE; } if (!thisKnown) numUnknown++; } break; } } if (numUnknown > 10) numUnknown = 10; for(u = 0; u < numUnknown; u++) returnWeight *= 4; free(lineCopy); return(returnWeight); } /****************************************************************************** * * function detectLoopedPedigrees * parameters pedfile file to red from islooped array to return FALSE of TRUE for each pedigree * output none * description reads pedigrees from pedfile and decides * which pedigrees have a loop * * * creation June 1999 * changes * comments * ******************************************************************************/ void detectLoopedPedigrees(boolean *islooped) { boolean hasCycle; /*does this pedigree have a loop?*/ int NodeIndex; /*loop index*/ int *positionsForLoci; /*how many positions in each locus*/ int currentPedigreeCount; /*count of pedigrees*/ long currentPedigreeId, nextPedigreeId; /*ids of pedigrees*/ int thisWeight; /*weight for this person based on loci*/ int presult; open_files(TRUE); computeLineLength(); /*sets pedLineLength*/ positionsForLoci = computePositionsForLoci(); /* get first ped id */ if (!P_eof(pedfile)) { fscanf(pedfile,"%ld",&nextPedigreeId); line[1][LINE_PEDIGREE] = nextPedigreeId; } for (currentPedigreeCount = 1; nextPedigreeId != 0; currentPedigreeCount++) { currentPedigreeId = nextPedigreeId; readped_with_loop(currentPedigreeId, &nextPedigreeId); /*checked*/ Convert_to_graph(); /*checked*/ Convert_to_undirected_graph(); /*checked*/ hasCycle = FALSE; /*all individual nodes come first, before family nodes*/ for (NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) { if (FALSE == NoCycleThrough(OriginalGraph, NodeIndex)) { hasCycle = TRUE; break; } } if (hasCycle) { presult = fprintf(countfile,"Pedigree %d\n", currentPedigreeCount); fflush(countfile); fsync(fileno(countfile)); for(NodeIndex = 1; NodeIndex < NumOfIndividualsWC; NodeIndex++) { thisWeight = computeInitialWeight(NodeIndex, positionsForLoci); presult = fprintf(countfile,"At locus 1 person %d has 0 homozygous genotypes and\n %d heterozygous genotypes\n",NodeIndex,thisWeight); fflush(countfile); fsync(fileno(countfile)); } } } close_files(); } /****************************************************************************** * * function loopbreakers * parameters none * output none * description reads pedigrees with old loopbreakers from pedfile.dat * finds new set of loopbreakers and saves new topology * in tpedfile.dat * * creation Sat Mar 29 20:27:00 1997 * changes changed to add use of random algorithm * comments uses greedy algorithm * ******************************************************************************/ void loopbreakers() { long nextPedigreeId; /* id of next pedigree */ long currentPedigreeId; /* id of current pedigree */ int currentPedigreeCount; /* sequential number of current pedigree */ long weight_greedy; /* (product) weight of loop breakers of greedy */ double weight_log_greedy; /* (sum of) log weight of loop breakers of greedy */ long weight_random; /* (product) weight of loop breakers of random */ double weight_log_random; /* (sum of) log weight of loop breakers of random */ int PedigreeWithLoops = 0; /* sequential number of pedigree that has loops */ boolean multipleMarriages; /* does this pedigree have multiply married indivduals*/ open_files(FALSE); computeLineLength(); /* get first ped id */ if (!P_eof(pedfile)) { fscanf(pedfile,"%ld",&nextPedigreeId); line[1][LINE_PEDIGREE] = nextPedigreeId; } /* get num of pedigree that has loops */ if (!P_eof(countfile)) fscanf(countfile, "Pedigree %d\n", &PedigreeWithLoops); for (currentPedigreeCount = 1; !P_eof(pedfile); currentPedigreeCount++) { currentPedigreeId = nextPedigreeId; if (currentPedigreeCount != PedigreeWithLoops) /* pedegree without loops */ read_write_ped_non_loop(currentPedigreeId, &nextPedigreeId, tpedfile); else { /* pedigree with loops */ readped_with_loop(currentPedigreeId, &nextPedigreeId); PedigreeWithLoops = Read_homoz_heteroz(); Convert_to_graph(); Convert_to_undirected_graph(); multipleMarriages = FindGreedyVFS(&weight_greedy, &weight_log_greedy); if (multipleMarriages) RepeatedWeightedGuess(&weight_random, &weight_log_random, weight_greedy, numCycle); arrangeFVS(); if (multipleMarriages && (weight_random < weight_greedy)) write_to_file(weight_random, weight_log_random, tpedfile); else write_to_file(weight_greedy, weight_log_greedy, tpedfile); } } close_files(); } /****************************************************************************** * * function loopbreakers2 * parameters islooped array indicating which pedigrees have a loop lpedfile file to output to * output none * description reads pedigrees with from pedfile.dat * finds initial set of loopbreakers and saves new topology * in pedfile.dat * * creation June 1999 * changes derived from loopbreakers * comments uses greedy algorithm * ******************************************************************************/ void loopbreakers2(FILE * lpedfile) { long nextPedigreeId; /* id of next pedigree */ long currentPedigreeId; /* id of current pedigree */ int currentPedigreeCount; /* sequential number of current pedigree */ long weight_greedy = 0; /* (product) weight of loop breakers of greedy */ double weight_log_greedy = 0; /* (sum of) log weight of loop breakers of greedy */ long weight_random; /* (product) weight of loop breakers of random */ double weight_log_random; /* (sum of) log weight of loop breakers of random */ int PedigreeWithLoops = 0; /* sequential number of pedigree that has loops */ boolean multipleMarriages; /* does this pedigree have multiply married indivduals*/ open_files(FALSE); /* get first ped id */ if (!P_eof(pedfile)) { fscanf(pedfile,"%ld",&nextPedigreeId); line[1][LINE_PEDIGREE] = nextPedigreeId; } /* get num of pedigree that has loops */ if (!P_eof(countfile)) fscanf(countfile, "Pedigree %d\n", &PedigreeWithLoops); for (currentPedigreeCount = 1; !P_eof(pedfile); currentPedigreeCount++) { currentPedigreeId = nextPedigreeId; if (currentPedigreeCount != PedigreeWithLoops) /* pedegree without loops */ read_write_ped_non_loop(currentPedigreeId, &nextPedigreeId, lpedfile); else { /* pedigree with loops */ readped_with_loop(currentPedigreeId, &nextPedigreeId); PedigreeWithLoops = Read_homoz_heteroz(); Convert_to_graph(); Convert_to_undirected_graph(); multipleMarriages = FindGreedyVFS(&weight_greedy, &weight_log_greedy); if (multipleMarriages) RepeatedWeightedGuess(&weight_random, &weight_log_random, weight_greedy, numCycle); arrangeFVS(); if (multipleMarriages && (weight_log_random < weight_log_greedy)) write_to_file(weight_random, weight_log_random, lpedfile); else write_to_file(weight_greedy, weight_log_greedy, lpedfile); } } close_files(); } fastlink-4.1P-fix95/4.1P/src/unknown.c0000644000265600020320000044260010517437576016500 0ustar tilleaadmin/* Output from p2c, the Pascal-to-C translator */ /* From input file "unknown.p" */ /*Changes at Columbia U. indicated by "change"*/ /*10 July 1993*/ /* Modified extensively by Dylan Cooper and Alejandro Schaffer to produce a file whose name is in the macro LOOPFILE_NAME) that is used to restrict the genotypes of unknowns in the presence of loops. Modified in late 1994 and summer of 1995. Please read README.loopfile for a description of the file created and the concept of loopbreaker vectors. The basic idea is (for each locus of each pedigree): -- find all the permutations (vectors) of single locus genotypes that the loop breakers can have -- traverse the pedigree from the proband for each loopbreaker vector and record the single locus genotypes each person may have if the loopbreakers have the single locus genotypes specified by the vector -- if there are no loops do a faster version of the old alg Modified by Alejandro Schaffer in late 1995 to renumber alleles when ALLELE_SPEED is set to 1. If 2 or more alleles are unused in a pedigree at a locus, all the unused alleles can be combined into 1. Allele renumbering affects the output of speedfile.dat and loopfile.dat, but not pedfile.dat, datafile.dat, or ipedfile.dat. The reasons for this choice are somewhat arbitrary. Further changes were made in April,1996 by Tony Schurtz, in order to allow for backward compatibility with the old "speedfile.dat" format. Now the application always writes out speedfile.dat in the original file format (as though ALLELE_SPEED were zero). If ALLELE_SPEED is set to one, a second speedfile is written, in the new format, to a file called "newspeedfile.dat" The changes to the source are quite systematic. Each function which depended upon the value of ALLELE_SPEED was simply "cloned", one version retaining the ALLELE_SPEED = 0 code, and the other the ALELE_SPEED = 1 code. These were named x_old, and x_new, respectively, x being the old function name.. main() was cloned in the same way in order to ensure that the entire state of the application is reinitialized before newspeedfile.dat is generated. Some of these routines were merged by A. A. Schaffer in February 1997. */ #include "unknown.h" static subhap seghap[maxgeno]; static thisperson *person[maxind + 1]; static thisperson *proband, *loop1, *loop2; static long risksys, mutsys; static long fgeno, mgeno; static long nsequence, newped, whichsys, totperson; static boolean sexlink, risk, disequi; static boolean disfreqs; /*using conditional allele frequencies, Morgan*/ static FILE *speedfile, *datafile, *pedfile, *ipedfile; #if LOOP_BREAKERS static FILE *countfile; #endif /*LOOP_BREAKERS*/ static genotype gene; static double one; /*changed*/ static boolean makehomozygous; /* Change - Added 7/8/93 */ static int numind; /*number of individuals in pedigree*/ static int depth; /*depth of recursion*/ /*The following three variables were added by A. A. Schaffer to help pinpoint Mendelian incompatibilities*/ static boolean incompat_traversal; /*found incompatibility on this traversal*/ static boolean first_incompat; /*Is this the first incomptibility */ static boolean detected_incompat[maxind+1]; /* array to record whether an incompatibility with this person has already been reported*/ static boolean errorOccurred; /*is there a basic error in the input files*/ static boolean gapsinIds; /*is there a gap in the individual ids*/ static int totalNumPed; /*total number of pedigrees*/ #if LOOPSPEED static int num_loops_considered; /* Added by Dylan late 1994 */ static int num_loops; #endif #if LOOPSPEED static long genenumber[maxlocus][maxgeno][maxgeno]; #else static long genenumber[maxgeno][maxgeno]; #endif #if LOOPSPEED /* file containing info when pedigree has loops */ static FILE *loopfile; /* aliases the two loopbreakers for each loop */ #if LOOP_BREAKERS static thisperson *looppers[maxloop][maxloop]; static int numCopies[maxloop]; /*inferred information about possible loop breaker genotypes */ static genotype **loop_infer_genotype[MAXPED]; #else static thisperson *looppers[maxloop][2]; #endif /*LOOP_BREAKERS*/ /* table holding possible genotypes for unknowns. Indexed by: - person[i]->nseq - locus - loopbreaker vector # - single locus genotype # */ static geno_for_unknown *unknown_poss = NULL; /* array of valid loopbreakers */ static loop_vector_array loop_vectors = NULL; /* holds number of loopbreaker vectors for each locus */ static int num_loop_vectors[maxlocus]; #endif char status[maxind+1]; /* used to check pedfile.dat for consistency*/ /* ----------------------- Procedures ------------------------------- */ /* Dylan -- Copied from iostuff.c */ /* This routine is a simple exit routine, when the sytem is out of memory */ void malloc_err(message) char * message; { FILE *errorfile; time_t secondsNow; fprintf(stderr, "\nProblem with malloc, probably not enough space\n"); fprintf(stderr, "Problem occurred when allocating %s\n", message); #if LOOPSPEED fprintf(stderr, "Reduce max_vectors_considered to %d.\n", fewer_vects_size); #endif errorfile = fopen("FASTLINK.err","a"); if (errorfile) { time (&secondsNow); fprintf(errorfile,"\n%s",ctime(&secondsNow)); fprintf(errorfile, "\nProblem with malloc, probably not enough space\n"); fprintf(errorfile, "Problem occurred when allocating %s\n", message); fclose(errorfile); } exit(EXIT_FAILURE); } /* Two routines taken from */ /* "p2c" Copyright (C) 1989, 1990, 1991 Free Software Foundation. * By Dave Gillespie, daveg@csvax.cs.caltech.edu. Version --VERSION--. * This file may be copied, modified, etc. in any way. It is not restricted * by the licence agreement accompanying p2c itself. */ /* Check if at end of file, using Pascal "eof" semantics. End-of-file for stdin is broken; remove the special case for it to be broken in a different way. */ int P_eof(f) FILE *f; { register int ch; if (feof(f)) return 1; if (f == stdin) return 0; /* not safe to look-ahead on the keyboard! */ ch = getc(f); if (ch == EOF) return 1; ungetc(ch, f); return 0; } /* Check if at end of line (or end of entire file). */ int P_eoln(f) FILE *f; { register int ch; ch = getc(f); if (ch == EOF) return 1; ungetc(ch, f); return (ch == '\n'); } /* dwix: begin */ /* this struct is a linked list of integers used to store the pedigree */ /* numbers, which will be saved with an association to an index */ struct int_list_ { int ped_number; struct int_list_ *next; }; typedef struct int_list_ int_list; void adjustIds() { FILE *localpedfile, *localupedfile; char *fgetsvalue; /*return value from fgets*/ char inputline[DEFAULT_STRING_LENGTH]; /* line read from ipedfile */ char restofline[DEFAULT_STRING_LENGTH]; /* line read from ipedfile */ int newid[maxind]; /*new id numberss*/ int firstLineThisPed, lastLineThisPed; int lineNumber; int i; /*loop index over lines*/ int j; /*loop index over individuals*/ int inped; /* pedigree read */ /*used to hold columns 2,3,4, 5, 6, 7*/ int person_id, pa_id, ma_id, foff_id, npa_id, nma_id; int counter; /*counter over individuals present*/ int max_id; /*maximum id seen in a pedigree*/ int prev_ped; /*number of previously seen pedigree*/ boolean pedFinished; /*are we finished with one pedigree*/ max_id = 0; localpedfile = fopen("pedfile.dat", "r"); if (NULL == localpedfile) { exit(FileNotFound); } localupedfile = fopen("upedfile.dat", "w"); if (NULL == localpedfile) { fprintf(stderr,"Failed to open upedfile.dat\n"); exit(EXIT_FAILURE); } firstLineThisPed = 0; lastLineThisPed = 0; prev_ped = 0; pedFinished = FALSE; while (!P_eof(localpedfile)) { /* go through all of file */ /*skip over lines already read*/ for(i = 0; i < lastLineThisPed; i++) /* get a line */ fgetsvalue = fgets(inputline,DEFAULT_STRING_LENGTH,localpedfile); lineNumber = i; for(i = 0; i < maxind; i++) status[i] = NOT_FOUND; do { /* read its ped and people */ pedFinished = FALSE; firstLineThisPed = lastLineThisPed; fscanf(localpedfile," %d%d%d%d%d%d%d",&inped, &person_id, &pa_id, &ma_id, &foff_id, &npa_id, &nma_id); if (lineNumber == lastLineThisPed) prev_ped = inped; if ((inped == prev_ped) && (NULL != (fgetsvalue = fgets(restofline,DEFAULT_STRING_LENGTH,localpedfile)))) { /* get a line */ switch (status[person_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[person_id] = FOUND_AS_SELF; break; case FOUND_AS_SELF: case DUPLICATED: status[person_id] = DUPLICATED; break; default: break; } if (pa_id > 0) { switch (status[pa_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[pa_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[pa_id] = FOUND_AS_SELF; break; case DUPLICATED: status[pa_id] = DUPLICATED; break; default: break; } } if (ma_id > 0) { switch (status[ma_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[ma_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[ma_id] = FOUND_AS_SELF; break; case DUPLICATED: status[ma_id] = DUPLICATED; break; default: break; } } if (foff_id > 0) { switch (status[foff_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[foff_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[foff_id] = FOUND_AS_SELF; break; case DUPLICATED: status[foff_id] = DUPLICATED; break; default: break; } } if (npa_id > 0) { switch (status[npa_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[npa_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[npa_id] = FOUND_AS_SELF; break; case DUPLICATED: status[npa_id] = DUPLICATED; break; default: break; } } if ((nma_id > 0) && (nma_id != npa_id)) { switch (status[nma_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[nma_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[nma_id] = FOUND_AS_SELF; break; case DUPLICATED: status[nma_id] = DUPLICATED; break; default: break; } } if (person_id > max_id) max_id = person_id; if (pa_id > max_id) max_id = pa_id; if (ma_id > max_id) max_id = ma_id; if (foff_id > max_id) max_id = foff_id; if (npa_id > max_id) max_id = npa_id; if (nma_id > max_id) max_id = nma_id; lineNumber++; } /*inped == prev_ped*/ else { /*inped != prev_ped */ pedFinished = TRUE; lastLineThisPed = lineNumber; newid[0] = 0; counter = 1; for(j = 1; j <= max_id; j++) { if (NOT_FOUND != status[j]) { newid[j] = counter; counter++; } } rewind(localpedfile); for(i = 0; i < firstLineThisPed; i++) /* get a line */ fgetsvalue = fgets(inputline,DEFAULT_STRING_LENGTH,localpedfile); for(i =firstLineThisPed; i < lastLineThisPed; i++) { fscanf(localpedfile," %d%d%d%d%d%d%d",&inped, &person_id, &pa_id, &ma_id, &foff_id, &npa_id, &nma_id); fgetsvalue = fgets(restofline,DEFAULT_STRING_LENGTH,localpedfile); fprintf(localupedfile, " %5d%5d%5d%5d%5d%5d%5d",inped, newid[person_id], newid[pa_id], newid[ma_id], newid[foff_id], newid[npa_id], newid[nma_id]); fputs(restofline, localupedfile); } for(i = 0; i <= max_id; i++) status[i] = NOT_FOUND; } } while (!P_eof(localpedfile)); /*inner while */ lastLineThisPed = lineNumber; newid[0] = 0; counter = 1; for(j = 1; j <= max_id; j++) { if (NOT_FOUND != status[j]) { newid[j] = counter; counter++; } } rewind(localpedfile); for(i = 0; i < firstLineThisPed; i++) /* get a line */ fgetsvalue = fgets(inputline,DEFAULT_STRING_LENGTH,localpedfile); for(i =firstLineThisPed; i < lastLineThisPed; i++) { fscanf(localpedfile," %d%d%d%d%d%d%d",&inped, &person_id, &pa_id, &ma_id, &foff_id, &npa_id, &nma_id); fgetsvalue = fgets(restofline,DEFAULT_STRING_LENGTH,localpedfile); fprintf(localupedfile, " %5d%5d%5d%5d%5d%5d%5d",inped, newid[person_id], newid[pa_id], newid[ma_id], newid[foff_id], newid[npa_id], newid[nma_id]); fputs(restofline, localupedfile); } } /*outer while */ fclose(localpedfile); fclose(localupedfile); } /*************************************************************************** function: read_till_blank_line this function will read from the file given and return the file read through until a blank line was encountered. This function returns the file so the next read will read the line after the blank line, not the blank line itself. ***************************************************************************/ void read_till_blank_line(infile) FILE* infile; { int blank_line = FALSE; /* is this a blank line */ char intext[DEFAULT_STRING_LENGTH]; /* the line read from the file */ char *tstr; /* a temporary char * */ while (!blank_line) /* while we have not reached a blank line */ { fgets(intext,DEFAULT_STRING_LENGTH,infile); /* get new line */ tstr = intext; /* scan whitespace */ while ((tstr[0]==' ') || (tstr[0]=='\011')) tstr++; /* if after scanning through whitespace, we are at then end of tstr, */ /* then we had a blank line */ if (tstr[0]=='\0') blank_line=TRUE; } } /*The following routine checks that each person from 1 through max_id appearing in a pedigree file occurs as an individual. If an error occurs, the program exits after printing an error*/ void check_status(max_id, ped_num) int max_id; int ped_num; { int i; boolean firstWarning, firstError; firstWarning = FALSE; firstError = FALSE; for (i = 1; i <= max_id; i++) if (status[i] != FOUND_AS_SELF) { if (!firstWarning) { if (status[i] == NOT_FOUND) { firstWarning = TRUE; gapsinIds = TRUE; fprintf(stderr, "\nWarning: Your pedigree file has missing ids in pedigree %d",ped_num); } } if (!firstError) { if (status[i] != NOT_FOUND) { firstError = TRUE; fprintf(stderr, "\nWarning: Your pedigree file has inconsistent ids in pedigree %d",ped_num); } } switch (status[i]) { case NOT_FOUND: fprintf(stderr, "\nperson number %d is missing",i); break; case FOUND_AS_PARENT: fprintf(stderr, "\nperson number %d occurs, but does not have his/her own line",i); break; case DUPLICATED: fprintf(stderr, "\nperson number %d is duplicated",i); break; default: break; } } if (firstError) { fprintf(stderr, "\nUNKNOWN will exit politely to allow you to fix the problem\n"); exit(EXIT_FAILURE); } } /************************************************************************** function: foundped this function will scan pedfile.dat and read the pedigrees in that file. It uses a linked list to save all the different pedigree's it finds. As it goes through the pedigrees, it counts them, and returns the count. The linked list is converted into an array of integers. This array is the global variable pedidx2num. It also saves the calculation in the static variable saved_ped, so there is no recomputation if the function is called more than once. ****************************************************************************/ int foundped() { static int saved_ped = 0; /* saved result */ char inputline[DEFAULT_STRING_LENGTH]; /* line read from ipedfile */ int ped_count = 0; /* pedigrees counted */ int inped; /* pedigree read */ int prev_ped = 0; /* the last pedigree read */ int_list *ped_list = NULL; /* linked list to save pedigrees */ int_list *tmp_ped_list = NULL; /* temp pointer into ped_list */ int count; /* counter for loops */ int max_id; /*maximum person id seen*/ int i; /*index*/ int person_id, pa_id, ma_id, foff_id, npa_id, nma_id; /*used to hold columns 2,3,4, 5, 6, 7 of a line*/ char *fgetsvalue; /*return value from fgets*/ /* if we ran before and saved the result - return it */ if ( saved_ped != 0 ) return(saved_ped); /* open pedfile.dat */ pedfile = fopen("pedfile.dat", "r"); if (pedfile == NULL) /* if the open failed - print error and exit */ { /* dwix err msg */ fprintf(stderr,"Error opening pedfile.dat in UNKNOWN.\n"); exit(EXIT_FAILURE); } ped_list = NULL; /* read all the pedigrees and process */ while (!feof(pedfile)) /* go through all of file */ { fgetsvalue = fgets(inputline,DEFAULT_STRING_LENGTH,pedfile); /* get a line */ /* read its ped and people */ sscanf(inputline," %d%d%d%d%d%d%d",&inped, &person_id, &pa_id, &ma_id, &foff_id, &npa_id, &nma_id); if ((NULL != fgetsvalue) && (inped!=prev_ped)) /* if a new ped number */ { if (prev_ped != 0) check_status(max_id, prev_ped); /*initialize status*/ for(i = 1; i <= maxind; i++) status[i] = NOT_FOUND; max_id = 0; /* make new node in the list */ tmp_ped_list = NULL; tmp_ped_list = (int_list *)malloc(sizeof(int_list)); if (tmp_ped_list == NULL) /* if error mallocing exit w/ error */ malloc_err("tmp_ped_list"); /* place data into new node */ tmp_ped_list->ped_number = inped; /* add ped number */ tmp_ped_list->next = ped_list; /* tack list onto end */ /* note: this makes the list */ /* backward */ ped_list = tmp_ped_list; /* make ped_list new leader */ ped_count++; /* increase ped_count */ prev_ped = inped; /* save the previos ped */ } if (NULL != fgetsvalue) { switch (status[person_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[person_id] = FOUND_AS_SELF; break; case FOUND_AS_SELF: case DUPLICATED: status[person_id] = DUPLICATED; break; default: break; } if (pa_id > 0) { switch (status[pa_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[pa_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[pa_id] = FOUND_AS_SELF; break; case DUPLICATED: status[pa_id] = DUPLICATED; break; default: break; } } if (ma_id > 0) { switch (status[ma_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[ma_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[ma_id] = FOUND_AS_SELF; break; case DUPLICATED: status[ma_id] = DUPLICATED; break; default: break; } } if (foff_id > 0) { switch (status[foff_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[foff_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[foff_id] = FOUND_AS_SELF; break; case DUPLICATED: status[foff_id] = DUPLICATED; break; default: break; } } if (npa_id > 0) { switch (status[npa_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[npa_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[npa_id] = FOUND_AS_SELF; break; case DUPLICATED: status[npa_id] = DUPLICATED; break; default: break; } } if ((nma_id > 0) && (nma_id != npa_id)) { switch (status[nma_id]) { case NOT_FOUND: case FOUND_AS_PARENT: status[nma_id] = FOUND_AS_PARENT; break; case FOUND_AS_SELF: status[nma_id] = FOUND_AS_SELF; break; case DUPLICATED: status[nma_id] = DUPLICATED; break; default: break; } } if (person_id > max_id) max_id = person_id; if (pa_id > max_id) max_id = pa_id; if (ma_id > max_id) max_id = ma_id; if (foff_id > max_id) max_id = foff_id; if (npa_id > max_id) max_id = npa_id; if (nma_id > max_id) max_id = nma_id; } } if (prev_ped != 0) check_status(max_id, prev_ped); fclose(pedfile); /* close the file */ pedfile = NULL; /* allocate space for the array to convert index to pedigree number */ pedidx2num = (int *)calloc(ped_count,sizeof(int)); if (pedidx2num==NULL) /* if error exit w/ message */ malloc_err("pedidx2num"); /* copy list data into array - go backwards */ tmp_ped_list = ped_list; for (count=ped_count-1;count >= 0; count--) { pedidx2num[count] = tmp_ped_list->ped_number; tmp_ped_list = tmp_ped_list->next; } /* delete allocated space for the linked list */ while (ped_list!=NULL) /* while members to delete */ { tmp_ped_list = ped_list; /* save this member */ ped_list = ped_list->next; /* get next member */ free(tmp_ped_list); /* delete this member */ } saved_ped = ped_count; /* save the result */ return(ped_count); /* return the result */ } /*************************************************************************** function: init_ped_loc_all this function initializes the variable ped_loc_all after it has been allocated. This function initializes all entries in the 3d array to 0 ****************************************************************************/ void init_ped_loc_all() { int a,b,c; locusvalues **templocus; templocus = thislocus; if (totalNumPed==0) { /* dwix err msg */ fprintf(stderr,"foundped() found 0 pedigree's - wrong.\n"); exit(EXIT_FAILURE); } ped_loc_all = NULL; ped_loc_all = (loc_all *)malloc(totalNumPed*sizeof(loc_all)); if (ped_loc_all==NULL) malloc_err("ped_loc_all"); ped_new_allele_count = NULL; ped_new_allele_count = (new_allele_count *) malloc(totalNumPed * sizeof(new_allele_count)); for (a=0;awhich) && (allformat == templocus[locidx]->UU.U2.format)) { /*map old alleles to new alleles preserving present ones*/ old_all = 1; new_all = 1; missed = 0; while (old_all <= templocus[locidx]->maxallele) { if (ped_loc_all[pedidx][locidx][old_all].present) { ped_loc_all[pedidx][locidx][old_all].new_allele = new_all; ped_loc_all[pedidx][locidx][new_all].old_allele = old_all; new_all++; } else missed = old_all; old_all++; } /*create new allele if not all present as new allele new_all */ if (new_all < old_all) { /*missed must have a non-zero value*/ ped_loc_all[pedidx][locidx][new_all].old_allele = missed; new_all++; } ped_new_allele_count[pedidx][locidx] = new_all - 1; } } /*The following procedure written by A.A. Schaffer to adjust the alleles of persons based on renumbering of alleles. Uses the fact that old allele -> new allele mapping is monotonic */ void allele_adjust_persons() { int pedix, locidx, personidx; thisperson *next_to_mutate; /*next person to have alleles changed*/ locusvalues **templocus; templocus = thislocus; personidx = 1; pedix = currentped; while ((next_to_mutate = person[personidx]) != NULL) { for(locidx = 0; locidx < nsystem; locidx++) { if ((binary_ == templocus[locidx]->which) && (allformat == templocus[locidx]->UU.U2.format)) { next_to_mutate->phen[locidx]->allele1 = ped_loc_all[pedix][locidx] [next_to_mutate->phen[locidx]->allele1].new_allele; next_to_mutate->phen[locidx]->allele2 = ped_loc_all[pedix][locidx] [next_to_mutate->phen[locidx]->allele2].new_allele; } } personidx++; } } static void respond() { /*Change - new*/ printf("*** Press to continue\n"); scanf("%*[^\n]"); getchar(); } static void inputerror(nerror, par1, par2) long nerror, par1, par2; { printf("Fatal error detected in input files\n"); switch (nerror) { case 0: printf("Number of loci %2ld exceeds the constant maxlocus\n", par1); break; case 1: printf("Number of loci read %2ld. Less than minimum of 1\n", par1); break; case 2: printf( "Error detected reading loci order. Locus number %2ld in position %2ld exceeds number of loci\n", par2, par1); break; case 3: printf( "Error detected reading loci order. Illegal locus number %2ld in position %2ld\n", par2, par1); break; case 4: printf( "Error detected reading loci order. Locus number repeated in positions %2ld and %2ld\n", par1, par2); break; case 5: printf( "Error detected reading locus description. Illegal locus type %2ld for locus %2ld\n", par2, par1); break; case 6: printf( "Error detected reading locus description for system %2ld. Number of alleles %2ld exceeds maxall\n", par1, par1); break; case 7: printf( "Error detected reading locus description for system %2ld. Illegal number of alleles %2ld\n", par1, par2); break; case 8: printf( "Error detected reading locus description for system %2ld.\n Number of factors %2ld exceeds maxfact or length of a long int\n", par1, par2); break; case 9: printf( "Error detected reading locus description for system %2ld. Illegal number of factors %2ld\n", par1, par2); break; case 10: printf( "Error detected reading locus description for system %2ld. Alleles not codominant\n", par1); break; case 11: printf("Error detected reading pedigree record %2ld. Illegal code for sex %2ld\n", par1, par2); break; case 12: printf( "Error detected reading pedigree record at pedigree%2ld. Maximum number of pedigree records exceeded\n", par1); break; case 13: printf( "Error detected reading pedigree record %2ld. Maximum number of individuals exceeded\n", par1); break; case 14: printf( "Error detected reading pedigree record %2ld. Illegal binary factor code %2ld\n", par1, par2); break; case 15: printf( "Error detected reading pedigree record %2ld. No allelic pair for genotype\n", par1); break; case 16: printf( "Error detected reading pedigree record %2ld. Allele number %2ld exceeds maxall\n", par1, par2); break; case 17: printf( "Error detected reading pedigree record %2ld. Illegal allele number %2ld\n", par1, par2); break; case 18: printf("Number of systems after factorization (%3ld) exceeds maxsystem\n", par1); break; case 19: printf("Number of systems after factorization (%3ld) less than minimum of 1\n", par1); break; case 20: printf("Number of recombination types (%3ld) exceeds maxrectype\n", par1); break; case 21: printf("Number of recombination types (%3ld) less than minimum of 1\n", par1); break; case 22: printf( "End of file detected in tempdat by procedure readthg before all data found\n"); break; case 23: printf( "Error detected reading iterated locus in datafile. Value (%3ld) greater than nlocus\n", par1); break; case 24: printf( "Error detected reading iterated locus in datafile. Illegal value (%3ld)\n", par1); break; case 25: printf("Number of iterated parameters greater then maxn\n"); break; case 26: printf( "Error detected reading pedigree record %2ld. Liability class (%2ld) exceeds nclass\n", par1, par2); break; case 27: printf( "Error detected reading pedigree record %2ld. Illegal liability class (%2ld)\n", par1, par2); break; case 28: printf( "Error detected reading locus description for system%2ld. Liability classes (%3ld) exceed maxliab\n", par1, par2); break; case 29: printf( "Error detected reading locus description for system%2ld. Illegal number of liability classes (%3ld)\n", par1, par2); break; case 30: printf( "Error detected reading locus description for system%2ld. Penetrance out of range\n", par1); break; case 31: printf( "Error detected reading locus description for system%2ld. Number of traits (%3ld) exceeds maxtrait\n", par1, par2); break; case 32: printf( "Error detected reading locus description for system%2ld. Number of traits out of range (%3ld)\n", par1, par2); break; case 33: printf( "Error detected reading locus description for system%2ld. Variance must be positive\n", par1); break; case 34: printf( "Error detected reading locus description for system%2ld. Variance multiplier must be positive\n", par1); break; case 35: printf( "Error detected reading locus description for system%2ld. Risk allele %3ld) exceeds nallele\n", par1, par2); break; case 36: printf( "Error detected reading locus description for system%2ld. Illegal risk allele (%3ld)\n", par1, par2); break; case 37: printf("Error detected reading datafile. Risk locus %3ld) exceeds nlocus\n", par2); break; case 38: printf("Error detected reading datafile. Illegal value for risk locus %3ld)\n", par2); break; case 39: printf("Error detected reading datafile. Mutation locus %3ld) exceeds nlocus\n", par2); break; case 40: printf( "Error detected reading datafile. Illegal value for mutation locus %3ld)\n", par2); break; case 41: printf( "Error detected reading datafile. Linkage disequilibrium is not allowed with this program\n"); break; case 42: printf("Locus %5ld in lod score list exceeds nlocus %5ld\n", par1, par2); break; case 43: printf("Illegal locus number %5ld in lod score list\n", par1); break; case 44: printf("Error detected reading pedigree record %2ld. One 0 allele\n", par1); break; } errorOccurred = TRUE; respond(); /*changed*/ } static void inputwarning(nwarning, par1, par2) long nwarning, par1, par2; { printf("Warning number from procedure inputdata\n"); switch (nwarning) { case 0: printf("Illegal sex difference parameter %2ld Parameter should be 0, 1, or 2\n", par1); break; case 1: printf("Illegal interference parameter %2ld Lack of interference assumed\n", par1); break; case 2: printf( "Illegal sex difference parameter %2ld Parameter must be 0 with sex-linked data\n", par1); break; case 3: printf( "Non-standard affection status%4ld interpreted as normal in pedigree record%5ld\n", par2, par1); break; } respond(); /*changed*/ } #if LOOPSPEED /* writes the old speedfile.dat for compatibility. Written by Dylan. */ static void writespeed_old() { int i, j, a, b; thisperson *WITH; int allele_count; /* for compatibility, when loops exist, speedfile.dat does not eliminate anything */ if (loop1 != NULL || loop2 != NULL) { for (i = 1; i <= totperson; i++) { WITH = person[i]; if (WITH->unknown && WITH->foff != NULL) { fprintf(speedfile, "id%7ld\n", WITH->nseq); for (j = 0; j < nsystem; j++) { allele_count = thislocus[j]->nallele; for (a = 0; a < allele_count; a++) { for (b = 0; b < allele_count; b++) { fprintf(speedfile, "%3d%3d%3d\n", j + 1, a + 1, b + 1); } } } } } return; } /* else no loops */ for (i = 1; i <= totperson; i++) { WITH = person[i]; if (WITH->unknown && WITH->foff != NULL) { fprintf(speedfile, "id%7ld\n", WITH->nseq); /* if male and sexlinked genotype is stored in second strand */ if (sexlink && WITH->male) { for (j = 0; j < nsystem; j++) { allele_count = thislocus[j]->nallele; for (b = 0; b < allele_count; b++) { if ( unknown_poss[i][j][0][genenumber[j][0][b] - 1]) { fprintf(speedfile, "%3d%3d%3d\n", j + 1, 1, b + 1); } } } } /* if not sexlinked and male, need both strands to determine genotype */ else { for (j = 0; j < nsystem; j++) { allele_count = thislocus[j]->nallele; for (a = 0; a < allele_count; a++) { for (b = 0; b < allele_count; b++) { if ( unknown_poss[i][j][0][genenumber[j][a][b] - 1] ) { fprintf(speedfile, "%3d%3d%3d\n", j + 1, a + 1, b + 1); } } } } } } } } /*writespeed_old*/ /* writes the old speedfile.dat for compatibility. Written by Dylan. */ static void writespeed_new() { int i, j, a, b; int loopcount; boolean skip; thisperson *WITH; int allele_count; /* for compatibility, when loops exist, speedfile.dat does not eliminate anything */ fprintf(speedfile, "%d\n",ALLELE_SPEED_CONSTANT); if (loop1 != NULL || loop2 != NULL) { for (i = 1; i <= totperson; i++) { skip = FALSE; WITH = person[i]; /*skip over founder loop breakers*/ for(loopcount = 0; loopcount < num_loops; loopcount++) if (WITH == looppers[loopcount][0]) skip = TRUE; if (WITH->unknown && WITH->foff != NULL && !skip) { fprintf(speedfile, "id%7ld\n", WITH->nseq); /* if male and sexlinked genotype is stored in second strand */ if (sexlink && WITH->male) { for (j = 0; j < nsystem; j++) { if ((binary_ == thislocus[j]->which) && (allformat == thislocus[j]->UU.U2.format)) allele_count = ped_new_allele_count[currentped][j]; else allele_count = thislocus[j]->nallele; for (b = 0; b < allele_count; b++) { fprintf(speedfile, "%3d%3d%3d\n", j + 1, 1, b + 1); } } } else { for (j = 0; j < nsystem; j++) { if ((binary_ == thislocus[j]->which) && (allformat == thislocus[j]->UU.U2.format)) allele_count = ped_new_allele_count[currentped][j]; else allele_count = thislocus[j]->nallele; for (a = 0; a < allele_count; a++) { for (b = 0; b < allele_count; b++) { fprintf(speedfile, "%3d%3d%3d\n", j + 1, a + 1, b + 1); } } } } } } return; } /* else no loops */ for (i = 1; i <= totperson; i++) { WITH = person[i]; if (WITH->unknown && WITH->foff != NULL) { fprintf(speedfile, "id%7ld\n", WITH->nseq); /* if male and sexlinked genotype is stored in second strand */ if (sexlink && WITH->male) { for (j = 0; j < nsystem; j++) { if ((binary_ == thislocus[j]->which) && (allformat == thislocus[j]->UU.U2.format)) allele_count = ped_new_allele_count[currentped][j]; else allele_count = thislocus[j]->nallele; for (b = 0; b < allele_count; b++) { if ( unknown_poss[i][j][0][genenumber[j][0][b] - 1]) { fprintf(speedfile, "%3d%3d%3d\n", j + 1, 1, b + 1); } } } } /* if not sexlinked and male, need both strands to determine genotype */ else { for (j = 0; j < nsystem; j++) { if ((binary_ == thislocus[j]->which) && (allformat == thislocus[j]->UU.U2.format)) allele_count = ped_new_allele_count[currentped][j]; else allele_count = thislocus[j]->nallele; for (a = 0; a < allele_count; a++) { for (b = 0; b < allele_count; b++) { if ( unknown_poss[i][j][0][genenumber[j][a][b] - 1] ) { fprintf(speedfile, "%3d%3d%3d\n", j + 1, a + 1, b + 1); } } } } } } } } /*writespeed_new*/ static void write_loopfile_old(ped) int ped; { int ind, locus, loop, vect, geno; /* iterators */ int geno_count; fprintf(loopfile, "Pedigree: %d\n", ped); fprintf(loopfile, "fewer_vects_size: %d\n", fewer_vects_size); fprintf(loopfile, "num_loops_considered: %d\n", num_loops_considered); /* print num_loop_vectors */ fprintf(loopfile, "num_loop_vectors:\n"); for (locus = 0; locus < nsystem; locus++) { fprintf(loopfile, "\t%d : %d\n", locus, num_loop_vectors[locus]); } /* print loop_vectors */ fprintf(loopfile, "loop_vectors:\n"); for (locus = 0; locus < nsystem; locus++) { fprintf(loopfile, "\tL : %d\n", locus); for (vect = 0; vect < num_loop_vectors[locus]; vect++) { fprintf(loopfile, "\t\t%d :", vect); for (loop = 0; loop < num_loops_considered; loop++) { fprintf(loopfile, " %d", loop_vectors[locus][vect][loop]); } fprintf(loopfile, "\n"); } } /* print unknown_poss */ fprintf(loopfile, "unknown_poss:\n"); for (ind = 1; ind <= totperson; ind++) { /* DYLAN -- second condition causes us to lose accuracy */ if ((person[ind]->unknown) && (person[ind]->foff != NULL)) { fprintf(loopfile, "id: %ld\n", person[ind]->nseq); for (locus = 0; locus < nsystem; locus++) { fprintf(loopfile, "\tL: %d\n", locus); if (!(person[ind]->thisunknown[locus])) fprintf(loopfile, "-\n"); /* to facilitate reading it back in */ else fprintf(loopfile, "+\n"); /* to facilitate reading it back in */ for (vect = 0; vect < num_loop_vectors[locus]; vect++) { fprintf(loopfile, "\t\t%d :", vect); if (sexlink && (person[ind]->male)) geno_count = thislocus[locus]->mgeno; else geno_count = thislocus[locus]->fgeno; for (geno = 0; geno < geno_count; geno++) { if (unknown_poss[ind][locus][vect][geno]) { fprintf(loopfile, " %d", geno); } } fprintf(loopfile, "\n"); } } } } } /* write_loopfile_old */ static void write_loopfile_new(ped) int ped; { int ind, locus, loop, vect, geno; /* iterators */ int geno_count; boolean skip; /*test for skipping founder loop breakers*/ int loopcount; /*index over loops*/ fprintf(loopfile, "Pedigree: %d\n", ped); fprintf(loopfile, "fewer_vects_size: %d\n", fewer_vects_size); fprintf(loopfile, "num_loops_considered: %d\n", num_loops_considered); /* print num_loop_vectors */ fprintf(loopfile, "num_loop_vectors:\n"); for (locus = 0; locus < nsystem; locus++) { fprintf(loopfile, "\t%d : %d\n", locus, num_loop_vectors[locus]); } /* print loop_vectors */ fprintf(loopfile, "loop_vectors:\n"); for (locus = 0; locus < nsystem; locus++) { fprintf(loopfile, "\tL : %d\n", locus); for (vect = 0; vect < num_loop_vectors[locus]; vect++) { fprintf(loopfile, "\t\t%d :", vect); for (loop = 0; loop < num_loops_considered; loop++) { fprintf(loopfile, " %d", loop_vectors[locus][vect][loop]); } fprintf(loopfile, "\n"); } } /* print unknown_poss */ fprintf(loopfile, "unknown_poss:\n"); for (ind = 1; ind <= totperson; ind++) { skip = FALSE; /*skip over founder loop breakers*/ for(loopcount = 0; loopcount < num_loops; loopcount++) if (person[ind] == looppers[loopcount][0]) skip = TRUE; /* DYLAN -- second condition causes us to lose accuracy */ if ((person[ind]->unknown) && (person[ind]->foff != NULL) && (!skip)) { fprintf(loopfile, "id: %ld\n", person[ind]->nseq); for (locus = 0; locus < nsystem; locus++) { fprintf(loopfile, "\tL: %d\n", locus); if (!(person[ind]->thisunknown[locus])) fprintf(loopfile, "-\n"); /* to facilitate reading it back in */ else fprintf(loopfile, "+\n"); /* to facilitate reading it back in */ for (vect = 0; vect < num_loop_vectors[locus]; vect++) { fprintf(loopfile, "\t\t%d :", vect); if ((binary_ == thislocus[locus]->which) && (allformat == thislocus[locus]->UU.U2.format)) if (sexlink && (person[ind]->male)) geno_count = ped_new_allele_count[currentped][locus]; else geno_count = ped_new_allele_count[currentped][locus] * ( 1 + ped_new_allele_count[currentped][locus])/2; else if (sexlink && (person[ind]->male)) geno_count = thislocus[locus]->mgeno; else geno_count = thislocus[locus]->fgeno; for (geno = 0; geno < geno_count; geno++) { if (unknown_poss[ind][locus][vect][geno]) { fprintf(loopfile, " %d", geno); } } fprintf(loopfile, "\n"); } } } } } /* write_loopfile_new */ #else static void writespeed_old() { long i, j, a_, b_; thisperson *WITH; information *WITH1; int allele_count; for (i = 1; i <= totperson; i++) { WITH = person[i]; if (WITH->unknown && WITH->foff != NULL) { WITH1 = WITH->store; fprintf(speedfile, "id%7ld\n", WITH->nseq); for (j = 1; j <= nsystem; j++) { allele_count = thislocus[j - 1]->nallele; for (a_ = 1; a_ <= allele_count; a_++) { for (b_ = 1; b_ <= allele_count; b_++) { if (WITH1->possible[j - 1][a_ - 1][b_ - 1]) fprintf(speedfile, "%3ld%3ld%3ld\n", j, a_, b_); } } } } } } /*writespeed_old*/ static void writespeed_new() { long i, j, a_, b_; thisperson *WITH; information *WITH1; int allele_count; fprintf(speedfile, "%d\n",ALLELE_SPEED_CONSTANT); for (i = 1; i <= totperson; i++) { WITH = person[i]; if (WITH->unknown && WITH->foff != NULL) { WITH1 = WITH->store; fprintf(speedfile, "id%7ld\n", WITH->nseq); for (j = 1; j <= nsystem; j++) { if ((binary_ == thislocus[j - 1]->which) && (allformat == thislocus[j - 1]->UU.U2.format)) allele_count = ped_new_allele_count[currentped][j - 1]; else allele_count = thislocus[j - 1]->nallele; for (a_ = 1; a_ <= allele_count; a_++) { for (b_ = 1; b_ <= allele_count; b_++) { if (WITH1->possible[j - 1][a_ - 1][b_ - 1]) fprintf(speedfile, "%3ld%3ld%3ld\n", j, a_, b_); } } } } } } /*writespeed_new*/ #endif static void writeped_old() { long i, j, k, a_, b_; thisperson *WITH; phenotype *WITH1; locusvalues *WITH2; long FORLIM2; for (i = 1; i <= totperson; i++) { WITH = person[i]; fprintf(ipedfile, "%7ld%5ld%5ld%5ld%5ld%5ld", WITH->oldped, WITH->id, WITH->paid, WITH->maid, WITH->offid, WITH->npaid); fprintf(ipedfile, "%5ld%2ld%3ld ", WITH->nmaid, WITH->sex, WITH->profield); for (j = 1; j <= nsystem; j++) { WITH1 = WITH->phen[j - 1]; WITH2 = thislocus[j - 1]; if (WITH2->which == binary_) { if (WITH2->UU.U2.format == binformat) { FORLIM2 = WITH2->UU.U2.nfactor; for (k = 1; k <= FORLIM2; k++) { if ((unsigned long)k < (sizeof(long) * 8) && ((1L << k) & WITH1->phenf) != 0) fprintf(ipedfile, " 1"); else fprintf(ipedfile, " 0"); } } else { a_ = 0; b_ = 0; a_ = WITH1->allele1; b_ = WITH1->allele2; fprintf(ipedfile, "%3ld%3ld", a_, b_); } } else if (WITH2->which == quantitative) { if (!sexlink || !WITH->male) { FORLIM2 = WITH2->UU.ntrait; for (k = 0; k < FORLIM2; k++) fprintf(ipedfile, " %9.4f", WITH1->x[k]); } else { FORLIM2 = WITH2->UU.ntrait; for (k = 1; k <= FORLIM2; k++) fprintf(ipedfile, " %9ld", WITH1->aff); } } else { fprintf(ipedfile, "%2ld", WITH1->aff); if (WITH2->UU.U0.nclass != 1) fprintf(ipedfile, "%4ld", WITH1->liability); } if (j != nsystem) putc(' ', ipedfile); } putc('\n', ipedfile); } } /*writeped_old*/ static void writeped_new() { long i, j, k, a_, b_; thisperson *WITH; phenotype *WITH1; locusvalues *WITH2; long FORLIM2; for (i = 1; i <= totperson; i++) { WITH = person[i]; fprintf(ipedfile, "%7ld%5ld%5ld%5ld%5ld%5ld", WITH->oldped, WITH->id, WITH->paid, WITH->maid, WITH->offid, WITH->npaid); fprintf(ipedfile, "%5ld%2ld%3ld ", WITH->nmaid, WITH->sex, WITH->profield); for (j = 1; j <= nsystem; j++) { WITH1 = WITH->phen[j - 1]; WITH2 = thislocus[j - 1]; if (WITH2->which == binary_) { if (WITH2->UU.U2.format == binformat) { FORLIM2 = WITH2->UU.U2.nfactor; for (k = 1; k <= FORLIM2; k++) { if ((unsigned long)k < (sizeof(long) * 8) && ((1L << k) & WITH1->phenf) != 0) fprintf(ipedfile, " 1"); else fprintf(ipedfile, " 0"); } } else { a_ = 0; b_ = 0; a_ = ped_loc_all[currentped][j - 1][WITH1->allele1].old_allele; b_ = ped_loc_all[currentped][j - 1][WITH1->allele2].old_allele; fprintf(ipedfile, "%3ld%3ld", a_, b_); } } else if (WITH2->which == quantitative) { if (!sexlink || !WITH->male) { FORLIM2 = WITH2->UU.ntrait; for (k = 0; k < FORLIM2; k++) fprintf(ipedfile, " %9.4f", WITH1->x[k]); } else { FORLIM2 = WITH2->UU.ntrait; for (k = 1; k <= FORLIM2; k++) fprintf(ipedfile, " %9ld", WITH1->aff); } } else { fprintf(ipedfile, "%2ld", WITH1->aff); if (WITH2->UU.U0.nclass != 1) fprintf(ipedfile, "%4ld", WITH1->liability); } if (j != nsystem) putc(' ', ipedfile); } putc('\n', ipedfile); } } /*writeped_new*/ /* This procedure infers genotypes that can be known and resets the 'unknown' flags. Modified by Dylan in late 1994 to use the data structure 'unknown_poss' rather than the 'possible' field of each person. */ static void infer_old() { long i, j, k, l, kposs, lposs, count, pacount, macount; boolean someknown; thisperson *WITH; information *WITH1; locusvalues *WITH2; long FORLIM2, FORLIM3; int loop_vect; int skip_locus[maxlocus]; /*Replace by homozygotes if all unknown in a pedigree*/ if (!makehomozygous) /*change - added*/ return; for (j = 0; j < nsystem; j++) { WITH2 = thislocus[j]; skip_locus[j] = 0; if ((WITH2->which == binary_) && (WITH2->UU.U2.format == allformat)) { /*change - 'format=3' added*/ someknown = FALSE; for (i = 1; i <= totperson; i++) { if (person[i]->phen[j]->phenf != 0) someknown = TRUE; } if (!someknown) { skip_locus[j] = 1; if (WITH2->onefreq > 0.0) { for (i = 1; i <= totperson; i++) { person[i]->phen[j]->phenf = 1; person[i]->phen[j]->allele1 = 1; person[i]->phen[j]->allele2 = 1; } } } } } for (i = 1; i <= totperson; i++) { if (person[i]->unknown) { WITH = person[i]; #if !LOOPSPEED WITH1 = WITH->store; #endif for (j = 0; j < nsystem; j++) { if ((thislocus[j]->which == binary_) && (!skip_locus[j])) { if (WITH->phen[j]->phenf == 0) { WITH2 = thislocus[j]; count = 0; #if LOOPSPEED /* need to deal with case when only one strand carried genotype */ if (sexlink && WITH->male) { for (l = 1; l <= thislocus[j]->nallele; l++) { for (loop_vect = 0; loop_vect < num_loop_vectors[j]; loop_vect++) { if (unknown_poss[i][j][loop_vect][genenumber[j][0][l-1]-1]){ kposs = 1; lposs = l; count++; } } } } else { #endif FORLIM2 = WITH2->nallele; for (k = 1; k <= FORLIM2; k++) { FORLIM3 = WITH2->nallele; for (l = k; l <= FORLIM3; l++) { #if LOOPSPEED /* check all loopbreaker vectors */ for (loop_vect = 0; loop_vect < num_loop_vectors[j]; loop_vect++) { if (unknown_poss[i][j][loop_vect][genenumber[j][k-1][l-1] -1]){ #else if (WITH1->possible[j][k - 1][l - 1]) { #endif kposs = k; lposs = l; count++; } } } #if LOOPSPEED /* extra { match "} else {" and for statement */ } } #endif if (count == 1) { if (sexlink && WITH->male) { if (allformat == thislocus[j]->UU.U2.format) { if(lposs) WITH->phen[j]->phenf = 1; else WITH->phen[j]->phenf = 0; WITH->phen[j]->allele1 = (WITH->phen[j]->allele2 = lposs); } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[lposs - 1]; } else { if (allformat == thislocus[j]->UU.U2.format) { WITH->phen[j]->phenf = (kposs || lposs); WITH->phen[j]->allele1 = kposs; WITH->phen[j]->allele2 = lposs; } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[kposs - 1] | WITH2->UU.U2.allele[lposs - 1]; } } } } } /* for each locus */ count = 0; for (j = 0; j < nsystem; j++) { if (thislocus[j]->which != binary_) count++; else if (WITH->phen[j]->phenf == 0) count++; } WITH->unknown = (count != 0); } } /*Infer children when parents are homozygotes*/ for (i = 1; i <= totperson; i++) { if (person[i]->foff == NULL) { WITH = person[i]; for (j = 0; j < nsystem; j++) { WITH2 = thislocus[j]; if (WITH->phen[j]->which == binary_) { if (WITH->phen[j]->phenf == 0) { if (WITH->pa != NULL) { pacount = 0; macount = 0; if(binformat == WITH2->UU.U2.format) { FORLIM2 = thislocus[j]->nallele; for (k = 1; k <= FORLIM2; k++) { if ((WITH2->UU.U2.allele[k - 1] & (~WITH->pa->phen[j]->phenf)) == 0) { kposs = k; pacount++; } } FORLIM2 = thislocus[j]->nallele; for (l = 1; l <= FORLIM2; l++) { if ((WITH2->UU.U2.allele[l - 1] & (~WITH->ma->phen[j]->phenf)) == 0) { lposs = l; macount++; } } } else { /*numbered alleles*/ if (WITH->pa->phen[j]->allele1 > 0) { kposs = WITH->pa->phen[j]->allele1; pacount++; } if ((WITH->pa->phen[j]->allele1 != WITH->pa->phen[j]->allele2) && (WITH->pa->phen[j]->allele2 > 0)) { kposs = WITH->pa->phen[j]->allele2; pacount++; } if (WITH->ma->phen[j]->allele1 > 0) { lposs = WITH->ma->phen[j]->allele1; macount++; } if ((WITH->ma->phen[j]->allele1 != WITH->ma->phen[j]->allele2) && (WITH->ma->phen[j]->allele2 > 0)) { lposs = WITH->ma->phen[j]->allele2; macount++; } } if (macount == 1 && pacount == 1 && !(WITH->male && sexlink)) if(allformat == WITH2->UU.U2.format) { if (kposs <=lposs) { WITH->phen[j]->allele1 = kposs; WITH->phen[j]->allele2 = lposs; } else { WITH->phen[j]->allele1 = lposs; WITH->phen[j]->allele2 = kposs; } WITH->phen[j]->phenf = ((kposs > 0) || (lposs > 0)); } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[kposs - 1] | WITH2->UU.U2.allele[lposs - 1]; else if (macount == 1 && WITH->male && sexlink) if (allformat == WITH2->UU.U2.format) { WITH->phen[j]->allele1 = lposs; WITH->phen[j]->phenf = (lposs > 0); } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[lposs - 1]; } } } } } } } /*infer_old*/ static void infer_new() { long i, j, k, l, kposs, lposs, count, pacount, macount; boolean someknown; thisperson *WITH; information *WITH1; locusvalues *WITH2; long FORLIM2, FORLIM3; int loop_vect; int skip_locus[maxlocus]; /*Replace by homozygotes if all unknown in a pedigree*/ if (!makehomozygous) /*change - added*/ return; for (j = 0; j < nsystem; j++) { WITH2 = thislocus[j]; skip_locus[j] = 0; if ((WITH2->which == binary_) && (WITH2->UU.U2.format == allformat)) { /*change - 'format=3' added*/ someknown = FALSE; for (i = 1; i <= totperson; i++) { if (person[i]->phen[j]->phenf != 0) someknown = TRUE; } if (!someknown) { skip_locus[j] = 1; if (WITH2->onefreq > 0.0) { for (i = 1; i <= totperson; i++) { person[i]->phen[j]->phenf = 1; person[i]->phen[j]->allele1 = 1; person[i]->phen[j]->allele2 = 1; } ped_loc_all[currentped][j][1].old_allele = 1; } } } } for (i = 1; i <= totperson; i++) { if (person[i]->unknown) { WITH = person[i]; #if !LOOPSPEED WITH1 = WITH->store; #endif for (j = 0; j < nsystem; j++) { if ((thislocus[j]->which == binary_) && (!skip_locus[j])) { if (WITH->phen[j]->phenf == 0) { WITH2 = thislocus[j]; count = 0; #if LOOPSPEED /* need to deal with case when only one strand carried genotype */ if (sexlink && WITH->male) { for (l = 1; l <= thislocus[j]->nallele; l++) { for (loop_vect = 0; loop_vect < num_loop_vectors[j]; loop_vect++) { if (unknown_poss[i][j][loop_vect][genenumber[j][0][l-1]-1]){ kposs = 1; lposs = l; count++; } } } } else { #endif FORLIM2 = WITH2->nallele; for (k = 1; k <= FORLIM2; k++) { FORLIM3 = WITH2->nallele; for (l = k; l <= FORLIM3; l++) { #if LOOPSPEED /* check all loopbreaker vectors */ for (loop_vect = 0; loop_vect < num_loop_vectors[j]; loop_vect++) { if (unknown_poss[i][j][loop_vect][genenumber[j][k-1][l-1] -1]){ #else if (WITH1->possible[j][k - 1][l - 1]) { #endif kposs = k; lposs = l; count++; } } } #if LOOPSPEED /* extra { match "} else {" and for statement */ } } #endif if (count == 1) { if (sexlink && WITH->male) { if (allformat == thislocus[j]->UU.U2.format) { if (ped_loc_all[currentped][currentlocus][lposs].old_allele) WITH->phen[j]->phenf = 1; else WITH->phen[j]->phenf = 0; WITH->phen[j]->allele1 = (WITH->phen[j]->allele2 = lposs); } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[lposs - 1]; } else { if (allformat == thislocus[j]->UU.U2.format) { WITH->phen[j]->phenf = (ped_loc_all[currentped][currentlocus][kposs].old_allele || ped_loc_all[currentped][currentlocus][lposs].old_allele); WITH->phen[j]->allele1 = kposs; WITH->phen[j]->allele2 = lposs; } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[kposs - 1] | WITH2->UU.U2.allele[lposs - 1]; } } } } } /* for each locus */ count = 0; for (j = 0; j < nsystem; j++) { if (thislocus[j]->which != binary_) count++; else if (WITH->phen[j]->phenf == 0) count++; } WITH->unknown = (count != 0); } } /*Infer children when parents are homozygotes*/ for (i = 1; i <= totperson; i++) { if (person[i]->foff == NULL) { WITH = person[i]; for (j = 0; j < nsystem; j++) { WITH2 = thislocus[j]; if (WITH->phen[j]->which == binary_) { if (WITH->phen[j]->phenf == 0) { if (WITH->pa != NULL) { pacount = 0; macount = 0; if(binformat == WITH2->UU.U2.format) { FORLIM2 = thislocus[j]->nallele; for (k = 1; k <= FORLIM2; k++) { if ((WITH2->UU.U2.allele[k - 1] & (~WITH->pa->phen[j]->phenf)) == 0) { kposs = k; pacount++; } } FORLIM2 = thislocus[j]->nallele; for (l = 1; l <= FORLIM2; l++) { if ((WITH2->UU.U2.allele[l - 1] & (~WITH->ma->phen[j]->phenf)) == 0) { lposs = l; macount++; } } } else { /*numbered alleles*/ if (WITH->pa->phen[j]->allele1 > 0) { kposs = WITH->pa->phen[j]->allele1; pacount++; } if ((WITH->pa->phen[j]->allele1 != WITH->pa->phen[j]->allele2) && (WITH->pa->phen[j]->allele2 > 0)) { kposs = WITH->pa->phen[j]->allele2; pacount++; } if (WITH->ma->phen[j]->allele1 > 0) { lposs = WITH->ma->phen[j]->allele1; macount++; } if ((WITH->ma->phen[j]->allele1 != WITH->ma->phen[j]->allele2) && (WITH->ma->phen[j]->allele2 > 0)) { lposs = WITH->ma->phen[j]->allele2; macount++; } } if (macount == 1 && pacount == 1 && !(WITH->male && sexlink)) if(allformat == WITH2->UU.U2.format) { if (kposs <=lposs) { WITH->phen[j]->allele1 = kposs; WITH->phen[j]->allele2 = lposs; } else { WITH->phen[j]->allele1 = lposs; WITH->phen[j]->allele2 = kposs; } WITH->phen[j]->phenf = ((kposs > 0) || (lposs > 0)); } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[kposs - 1] | WITH2->UU.U2.allele[lposs - 1]; else if (macount == 1 && WITH->male && sexlink) if (allformat == WITH2->UU.U2.format) { WITH->phen[j]->allele1 = lposs; WITH->phen[j]->phenf = (lposs > 0); } else WITH->phen[j]->phenf = WITH2->UU.U2.allele[lposs - 1]; } } } } } } } /*infer_new*/ static void getunknown_old() { long i, j, n, ahap, bhap; thisperson *WITH; information *WITH1; locusvalues *WITH2; for (i = 1; i <= totperson; i++) { person[i]->unknown = FALSE; for (j = 0; j < nsystem; j++) person[i]->thisunknown[j] = FALSE; } /* Next bit modified in late 1994 by Dylan. The if-then-else statements used to be nested as if no { were used. Thus unknown only got set TRUE when the locus was binary. */ for (i = 1; i <= totperson; i++) { WITH = person[i]; for (j = 0; j < nsystem; j++) { if (thislocus[j]->which == binary_) { if (WITH->phen[j]->phenf == 0) WITH->thisunknown[j] = TRUE; } else if (thislocus[j]->which == quantitative) { if (WITH->phen[j]->x[0] == missval) WITH->thisunknown[j] = TRUE; } else if (WITH->phen[j]->aff == missaff) { WITH->thisunknown[j] = TRUE; } if (WITH->thisunknown[j]) { WITH->unknown = TRUE; } } } #if !LOOPSPEED for (i = 1; i <= totperson; i++) { WITH = person[i]; if (WITH->unknown) { WITH->store = (information *)Malloc(sizeof(information)); /* malloc check added by Dylan */ if (WITH->store == NULL) malloc_err("store field"); WITH1 = WITH->store; for (n = 0; n < nsystem; n++) { WITH2 = thislocus[n]; for (ahap = 0; ahap < WITH2->nallele; ahap++) { for (bhap = 0; bhap < WITH2->nallele; bhap++) WITH1->possible[n][ahap][bhap] = TRUE; } } } } #endif } /*getunknown_old*/ static void getunknown_new() { long i, j, n, ahap, bhap; thisperson *WITH; information *WITH1; locusvalues *WITH2; long FORLIM2; for (i = 1; i <= totperson; i++) { person[i]->unknown = FALSE; for (j = 0; j < nsystem; j++) person[i]->thisunknown[j] = FALSE; } /* Next bit modified in late 1994 by Dylan. The if-then-else statements used to be nested as if no { were used. Thus unknown only got set TRUE when the locus was binary. */ for (i = 1; i <= totperson; i++) { WITH = person[i]; for (j = 0; j < nsystem; j++) { if (thislocus[j]->which == binary_) { if (WITH->phen[j]->phenf == 0) WITH->thisunknown[j] = TRUE; } else if (thislocus[j]->which == quantitative) { if (WITH->phen[j]->x[0] == missval) WITH->thisunknown[j] = TRUE; } else if (WITH->phen[j]->aff == missaff) { WITH->thisunknown[j] = TRUE; } if (WITH->thisunknown[j]) { WITH->unknown = TRUE; } } } #if !LOOPSPEED for (i = 1; i <= totperson; i++) { WITH = person[i]; if (WITH->unknown) { WITH->store = (information *)Malloc(sizeof(information)); /* malloc check added by Dylan */ if (WITH->store == NULL) malloc_err("store field"); WITH1 = WITH->store; for (n = 0; n < nsystem; n++) { WITH2 = thislocus[n]; if ((binary_ == thislocus[n]->which) && (allformat == thislocus[n]->UU.U2.format)) FORLIM2 = ped_new_allele_count[currentped][n]; else FORLIM2 = WITH2->nallele; for (ahap = 0; ahap < FORLIM2; ahap++) { for (bhap = 0; bhap < FORLIM2; bhap++) WITH1->possible[n][ahap][bhap] = TRUE; } } } } #endif } /*getunknown_new*/ static void getlocation(thislocus) locusvalues *thislocus; { long ahap, bhap, here, FORLIM, FORLIM1; here = 0; FORLIM = thislocus->nallele; for (ahap = 1; ahap <= FORLIM; ahap++) { FORLIM1 = thislocus->nallele; for (bhap = ahap; bhap <= FORLIM1; bhap++) { here++; #if LOOPSPEED /* WARNING!!! If you change the way the genotypes are computed from the alleles you need to make changes to procedures: translate_loop_vector() fac_() aff_() facmale_() affmale_() quanmale_() */ /* DYLAN -- maybe saving seghaps instead would have been better */ genenumber[whichsys - 1][ahap - 1][bhap - 1] = here; genenumber[whichsys - 1][bhap - 1][ahap - 1] = here; #else genenumber[ahap - 1][bhap - 1] = here; genenumber[bhap - 1][ahap - 1] = here; #endif seghap[here - 1][0] = ahap; seghap[here - 1][1] = bhap; } } } /*getlocation*/ /* Local variables for getphenotype: */ struct LOC_getphenotype { thisperson **p; } ; void readbin(phen, ourlocus, LINK) phenotype **phen; locusvalues *ourlocus; struct LOC_getphenotype *LINK; { long i, j; phenotype *WITH1; long FORLIM; WITH1 = *phen; WITH1->which = binary_; WITH1->phenf = 0; FORLIM = ourlocus->UU.U2.nfactor; for (i = 1; i <= FORLIM; i++) { fscanf(pedfile, "%ld", &j); if (j != 0 && j != 1) inputerror(14L, (*LINK->p)->id, j); if (j == 1) WITH1->phenf = ((long)WITH1->phenf) | (1L << ((int)i)); } } void readnumber(phen, LINK, version) phenotype **phen; struct LOC_getphenotype *LINK; int version; { long j, k; phenotype *WITH; WITH = *phen; WITH->which = binary_; WITH->phenf = 0; fscanf(pedfile, "%ld%ld", &j, &k); if (j > maxall) inputerror(16L, (*LINK->p)->id, j); if ((j < 0) || (j > thislocus[currentlocus]->maxallele)) inputerror(17L, (*LINK->p)->id, j); if (k > maxall) inputerror(16L, (*LINK->p)->id, k); if ((k < 0) || (k > thislocus[currentlocus]->maxallele )) inputerror(17L, (*LINK->p)->id, k); if ((j == 0 || k == 0) && j != k) { inputerror(44L, (*LINK->p)->id, j); return; } if (j != 0) WITH->phenf = 1; if (k != 0) WITH->phenf = 1; if (NEW == version) { ped_loc_all[currentped][currentlocus][j].present = TRUE; ped_loc_all[currentped][currentlocus][k].present = TRUE; } if (j <= k) { WITH->allele1 = j; WITH->allele2 = k; } else { WITH->allele1 = k; WITH->allele2 = j; } } void readaff(phen, thislocus, LINK) phenotype **phen; locusvalues *thislocus; struct LOC_getphenotype *LINK; { long thisval; phenotype *WITH; WITH = *phen; WITH->which = affection; fscanf(pedfile, "%ld", &thisval); if (thisval == missaff) WITH->aff = 0; else { if (thisval == affval) WITH->aff = 2; else { if (thisval != 1) inputwarning(3L, (*LINK->p)->id, thisval); WITH->aff = 1; } } if (thislocus->UU.U0.nclass == 1) WITH->liability = 1; else fscanf(pedfile, "%ld", &WITH->liability); if (WITH->liability > thislocus->UU.U0.nclass) inputerror(26L, (*LINK->p)->id, WITH->liability); if (WITH->liability <= 0) inputerror(27L, (*LINK->p)->id, WITH->liability); } void readquan(phen, thislocus, LINK) phenotype **phen; locusvalues *thislocus; struct LOC_getphenotype *LINK; { long i; double xval; phenotype *WITH; long FORLIM; WITH = *phen; if (!sexlink || !(*LINK->p)->male) { WITH->which = quantitative; FORLIM = thislocus->UU.ntrait; for (i = 0; i < FORLIM; i++) fscanf(pedfile, "%lg", &WITH->x[i]); WITH->missing = TRUE; FORLIM = thislocus->UU.ntrait; for (i = 0; i < FORLIM; i++) { if (WITH->x[i] != missval) WITH->missing = FALSE; } return; } WITH->which = affection; fscanf(pedfile, "%lg", &xval); if (xval == missval) WITH->aff = missaff; else { if (xval == affall) WITH->aff = affall; else WITH->aff = -11; } WITH->liability = 1; FORLIM = thislocus->UU.ntrait; for (i = 2; i <= FORLIM; i++) fscanf(pedfile, "%lg", &xval); } void getphenotype(p_, version) thisperson **p_; int version; { struct LOC_getphenotype V; long thisread, system; thisperson *WITH; V.p = p_; WITH = *V.p; for (thisread = 1; thisread <= nsystem; thisread++) { system = thisread; currentlocus = system - 1; WITH->phen[system - 1] = NULL; WITH->phen[system - 1] = (phenotype *)Malloc(sizeof(phenotype)); /* malloc check added by Dylan */ if (WITH->phen[system - 1] == NULL) malloc_err("phenotype field"); switch (thislocus[system - 1]->which) { case quantitative: readquan(&WITH->phen[system - 1], thislocus[system - 1], &V); break; case affection: readaff(&WITH->phen[system - 1], thislocus[system - 1], &V); break; case binary_: if (thislocus[system - 1]->UU.U2.format == 3) readnumber(&WITH->phen[system - 1], &V, version); else readbin(&WITH->phen[system - 1], thislocus[system - 1], &V); break; } } } /*getphenotype*/ void getind(id, seq) long *id, *seq; { thisperson *WITH; *id = 0; fscanf(pedfile, "%ld", seq); if (*seq == 0) return; *id = *seq; if (*id > maxind) inputerror(13L, *id, *id); if (person[*id] != NULL) return; numind++; person[*id] = (thisperson *)Malloc(sizeof(thisperson)); /* malloc check added by Dylan */ if (person[*id] == NULL) malloc_err("person"); WITH = person[*id]; WITH->gen = (thisarray *)Malloc(sizeof(thisarray)); /* malloc check added by Dylan */ if (WITH->gen == NULL) malloc_err("gen field"); WITH->nseq = *seq + nsequence; } /*getind*/ void multimarriage(p) thisperson **p; { thisperson *q, *child, *WITH; if ((*p)->foff == NULL) { (*p)->multi = FALSE; return; } WITH = *p; if (WITH->male) q = WITH->foff->ma; else q = WITH->foff->pa; child = WITH->foff; (*p)->multi = FALSE; do { if (WITH->male) { WITH->multi = (q == child->ma); child = child->nextpa; } else { WITH->multi = (q == child->pa); child = child->nextma; } } while (!(child == NULL || WITH->multi)); } /*multimarriage*/ void getrest() { char whichchr; whichchr = ' '; while (!(P_eoln(pedfile) || whichchr == '\f')) { whichchr = getc(pedfile); if (whichchr == '\n') whichchr = ' '; } fscanf(pedfile, "%*[^\n]"); getc(pedfile); } /*getrest*/ /* This procedure reads in one pedigree. Modified in late 1994 by Dylan to keep information about the loopbreakers in 'looppers'. */ static void readped(version) int version; { long i, newid, thisone, thisped, tempid; thisperson *WITH; thisperson *holdloop; #if LOOP_BREAKERS int j; #endif for (i = 0; i <= maxind; i++) person[i] = NULL; totperson = 0; loop1 = NULL; loop2 = NULL; proband = NULL; thisped = newped; #if LOOPSPEED /* DYLAN added looppers init */ for (i = 0; i < maxloop; i++) { #if LOOP_BREAKERS for (j = 0; j < maxloop; j++) looppers[i][j] = NULL; numCopies[i] = 0; #else looppers[i][0] = NULL; looppers[i][1] = NULL; #endif } num_loops = 0; /* added by Dylan late 1994 */ #endif printf("Ped. %2ld\n", thisped); /*change - added*/ while (!P_eof(pedfile) && thisped == newped) { totperson++; getind(&thisone, &tempid); if (proband == NULL) proband = person[thisone]; WITH = person[thisone]; WITH->id = tempid; WITH->oldped = newped; getind(&newid, &WITH->paid); WITH->pa = person[newid]; getind(&newid, &WITH->maid); WITH->ma = person[newid]; getind(&newid, &WITH->offid); WITH->foff = person[newid]; getind(&newid, &WITH->npaid); WITH->nextpa = person[newid]; getind(&newid, &WITH->nmaid); WITH->nextma = person[newid]; #if !LOOPSPEED WITH->store = NULL; #endif WITH->up = FALSE; fscanf(pedfile, "%ld", &WITH->sex); if (WITH->sex != 1 && WITH->sex != 2) inputerror(11L, WITH->id, WITH->sex); WITH->male = (WITH->sex == 1); fscanf(pedfile, "%ld", &WITH->profield); /* DYLAN, check for more than max loop */ if ((WITH->profield - 1) > maxloop) { fprintf(stderr, "\nUNKNOWN: Your pedigree has more loops than allowed by the constant maxloop"); fprintf(stderr, "\nYou must increase the constant maxloop defined in unknown.c and recompile"); fprintf(stderr, "\nYou are encouraged to read the loops.ps document distributed with FASTLINK"); fprintf(stderr, "\nUNKNOWN will exit politely to allow you to correct the problem\n"); exit(EXIT_FAILURE); } if (WITH->profield == 1) proband = person[thisone]; #if LOOPSPEED /* DYLAN, init looppers and loopX */ else if (WITH->profield > 1 && WITH->profield - 1 <= maxloop) { #if LOOP_BREAKERS j=WITH->profield - 2; looppers[j][numCopies[j]] = person[thisone]; numCopies[j]++; #else if (looppers[WITH->profield - 2][1] == NULL) looppers[WITH->profield - 2][1] = person[thisone]; else looppers[WITH->profield - 2][0] = person[thisone]; #endif #endif if (WITH->profield == 2) { if (loop2 == NULL) loop2 = person[thisone]; else loop1 = person[thisone]; } #if LOOPSPEED } #endif getphenotype(&person[thisone], version); getrest(); if (!P_eof(pedfile)) fscanf(pedfile, "%ld", &newped); } /* while */ nsequence += totperson; #if LOOPSPEED /* deal with proband in loop */ if (loop2 != NULL && loop1 == NULL) loop1 = proband; if (looppers[0][1] != NULL && looppers[0][0] == NULL) looppers[0][0] = proband; /* make sure looppers is set up right */ for (i = 0; i < maxloop; i++) { if (looppers[i][0] == NULL) looppers[i][1] = NULL; else { num_loops++; #if LOOP_BREAKERS for (j=1; jpa == NULL && looppers[i][j]->pa != NULL) { holdloop = looppers[i][0]; looppers[i][0] = looppers[i][j]; looppers[i][j] = holdloop; } #else if (looppers[i][0]->pa == NULL && looppers[i][1]->pa != NULL) { holdloop = looppers[i][0]; looppers[i][0] = looppers[i][1]; looppers[i][1] = holdloop; } #endif } } #endif for (thisone = 1; thisone <= totperson; thisone++) multimarriage(&person[thisone]); } /*readped*/ /* Local variables for readloci: */ struct LOC_readloci { long whichtype; } ; /* Local variables for getlocus: */ struct LOC_getlocus { struct LOC_readloci *LINK; long system; } ; void getquan(locus, LINK) locusvalues **locus; struct LOC_getlocus *LINK; { long i; locusvalues *WITH; WITH = *locus; fscanf(datafile, "%ld%*[^\n]", &WITH->UU.ntrait); getc(datafile); if (WITH->UU.ntrait > maxtrait) inputerror(31L, LINK->system, WITH->UU.ntrait); if (WITH->UU.ntrait <= 0) inputerror(32L, LINK->system, WITH->UU.U0.nclass); for (i = 1; i <= 3; i++) { fscanf(datafile, "%*[^\n]"); getc(datafile); } } /*getquan*/ void getpen(locus, LINK) locusvalues **locus; struct LOC_getlocus *LINK; { long i, j, k, l; locusvalues *WITH; long FORLIM, FORLIM1, FORLIM2; WITH = *locus; fscanf(datafile, "%ld%*[^\n]", &WITH->UU.U0.nclass); getc(datafile); if (WITH->UU.U0.nclass > maxliab) inputerror(28L, LINK->system, WITH->UU.U0.nclass); if (WITH->UU.U0.nclass <= 0) inputerror(29L, LINK->system, WITH->UU.U0.nclass); FORLIM = WITH->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH->nallele; for (j = i - 1; j < FORLIM2; j++) { fscanf(datafile, "%lg", &WITH->UU.U0.pen[i][j][2][l]); if ((unsigned)WITH->UU.U0.pen[i][j][2][l] > one) inputerror(30L, LINK->system, LINK->system); WITH->UU.U0.pen[i][j][1][l] = 1 - WITH->UU.U0.pen[i][j][2][l]; WITH->UU.U0.pen[i][j][0][l] = 1.0; for (k = 0; k <= 2; k++) WITH->UU.U0.pen[j + 1][i - 1][k][l] = WITH->UU.U0.pen[i][j][k][l]; } } fscanf(datafile, "%*[^\n]"); getc(datafile); FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) WITH->UU.U0.pen[0][i][0][l] = 1.0; if (sexlink) { FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) fscanf(datafile, "%lg", &WITH->UU.U0.pen[0][i][2][l]); if ((unsigned)WITH->UU.U0.pen[0][j - 1][2][l] > one) inputerror(30L, LINK->system, LINK->system); FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) WITH->UU.U0.pen[0][i][1][l] = 1.0 - WITH->UU.U0.pen[0][i][2][l]; fscanf(datafile, "%*[^\n]"); getc(datafile); } } } /*getpen*/ void getbin(locus, LINK) locusvalues **locus; struct LOC_getlocus *LINK; { long i, j, k; locusvalues *WITH; long FORLIM, FORLIM1; WITH = *locus; fscanf(datafile, "%ld%*[^\n]", &WITH->UU.U2.nfactor); getc(datafile); if ((WITH->UU.U2.nfactor > maxfact) || (WITH->UU.U2.nfactor > (sizeof(long) * 8 - 1))) inputerror(8L, LINK->system, WITH->UU.U2.nfactor); if (WITH->UU.U2.nfactor <= 0) inputerror(9L, LINK->system, WITH->UU.U2.nfactor); FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) WITH->UU.U2.allele[i] = 0; FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->UU.U2.nfactor; for (j = 1; j <= FORLIM1; j++) { fscanf(datafile, "%ld", &k); if (k == 1) WITH->UU.U2.allele[i] = ((long)WITH->UU.U2.allele[i]) | (1L << ((int)j)); } } fscanf(datafile, "%*[^\n]"); getc(datafile); } /*getbin*/ void getnumber(locus, LINK) locusvalues **locus; struct LOC_getlocus *LINK; { long i; locusvalues *WITH; long FORLIM; WITH = *locus; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) WITH->UU.U2.allele[i - 1] = 1; } /*getnumber*/ void getlocus(system_, LINK) long system_; struct LOC_readloci *LINK; { struct LOC_getlocus V; locusvalues *WITH; V.LINK = LINK; V.system = system_; thislocus[V.system - 1] = (locusvalues *)Malloc(sizeof(locusvalues)); /* malloc check added by Dylan */ if (thislocus[V.system - 1] == NULL) malloc_err("locus"); WITH = thislocus[V.system - 1]; fscanf(datafile, "%ld%ld", &LINK->whichtype, &WITH->nallele); WITH->maxallele = WITH->nallele; #if LOOPSPEED WITH->fgeno = (WITH->nallele * (WITH->nallele + 1) / 2); if (sexlink) WITH->mgeno = WITH->nallele; else WITH->mgeno = WITH->fgeno; #endif switch (LINK->whichtype) { case 0: WITH->which = quantitative; break; case 1: WITH->which = affection; break; case 2: WITH->which = binary_; WITH->UU.U2.format = binformat; break; case 3: WITH->which = binary_; WITH->UU.U2.format = allformat; break; } if (!disequi) { fscanf(datafile, "%*[^\n]"); fscanf(datafile, "%lf", &thislocus[V.system - 1]->onefreq); } else { fscanf(datafile, "%*[^\n]"); getc(datafile); } if (!disequi) { fscanf(datafile, "%*[^\n]"); getc(datafile); } if (disfreqs && (binary_==WITH->which)) { fscanf(datafile, "%*[^\n]"); getc(datafile); } switch (WITH->which) { case quantitative: getquan(&thislocus[V.system - 1], &V); break; case affection: getpen(&thislocus[V.system - 1], &V); break; case binary_: if (WITH->UU.U2.format == binformat) getbin(&thislocus[V.system - 1], &V); else getnumber(&thislocus[V.system - 1], &V); break; } if (risk && V.system == risksys) { fscanf(datafile, "%*[^\n]"); getc(datafile); } } /*getlocus*/ static void readloci() { struct LOC_readloci V; long coupling, autosomal; double mu; int i; fscanf(datafile, "%ld%ld%ld%*[^\n]", &nsystem, &risksys, &autosomal); getc(datafile); if (nsystem > maxlocus) inputerror(0L, nsystem, nsystem); if (nsystem <= 0) inputerror(1L, nsystem, nsystem); risk = (risksys != 0); sexlink = (autosomal == 1); printf("YOU ARE USING LINKAGE (V%s) WITH%3ld-POINT\n", aVersion, nsystem); printf("YOU ARE USING FASTLINK (V%s)\n", fVersion); if (sexlink) printf(" SEXLINKED DATA\n"); else printf(" AUTOSOMAL DATA\n"); fscanf(datafile, "%ld%lf%lf%ld%*[^\n]", &mutsys, &mu, &mu, &coupling); getc(datafile); disequi = (coupling == 1); fscanf(datafile, "%*[^\n]"); getc(datafile); for (i = 1; i <= nsystem; i++) getlocus((long) i, &V); if(disequi && ALLELE_SPEED) { fprintf(stderr,"\nYou cannot use the disequilibrium model with ALLELE_SPEED set to 1."); fprintf(stderr,"\nChange ALLELE_SPEED to 0 in unknown.c and commendefs.h."); fprintf(stderr,"\nRecompile unknown and the main programs.\n"); exit(EXIT_FAILURE); } if(disequi && disfreqs) { fprintf(stderr,"\nYou cannot use the disequilibrium model with conditional allele frequencies."); exit(EXIT_FAILURE); } } /*readloci*/ #if !LOOPSPEED static void cleanup(p) thisperson **p; { long i, j; thisperson *WITH; information *WITH1; thisarray *WITH2; WITH = *p; if (!WITH->unknown) return; WITH1 = WITH->store; WITH2 = WITH->gen; if (sexlink && WITH->male) { for (i = 0; i < mgeno; i++) { if (!WITH2->genarray[i]) WITH1->possible[whichsys - 1][0][i] = FALSE; } for (i = 1; i < mgeno; i++) { for (j = 0; j < mgeno; j++) WITH1->possible[whichsys - 1][i][j] = FALSE; } return; } for (i = 0; i < fgeno; i++) { if (!WITH2->genarray[i]) WITH1->possible[whichsys - 1][seghap[i][0] - 1] [seghap[i][1] - 1] = FALSE; WITH1->possible[whichsys - 1][seghap[i][1] - 1] [seghap[i][0] - 1] = WITH1->possible[whichsys - 1][seghap[i][0] - 1] [seghap[i][1] - 1]; } } /*cleanup*/ #endif #if LOOP_BREAKERS /*fill in possible genotypes for person p in ped at locus system, where the person has index person_index and fill in the genarray using genotypes inferred in prelim_iterpeds and stored in loop_infer_genotype*/ static void loopbreaker_getgene(ped, locus,p) int ped; long locus; thisperson *p; { long here, i, j; locusvalues *WITH; long FORLIM; long FORLIM1; int person_index; for(here = 0; here < fgeno; here++) /*AAS fixed initialization inefficiency*/ p->gen->genarray[here] = FALSE; for(person_index = 1; person_index <= totperson; person_index++) if (person[person_index] == p) break; if (person_index > totperson) { printf("Error in loopbreaker_getgene"); exit(EXIT_FAILURE); } here = 0; WITH = thislocus[locus - 1]; if (sexlink && p->male) { FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { here++; p->gen->genarray[here - 1] = loop_infer_genotype[ped -1][locus -1][person_index][here-1]; } } else { FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { FORLIM1 = WITH->nallele; for (j = i - 1; j < FORLIM1; j++) { here++; p->gen->genarray[here - 1] = loop_infer_genotype[ped -1][locus -1][person_index][here-1]; } } } } #endif /*figure out the possible genotypes for person p at locus system where the person has phenotype phen; does not used inferred information*/ static void getgene(system, p, phen) long system; thisperson *p; phenotype **phen; { long here, i, j; locusvalues *WITH; long FORLIM; phenotype *WITH1; long FORLIM1; for(here = 0; here < fgeno; here++) /*AAS fixed initialization inefficiency*/ p->gen->genarray[here] = FALSE; here = 0; WITH = thislocus[system - 1]; if (sexlink && p->male) { FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { here++; switch (WITH->which) { case quantitative: WITH1 = phen[system - 1]; if (i == affall) p->gen->genarray[here - 1] = (WITH1->aff == affall || WITH1->aff == missaff); else p->gen->genarray[here - 1] = (WITH1->aff != affall || WITH1->aff == missaff); break; case affection: WITH1 = phen[system - 1]; p->gen->genarray[here - 1] = (WITH->UU.U0.pen[0][i - 1] [WITH1->aff] [WITH1->liability - 1] > 0.0); break; case binary_: WITH1 = phen[system - 1]; if (allformat == WITH->UU.U2.format) if ((0 == WITH1->allele1) || (i == WITH1->allele1)) p->gen->genarray[here - 1] = 1; else p->gen->genarray[here - 1] = 0; else p->gen->genarray[here - 1] = (WITH1->phenf == WITH->UU.U2.allele[i - 1] || WITH1->phenf == 0); break; } } return; } FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { FORLIM1 = WITH->nallele; for (j = i - 1; j < FORLIM1; j++) { here++; switch (WITH->which) { case quantitative: p->gen->genarray[here - 1] = TRUE; break; case affection: WITH1 = phen[system - 1]; p->gen->genarray[here - 1] = (WITH->UU.U0.pen[i][j][WITH1->aff] [WITH1->liability - 1] > 0.0); break; case binary_: WITH1 = phen[system - 1]; if (allformat == WITH->UU.U2.format) if ((0 == WITH1->allele2) || ((i == WITH1->allele1) && ((j + 1) == WITH1->allele2))) p->gen->genarray[here - 1] = 1; else p->gen->genarray[here - 1] = 0; else p->gen->genarray[here - 1] = (WITH1->phenf == (WITH->UU.U2.allele[i - 1] | WITH->UU.U2.allele[j]) || WITH1->phenf == 0); break; } } } } /*getgene*/ #if LOOPSPEED /* This procedure determines the number of loops that will be considered on a per vector basis. It also sets the global variable 'fewer_vects_size'. Written by Dylan in late 1994. */ static void set_num_loops_considered(initial, ped) boolean initial; /*is this an initial call or not*/ int ped; /*pedigree index*/ { int num_geno[maxlocus][maxloop]; int num_vects[maxlocus]; int max_vects; int locus, loop, geno; int last_fewer_vects_size; int geno_bound; /* count the number of genotypes each loop breaker may have */ for (locus = 0; locus < nsystem; locus++) { for (loop = 0; loop < num_loops; loop++) { #if LOOP_BREAKERS if (initial) #endif getgene((long) (locus + 1), looppers[loop][0], looppers[loop][0]->phen); #if LOOP_BREAKERS else loopbreaker_getgene(ped,(long) (locus+1),looppers[loop][0]); #endif num_geno[locus][loop] = 0; if ((!sexlink) || (!looppers[loop][0]->male)) geno_bound = thislocus[locus]->fgeno; else geno_bound = thislocus[locus]->mgeno; for (geno = 0; geno < geno_bound; geno++) { if (looppers[loop][0]->gen->genarray[geno] == TRUE ) { num_geno[locus][loop]++; } } } } /* find the number of loops to consider */ num_loops_considered = 1; for (locus = 0; locus < nsystem; locus++) { num_vects[locus] = num_geno[locus][0]; } fewer_vects_size = 1; last_fewer_vects_size = 1; for (loop = 1; loop < num_loops; loop++) { for (locus = 0; locus < nsystem; locus++) { num_vects[locus] *= num_geno[locus][loop]; } max_vects = num_vects[0]; for (locus = 1; locus < nsystem; locus++) { if ( num_vects[locus] > max_vects ) { max_vects = num_vects[locus]; } } fewer_vects_size = max_vects - 1; if (max_vects <= max_vectors_considered ) { num_loops_considered++; last_fewer_vects_size = fewer_vects_size; } else { fewer_vects_size = last_fewer_vects_size; break; } } } /* set_num_loops_considered */ #endif static void collapsedown (); /* Local variables for seg: */ struct LOC_seg { thisperson **p, **q, **r, *child, *father, *mother; subhap firsthap, secondhap; long nfirst, nsecond; } ; /* Dylan -- Unrolled loops and removed unnecessary computations -- Done in mid 1994 */ boolean segfun(child, first, second, LINK) thisperson **child; long first, second; struct LOC_seg *LINK; { boolean temp; if (!sexlink) { #if LOOPSPEED temp = ((*child)->gen->genarray[genenumber[whichsys - 1 ][LINK->secondhap[0] - 1][LINK->firsthap[0] - 1] - 1] || (*child)->gen->genarray[genenumber[whichsys - 1][LINK->secondhap[0] - 1][LINK->firsthap[1] - 1] - 1] || (*child)->gen->genarray[genenumber[whichsys - 1][LINK->secondhap[1] - 1][LINK->firsthap[0] - 1] - 1] || (*child)->gen->genarray[genenumber[whichsys - 1][LINK->secondhap[1] - 1][LINK->firsthap[1] - 1] - 1]); return temp; #else temp = ((*child)->gen->genarray[genenumber[LINK->secondhap[0] - 1][LINK->firsthap[0] - 1] - 1] || (*child)->gen->genarray[genenumber[LINK->secondhap[0] - 1][LINK->firsthap[1] - 1] - 1] || (*child)->gen->genarray[genenumber[LINK->secondhap[1] - 1][LINK->firsthap[0] - 1] - 1] || (*child)->gen->genarray[genenumber[LINK->secondhap[1] - 1][LINK->firsthap[1] - 1] - 1]); return temp; #endif } if ((*child)->male) { if ((*LINK->p)->male) { temp = ((*child)->gen->genarray[LINK->secondhap[0] - 1] || (*child)->gen->genarray[LINK->secondhap[1] - 1]); } else { temp = ((*child)->gen->genarray[LINK->firsthap[0] - 1] || (*child)->gen->genarray[LINK->firsthap[1] - 1]); } return temp; } if ((*LINK->p)->male) { #if LOOPSPEED temp = ((*child)->gen->genarray[genenumber[whichsys - 1][LINK->secondhap[0] - 1][first] - 1] || (*child)->gen->genarray[genenumber[whichsys - 1][LINK->secondhap[1] - 1][first] - 1]); } else { temp = ((*child)->gen->genarray[genenumber[whichsys - 1][LINK->firsthap[0] - 1][second] - 1] || (*child)->gen->genarray[genenumber[whichsys - 1][LINK->firsthap[1] - 1][second] - 1]); #else temp = ((*child)->gen->genarray[genenumber[LINK->secondhap[0] - 1][first] - 1] || (*child)->gen->genarray[genenumber[LINK->secondhap[1] - 1][first] - 1]); } else { temp = ((*child)->gen->genarray[genenumber[LINK->firsthap[0] - 1][second] - 1] || (*child)->gen->genarray[genenumber[LINK->firsthap[1] - 1][second] - 1]); #endif } return temp; } /*segfun*/ /* Dylan -- modified to cache non-zero entries in q's genarray -- rewrote loops to start at 0 -- eliminated FORMLIM and WITH variables -- done in mid 1994 */ void segup(LINK) struct LOC_seg *LINK; { long first; boolean segval, val; int nonzindex, nonzcount; boolean compat; int j; /* array of indexes into genarray of non-zero elements */ unsigned int nonzgens[maxgeno]; if ((*LINK->p)->male) { LINK->nfirst = mgeno; LINK->nsecond = fgeno; } else { LINK->nfirst = fgeno; LINK->nsecond = mgeno; } /*find nonzero entries in q's genarray and make a list of them stored in nonzgens */ nonzcount = 0; { int i; for(i = 0; i < LINK->nsecond; i++) { if( (*LINK->q)->gen->genarray[i] ) { nonzgens[nonzcount++] = i; } } } for (first = 0; first < LINK->nfirst; first++) { if ( (*LINK->p)->gen->genarray[first] ) { segval = FALSE; memcpy(LINK->firsthap, seghap[first], sizeof(subhap)); for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { memcpy(LINK->secondhap, seghap[nonzgens[nonzindex]], sizeof(subhap)); val = TRUE; LINK->child = LINK->father->foff; do { if (LINK->mother == LINK->child->ma) val = segfun(&LINK->child, first, (long) nonzgens[nonzindex], LINK); LINK->child = LINK->child->nextpa; } while (val && LINK->child != NULL); segval = (val || segval); } (*LINK->p)->gen->genarray[first] = segval; } } #if LOOPSPEED /*do family by family incompatibility test porvided that LOOPSPEED is off or there are no loops*/ if (0 == num_loops) { #endif if (!incompat_traversal) { compat = FALSE; for (j = 0; j < LINK->nfirst; j++) compat = (compat || ((*LINK->p)->gen->genarray[j])); if (!compat && (!detected_incompat[(*LINK->p)->id]) && (!detected_incompat[(*LINK->q)->id])) { printf("\n One incompatibility involves the family in which person %ld is a parent",(*LINK->p)->id); printf("\n The person number refers to the second column in the pedigree file input to UNKNOWN"); incompat_traversal = TRUE; detected_incompat[(*LINK->p)->id] = TRUE; detected_incompat[(*LINK->q)->id] = TRUE; if (ONE_ERROR_ONLY) exit(EXIT_FAILURE); if (first_incompat) respond(); } } #if LOOPSPEED } #endif #if !LOOPSPEED /* cleanup modifies a data structure 'possible' not used in LOOPSPEED case */ cleanup(LINK->q); LINK->child = LINK->father->foff; do { if (LINK->child->ma == LINK->mother) cleanup(&LINK->child); LINK->child = LINK->child->nextpa; } while (LINK->child != NULL); #endif } /*segup*/ /* Dylan -- modified to cache non-zero entries in q's genarray -- rewrote loops to start at 0 -- eliminated FORMLIM and WITH variables -- Done in mid 1994 */ void segdown(LINK) struct LOC_seg *LINK; { long first, here; boolean val; haplotype thishap, thathap; int nonzindex, nonzcount; unsigned int nonzgens[maxgeno]; boolean compat; int j; for (first = 0; first < fgeno; first++) gene[first] = FALSE; /*find nonzero entries in q's genarray and make a list of them stored in nonzgens */ nonzcount = 0; { int i; for(i = 0; i < fgeno; i++) { if( (*LINK->q)->gen->genarray[i] ) { nonzgens[nonzcount++] = i; } } } for (first = 0; first < mgeno; first++) { if ((*LINK->p)->gen->genarray[first]) { memcpy(LINK->firsthap, seghap[first], sizeof(subhap)); for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { memcpy(LINK->secondhap, seghap[nonzgens[nonzindex]], sizeof(subhap)); /* Dylan -- changed from an or expression that was always TRUE */ val = TRUE; LINK->child = LINK->father->foff; do { if (LINK->child->ma == LINK->mother) { if (!LINK->child->up) val = segfun(&LINK->child, first, (long) nonzgens[nonzindex], LINK); } LINK->child = LINK->child->nextpa; } while (val && LINK->child != NULL); if (val) { if (!sexlink) { for (thishap = 0; thishap <= 1; thishap++) { for (thathap = 0; thathap <= 1; thathap++) { #if LOOPSPEED here = genenumber[whichsys - 1][LINK->secondhap[thishap] - 1] [LINK->firsthap[thathap] - 1] - 1; #else here = genenumber[LINK->secondhap[thishap] - 1] [LINK->firsthap[thathap] - 1] - 1; #endif gene[here] = (gene[here] || val); } } } else if ((*LINK->r)->male) { for (thathap = 0; thathap <= 1; thathap++) { here = LINK->secondhap[thathap] - 1; gene[here] = (gene[here] || val); } } else { for (thathap = 0; thathap <= 1; thathap++) { #if LOOPSPEED here = genenumber[whichsys - 1][LINK->secondhap[thathap] - 1] [first] - 1; #else here = genenumber[LINK->secondhap[thathap] - 1][first] - 1; #endif gene[here] = (gene[here] || val); } } } } } } for (first = 0; first < fgeno; first++) (*LINK->r)->gen->genarray[first] = ((*LINK->r)->gen->genarray[first] && gene[first]); #if LOOPSPEED /*do family by family incompatibility test porvided that LOOPSPEED is off or there are no loops*/ if (0 == num_loops) { #endif /*compatibility test*/ if (!incompat_traversal) { compat = FALSE; for (j = 0; j < fgeno; j++) compat = (compat || ((*LINK->r)->gen->genarray[j])); if (!compat && (!detected_incompat[(*LINK->p)->id]) && (!detected_incompat[(*LINK->q)->id])) { printf("\n One incompatibility involves the family in which person %ld is a child",(*LINK->r)->id); printf("\n The person number refers to the second column in the pedigree file input to UNKNOWN"); incompat_traversal = TRUE; detected_incompat[(*LINK->p)->id] = TRUE; detected_incompat[(*LINK->q)->id] = TRUE; if (ONE_ERROR_ONLY) exit(EXIT_FAILURE); if (first_incompat) respond(); } } #if LOOPSPEED } #endif #if !LOOPSPEED /* cleanup modifies a data structure not used in loopspeed case */ cleanup(LINK->p); cleanup(LINK->q); LINK->child = LINK->father->foff; do { if (LINK->child->ma == LINK->mother) { if (!LINK->child->up) cleanup(&LINK->child); } LINK->child = LINK->child->nextpa; } while (LINK->child != NULL); #endif } /*segdown*/ void seg(p_, q_, r_, peel) thisperson **p_, **q_, **r_; direction peel; { struct LOC_seg V; V.p = p_; V.q = q_; V.r = r_; if ((*V.p)->male) { V.father = *V.p; V.mother = *V.q; } else { V.father = *V.q; V.mother = *V.p; } if (peel == peelup) segup(&V); else segdown(&V); } /*seg*/ void collapseup(p) thisperson *p; { thisperson *q, *child, *nextchild; boolean down; depth++; if (depth > (DEPTH_MULTIPLE * numind)) { printf("The next pedigree appears to have an unbroken loop\n"); printf("If you do not think so, increase DEPTH_MULTIPLE in unknown.c\n"); exit(EXIT_FAILURE); } p->done = TRUE; if (p->foff == NULL) { depth--; return; } down = FALSE; child = p->foff; while (child != NULL) { down = FALSE; if (p->male) q = child->ma; else q = child->pa; if (!q->done) { collapsedown(q); nextchild = child; while (nextchild != NULL) { if (nextchild->pa == q || nextchild->ma == q) { if (!nextchild->up) collapseup(nextchild); else down = TRUE; } if (p->male) nextchild = nextchild->nextpa; else nextchild = nextchild->nextma; } if (q->multi) collapseup(q); if (!down) seg(&p, &q, &child, peelup); else collapsedown(p); } if (p->male) child = child->nextpa; else child = child->nextma; } depth--; } /*collapseup*/ static void collapsedown(p) thisperson *p; { depth++; if (depth > (DEPTH_MULTIPLE * numind)) { printf("The next pedigree appears to have an unbroken loop\n"); printf("If you do not think so, increase DEPTH_MULTIPLE in unknown.c\n"); exit(EXIT_FAILURE); } if (DOWN_CHECK && p->downvisit && (p != proband)) { printf("The next pedigree appears to have an unbroken loop\n"); printf("If you do not think so, change DOWN_CHECK to FALSE in unknown.h\n"); exit(EXIT_FAILURE); } else p->downvisit = TRUE; if (p->pa == NULL) { depth--; return; } p->up = TRUE; collapseup(p->pa); seg(&p->pa, &p->ma, &p, peeldown); depth--; } /*collapsedown*/ /* This procedure mallocs the space needed at this time for the data structure 'unknown_poss'. Written by Dylan in late 1994. */ #if LOOPSPEED static void malloc_unknown_poss(curr_person, init_value) int curr_person; boolean init_value; { int i; int geno; if (unknown_poss == NULL) { unknown_poss = (geno_for_unknown *) malloc((maxind + 1) * sizeof(geno_for_unknown)); if (unknown_poss == NULL) malloc_err("unknown possibilities table"); for (i = 1; i <= maxind; i++){ unknown_poss[i] = NULL; } } if (unknown_poss[curr_person] == NULL) { unknown_poss[curr_person] = (geno_for_locus *) malloc(nsystem * sizeof(geno_for_locus)); if (unknown_poss[curr_person] == NULL) malloc_err("unknown possibilities table"); for (i = 0; i < nsystem; i++){ unknown_poss[curr_person][i] = NULL; } } if (unknown_poss[curr_person][whichsys - 1] == NULL) { unknown_poss[curr_person][whichsys - 1] = (geno_for_loop_vector *) malloc(num_loop_vectors[whichsys - 1] * sizeof(geno_for_loop_vector)); if (unknown_poss[curr_person][whichsys - 1] == NULL) malloc_err("unknown possibilities table"); for (i = 0; i < num_loop_vectors[whichsys - 1]; i++) { unknown_poss[curr_person][whichsys - 1][i] = (boolean *) malloc (thislocus[whichsys - 1]->fgeno * sizeof(boolean)); if (unknown_poss[curr_person][whichsys - 1][i] == NULL) malloc_err("unknown possibilities table"); for (geno = 0; geno < thislocus[whichsys - 1]->fgeno; geno++) { unknown_poss[curr_person][whichsys - 1][i][geno] = init_value; } } } } /* malloc_unknown_poss */ #endif /* This procedure frees the space used by the data structure 'unknown_poss'. Written by Dylan in late 1994. */ #if LOOPSPEED static void free_unknown_poss() { int curr_person, locus, loop_v; if (unknown_poss != NULL) { for (curr_person = 1; curr_person <= totperson; curr_person++){ if (unknown_poss[curr_person] != NULL) { for (locus = 0; locus < nsystem; locus++){ if (unknown_poss[curr_person][locus] != NULL) { for (loop_v = 0; loop_v < num_loop_vectors[locus]; loop_v++) { if (unknown_poss[curr_person][locus][loop_v] != NULL) { free(unknown_poss[curr_person][locus][loop_v]); } } /* for each loop vector */ free(unknown_poss[curr_person][locus]); unknown_poss[curr_person][locus] = NULL; } } /* for each locus */ free(unknown_poss[curr_person]); unknown_poss[curr_person] = NULL; } } /* for each person */ free(unknown_poss); unknown_poss = NULL; } } /* free_unknown_poss */ #endif #if LOOPSPEED /* This procedure traverses the pedigree, using the proband declared in pedin.dat, and determines for each valid loopbreaker vector at this locus what genotypes the proband may have. This information is stored in the table 'unknown_poss'. It also compiles info for compatibility testing. This procedure was rewritten by Dylan in late 1994 to consider each valid loopbreaker vector individually. */ void likelihood(initial, ped) boolean initial; int ped; { int loopmax[maxloop]; int loopgen[maxloop]; int geno; int FORLIM; int i, j; int inner_vect; /* current loopbreaker vector being considered */ boolean valid_vector; thisperson *WITH; genotype compat_test_genarray; /* temp. to acculate geno in compat test */ boolean alldone; int nextgeno, temploopmax; /*AAS*/ int *loopbreaker_nextgeno[maxloop]; boolean first; #if LOOP_BREAKERS int k; #endif /* set loopmax */ for (i = 0; i < num_loops; i++) { if (looppers[i][0]->male) loopmax[i] = mgeno; else loopmax[i] = fgeno; } /* set compat_test_array if testing compatitibility and proband is known at this locus */ if (proband->thisunknown[whichsys - 1] == FALSE) { for (i = 0; i < fgeno; i++) { compat_test_genarray[i] = FALSE; } } first = FALSE; /* init variables to get genotype vector for loopbreakers */ for (i = num_loops_considered; i < num_loops; i++) { #if LOOP_BREAKERS if (initial) #endif getgene(whichsys, looppers[i][0], looppers[i][0]->phen); #if LOOP_BREAKERS else loopbreaker_getgene(ped, whichsys, looppers[i][0]); #endif loopbreaker_nextgeno[i] = (int *) malloc(loopmax[i] * sizeof(int)); if (NULL == loopbreaker_nextgeno[i]) malloc_err("loopbreaker_nextgeno entry"); for(geno = 0; geno < loopmax[i]; geno++) loopbreaker_nextgeno[i][geno] = 0; for(geno = 0, nextgeno = 0; geno < loopmax[i]; geno++) { while((nextgeno < loopmax[i]) && (looppers[i][0]->gen->genarray[nextgeno] == 0)) nextgeno++; loopbreaker_nextgeno[i][geno] = nextgeno; if (nextgeno < loopmax[i]) temploopmax = nextgeno + 1; geno = nextgeno; nextgeno++; } loopmax[i] = temploopmax; loopgen[i] = loopbreaker_nextgeno[i][0] + 1; first = TRUE; } /* iterate over all possible genotype vectors for loopbreakers */ do { /* get next genotype vector for loopbreakers */ i = num_loops_considered; if (num_loops > num_loops_considered) { if (!first) do { if (loopgen[i] >= loopmax[i]) loopgen[i] = loopbreaker_nextgeno[i][0] + 1; else { loopgen[i] = loopbreaker_nextgeno[i][loopgen[i]] + 1; i = num_loops; } i++; } while (i <= num_loops); else first = FALSE; } /* check if this loopbreaker genotype vector is possible */ valid_vector = TRUE; for (i = num_loops_considered; i < num_loops; i++) { if (loopgen[i] > loopmax[i]) { valid_vector = FALSE; break; } } /* if outer loop breaker genotype vector is possible */ if ( valid_vector == TRUE ) { /* iterate over each possible inner loop breaker vector */ for (inner_vect = 0; inner_vect < num_loop_vectors[whichsys - 1]; inner_vect++){ /* init each person */ /* DYLAN -- really only need to get everyone if a loopbreaker can have multiple values i.e. it is unknown or a locus is "affection" */ for (i = 1; i <= totperson; i++) { getgene(whichsys, person[i], person[i]->phen); WITH = person[i]; WITH->done = FALSE; WITH->up = FALSE; WITH->downvisit = FALSE; } /* set loopbreak genotypes to match loopbreaker genotype vector */ for (i=0; i < num_loops; i++) { for (j=0; j < loopmax[i]; j++) { #if LOOP_BREAKERS for(k =0; k < numCopies[i]; k++) looppers[i][k]->gen->genarray[j] = FALSE; #else looppers[i][0]->gen->genarray[j] = FALSE; looppers[i][1]->gen->genarray[j] = FALSE; #endif } } for (i = 0; i < num_loops_considered; i++) { #if LOOP_BREAKERS for(k =0; k < numCopies[i]; k++) looppers[i][k]->gen->genarray [loop_vectors[whichsys - 1][inner_vect][i]] = TRUE; #else looppers[i][0]->gen->genarray [loop_vectors[whichsys - 1][inner_vect][i]] = TRUE; looppers[i][1]->gen->genarray [loop_vectors[whichsys - 1][inner_vect][i]] = TRUE; #endif } for (i = num_loops_considered; i < num_loops; i++) { #if LOOP_BREAKERS for(k =0; k < numCopies[i]; k++) looppers[i][k]->gen->genarray[loopgen[i] - 1] = TRUE; #else looppers[i][0]->gen->genarray[loopgen[i] - 1] = TRUE; looppers[i][1]->gen->genarray[loopgen[i] - 1] = TRUE; #endif } /* traverse pedigree */ collapseup(proband); collapsedown(proband); /* record possible genotypes */ for (i = 1; i <= totperson; i++) { /*The following line changed by A. A. Schaffer to add inference capability in the case where person[i] is unknown only at some, but not all loci*/ /* if ( person[i]->thisunknown[whichsys - 1] == TRUE ) {*/ if ( person[i]->unknown) { malloc_unknown_poss(i, FALSE); if (person[i]->male) FORLIM = mgeno; else FORLIM = fgeno; for (geno =0; geno < FORLIM; geno++) { unknown_poss[i][whichsys - 1][inner_vect][geno] = (person[i]->gen->genarray[geno] || unknown_poss[i][whichsys - 1][inner_vect][geno]); } } } /* DYLAN -- really should rule out some loopbreaker vectors here */ /* accumulate info for compat test */ if ( proband->thisunknown[whichsys - 1] == FALSE ) { if (proband->male) FORLIM = mgeno; else FORLIM = fgeno; for (i = 0; i < FORLIM; i++) { compat_test_genarray[i] = (compat_test_genarray[i] || proband->gen->genarray[i]); } } } /* for */ } /* if valid vector */ alldone = TRUE; for (i = num_loops_considered; i < num_loops; i++) alldone = (alldone && loopgen[i] == loopmax[i]); } while (!alldone); /* copy out compatibility test array for use in check in iterpeds() */ if (proband->thisunknown[whichsys - 1] == FALSE) { if (proband->male) FORLIM = mgeno; else FORLIM = fgeno; for (i = 0; i < FORLIM; i++) { proband->gen->genarray[i] = compat_test_genarray[i]; } } for (i = num_loops_considered; i < num_loops; i++) free(loopbreaker_nextgeno[i]); } /*likelihood*/ /* This procedure is called when the pedigree has no loops. Just do the traversal. 'unknown_poss' is set later. Written by Dylan in late 1994. */ static void no_loop_likelihood(proband_index) int proband_index; { proband = person[proband_index]; /* traverse pedigree */ collapsedown(proband); collapseup(proband); } /* no_loop_likelihood*/ #else static void likelihood(proband) thisperson **proband; { long i, j; thisperson *WITH; information *WITH1; thisarray *WITH2; locusvalues *WITH3; long FORLIM, FORLIM1; collapsedown(*proband); collapseup(*proband); if (!(*proband)->thisunknown[whichsys - 1]) return; WITH = *proband; WITH1 = WITH->store; WITH2 = WITH->gen; WITH3 = thislocus[whichsys - 1]; if (sexlink && WITH->male) { FORLIM = WITH3->nallele; for (j = 0; j < FORLIM; j++) WITH1->possible[whichsys - 1][0][j] = WITH2->genarray[j]; } else { FORLIM = WITH3->nallele; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH3->nallele; for (j = i; j < FORLIM1; j++) { WITH1->possible[whichsys - 1][i] [j] = WITH2->genarray[genenumber[i][j] - 1]; WITH1->possible[whichsys - 1][j][i] = WITH1->possible[whichsys - 1][i] [j]; } } } cleanup(proband); } /*likelihood*/ #endif #if LOOPSPEED /* This procedure mallocs enough space in 'loop_vectors' for the row for the current locus. Written by Dylan in late 1994. */ static void malloc_loop_vectors() { int i; if (loop_vectors == NULL) { loop_vectors = (vector_for_locus *) malloc(nsystem * sizeof(vector_for_locus)); if (loop_vectors == NULL) malloc_err("loop vector table"); for (i = 0; i < nsystem; i++){ loop_vectors[i] = NULL; } } loop_vectors[whichsys - 1] = (vector_for_loop *) malloc(num_loop_vectors[whichsys - 1] * sizeof(vector_for_loop)); if (loop_vectors[whichsys - 1] == NULL) malloc_err("loop vector table"); for (i = 0; i < num_loop_vectors[whichsys - 1]; i++){ loop_vectors[whichsys - 1][i] = (int *) malloc (num_loops_considered * sizeof(int)); if (loop_vectors[whichsys - 1][i] == NULL) malloc_err("loop vector table"); } } /* malloc_loop_vectors */ /* This procedure frees the space used by 'loop_vectors'. Written by Dylan. */ static void free_loop_vectors () { int locus, vect; if (loop_vectors != NULL) { for (locus = 0; locus < nsystem; locus++) { if ( loop_vectors[locus] != NULL ) { for (vect = 0; vect < num_loop_vectors[locus]; vect++) { if ( loop_vectors[locus][vect] != NULL ) { free(loop_vectors[locus][vect]); } } free(loop_vectors[locus]); } } free(loop_vectors); loop_vectors = NULL; } } /* free_loop_vectors */ #endif #if LOOPSPEED /* Frees space used by simple linked list. Written by Dylan in late 1994. */ static void free_simple_list(l) simple_list l; { list_elt *curr, *temp; for (curr = l.head; curr; ) { temp = curr; curr = curr->next; free(temp); } } /* free_simple_list */ #endif /* This procedure records all the valid loopbreaker vectors for the current locus. In particular... This procedure fills in the 'loop_vectors' row corresponding to the current locus, 'whichsys', with the valid loopbreaker vectors. It also records the number of valid loopbreaker vectors in 'num_loop_vectors'. Written by Dylan in late 1994. */ #if LOOPSPEED static void get_loopbreaker_vectors(initial, ped) boolean initial; /*is this anything but the final call*/ int ped; { int i, j; boolean alldone; int loopgen[maxloop]; int loopmax[maxloop]; int nextgeno, geno, temploopmax; /*AAS*/ int *loopbreaker_nextgeno[maxloop]; simple_list temp_list; int loop_vect; /* if no loops, little to do */ if ( num_loops_considered == 0 ) { num_loop_vectors[whichsys - 1] = 1; /* the null loop vector */ return; } /* init */ num_loop_vectors[whichsys - 1] = 0; temp_list.head = NULL; temp_list.curr = NULL; /* init variables to get genotype vector for loopbreakers */ for (i = 0; i < num_loops_considered; i++) { loopgen[i] = 1; loopmax[i] = 1; if (looppers[i][0] != NULL) { if (looppers[i][0]->male) loopmax[i] = mgeno; else loopmax[i] = fgeno; #if LOOP_BREAKERS if (initial) #endif getgene(whichsys, looppers[i][0], looppers[i][0]->phen); #if LOOP_BREAKERS else loopbreaker_getgene(ped, whichsys, looppers[i][0]); #endif } loopbreaker_nextgeno[i] = (int *) malloc(loopmax[i] * sizeof(int)); if (NULL == loopbreaker_nextgeno[i]) malloc_err("loopbreaker_nextgeno entry"); for(geno = 0; geno < loopmax[i]; geno++) loopbreaker_nextgeno[i][geno] = 0; for(geno = 0, nextgeno = 0; geno < loopmax[i]; geno++) { while((nextgeno < loopmax[i]) && (looppers[i][0]->gen->genarray[nextgeno] == 0)) nextgeno++; loopbreaker_nextgeno[i][geno] = nextgeno; if (nextgeno < loopmax[i]) temploopmax = nextgeno + 1; geno = nextgeno; nextgeno++; } loopmax[i] = temploopmax; loopgen[i] = loopbreaker_nextgeno[i][0] + 1; } do { /* accumulate possible values (to make vectors) into a list */ if (temp_list.curr == NULL) { temp_list.curr = (list_elt *) malloc (sizeof(list_elt)); if (temp_list.curr == NULL) malloc_err("loop breaker vector"); } else { temp_list.curr->next = (list_elt *) malloc (sizeof(list_elt)); if (temp_list.curr == NULL) malloc_err("loop breaker vector"); temp_list.curr= temp_list.curr->next; } temp_list.curr->value = loopgen[0] - 1; temp_list.curr->next = NULL; if (temp_list.head == NULL) { temp_list.head = temp_list.curr; } for (i = 1; i < num_loops_considered; i++) { temp_list.curr->next = (list_elt *) malloc (sizeof(list_elt)); if (temp_list.curr->next == NULL) malloc_err("loop breaker vector"); temp_list.curr = temp_list.curr->next; temp_list.curr->next = NULL; temp_list.curr->value = loopgen[i] - 1; } num_loop_vectors[whichsys - 1]++; alldone = TRUE; for (i = 0; i < num_loops_considered; i++) alldone = (alldone && loopgen[i] == loopmax[i]); if (!alldone) { /* get next genotype vector for loopbreakers */ i = 0; do { if (loopgen[i] >= loopmax[i]) loopgen[i] = loopbreaker_nextgeno[i][0] + 1; else { loopgen[i] = loopbreaker_nextgeno[i][loopgen[i]] + 1; i = num_loops_considered; } i++; } while (i <= num_loops_considered); } } while (!alldone); for (i = 0; i < num_loops_considered; i++) free(loopbreaker_nextgeno[i]); /* move vectors from list to table now that size is known */ malloc_loop_vectors(); loop_vect = 0; temp_list.curr = temp_list.head; for (j = 0; j < num_loop_vectors[whichsys - 1]; j++) { for (i = 0; i < num_loops_considered; i++) { loop_vectors[whichsys-1][loop_vect][i] = temp_list.curr->value; temp_list.curr = temp_list.curr->next; } loop_vect++; } free_simple_list(temp_list); } /* get_loopbreaker_vectors */ #endif #if LOOPSPEED /* This procedure calls likelihood for each person who is unknown at the current locus. It also calls likelihood on the first person in the pedigree to check that the pedigree is compatitible. This procedure was rewritten by Dylan in late 1994. */ static void iterpeds(initial,ped) boolean initial; int ped; { int i, j; int FORLIM; int loop_vect; boolean compat; compat = FALSE; /* find all valid loopbreaker vectors at this locus */ get_loopbreaker_vectors(initial, ped); likelihood(initial,ped); if ( proband->thisunknown[whichsys - 1] == TRUE ) { for (j = 1; j <= totperson; j++) { if ( proband == person[j] ) { i = j; break; } } if (proband->male) FORLIM = thislocus[whichsys - 1]->mgeno; else FORLIM = thislocus[whichsys - 1]->fgeno; for (loop_vect = 0; loop_vect < num_loop_vectors[whichsys - 1]; loop_vect++) for (j = 0; j < FORLIM; j++) compat = (compat || unknown_poss[i][whichsys-1][loop_vect][j]); } else { if (proband->male) FORLIM = thislocus[whichsys - 1]->mgeno; else FORLIM = thislocus[whichsys - 1]->fgeno; for (j = 0; j < FORLIM; j++) compat = (compat || proband->gen->genarray[j]); } if (!compat) { printf("ERROR: Incompatibility detected in this family for locus %12ld\n", whichsys); respond(); } /* set unknown_poss entry to known genotype for this locus */ /*A. A. Schaffer modified the code to do this in likelihood instead*/ /* if ( compat ) { for (i = 1; i <= totperson; i++) { if (person[i]->unknown && !person[i]->thisunknown[whichsys - 1] ) { malloc_unknown_poss(i, FALSE); getgene(whichsys, person[i], person[i]->phen); Note possible problem for SEXLINK here, but commented out for (geno = 0; geno < thislocus[whichsys - 1]->fgeno; geno++) { for (loop_vect2 = 0; loop_vect2 < num_loop_vectors[whichsys - 1]; loop_vect2++) unknown_poss[i][whichsys - 1][loop_vect2][geno] = person[i]->gen->genarray[geno]; } } } }*/ } /*iterpeds*/ /* This procedure is used when there are no loops in the pedigree. It sets 'unknown_poss' to hold the same values as 'possible' would have with LOOPSPEED undefined, but only updates 'unknown_poss' at the end. Note that we only getgene() for each person once, allowing their genotypes to be narrowed on each traversal. Written by Dylan in late 1994. Modified by A. A. Schaffer in summer 1995 to allow for incompatibility location within nuclear families */ static void no_loop_iterpeds() { int i, j; int FORLIM; boolean compattest, compat; first_incompat = FALSE; compattest = FALSE; /* have not done a comptability test yet */ compat = FALSE; /* trivially init */ get_loopbreaker_vectors(TRUE,0); for (i= 1; i <= totperson; i++) { getgene(whichsys, person[i], person[i]->phen); } for (i = 1; i <= totperson; i++) { if (!compattest || person[i]->thisunknown[whichsys - 1]) { incompat_traversal = FALSE; /* init for segup() and segdown() */ for (j = 1; j <= totperson; j++) { person[j]->done = FALSE; person[j]->up = FALSE; person[j]->downvisit = FALSE; } /* traverse for each person */ no_loop_likelihood(i); /* test compatibilty */ if (!compattest) { compattest = TRUE; if (proband->male) FORLIM = thislocus[whichsys - 1]->mgeno; else FORLIM = thislocus[whichsys - 1]->fgeno; for (j = 0; j < FORLIM; j++) { compat = (compat || person[i]->gen->genarray[j]); } if (!compat) { printf("ERROR: Incompatibility detected in this family for locus %12ld\n", whichsys); respond(); first_incompat = TRUE; } } } } /* set unknown_poss from the genarrays */ for (i = 1; i <= totperson; i++) { if ( person[i]->unknown ) { malloc_unknown_poss(i, FALSE); if (person[i]->male) FORLIM = thislocus[whichsys - 1]->mgeno; else FORLIM = thislocus[whichsys - 1]->fgeno; for (j = 0; j < FORLIM; j++) { unknown_poss[i][whichsys - 1][0][j] = person[i]->gen->genarray[j]; } } } } /* no_loop_iterpeds*/ #if LOOP_BREAKERS static void free_loop_infer_genotype() { int pedindex; int locusindex; for(pedindex = 0; pedindex < MAXPED; pedindex++){ if (NULL != loop_infer_genotype[pedindex]) { for(locusindex = 0; locusindex < nsystem; locusindex++) { if (NULL != loop_infer_genotype[pedindex][locusindex]) { free(loop_infer_genotype[pedindex][locusindex]); } } free(loop_infer_genotype[pedindex]); } } } #endif #if LOOP_BREAKERS static void prelim_iterpeds(ped) int ped; /*pedigree number*/ { int i, j, k; int FORLIM, FORLIM1; boolean compattest, compat; int homoz, heteroz, here; int locusindex; first_incompat = FALSE; compattest = FALSE; /* have not done a comptability test yet */ compat = FALSE; for (i= 1; i <= totperson; i++) { getgene(whichsys, person[i], person[i]->phen); } for (i = 1; i <= totperson; i++) { if (!compattest || person[i]->thisunknown[whichsys - 1]) { incompat_traversal = FALSE; /* init for segup() and segdown() */ for (j = 1; j <= totperson; j++) { person[j]->done = FALSE; person[j]->up = FALSE; person[j]->downvisit = FALSE; } /* traverse for each person */ no_loop_likelihood(i); /* test compatibilty */ if (!compattest) { compattest = TRUE; if (proband->male) FORLIM = thislocus[whichsys - 1]->mgeno; else FORLIM = thislocus[whichsys - 1]->fgeno; for (j = 0; j < FORLIM; j++) { compat = (compat || person[i]->gen->genarray[j]); } if (!compat) { printf("ERROR: Incompatibility detected in this family for locus %12ld\n", whichsys); respond(); first_incompat = TRUE; } } } } if (1 == whichsys) { loop_infer_genotype[ped - 1] = (genotype **) malloc((nsystem) * sizeof(genotype*)); if (NULL == loop_infer_genotype[ped -1]) malloc_err("loop_infer_geno outer level"); for(locusindex = 0; locusindex < nsystem; locusindex++) loop_infer_genotype[ped - 1][locusindex] = NULL; } loop_infer_genotype[ped -1][whichsys -1] = (genotype *) malloc ((totperson +1) * sizeof(genotype)); if (NULL == loop_infer_genotype[ped - 1][whichsys - 1]) malloc_err("loop_infer_genotype second level"); for(i = 1; i <= totperson; i++) { FORLIM1 = thislocus[whichsys - 1]->nallele; homoz = 0; heteroz = 0; here = 0; if (sexlink && (person[i]->male)) { for (j = 0; j < FORLIM1; j++) { loop_infer_genotype[ped -1][whichsys -1][i][j] = person[i]->gen->genarray[j]; if(person[i]->gen->genarray[j]) homoz++; } } else { for (j = 0; j < FORLIM1; j++) /*possibilities for first allele*/ for (k = j; k < FORLIM1; k++) { /*possibilities for second allele*/ loop_infer_genotype[ped -1][whichsys -1][i][here] = person[i]->gen->genarray[here]; if(person[i]->gen->genarray[here]) if (j == k) homoz++; else heteroz++; here++; } } fprintf(countfile,"At locus %d person %d has %d homozygous genotypes and\n %d heterozygous genotypes\n",whichsys,i,homoz,heteroz); } } /* prelim_iterpeds*/ #endif /*LOOP_BREAKERS*/ #else /*old iterpeds*/ static void iterpeds(initial,ped) boolean initial; { long i, j; boolean compattest, compat; long FORLIM1; /* This means that this part of unknown is not active for pedigrees with loops! */ if (loop1 != NULL || loop2 != NULL) return; for (i = 1; i <= totperson; i++) getgene(whichsys, person[i], person[i]->phen); first_incompat = FALSE; compattest = FALSE; compat = FALSE; for (i = 1; i <= totperson; i++) { if (!compattest || person[i]->thisunknown[whichsys - 1]) { incompat_traversal=FALSE; for (j = 1; j <= totperson; j++) { person[j]->done = FALSE; person[j]->up = FALSE; person[j]->downvisit = FALSE; } likelihood(&person[i]); if (!compattest) { /*Only do the overall compatibility test once per locus-pedigree pair*/ compattest = TRUE; if (person[i]->male) FORLIM1 = mgeno; else FORLIM1 = fgeno; for (j = 0; j < FORLIM1; j++) compat = (compat || person[i]->gen->genarray[j]); if (!compat) { printf("ERROR: Incompatibility detected in this family for locus %12ld\n", whichsys); respond(); first_incompat = TRUE; } } } } for (i = 1; i <= totperson; i++) { if (person[i]->unknown) cleanup(&person[i]); } } /*iterpeds*/ #endif static void reinit() { long i, j; for (i = 1; i <= totperson; i++) { for (j = 0; j < nsystem; j++) Free(person[i]->phen[j]); } #if !LOOPSPEED for (i = 1; i <= totperson; i++) { if (person[i]->store != NULL) Free(person[i]->store); } #endif for (i = 1; i <= totperson; i++) { Free(person[i]->gen); Free(person[i]); person[i] = NULL; } #if LOOPSPEED free_unknown_poss(); free_loop_vectors(); #endif } /*reinit*/ boolean testhets() { /*Change: Function added by Joe Terwilliger 7/8/93*/ double a_, b_, c; long prog, d, numl, lc, nall, sexl, nqv, i, j, sexd, int_; boolean tmp; char fff; tmp = TRUE; fscanf(datafile, "%ld%lg%ld%ld%*[^\n]", &numl, &b_, &sexl, &prog); getc(datafile); fscanf(datafile, "%lg%lg%lg%ld%*[^\n]", &a_, &b_, &c, &d); getc(datafile); if (d == 1) { tmp = FALSE; goto _L10; } if (prog != 1 && prog != 3) goto _L10; fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); for (j = 1; j <= numl; j++) { fscanf(datafile, "%ld", &lc); switch (lc) { case 0: fscanf(datafile, "%ld%*[^\n]", &nall); getc(datafile); fscanf(datafile, "%*[^\n]"); getc(datafile); fscanf(datafile, "%ld%*[^\n]", &nqv); getc(datafile); for (i = 1; i <= nqv; i++) { fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); } fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); break; case 1: fscanf(datafile, "%ld%*[^\n]", &nall); getc(datafile); fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); fscanf(datafile, "%ld%*[^\n]", &nall); getc(datafile); if (sexl == 0) { for (i = 1; i <= nall; i++) { fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); } } else { for (i = 1; i <= nall + nall; i++) { fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); } } break; case 2: fscanf(datafile, "%ld%*[^\n]", &nall); getc(datafile); for (i = 1; i <= nall + 2; i++) { fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); } if (disfreqs) { fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); } break; case 3: fscanf(datafile, "%ld%*[^\n]", &nall); getc(datafile); fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); if (disfreqs) { fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); } break; } } fscanf(datafile, "%ld%ld%*[^\n]", &sexd, &int_); getc(datafile); if (sexd != 0) { fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); } fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); numl--; if (numl == 2 && int_ == 1) numl = 3; if (sexd == 1) numl++; if (sexd == 2) numl += numl; fscanf(datafile, "%lg%*[^\n]", &a_); getc(datafile); for (i = 1; i <= numl; i++) fscanf(datafile, "%ld", &d); fff = ' '; while (!P_eoln(datafile) && fff != '1') { fff = getc(datafile); if (fff == '\n') fff = ' '; } if (fff == '1') tmp = FALSE; _L10: return tmp; } /*testhets*/ static void initunknown(version) int version; { if (OLD == version) { printf("Program UNKNOWN version %s\n", aVersion); printf("The following maximum values are in effect:\n"); printf("%8ld loci\n", (long)maxlocus); printf("%8d single locus genotypes\n", maxgeno); printf("%8ld alleles at a single locus\n", (long)maxall); printf("%8ld individuals in one pedigree\n", (long)maxind); printf("%8ld marriage(s) for one male\n", (long)maxmarriage); printf("%8ld quantitative factor(s) at a single locus\n", (long)maxtrait); printf("%8ld liability classes\n", (long)maxliab); printf("%8d binary codes at a single locus\n", maxfact); printf("%8d maximum number of loops\n", maxloop); one = 1.00001; /*change*/ printf("Opening DATAFILE.DAT\n"); } else printf("Reopening DATAFILE.DAT\n"); if (datafile != NULL) { fclose(datafile); datafile = fopen("datafile.dat", "r"); } else datafile = fopen("datafile.dat", "r"); if (datafile == NULL) exit(FileNotFound); if (P_eof(datafile)) { printf( "ERROR: File empty or nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } #if ALLELE_SPEED makehomozygous = testhets(); /*Change - 2 lines added*/ rewind(datafile); #else makehomozygous = FALSE; #endif if ((NEWFIRST != version) && (OLD2 != version) ) { if (ipedfile != NULL) { fclose(ipedfile); ipedfile = fopen("ipedfile.dat", "w"); } else ipedfile = fopen("ipedfile.dat", "w"); if (ipedfile == NULL) exit(FileNotFound); #if LOOPSPEED if (OLD2 != version) { if (loopfile != NULL) { fclose(loopfile); loopfile = fopen(LOOPFILE_NAME, "w"); } else loopfile = fopen(LOOPFILE_NAME, "w"); if (loopfile == NULL) exit(FileNotFound); } #endif if (OLD2 != version) { if (speedfile != NULL) { fclose(speedfile); if (version == OLD) speedfile = fopen("speedfile.dat", "w"); else speedfile = fopen("newspeedfile.dat", "w"); } else if (version == OLD) speedfile = fopen("speedfile.dat", "w"); else speedfile = fopen("newspeedfile.dat", "w"); if (speedfile == NULL) exit(FileNotFound); } } } /*initunknown*/ int main_old(argc, argv) /* generate "speedfile.dat" in old format - Tony */ int argc; char *argv[]; { locusvalues *WITH; int ind, ped; int num_alleles; #if LOOPSPEED #if LOOP_BREAKERS int i; thisperson *WITH2, *holdloop; int loopnumber; #endif #endif ipedfile = NULL; pedfile = NULL; datafile = NULL; unlink("newspeedfile.dat"); speedfile = NULL; #if LOOPSPEED unlink(LOOPFILE_NAME); loopfile = NULL; #endif initunknown(OLD); readloci(); gapsinIds = FALSE; totalNumPed = foundped(); /*check pedfile.dat*/ if (gapsinIds) { strcpy(pedfilename,"upedfile.dat"); adjustIds(); } else strcpy(pedfilename,"pedfile.dat"); printf("Opening PEDFILE.DAT\n"); if (pedfile != NULL) { fclose(pedfile); pedfile = fopen(pedfilename, "r"); } else pedfile = fopen(pedfilename, "r"); if (pedfile == NULL) exit(FileNotFound); if (P_eof(pedfile)) { printf( "ERROR: File empty or nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } nsequence = 0; if (!P_eof(pedfile)) fscanf(pedfile, "%ld", &newped); ped = 0; while (!P_eof(pedfile)) { /*Becker comment*/ numind = 0; depth = 0; currentped = ped; ped++; readped(OLD); getunknown_old(); if (errorOccurred) { printf("There is an error in your input files\n"); printf("UNKNOWN will exit politely to let you fix the error\n"); exit(EXIT_FAILURE); } #if LOOPSPEED if ( num_loops > 0 ) { set_num_loops_considered(TRUE,ped); } else { num_loops_considered = 0; } #endif for (whichsys = 1; whichsys <= nsystem; whichsys++) { if (mutsys != whichsys) { for(ind = 0; ind <=maxind; ind++) detected_incompat[ind] = FALSE; WITH = thislocus[whichsys - 1]; fgeno = WITH->nallele * (WITH->nallele + 1) / 2; if (sexlink) mgeno = WITH->nallele; else mgeno = fgeno; getlocation(thislocus[whichsys - 1]); #if LOOPSPEED WITH->mgeno = mgeno; WITH->fgeno = fgeno; if ( num_loops == 0 ) { no_loop_iterpeds(); } else { iterpeds(TRUE,ped); } #else iterpeds(TRUE,ped); #endif } else { #if LOOPSPEED fprintf(stderr, "\nYou cannot have LOOPSPEED set to 1 and use the mutation model."); fprintf(stderr,"\nIf you did not intend to use the mutation model,"); fprintf(stderr,"\nchange the second line of the locus file to be"); fprintf(stderr,"\n0 0.0 0.0 0"); fprintf(stderr,"\nand redo your run."); fprintf(stderr,"\nIf you really intended to use the mutation model,"); fprintf(stderr,"\nthen recompile UNKNOWN and the main programs"); fprintf(stderr,"\nwith LOOPSPEED set to 0, and then rerun."); exit(EXIT_FAILURE); #else ; #endif } } infer_old(); writeped_old(); writespeed_old(); #if LOOPSPEED write_loopfile_old(ped); #endif reinit(); } if (datafile != NULL) { fclose(datafile); datafile = NULL; } if (pedfile != NULL) { fclose(pedfile); pedfile = NULL; } if (ipedfile != NULL) { fclose(ipedfile); ipedfile = NULL; } #if LOOPSPEED if (loopfile != NULL) { fclose(loopfile); loopfile = NULL; } #endif if (speedfile != NULL) { fclose(speedfile); speedfile = NULL; } /*second time */ #if (!ALLELE_SPEED) && LOOPSPEED && LOOP_BREAKERS pedfile = NULL; datafile = NULL; initunknown(OLD2); readloci(); printf("Reopening PEDFILE.DAT\n"); if (pedfile != NULL) { fclose(pedfile); pedfile = fopen(pedfilename, "r"); } else pedfile = fopen(pedfilename, "r"); if (pedfile == NULL) exit(FileNotFound); if (P_eof(pedfile)) { printf( "ERROR: File empty or nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } countfile = fopen(COUNTFILE_NAME,"w"); if (NULL == countfile) exit(FileNotFound); nsequence = 0; if (!P_eof(pedfile)) fscanf(pedfile, "%ld", &newped); ped = 0; while (!P_eof(pedfile)) { numind = 0; depth = 0; currentped = ped; ped++; readped(OLD); getunknown_old(); if (num_loops > 0) { fprintf(countfile,"Pedigree %d\n", ped); fflush(countfile); fsync(fileno(countfile)); for (whichsys = 1; whichsys <= nsystem; whichsys++) { if (mutsys != whichsys) { for(ind = 0; ind <=maxind; ind++) detected_incompat[ind] = FALSE; WITH = thislocus[whichsys - 1]; fgeno = WITH->nallele * (WITH->nallele + 1) / 2; if (sexlink) mgeno = WITH->nallele; else mgeno = fgeno; getlocation(thislocus[whichsys - 1]); prelim_iterpeds(ped); } else { fprintf(stderr, "\nYou cannot have LOOPSPEED set to 1 and use the mutation model."); fprintf(stderr,"\nIf you did not intend to use the mutation model,"); fprintf(stderr,"\nchange the second line of the locus file to be"); fprintf(stderr,"\n0 0.0 0.0 0"); fprintf(stderr,"\nand redo your run."); fprintf(stderr,"\nIf you really intended to use the mutation model,"); fprintf(stderr,"\nthen recompile UNKNOWN and the main programs"); fprintf(stderr,"\nwith LOOPSPEED set to 0, and then rerun."); exit(EXIT_FAILURE); } } } } fflush(countfile); fsync(fileno(countfile)); fclose(countfile); countfile = NULL; loopbreakers(); if (datafile != NULL) { fclose(datafile); datafile = NULL; } if (pedfile != NULL) { fclose(pedfile); pedfile = NULL; } /*third time*/ ipedfile = NULL; pedfile = NULL; datafile = NULL; speedfile = NULL; unlink(LOOPFILE_NAME); loopfile = NULL; initunknown(OLD); readloci(); printf("Reopening PEDFILE.DAT\n"); if (pedfile != NULL) { fclose(pedfile); pedfile = fopen(TPEDFILE_NAME, "r"); } else pedfile = fopen(TPEDFILE_NAME, "r"); if (pedfile == NULL) exit(FileNotFound); if (P_eof(pedfile)) { printf( "ERROR: File empty or nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } nsequence = 0; if (!P_eof(pedfile)) fscanf(pedfile, "%ld", &newped); ped = 0; while (!P_eof(pedfile)) { numind = 0; depth = 0; currentped = ped; ped++; readped(OLD); getunknown_old(); /*Geiger: code for readjusting loop breakers*/ num_loops = 0; for (i = 0; i < maxloop; i++) numCopies[i] = 0; /*totperson counts number of people in this pedigree indexing of thisperson starts at 1*/ for(ind = 1; ind <= totperson; ind++) { WITH2 = person[ind]; if (WITH2->profield > 1) { /*Is this person a loop breaker*/ if (WITH2->profield > (maxloop + 1)) { /*Is this loopbreaker the proband*/ proband = WITH2; loopnumber = WITH2->profield - maxloop - 2; } else loopnumber = WITH2->profield - 2; if (loopnumber > (num_loops - 1)) num_loops = loopnumber + 1; looppers[loopnumber][numCopies[loopnumber]] = WITH2; /*The copy of the loopbreaker in entry 0 is supposed to be one with a non-null pa pointer; if this new copy has a non-null pa pointer and the copy already in entry 0 has a null pa pointer, then swap the two*/ if ((numCopies[loopnumber] > 0) && (looppers[loopnumber][0]->pa == NULL) && (looppers[loopnumber][numCopies[loopnumber]]->pa != NULL)) { holdloop = looppers[loopnumber][0]; looppers[loopnumber][0] = looppers[loopnumber][numCopies[loopnumber]]; looppers[loopnumber][numCopies[loopnumber]] = holdloop; } numCopies[loopnumber]++; } } if ( num_loops > 0 ) { set_num_loops_considered(TRUE,ped); } else { num_loops_considered = 0; } for (whichsys = 1; whichsys <= nsystem; whichsys++) { if (mutsys != whichsys) { for(ind = 0; ind <=maxind; ind++) detected_incompat[ind] = FALSE; WITH = thislocus[whichsys - 1]; fgeno = WITH->nallele * (WITH->nallele + 1) / 2; if (sexlink) mgeno = WITH->nallele; else mgeno = fgeno; getlocation(thislocus[whichsys - 1]); WITH->mgeno = mgeno; WITH->fgeno = fgeno; if ( num_loops == 0 ) { no_loop_iterpeds(); } else { iterpeds(FALSE,ped); } } else { fprintf(stderr, "\nYou cannot have LOOPSPEED set to 1 and use the mutation model."); fprintf(stderr,"\nIf you did not intend to use the mutation model,"); fprintf(stderr,"\nchange the second line of the locus file to be"); fprintf(stderr,"\n0 0.0 0.0 0"); fprintf(stderr,"\nand redo your run."); fprintf(stderr,"\nIf you really intended to use the mutation model,"); fprintf(stderr,"\nthen recompile UNKNOWN and the main programs"); fprintf(stderr,"\nwith LOOPSPEED set to 0, and then rerun."); exit(EXIT_FAILURE); } } infer_old(); writeped_old(); writespeed_old(); write_loopfile_old(ped); reinit(); /*AAS bug fix here*/ } #if LOOP_BREAKERS free_loop_infer_genotype(); #endif if (datafile != NULL) { fclose(datafile); datafile = NULL; } if (pedfile != NULL) { fclose(pedfile); pedfile = NULL; } if (ipedfile != NULL) { fclose(ipedfile); ipedfile = NULL; } if (loopfile != NULL) { fclose(loopfile); loopfile = NULL; } if (speedfile != NULL) { fclose(speedfile); speedfile = NULL; } unlink(COUNTFILE_NAME); #endif /*(!ALLELE_SPEED) && LOOPSPEED*/ return(1); } /* main_old */ #if LOOP_BREAKERS int main_new_first(argc, argv) /* generate "newspeedfile.dat" - Tony */ int argc; char *argv[]; { locusvalues *WITH; int ind, ped; int num_alleles; pedfile = NULL; datafile = NULL; speedfile = NULL; initunknown(NEWFIRST); readloci(); init_ped_loc_all(); printf("Reopening PEDFILE.DAT\n"); if (pedfile != NULL) { fclose(pedfile); pedfile = fopen(pedfilename, "r"); } else pedfile = fopen(pedfilename, "r"); if (pedfile == NULL) exit(FileNotFound); if (P_eof(pedfile)) { printf( "ERROR: File empty or nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } countfile = fopen(COUNTFILE_NAME,"w"); if (NULL == countfile) exit(FileNotFound); nsequence = 0; if (!P_eof(pedfile)) fscanf(pedfile, "%ld", &newped); for(ped = 0; ped < MAXPED; ped++); loop_infer_genotype[ped] = NULL; ped = 0; while (!P_eof(pedfile)) { numind = 0; depth = 0; currentped = ped; ped++; readped(NEW); adjust_alleles(); allele_adjust_persons(); getunknown_new(); if (num_loops > 0) { fprintf(countfile,"Pedigree %d\n", ped); fflush(countfile); fsync(fileno(countfile)); for (whichsys = 1; whichsys <= nsystem; whichsys++) { if (mutsys != whichsys) { for(ind = 0; ind <=maxind; ind++) detected_incompat[ind] = FALSE; WITH = thislocus[whichsys - 1]; if ((binary_ == WITH->which) && (allformat == WITH->UU.U2.format)) num_alleles = ped_new_allele_count[currentped][whichsys -1]; else num_alleles = WITH->nallele; fgeno = num_alleles * (num_alleles + 1) / 2; WITH->nallele = num_alleles; if (sexlink) mgeno = num_alleles; else mgeno = fgeno; getlocation(thislocus[whichsys - 1]); WITH->mgeno = mgeno; WITH->fgeno = fgeno; prelim_iterpeds(ped); } else { fprintf(stderr, "\nYou cannot have LOOPSPEED set to 1 and use the mutation model."); fprintf(stderr,"\nIf you did not intend to use the mutation model,"); fprintf(stderr,"\nchange the second line of the locus file to be"); fprintf(stderr,"\n0 0.0 0.0 0"); fprintf(stderr,"\nand redo your run."); fprintf(stderr,"\nIf you really intended to use the mutation model,"); fprintf(stderr,"\nthen recompile UNKNOWN and the main programs"); fprintf(stderr,"\nwith LOOPSPEED set to 0, and then rerun."); exit(EXIT_FAILURE); } } } } fflush(countfile); fsync(fileno(countfile)); fclose(countfile); countfile = NULL; loopbreakers(); if (datafile != NULL) { fclose(datafile); datafile = NULL; } if (pedfile != NULL) { fclose(pedfile); pedfile = NULL; } return(1); } /* main_new_first */ #endif /*LOOP_BREAKERS*/ int main_new_second(argc, argv) /* generate "newspeedfile.dat" - Tony */ int argc; char *argv[]; { locusvalues *WITH; int ind, ped; int num_alleles; int i; #if LOOPSPEED #if LOOP_BREAKERS thisperson *WITH2, *holdloop; int loopnumber; #endif #endif ipedfile = NULL; pedfile = NULL; datafile = NULL; speedfile = NULL; #if LOOPSPEED unlink(LOOPFILE_NAME); loopfile = NULL; #if LOOP_BREAKERS unlink(COUNTFILE_NAME); countfile = NULL; #endif /*LOOP_BREAKERS*/ #endif /*LOOPSPEED*/ initunknown(NEWSECOND); readloci(); init_ped_loc_all(); printf("Reopening PEDFILE.DAT\n"); #if LOOP_BREAKERS if (pedfile != NULL) { fclose(pedfile); pedfile = fopen(TPEDFILE_NAME, "r"); } else pedfile = fopen(TPEDFILE_NAME, "r"); #else if (pedfile != NULL) { fclose(pedfile); pedfile = fopen(pedfilename, "r"); } else pedfile = fopen(pedfilename, "r"); #endif if (pedfile == NULL) exit(FileNotFound); if (P_eof(pedfile)) { printf( "ERROR: File empty or nonexistent. Press to continue or to abort\n"); scanf("%*[^\n]"); getchar(); } nsequence = 0; if (!P_eof(pedfile)) fscanf(pedfile, "%ld", &newped); ped = 0; while (!P_eof(pedfile)) { numind = 0; depth = 0; currentped = ped; ped++; readped(NEW); adjust_alleles(); allele_adjust_persons(); getunknown_new(); #if LOOPSPEED #if LOOP_BREAKERS /*Geiger: code for readjusting loop breakers*/ num_loops = 0; for (i = 0; i < maxloop; i++) numCopies[i] = 0; /*totperson counts number of people in this pedigree indexing of thisperson starts at 1*/ for(ind = 1; ind <= totperson; ind++) { WITH2 = person[ind]; if (WITH2->profield > 1) { /*Is this person a loop breaker*/ if (WITH2->profield > (maxloop + 1)) { /*Is this loopbreaker the proband*/ proband = WITH2; loopnumber = WITH2->profield - maxloop - 2; } else loopnumber = WITH2->profield - 2; if (loopnumber > (num_loops - 1)) num_loops = loopnumber + 1; looppers[loopnumber][numCopies[loopnumber]] = WITH2; /*The copy of the loopbreaker in entry 0 is supposed to be one with a non-null pa pointer; if this new copy has a non-null pa pointer and the copy already in entry 0 has a null pa pointer, then swap the two*/ if ((numCopies[loopnumber] > 0) && (looppers[loopnumber][0]->pa == NULL) && (looppers[loopnumber][numCopies[loopnumber]]->pa != NULL)) { holdloop = looppers[loopnumber][0]; looppers[loopnumber][0] = looppers[loopnumber][numCopies[loopnumber]]; looppers[loopnumber][numCopies[loopnumber]] = holdloop; } numCopies[loopnumber]++; } } #endif /*LOOP_BREAKERS*/ if ( num_loops > 0 ) { set_num_loops_considered(FALSE,ped); } else { num_loops_considered = 0; } #endif /*LOOPSPEED*/ for (whichsys = 1; whichsys <= nsystem; whichsys++) { if (mutsys != whichsys) { for(ind = 0; ind <=maxind; ind++) detected_incompat[ind] = FALSE; WITH = thislocus[whichsys - 1]; if ((binary_ == WITH->which) && (allformat == WITH->UU.U2.format)) num_alleles = ped_new_allele_count[currentped][whichsys -1]; else num_alleles = WITH->nallele; fgeno = num_alleles * (num_alleles + 1) / 2; WITH->nallele = num_alleles; if (sexlink) mgeno = num_alleles; else mgeno = fgeno; getlocation(thislocus[whichsys - 1]); #if LOOPSPEED WITH->mgeno = mgeno; WITH->fgeno = fgeno; if ( num_loops == 0 ) { no_loop_iterpeds(); } else { iterpeds(FALSE,ped); } #else iterpeds(TRUE,ped); #endif } else { #if LOOPSPEED fprintf(stderr, "\nYou cannot have LOOPSPEED set to 1 and use the mutation model."); fprintf(stderr,"\nIf you did not intend to use the mutation model,"); fprintf(stderr,"\nchange the second line of the locus file to be"); fprintf(stderr,"\n0 0.0 0.0 0"); fprintf(stderr,"\nand redo your run."); fprintf(stderr,"\nIf you really intended to use the mutation model,"); fprintf(stderr,"\nthen recompile UNKNOWN and the main programs"); fprintf(stderr,"\nwith LOOPSPEED set to 0, and then rerun."); exit(EXIT_FAILURE); #else ; #endif } } infer_new(); writeped_new(); writespeed_new(); #if LOOPSPEED write_loopfile_new(ped); #endif reinit(); } #if LOOP_BREAKERS free_loop_infer_genotype(); #endif if (datafile != NULL) { fclose(datafile); datafile = NULL; } if (pedfile != NULL) { fclose(pedfile); pedfile = NULL; } if (ipedfile != NULL) { fclose(ipedfile); ipedfile = NULL; } #if LOOPSPEED if (loopfile != NULL) { fclose(loopfile); loopfile = NULL; } #endif if (speedfile != NULL) { fclose(speedfile); speedfile = NULL; } return(1); } /* main_new_second */ void initial_breakers() { boolean *islooped; /*which pedigrees are looped*/ int i; /*index over pedigrees*/ FILE *lpedfile; /*output file for pedigree after breakers selected*/ pedfile = NULL; datafile = NULL; #if LOOPSPEED unlink(LOOPFILE_NAME); loopfile = NULL; #endif #if LOOP_BREAKERS initunknown(OLD); readloci(); gapsinIds = FALSE; totalNumPed = foundped(); /*check pedfile.dat*/ if (gapsinIds) { strcpy(pedfilename,"upedfile.dat"); adjustIds(); } else strcpy(pedfilename,"pedfile.dat"); islooped = (boolean *) malloc(totalNumPed * sizeof(boolean)); for(i = 0; i < totalNumPed; i++) islooped[i] = FALSE; if (pedfile != NULL) { fclose(pedfile); pedfile = NULL; } detectLoopedPedigrees(islooped); lpedfile = fopen(LPEDFILE_NAME, "w"); if (NULL == lpedfile) exit(FileNotFound); loopbreakers2(lpedfile); if (datafile != NULL) { fclose(datafile); datafile = NULL; } if (pedfile != NULL) { fclose(pedfile); pedfile = NULL; } if (lpedfile != NULL) { fclose(lpedfile); lpedfile = NULL; } #else /*LOOP_BREAKERS 0*/ fprintf(stderr,"Cannot use unknown -l with LOOP_BREAKERS set to 0\n"); exit(EXIT_FAILURE); #endif /*if LOOP_BREAKERS*/ } int main(argc, argv) int argc; char *argv[]; { int c; boolean lflag; disfreqs = FALSE; lflag = FALSE; while ((c = getopt(argc, argv, "cl")) != -1) { switch (c) { case 'c': disfreqs = TRUE; break; case 'l': initial_breakers(); lflag = TRUE; break; default: break; } } if (lflag) exit(EXIT_SUCCESS); errorOccurred = FALSE; main_old(argc,argv); if (ALLELE_SPEED == 1) { #if LOOP_BREAKERS main_new_first(argc,argv); #endif main_new_second(argc,argv); } #if LOOP_BREAKERS unlink(TPEDFILE_NAME); #endif exit(EXIT_SUCCESS); } fastlink-4.1P-fix95/4.1P/src/strbuff.h0000644000265600020320000000161606737460342016453 0ustar tilleaadmin/* strbuff.h -- Header file for strBuff class This is a dynamically resizing string buffer. Output is written to an external buffer, and then appended to the internal buffer. Internal state maintains a pointer to the current end of the string. If the buffer to be appended would cause an overflow of the internal buffer, the internal string is doubled in size before the copy. Based on an idea by Jeremy Buhler (jbuhler@rice.edu). */ #if !defined(STRBUFF_H) #define STRBUFF_H #include #include typedef struct { char* string; /* internal string */ int size; /* current size of internal buffer */ int stindex; /* current index to end of string */ } strBuff; strBuff* newStrBuff(); #if defined(KNR_PROTO) void append(); #else void append(strBuff*, char*); #endif /* defined(KNR_PROTO) */ #endif /* if !defined(STRBUFF_H) */ fastlink-4.1P-fix95/4.1P/src/automodified.c0000644000265600020320000013455510517437676017462 0ustar tilleaadmin/* This file contains new versions of the routines segup, segdown, */ /* and some auxiliary routines for use with */ /* LODSCORE, ILINK, LINKMAP, and MLINK */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottinghm, Jr., */ /* Avoiding Recomputation In Linkage Analysis,*/ /* Hum. Hered. 44(1994), pp. 225-237 */ /* The versions in this file use a lot of memory */ /* Somewhat slower versions that use less memory */ /* are in slowautomodified.c */ /* Most of the code in this file was written by R. M. Idury*/ #include "commondefs.h" #include "moddefs.h" Void getprobtable() /* compute joint recombination probabilities */ { static int size = 0, firsttime = 1; int index, i, j, ii, jj; char *recomb_flag; if(firsttime && !sexlink) { if (!AUTOSOMAL_RUN) fprintf(stderr, "\nWARNING: You are doing an autosomal run but have AUTOSOMAL_RUN set to 0"); if ((!SEXDIF_RUN) && sexdif) fprintf(stderr, "\nWARNING: You are doing a sexdif run but have SEXDIF_RUN set to 0"); firsttime = 0; classbase = (unsigned int *) malloc(nuprobclass * sizeof(unsigned int)); if (classbase == NULL) malloc_err("classbase"); classsize = (unsigned int *) malloc(nuprobclass * sizeof(unsigned int)); if (classsize == NULL) malloc_err("classsize"); recomb_flag = (char *) malloc(nuneed * sizeof(char)); if (recomb_flag == NULL) malloc_err("recomb_flag"); for(i = 0; i < nuneed; i++) recomb_flag[i] = 0; for(i = 0; i < fgeno; i++) recomb_flag[probstart[i]-1] = 1; size = 0; for(i = 0; i < nuneed; i++) if(recomb_flag[i] == 1) classbase[size++] = i; classsize[size-1] = nuneed - classbase[size-1]; for(i = size-2; i >= 0; i--) classsize[i] = classbase[i+1] - classbase[i]; if (!sexlink) { probtableindex = (unsigned *) malloc(nuneed * nuneed * sizeof (unsigned)); if (probtableindex == NULL) { fprintf(stderr, "\nYou probably need to run the slower version of this program"); malloc_err("probtableindex"); } probtable = (double *) malloc(maxisozygclass * nuneed * nuneed * sizeof(double)); if (probtable == NULL) { fprintf(stderr, "\n You probably need to use the slower version of this program"); malloc_err("probtable"); } } if (sexdif) { probtabledif = (double *) malloc(maxisozygclass * nuneed * nuneed * sizeof(double)); if (probtabledif == NULL) { fprintf(stderr, "\n You probably need to use the slower version of this program"); malloc_err("probtabledif"); } } free(recomb_flag); } index = 0; if (!sexlink) { for(i = 0; i < size; i++) { for(j = 0; j < size; j++) { probtableindex[classbase[i]*nuneed+classbase[j]] = index; for(ii = classbase[i]; ii < classbase[i]+classsize[i]; ii++) { for(jj = classbase[j]; jj < classbase[j]+classsize[j]; jj++) { probtable[index++] = segprob2[ii*nuneed+jj]; } } } } } if (sexdif) { index = 0; for(i = 0; i < size; i++) { for(j = 0; j < size; j++) { for(ii = classbase[i]; ii < classbase[i]+classsize[i]; ii++) { for(jj = classbase[j]; jj < classbase[j]+classsize[j]; jj++) { probtabledif[index++] = segprob2[jj*nuneed+ii]; } } } } } } /*segsum2 is used in segup to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class of both parental genotypes; fs stands for the product of first and second. */ /* cgh -- made this void for gcc */ Local void segsum2(first,second,fslength) unsigned first, second, fslength; { int g1, g2, g3, g4; /*indices to store gene numbers*/ int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM = fence[first]; /*end of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ /*iterate over isozygotes of i*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1] + tempwith3[g3 - 1] + tempwith3[g4 - 1]); } index++; /*increment isozygote class counter*/ } } } /*segsum2*/ /*segsum3 is used in segup to compute some common subexpressions in the probability updates. It uses the pair sums precomputed in the array partialprob. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class of both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ /* cgh -- made this void for gcc */ Local void segsum3(first,second,fslength) unsigned first,second, fslength; { int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ childprob *pp1; double *pps1,*pps2; /*temporary pointers for partialprob table*/ int firstindex; /*firstindex for the partialprob table*/ FORLIM = fence[first]; /*end of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ /*iterate over isozygotes of i*/ for (firstindex=0,i = base[first]; i < FORLIM; i++,firstindex++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; pp1 = partialprob[firstindex]; /*Get info for this haplotype pair*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ pps1 = pp1[s1-1]; /*Get partialprob info for s1*/ pps2 = pp1[s2-1]; /*Get partialprob info for s2*/ /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = *(pps1++) + *(pps2++); } index++; /*increment isozygote class counter*/ } } } /*segsum3*/ /*segsumdown2 is used in segdown to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class for both parental genotypes; fs stands for the product of first and second. */ /* cgh -- made this void for gcc */ Local void segsumdown2(first,second,fslength) unsigned first, second, fslength; { int g1, g2, g3, g4; /*indices to store gene numbers*/ int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int index2; /*used as index for isozygote class*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM = fence[first]; /*end of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ index2 = 0; /*iterate over isozygotes of i*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*store these gene numbers for later use; the key point is that we will want these numbers consecutively later, so we store them consecutively in segindex*/ segindex[index2++] = g1; segindex[index2++] = g2; segindex[index2++] = g3; segindex[index2++] = g4; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1] + tempwith3[g3 - 1] + tempwith3[g4 - 1]); } index++; /*increment isozygote class counter*/ } } } /*segsumdown2*/ /*segsumdown3 is used in segdown to compute some common subexpressions in the probability updates. It uses the precomputed pair sums in partialprob. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class for both parental genotypes; fs stands for the product of first and second. */ /* cgh -- made this void for gcc */ Local void segsumdown3(first,second,fslength) unsigned first, second, fslength; { int g1, g2, g3, g4; /*indices to store gene numbers*/ int f1, f2, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int index2; /*used as index for isozygote class*/ int i, j, k, l; /*loop indices*/ int FORLIM; /*limit on a for loop*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1, *TEMPGENE2; /*temporary pointers into genenumber table*/ childprob *pp1; double *pps1,*pps2; /*temporary pointers for partialprob table*/ int firstindex; /*firstindex for the partialprob table*/ FORLIM = fence[first]; /*end of the isozygote class for first*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ index2 = 0; /*iterate over isozygotes of i*/ for (firstindex=0,i = base[first]; i < FORLIM; i++,firstindex++) { f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ f2 = haps2[i]; /*retrieve second haplotype*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ TEMPGENE2 = genenumber[f2 - 1]; pp1 = partialprob[firstindex]; /*Get info for this haplotype pair*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the four ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*store these gene numbers for later use; the key point is that we will want these numbers consecutively later, so we store them consecutively in segindex*/ segindex[index2++] = g1; segindex[index2++] = g2; segindex[index2++] = g3; segindex[index2++] = g4; pps1 = pp1[s1-1]; /*Get partialprob info for s1*/ pps2 = pp1[s2-1]; /*Get partialprob info for s2*/ /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { /* sum the probabilities for the four joint genotypes that the child can get from the current parental joint genotypes*/ tempseg[l] = *(pps1++) + *(pps2++); } index++; /*increment isozygote class counter*/ } } } /*segsumdown3*/ /*lsegfun2 does a logical test similar to the computation done in the original segfun to determine whether segfun would return 0.0. If segfun would return 0.0, then lsegfun2 return 0 (FALSE), while if segfun would not return 0.0., lsegfun2 returns 1 (TRUE). Given, a combined isozygote class, we want to know whether any elements of that isozygote class are possible joint genotypes for the parents. This will be the case if and only if each child has a nonzero probability for at least one of the joint genotypes that the parents can produce given their isozygote class. first and second are the joint genotypes for the parents. */ unsigned lsegfun2(first,second) unsigned first,second; { int g1, g2, g3, g4; /*four gene numbers*/ int i, j, k; /* loop indices*/ int f1, f2, s1, s2; /*haplotype numbers*/ int FORLIM; /*loop bound*/ int FORLIM1, FORLIM2; /*loop bounds*/ int *TEMPGENE1, *TEMPGENE2; /* store pointers into genenumber*/ unsigned char *tempflag3; /*stores sparsity pattern for child's genarray*/ FORLIM = fence[first]; /*find end of isozygote class for first*/ FORLIM1 = base[second];/*find beginning and end of isozygote class for second*/ FORLIM2 = fence[second]; /*try to find a non-zero value for each child*/ for (k = 0; k < nchild; k++) { /*code for the non-boolean version is shown in comments tempwith3 = thischild[k]->genarray;*/ /*retrieve sparsity pattern for child k*/ tempflag3 = thischild[k]->sparseflag; /*iterate over all recombined isozygotes of first*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*retrieve the haplotypes of this genotype*/ f2 = haps2[i]; TEMPGENE1 = genenumber[f1 - 1];/*get pointer into genenumber for this haplotype*/ TEMPGENE2 = genenumber[f2 - 1]; /*iterate over all the recombined isozygotes of second*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*get haplotypes of this genotype*/ s2 = haps2[j]; /*retrieve the four genes that this combination of joint haplotypes can produce*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; g3 = TEMPGENE2[s1 - 1]; g4 = TEMPGENE2[s2 - 1]; /*if(tempwith3[g1 - 1] != 0.0 || tempwith3[g2 - 1] != 0.0 || tempwith3[g3 - 1] != 0.0 || tempwith3[g4 - 1] != 0.0) goto notzero;*/ /*if any of the flags is TRUE, then this child can have this genotype, and we move immediately to testing the next child*/ if(tempflag3[g1 - 1] != 0 || tempflag3[g2 - 1] != 0 || tempflag3[g3 - 1] != 0 || tempflag3[g4 - 1] != 0) goto notzero; } } return 0; /*this child failed to have any of the genotypes for the isozygote class, so this isozygote class is not possible*/ notzero: continue; } return 1; /*all children passed the test and have a possible joint genotype*/ } /*segup updates the genotype probabilities for a parent (p) based on the probabilities of children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children*/ Void segup(LINK) struct LOC_seg *LINK; { int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ unsigned int *tempstart; /*temporary index to probability array*/ static int current; /*index for haplotype pools*/ double valtemp; /*intermediate value in probability updates*/ double val, temp1, tempr; /*temporaries to store intermediate values*/ int f1, f2; /*two haplotypes from parent*/ int here, i, j, first, second; /*genotype indices*/ int g1, g2; /*two possible joint genotypes for child*/ int fslength; /*size of product isozygote class for p and q*/ int jointisoindex, fisoindex; /*indices to work within isozygote classes*/ int l; /*increment used to manage offset into probtableindex l is the number of probability values needed for the current isozygote class. This is obtained by multplying the number of probabilities (nuneed) times the size of the class*/ int k; /*index to loop over children*/ char skip; /*used to skip iterations of a loop*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for p parent*/ thetavalues *WITH5; /*store theta values for q parent*/ int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ int loop1,loop2,loop3,loop4; /*Index variables for the three loops that precalculate partial probabilities*/ int *gene_ptr1,*gene_ptr2; /*Temporarily points to gene array*/ int fastsum; /*Should we use segsum2 or segsum3?*/ boolean depend; /*used to handle loops*/ /* newsegprob is used to hold a segprob array, which contains the probabilities for various patterns of recombination events*/ double *newsegprob; double *tempprob; /*temporary holder for probability array*/ int ind; /*used to store offset for probability array*/ initseg(LINK); /*get data about this p,q,children triple*/ /*clear out pools, debugging for(i=0; i<= current; i++){ indpool[i]=0; invpool[i]=0; nextpool[i]=0; } */ /*get sparsity patterns for p and q genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get genarray for p*/ newwith3=WITH3->genarray; /*get genarray for q*/ WITH4 = LINK->firstsex; /*get p probabilities*/ WITH5 = LINK->secondsex; /*get q probabilities*/ /*The case of 1 child is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 1) { newwithr=thischild[0]->genarray; /*get genarray for first child*/ /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; phapcache1[i].first = 0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ for(i = 0; i < fgeno; i++) { gene[i] = 0.0; if(newwithr[i] == 0.0) continue; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } current = 1; /* current should start with 1, since 0 means a null ptr */ for (first = 0; first < fgeno; first++) { if(newflag2[first] == 0) continue; /*use only possible genotypes*/ FORLIM = fence[first]; /*find end of isozygote class of first*/ /*iterate over all members of first's isozygote calss*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*get haplotypes*/ f2 = haps2[i]; ind = hind[i]; /*get probability offset for i*/ /*if f1 is a possible haplotype for child add the probability offset and value of first to the cache*/ if(flag[f1-1] != 0) { indpool[current] = ind; /*store values in cache*/ invpool[current] = first; nextpool[current] = 0; /* increment cache indices*/ if(phapcache1[f1-1].first == 0) { phapcache1[f1-1].first = current; phapcache1[f1-1].last = current; } else { nextpool[phapcache1[f1-1].last] = current; phapcache1[f1-1].last = current; } current++; } /*similar to f1, if f2 is a possible haplotype for a child, cache the ind and first values for it*/ if(flag[f2-1] != 0) { indpool[current] = ind; invpool[current] = first; nextpool[current] = 0; if(phapcache1[f2-1].first == 0) { phapcache1[f2-1].first = current; phapcache1[f2-1].last = current; } else { nextpool[phapcache1[f2-1].last] = current; phapcache1[f2-1].last = current; } current++; } } } /*This section of the code precomputes for each haplotype the the probability that the child will inherit this haplotype from q. Each genotype has two haplotypes, but can produce others by recombination. Therefore, for each genotype we must sum over the different haplotypes that can be produced by its isozygote class. The contributions for each haplotype are stored in qsumcache.*/ newsegprob = WITH5->segprob; /*use q probabilities to work with q*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] != 0) || (flag[f2-1] != 0)) { /*conditional probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the parent p based on the probabilities for the child*/ newsegprob = WITH4->segprob; /*use probabilities to work with p*/ /*Iterate over all joint genotypes of the child*/ newflagr=thischild[0]->sparseflag; for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; tempr = newwithr[here]; c1 = invgenenum1[here]; c2 = invgenenum2[here]; temp1 = tempr * qsumcache[c2 - 1]; /*multiply probabilities for haplotype c2 from q*/ /*now find all the values of first that as genotypes of the father could have passed on the other haplotype c1; multiply by their probabilties, which are stored in phapcache, and add to the entry gene[first], which will be used to form the new genarray for p*/ for(i=phapcache1[c1-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { temp1 = tempr * qsumcache[c1 - 1]; for(i=phapcache1[c2-1].first; i != 0; i = nextpool[i]) { first = invpool[i]; gene[first] += temp1*newsegprob[indpool[i]]; } } } /*set up new genarray for p; it is gene scaled by segscale*/ for (first = 0; first < fgeno; first++) { if(newflag2[first] == 0.0) continue; newwith2[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 1*/ /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } fastsum = (nonzcount > (fgeno/maxclasssize)); /*iterate over genotypes for p*/ for (first = 0; first < fgeno; first += step1) { /*number of distinct probabilties needed for first's isoz. class*/ step1 = probend[first] - probstart[first]+1; skip = 1; /*work only on those isozygotes that are possible*/ for(i = first; i < first+step1; i++) if(newflag2[i] != 0) { skip = 0; break; /*go to next isozygote in class*/ } if(skip) continue; /*initialize update multiple for each isozygote in class*/ for(i = 0; i < step1; i++) segval[i] = 0.0; if (fastsum) { /*precalculate partial probabilities for a fixed value of first*/ for(loop1=base[first],loop4=0;loop1genarray[g1-1] + thischild[loop3]->genarray[g2-1]; } } } /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; fslength = step1 * step2; /*number of probs. for combined isozygote class*/ fisoindex = (probstart[first] - 1) * nuneed - 1; /*probability array offset*/ tempstart = probstart + second; /*set tempstart to the start of the section of probstart that we want*/ l = step1 * nuneed; /*call segsum2 or segsum3 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ if (fastsum) segsum3(first,second,fslength); else segsum2(first,second,fslength); /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { fisoindex += l; /*increment by number of probabilities needed for this iso. class*/ continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) continue; /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ #if AUTOSOMAL_RUN if ((!sexdif) || ((*LINK->p)->male)) tempprob = probtable + probtableindex[fisoindex+ tempstart[j]]; #if SEXDIF_RUN else tempprob = probtabledif + probtableindex[fisoindex+ tempstart[j]]; #endif #endif /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the tempseg array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + fslength; /*move the base of newwithr*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; val *= temp1; newwithr += fslength; } /*update segval entry for this isozygote of first*/ segval[i] += newwith3[second+j] * val; } fisoindex += l; /*go to next isozygote for p*/ } } /*update p's genarray for each isozygote in this class*/ for(i = 0; i < step1; i++) newwith2[first+i] *= segval[i] * segscale; } } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < fgeno; i++) if((newflag2[i] != 0) && (newwith2[i] == 0.0)) newflag2[i] = 0; /*Added by Alex to handle loops */ if (loopfirstgen && (!(*LINK->p)->loopdepend)) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->p)->loopdepend = depend; (*LINK->p)->loopneeded = false; } } if ((*LINK->p)->loopdepend) { if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segup*/ /* segdown updates the genotype probabilities for a child based on the probabilities of parents and other children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children */ Void segdown(LINK) struct LOC_seg *LINK; { int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ unsigned int *tempstart; /*temporary index to probability array*/ double valtemp; /*intermediate value in probability updates*/ double val, temp1; /*temporaries to store intermediate values*/ int f1, f2; /*two haplotypes from parents*/ int here, i, j, first, second; /*genotype indices*/ int g1, g2; /*two possible joint genotypes for child*/ int fslength; /*number of probs. for product isoz. class of p,q*/ int jointisoindex, fisoindex; /*indices to work within isozygote classes*/ int currentindex; /*index to update genarray within isozygote class*/ int l; /*increment used to manage offset into probtableindex l is the number of probability values needed for the current isozygote class. This is obtained by multplying the number of probabilities (nuneed) times the size of the class*/ int k; /*index to loop over children*/ char skip; /*used to skip iterations of a loop*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr, *newwithc; /*store genarrays for p,q, and children*/ thetavalues *WITH4; /*stores theta values for p*/ thetavalues *WITH5; /*store theta values for q*/ int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ int loop1,loop2,loop3,loop4; /*Index variables for the three loops that precalculate partial probabilities*/ int *gene_ptr1,*gene_ptr2; /*Temporarily points to gene array*/ int fastsum; /*Should we use segsumdown2 or segsumdown3?*/ /* newsegprob is used to hold a segprob array, which contains the probabilities for various patterns of recombination events*/ double *newsegprob; double *tempprob; /*temporary holder for probability array*/ boolean depend; /*used to handle loops*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p, q, and child genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; newflagr = (*LINK->r)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ newwithr = (*LINK->r)->gen->genarray; /*get genarray for first child*/ WITH4 = LINK->firstsex; /*get p probabilities*/ WITH5 = LINK->secondsex; /*get q probabilities*/ /*The case of 1 child (nchild==0) is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 0) { /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; psumcache[i] = 0.0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ for(i = 0; i < fgeno; i++) { gene[i] = 0.0; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } /*This section of the code precomputes for each haplotype the the probability that the child will inherit this haplotype from p. Each genotype has two haplotypes, but can produce others by recombination. Therefore, for each genotype we must sum over the different haplotypes that can be produced by its isozygote class. The contributions for each haplotype are stored in psumcache. Afterwards a similar computation is done for the inheritance from q with the results stored in qsumcache.*/ newsegprob = WITH4->segprob; /*get p probabilities for recomb. patterns*/ for (first = 0; first < fgeno; first++) { if(newflag2[first] == 0) continue; /*use only possible genotypes*/ FORLIM = fence[first]; /*find end of isozygote class of first*/ valtemp = newwith2[first]; /*probability of getting this genotype*/ /*iterate over all members of first's isozygote calss*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; /*get haplotypes*/ f2 = haps2[i]; if ((flag[f1-1] !=0) || (flag[f2-1] != 0)) { /*get probability offset for i*/ /*multiply probability of getting genotype times probability of this recombination pattern and haplo. choice*/ val = valtemp * newsegprob[hind[i]]; /*add to psumcache*/ if(flag[f1-1] != 0) { psumcache[f1-1] += val; } if(flag[f2-1] != 0) { psumcache[f2-1] += val; } } } } newsegprob = WITH5->segprob; /*get q probabilities*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] !=0) || (flag[f2-1] !=0)) { /*condition probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ /*get probability offset for i*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the child based on the probabilities for the parents*/ /*Iterate over all joint genotypes of the child*/ for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*probability of child getting genotype here as a result of p passing on c1 and q passing on c2 is summed to gene[here] */ gene[here] += psumcache[c1-1] * qsumcache[c2-1]; /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { gene[here] += psumcache[c2-1] * qsumcache[c1-1]; } } /*set up new genarray for r; it is gene scaled by segscale*/ for (first = 0; first < fgeno; first++) { if(newflagr[first] == 0) continue; if(gene[first] == 0.0) newflagr[first] = 0; newwithr[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 0*/ /*initialize genarray entries for child to 0*/ for(i = 0; i < fgeno; i++) { gene[i] = 0.0; } /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } fastsum = (nonzcount > (fgeno / maxclasssize)); /*iterate over genotypes for p*/ for (first = 0; first < fgeno; first += step1) { /*number of distinct probabilties needed for first's isoz. class*/ step1 = probend[first] - probstart[first]+1; skip = 1; /*work only on those isozygotes that are possible*/ for(i = first; i < first+step1; i++) if(newflag2[i] != 0) { skip = 0; break; /*go to next isozygote in class*/ } if(skip) continue; if (fastsum) { /*precalculate partial probabilities for a fixed value of first*/ for(loop1=base[first],loop4=0;loop1genarray[g1-1] + thischild[loop3]->genarray[g2-1]; } } } /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; fslength = step1 * step2; /*number of probs. of combined isozygote class*/ fisoindex = (probstart[first] - 1) * nuneed - 1; /*probability array offset*/ tempstart = probstart + second; /*set tempstart to the start of the section of probstart that we want*/ l = step1 * nuneed; /*number of probabilities for this isozygote class*/ /*call segsumdown2 or 3 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ if (fastsum) segsumdown3(first,second,fslength); else segsumdown2(first,second,fslength); for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) segval[jointisoindex] = 0.0; /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { fisoindex += l; /*increment by number of probabilities needed for this iso. class*/ continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) { continue; } /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ #if AUTOSOMAL_RUN if ((!sexdif) || ((*LINK->p)->male)) tempprob = probtable + probtableindex[fisoindex+tempstart[j]]; #if SEXDIF_RUN else tempprob = probtabledif + probtableindex[fisoindex+tempstart[j]]; #endif #endif /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the tempseg array. the number of contributions is fslength which is the number of probabilties needed for the joint isozygote class for the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithc = tempseg + fslength; /*move the base of newwithc*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithc has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithc[0]; for(jointisoindex = 1; jointisoindex < fslength; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithc[jointisoindex]; val *= temp1; newwithc += fslength; } /*probability of this combination of parent genotypes*/ val *= newwith2[first+i] * newwith3[second+j]; for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) { /*probability of this recombination pattern (based on other children)*/ segval[jointisoindex] += tempprob[jointisoindex] * val; } } fisoindex += l; /*go to next isozygote for p*/ } /*update the probabilities of four joint genotypes the child might get; each different choice of recombination pattern will lead to a different set of four genotypes*/ currentindex = 0; for(jointisoindex = 0; jointisoindex < fslength; jointisoindex++) { temp1 = segval[jointisoindex]; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; } } } /*finally update child's real genarray by coppy gene multiplied by scale factor segscale*/ for(i = 0; i < fgeno; i++) { if(newflagr[i] == 0) continue; if(gene[i] == 0.0) newflagr[i] = 0; /*if probability changes from nonzero to 0.0 change flag to 0*/ newwithr[i] *= segscale * gene[i]; } } /*Added by A. A. Schaffer to handle loops */ if (loopfirstgen && (!((*LINK->r)->loopdepend))) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->p)->loopdepend) || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->r)->loopdepend = depend; (*LINK->r)->loopneeded = false; } } if ((*LINK->r)->loopdepend) { if (!((*LINK->p)->loopdepend)) (*LINK->p)->loopneeded = true; if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->p, LINK->LINK); cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segdown*/ fastlink-4.1P-fix95/4.1P/src/comlike.c0000644000265600020320000016302510517437723016417 0ustar tilleaadmin/* This file contains modified versions of the routines to do single likelihood computations for the LINKAGE package. The modifications herein are mostly needed to handle loops better and are described in the paper: A. A. Schaffer, S. K. Gupta, K. Shriram, R. W. Cottingham, Jr. Avoiding Recomputation in Linkage Analysis Human Heredity 44(1994), pp. 225-237. */ /* Modified by Dylan in late 1994 to speed up pedigrees with loops. #if LOOPSPEED were added at that time. Further modified by A. A. Schaffer in mid-1995 to handle loops in which loopbreakers have know genotypes. More uses of LOOPSPEED added at that time. */ #include "commondefs.h" #ifndef LESSMEMORY #include "moddefs.h" #endif #if defined(LODSCORE) #include "lodefs.h" #endif #if PARALLEL #if IS_SHMEM void Tmk_errexit(format, va_alist) char* format; va_dcl { va_list args; va_start(args); vfprintf(stderr, format, args); va_end(args); exit(-1); } #if defined(GMEM_DEBUG) extern int totMem; #endif /* defined(GMEM_DEBUG) */ char *Tmk_malloc(size) unsigned size; { #if defined(GMEM_DEBUG) totMem += size; #endif /* defined(GMEM_DEBUG) */ return G_MALLOC(size); } #endif /* IS_SHMEM */ unsigned MakeMask(start, end) int start, end; { unsigned u = 0; int i; for (i = start; i <= end; i++) u |= (1 << i); return u; } void OneMaster() { iAmAMaster[0] = true; whoIsMyMaster[0] = 0; thetanumbase[0] = 0; thetanumfence[0] = 1; *slavesPerGroup = Tmk_nprocs; *checkmaster = 0; currentthetanum = 0; thischild = gMem->gthischild[mymaster]; pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; } short findemptygen() { short i; for (i = 0; i < maxworkingset; i++) if (ggeninuse[currentthetanum][i] == 0) return(i); Tmk_errexit("Problem in findemptygen --- the estimate of %d for maxworkingset is too low.\n Specify a larger value with the -w option.\n If this estimate was computed automatically, \n then you have hit a bug that you should report. \n Consult README.p4 or\nREADME.TreadMarks for details.\n", maxworkingset); /* cgh -- this can't happen, but it makes gcc happy */ return -1; } #endif /*PARALLEL*/ Void invert(m, n, det) double (*m)[maxtrait]; int n; double *det; { covmatrix v; double val; int i, j, k; *det = 1.0; for (i = 1; i <= n; i++) { val = m[i - 1][i - 1]; for (k = 0; k <= i - 2; k++) val -= v[k][i - 1] * v[k][i - 1]; *det *= val; v[i - 1][i - 1] = sqrt(val); for (j = i; j < n; j++) { val = m[i - 1][j]; for (k = 0; k <= i - 2; k++) val -= v[k][i - 1] * v[k][j]; v[i - 1][j] = val / v[i - 1][i - 1]; v[j][i - 1] = 0.0; } } for (i = 1; i <= n; i++) { m[i - 1][i - 1] = 1 / v[i - 1][i - 1]; for (j = i + 1; j <= n; j++) { val = 0.0; for (k = i - 1; k <= j - 2; k++) val -= m[k][i - 1] * v[k][j - 1]; m[j - 1][i - 1] = val / v[j - 1][j - 1]; m[i - 1][j - 1] = 0.0; } } for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) { val = 0.0; for (k = j; k < n; k++) val += m[k][i] * m[k][j]; v[i][j] = val; v[j][i] = val; } } memcpy(m, v, sizeof(covmatrix)); } /* static void collapsedown (thisperson *p, struct LOC_likelihood *LINK);*/ static void collapsedown (); static void precollapsedown(); Void cleanup(p, LINK) thisperson **p; struct LOC_likelihood *LINK; { thisperson *WITH; WITH = *p; if ((!(WITH->loopneeded)) || looplastgen) { /*changed by A. A. Schaffer*/ #if !PARALLEL Free(WITH->gen->sparseflag); Free(WITH->gen->genarray); Free(WITH->gen); #endif WITH->gen = NULL; #if PARALLEL ggeninuse[currentthetanum][WITH->memindex] = 0; /*Used to free cell in genbank for parallel computation*/ #endif } WITH->newgenexists = false; } /*cleanup*/ void allocate_thisarray(location, number) thisarray *location; int number; { location->genarray = (double *) malloc(number * sizeof(double)); if (NULL == location->genarray) malloc_err("genarray field"); location->sparseflag = (unsigned char *) malloc(number * sizeof(unsigned char)); if (NULL == location->sparseflag) malloc_err("sparseflag field"); } Local Void prob(p, LINK) thisperson **p; struct LOC_likelihood *LINK; { int i; thisperson *WITH; unsigned char *tempflag1; /*Next two declarations by R. M. Idury*/ double *tempwith1; #if PARALLEL short genindex; /*Index into genbank for parallel computation*/ #endif WITH = *p; if (WITH->newgenexists) return; /*Fixed by A. A. Schaffer*/ if (WITH->gen == NULL) { #if !PARALLEL WITH->gen = (thisarray *) Malloc(sizeof(thisarray)); if (WITH->gen == NULL) malloc_err("gen field in prob"); allocate_thisarray(WITH->gen, fgeno); #else /*Next four lines added by A.A. Schaffer for parallel computation*/ genindex = findemptygen(); WITH->gen = &(ggenbank[currentthetanum][genindex]); WITH->memindex = genindex; ggeninuse[currentthetanum][genindex] = 1; #endif WITH->newgenexists = true; /*Inserted by A. A. Schaffer*/ /*Code to initialze genarray and sparseflag put in by R. M. Idury*/ tempwith1 = WITH->gen->genarray; tempflag1 = WITH->gen->sparseflag; for(i=0;iinloop > 0) { if (looppers[LINK->thisped - 1][WITH->inloop - 1][0] == *p) { /*G OK*/ tempwith1[LINK->loopgen[WITH->inloop - 1] - 1] = LINK->holdpoint[WITH->inloop - 1]-> genarray[LINK->loopgen[WITH->inloop - 1] - 1]; tempflag1[LINK->loopgen[WITH->inloop - 1] - 1] = 1; } else { tempwith1[LINK->loopgen[WITH->inloop - 1] - 1] = 1.0; tempflag1[LINK->loopgen[WITH->inloop - 1] - 1] = 1; } return; } getvect(*p, LINK); } if ((*p)->pa == NULL && (WITH->inloop==0)) LINK->nuscale++; } /*prob*/ /*pseudoprob does just the scaling function of prob */ /*This routine written by A. A. Schaffer*/ Local Void pseudoprob(p, LINK) thisperson **p; struct LOC_likelihood *LINK; { thisperson *WITH; WITH = *p; if (!(WITH->newgenexists)) if ((*p)->pa == NULL) { LINK->nuscale++; if (WITH->inloop > 0) { LINK->nuscale--; } } } /*pseudoprob*/ Void initseg(LINK) struct LOC_seg *LINK; { if ((*LINK->p)->male) { LINK->nfirst = mgeno; LINK->nsecond = fgeno; LINK->firstsex = maletheta; LINK->secondsex = femaletheta; LINK->pf = mutmale; LINK->ps = mutfemale; } else { LINK->nfirst = fgeno; LINK->nsecond = mgeno; LINK->firstsex = femaletheta; LINK->secondsex = maletheta; LINK->pf = mutfemale; LINK->ps = mutmale; } prob(&LINK->father, LINK->LINK); prob(&LINK->mother, LINK->LINK); LINK->child = LINK->father->foff; nchild = 0; do { prob(&LINK->child, LINK->LINK); if (LINK->child->ma == LINK->mother && (!LINK->child->up)) { nchild++; childarray[nchild - 1] = LINK->child; /*Line added by A. A. Schaffer*/ thischild[nchild - 1] = LINK->child->gen; malechild[nchild - 1] = LINK->child->male; } LINK->child = LINK->child->nextpa; } while (LINK->child != NULL); #if PARALLEL gMem->nchild[mymaster] = nchild; #endif if (nchild > maxchild) { fprintf(stderr, "\nA nuclear family has more children than maxchild"); fprintf(stderr, "\nThe program will exit politely to allow you to"); fprintf(stderr, "\nincrease maxchild in the file commondefs.h"); exit(EXIT_FAILURE); } } /*initseg*/ /*pseudoseg simulates the calls that initseg would make to prob by using pseudoprob just to get scaling right*/ /*This routine written by A. A. Schaffer*/ Local Void pseudoseg(LINK) struct LOC_seg *LINK; { pseudoprob(&LINK->father, LINK->LINK); pseudoprob(&LINK->mother, LINK->LINK); LINK->child = LINK->father->foff; nchild = 0; do { pseudoprob(&LINK->child, LINK->LINK); if (LINK->child->ma == LINK->mother && (!LINK->child->up)) { nchild++; } LINK->child = LINK->child->nextpa; } while (LINK->child != NULL); LINK->LINK->nuscale++; /*does extra scaling skipped in exitseg*/ } /*pseudoseg*/ Void exitseg(LINK) struct LOC_seg *LINK; { LINK->LINK->nuscale++; LINK->child = LINK->father->foff; do { if (LINK->child->ma == LINK->mother && (!LINK->child->up)) cleanup(&LINK->child, LINK->LINK); LINK->child = LINK->child->nextpa; } while (LINK->child != NULL); /*exitseg*/ } Local Void getgenetables() { int locfstart, locfend, locfseg; int f1, f2, i, first; currentfence = 1; for (first = 0; first < fgeno; first++) { base[first] = currentfence; locfstart = probstart[first]; locfend = probend[first]; locfseg = segstart[first]; for (i = locfstart-1; i < locfend; i++) { f1 = invgenenum1[locfseg - 1]; haps1[currentfence] = f1; f2 = invgenenum2[locfseg - 1]; haps2[currentfence] = f2; hind[currentfence++] = i; locfseg++; } fence[first] = currentfence; } } /* getgenetables */ #if ALLELE_SPEED /*The following procedure recomputes the number of haplotypes and genotypes for a given pedigree. Written by A. A. Schaffer */ void recompute_haps(pedix, wantlocations) int pedix; boolean wantlocations; { int temphap, tempfgeno, tempall; int locidx; locusvalues **templocus; #if defined(LODSCORE) int locus1, locus2; #endif templocus = thislocus; temphap = 1; tempfgeno = 1; /*need to adjust the increment array for lookups into genenumber*/ increment[mlocus - 1] = 1; #if defined(LODSCORE) locus1 = locuslist1[iplace - 1] - 1; locus2 = locuslist2[jplace - 1] - 1; if ((binary_ == templocus[1]->which) && (allformat == templocus[1]->format)) { tempall = ped_new_allele_count[pedix - 1][locus2]; templocus[1]->nallele = tempall; } else tempall = templocus[1]->nallele; increment[0] = increment[1] * tempall; temphap *= tempall; if ((binary_ == templocus[0]->which) && (allformat == templocus[0]->format)) { tempall = ped_new_allele_count[pedix - 1][locus1]; templocus[0]->nallele = tempall; } else tempall = templocus[0]->nallele; temphap *= tempall; #else for(locidx = mlocus - 1; locidx >= 0; locidx--) { if ((binary_ == templocus[locidx]->which) && (allformat == templocus[locidx]->format)) { tempall = ped_new_allele_count[pedix - 1][locidx]; templocus[locidx]->nallele = tempall; } else tempall = templocus[locidx]->nallele; if (locidx > 0) increment[locidx - 1] = increment[locidx] * tempall; temphap *= tempall; } #endif /*defined(LODSCORE) */ nuhap = temphap; fgeno = nuhap * (nuhap + 1) / 2; if (sexlink) mgeno = nuhap; else mgeno = fgeno; if (ped_must_change_locations[pedix - 1] && wantlocations) { getlocations(); getgenetables(); } } #endif /*computenumhaps computes the weighted sum over all genotypes of how many haplotypes can be passed on to a child. The following explanation assumes some basic understanding of combinatorics at the undergraduate level. The total number of haplotypes that can be passed on is a weighted sum of the number of genotypes, where different genotypes get different weights, We first classify the genotypes by heterozygosity pattern, where 0 means homozygous and 1 means heterozygous. There are mlocus loci and therefore 2**mlocus different heterozygosity patterns. The number of genotypes of a given heterozygosity pattern can be computed by considering one locus at a time and multiplying the contributions of all the loci, since they are independent. A homozygous locus with A alleles contributes a factor of A. The first heterozygous locus contributes a factor of A *(A-1)/2 if it has A alleles. Any other heterozygous locus with B alleles, contributes a factor of B*(B-1). The weight of a genotype is 1 if it is homozygous; otherwise it is 2**(h-1), where h is the number of heterozygous loci in the genotype.*/ static int computenumhaps() { int numpatterns; hapvector *patternmatrix; int p; /*index over heterozygosity patterns*/ int l; /*index over loci*/ int value; /*accumulator for return value*/ int term; /*term for this heterozygosity pattern*/ boolean hetyet; /*have we seen a heterozygous locus yet*/ #if defined(LODSCORE) int locus1, locus2; #endif numpatterns = 2; for (i=2; i<=mlocus;i++) numpatterns*=2; patternmatrix = (hapvector *) malloc(numpatterns*sizeof(hapvector)); if (patternmatrix == NULL) malloc_err("patternmatrix"); for(l=0; l < mlocus; l++) patternmatrix[0][l]=0; for(p=1; p< numpatterns; p++) { l = 0; do{ patternmatrix[p][l] = !patternmatrix[p-1][l]; l++; } while(!patternmatrix[p][l-1]); do{ patternmatrix[p][l] = patternmatrix[p-1][l]; l++; } while(l < mlocus); } value = 2; /*offset by 1 because 0 index has special meaning*/ for(p=0; p < numpatterns; p++){ term = 1; hetyet = 0; for(l=0; l < mlocus; l++){ if (!patternmatrix[p][l]) { term *= thislocus[l]->nallele; } else if (!hetyet) { hetyet = 1; term *= (thislocus[l]->nallele * (thislocus[l]->nallele -1))/2; } else term *= thislocus[l]->nallele * (thislocus[l]->nallele - 1) * 2; } value+=term; } free(patternmatrix); return(value); } Void allocategenetables() { int maxfgeno, thisfinalfence, maxfinalfence; int ped; int i, c; maxfemgen = 0; maxhaplo = 0; #if ALLELE_SPEED maxfgeno = 0; maxfinalfence = 0; for(ped = 1; ped <= mymaxped; ped++){ recompute_haps(ped, false); if (fgeno > maxfgeno) maxfgeno = fgeno; if (nuhap > maxhaplo) maxhaplo = nuhap; thisfinalfence = computenumhaps(); if (thisfinalfence > maxfinalfence) maxfinalfence = thisfinalfence; } #else maxfgeno = fgeno; maxhaplo = nuhap; maxfinalfence = computenumhaps(); #endif /*ALLELE_SPEED*/ maxfemgen = maxfgeno; #ifndef LESSMEMORY indpool = (unsigned *) malloc(2 * maxclasssize * maxfgeno * sizeof (unsigned)); if (indpool == NULL) { fprintf(stderr, "\nYou probably need to use the slower version of this program"); malloc_err("indpool"); } invpool = (unsigned *) malloc(2 * maxclasssize * maxfgeno * sizeof (unsigned)); if (invpool == NULL) { fprintf(stderr, "\nYou probably need to use the slower version of this program"); malloc_err("invpool"); } nextpool = (unsigned *) malloc(2 * maxclasssize * maxfgeno * sizeof (unsigned)); if (nextpool == NULL) { fprintf(stderr, "\nYou probably need to use the slower version of this program"); malloc_err("nextpool"); } #endif genenumber = (int**) malloc(maxhaplo * sizeof(int*)); if (genenumber == NULL) malloc_err("genenumber"); for(i = 0; i < maxhaplo; i++) { genenumber[i] = (int *) malloc(maxhaplo * sizeof(int*)); if (genenumber[i] == NULL) malloc_err("Entry in genenumber"); } #if (defined(ILINK) || defined (LODSCORE)) if (approximate) { approxarray = (unschar **) malloc(nuped * sizeof(unschar *)); if (approxarray == NULL) malloc_err("approxarray"); for(i = 0; i <= nuped; i++) { approxarray[i] = (unschar *) malloc(maxfgeno * sizeof(unschar)); if (approxarray[i] == NULL) malloc_err("Entry in approxarray"); } } #endif base = (unsigned *) malloc(maxfgeno * sizeof(unsigned)); if (base == NULL) malloc_err("base"); fence = (unsigned *) malloc(maxfgeno * sizeof(unsigned)); if (fence == NULL) malloc_err("fence"); invgenenum1 = (unsigned *) malloc(maxfgeno * sizeof(unsigned)); if (invgenenum1 == NULL) malloc_err("invgenenum1"); invgenenum2 = (unsigned *) malloc(maxfgeno * sizeof(unsigned)); if (invgenenum2 == NULL) malloc_err("invgenenum2"); segstart = (int *) malloc(maxfgeno * sizeof(int)); if (segstart == NULL) malloc_err("segstart"); probstart = (unsigned *) malloc(maxfgeno * sizeof(unsigned)); if (probstart == NULL) malloc_err("probstart"); probend = (unsigned *) malloc(maxfgeno * sizeof(unsigned)); if (probend == NULL) malloc_err("probend"); rare = (boolean *) malloc(maxfgeno * sizeof(unsigned)); if (rare == NULL) malloc_err("rare"); if (risk) { risk1 = (boolean *) malloc(maxfgeno * sizeof(boolean)); if (risk1 == NULL) malloc_err("risk1"); risk2 = (boolean *) malloc(maxfgeno * sizeof(boolean)); if (risk2 == NULL) malloc_err("risk2"); riskmale = (boolean *) malloc(maxhaplo * sizeof(boolean)); if (riskmale == NULL) malloc_err("riskmale"); } if (mutsys != 0) { muthap = (unschar *) malloc(maxhaplo * sizeof(unschar)); if (muthap == NULL) malloc_err("muthap"); } haps1 = (unsigned short *) malloc(maxfinalfence * sizeof(unsigned short)); if (haps1 == NULL) malloc_err("haps1"); haps2 = (unsigned short *) malloc(maxfinalfence * sizeof(unsigned short)); if (haps2 == NULL) malloc_err("haps2"); hind = (unsigned int *) malloc(maxfinalfence * sizeof(unsigned int)); if (hind == NULL) malloc_err("hind"); #if !(PARALLEL) /*if parallel, used shared arrays*/ nonzgens = (unsigned int *) malloc(maxfgeno * sizeof(unsigned int)); if (nonzgens == NULL) malloc_err("nonzgens"); #endif gene = (double *) malloc(maxfgeno * sizeof(double)); if (gene == NULL) malloc_err("gene"); flag = (boolean *) malloc(maxfgeno * sizeof(boolean)); if (flag == NULL) malloc_err("flag"); #if !(PARALLEL) /*in parallel, use arrpsumcache and arrqsumcache*/ psumcache = (double *) malloc(maxhaplo * sizeof(double)); if (psumcache == NULL) malloc_err("psumcache"); qsumcache = (double *) malloc(maxhaplo * sizeof(double)); if (qsumcache == NULL) malloc_err("qsumcache"); #else onechildupqsumcache = (double *) malloc(maxhaplo * sizeof(double)); if (onechildupqsumcache == NULL) malloc_err("onechildupqsumcache"); #endif #if !defined(LESSMEMORY) phapcache1 = (cache *) malloc(maxhaplo * sizeof(cache)); if (phapcache1 == NULL) malloc_err("phapcache1"); #endif #if PARALLEL stripe_pnonzgens = (unsigned int *) malloc(maxfgeno * sizeof(unsigned int)); if (stripe_pnonzgens == NULL) malloc_err("stripe_pnonzgens"); stripe_qnonzgens = (unsigned int *) malloc(maxfgeno * sizeof(unsigned int)); if (stripe_qnonzgens == NULL) malloc_err("stripe_qnonzgens"); privatepnonzgens = (unsigned int *) malloc(maxfgeno * sizeof(unsigned int)); if (privatepnonzgens == NULL) malloc_err("privatepnonzgens"); privateqnonzgens = (unsigned int *) malloc(maxfgeno * sizeof(unsigned int)); if (privateqnonzgens == NULL) malloc_err("privateqnonzgens"); #endif #if !defined(LESSMEMORY) #if !PARALLEL if (!sexlink) { partialprob = (childprob **) malloc(maxclasssize * sizeof(childprob *)); if (partialprob == NULL) { fprintf(stderr, "\nYou probably need to use the slower version of this program"); malloc_err("partialprob"); } for(c = 0; c < maxclasssize; c++) { partialprob[c] = (childprob *) malloc(maxhaplo * sizeof(childprob)); if (partialprob[c] == NULL) { fprintf(stderr, "\nYou probably need to use the slower version of this program"); malloc_err("Entry in partialprob"); } } } #endif #endif } /* allocgenetables */ Void freegenetables() { int i, c; #ifndef LESSMEMORY free(indpool); indpool = NULL; free(invpool); invpool = NULL; free(nextpool); nextpool = NULL; #endif for(i = 0; i < maxhaplo; i++) { free(genenumber[i]); genenumber[i] = NULL; } free(genenumber); genenumber = NULL; #if (defined(ILINK) || defined (LODSCORE)) if (approximate) { for(i = 0; i <= nuped; i++) { free(approxarray[i]); approxarray[i] = NULL; } free(approxarray); approxarray = NULL; } #endif free(base); base = NULL; free(fence); fence = NULL; free(invgenenum1); invgenenum1 = NULL; free(invgenenum2); invgenenum2 = NULL; free(segstart); segstart = NULL; free(probstart); probstart = NULL; free(probend); probend = NULL; free(rare); rare = NULL; if (risk) { free(risk1); risk1 = NULL; free(risk2); risk2 = NULL; free(riskmale); riskmale = NULL; } if (mutsys != 0) { free(muthap); muthap = NULL; } free(haps1); haps1 = NULL; free(haps2); haps2 = NULL; free(hind); hind = NULL; #if !(PARALLEL) /*if parallel, used shared arrays*/ free(nonzgens); nonzgens = NULL; #endif free(gene); gene = NULL; free(flag); flag = NULL; #if !(PARALLEL) /*in parallel, use arrpsumcache and arrqsumcache*/ free(psumcache); psumcache = NULL; free(qsumcache); qsumcache = NULL; #endif #if !defined(LESSMEMORY) free(phapcache1); phapcache1 = NULL; #endif #if !defined(LESSMEMORY) #if !PARALLEL if (!sexlink) { for(c = 0; c < maxclasssize; c++) { free(partialprob[c]); partialprob[c] = NULL; } free(partialprob); partialprob = NULL; } #endif #endif } /* freegenetables */ /* getgeneindices is a preprocessing routine that compute the encodings of all the haplotypes and genotypes and precomputes for each genotype a list of the haplotypes it can pass on in one array insted of using indirect addressing by genotype */ Void getgeneindices() { int i; #if defined(LODSCORE) /*find number of recombination probabilities*/ nuneed = 7; for (i= 3; i<= mlocus; i++) nuneed = 5 * nuneed - 3; #endif /* defined(LODSCORE) */ #if ((!defined(LESSMEMORY)) && ((!PARALLEL) || (PRECOMPUTE))) segprob2 = (double *) malloc(nuneed * nuneed * sizeof(double)); if (segprob2 == NULL) { fprintf(stderr, "\nYou probably need to use the slower version of this program"); malloc_err("segprob2"); } #endif /*find size of isozygote class and it's square for joint classes*/ maxclasssize = 2; for (i = 3; i<= mlocus; i++) maxclasssize *= 2; maxisozygclass = maxclasssize * maxclasssize; nuprobclass = 2; for(i = 2; i <= mlocus; i++) nuprobclass = 3 * nuprobclass - 1; segval = (double *) malloc(maxisozygclass * sizeof(double)); if (segval == NULL) malloc_err("segval"); tempseg = (double *) malloc(maxchild *maxisozygclass * sizeof(double)); if (tempseg == NULL) malloc_err("tempseg"); segindex = (unsigned *) malloc(4 * maxisozygclass * sizeof(unsigned)); if (segindex == NULL) malloc_err("segindex"); #if (defined(LESSMEMORY) || (defined(PARALLEL) && (0 == PRECOMPUTE))) tempseg2 = (double *) malloc(maxchild *maxisozygclass * sizeof(double)); if (tempseg2 == NULL) malloc_err("tempseg2"); #endif #if ALLELE_SPEED allocategenetables(); #endif #if !ALLELE_SPEED getgenetables(); #endif } /* getgeneindices */ /*Routine determines in which way to do the next nuclear family genarray update. Modified by R. M. Idury to distinguish between old versions of segup (called oldsegup) and new versions of segdown and segup. Modified by A. A. Schaffer to avoid doing the update in certain loop traversal pedigree situations */ Void seg(p_, q_, r_, peel, LINK) thisperson **p_, **q_, **r_; direction peel; struct LOC_likelihood *LINK; { struct LOC_seg V; boolean phaseunkn; V.LINK = LINK; V.p = p_; V.q = q_; V.r = r_; phaseunkn = ((*V.q)->pa == NULL && (*V.q)->firstpass && (*V.q)->inloop == 0 && !disequi); if ((*V.p)->male) { V.father = *V.p; V.mother = *V.q; } else { V.father = *V.q; V.mother = *V.p; } if (peel == peelup) { if (((*V.p)->pa == NULL) && phaseunkn && approximate) { if (firstapprox && firsttime) { switch (thispath) { case auto_: segtop(&V); break; case mauto: segtop(&V); break; case sex: segsextop(&V); break; case msex: segsextop(&V); break; } } else { /*first approximate not first time*/ if (firstapprox) { switch (thispath) { case auto_: segctop(&V); break; case mauto: segctop(&V); break; case sex: segsexctop(&V); break; case msex: segsexctop(&V); break; } } else { /*approximate*/ switch (thispath) { case auto_: segcapprox(&V); break; case mauto: segcapprox(&V); break; case sex: segsexctop(&V); break; case msex: segsexctop(&V); break; } } } } else { /*do not approximate*/ if (phaseunkn) { if (firsttime) { switch (thispath) { case auto_: if (((*V.p)->loopdepend) || loopfirstgen) segup(&V); else pseudoseg(&V); break; case mauto: segtop(&V); break; case sex: if (((*V.p)->loopdepend) || loopfirstgen) segsexup(&V); else pseudoseg(&V); break; case msex: segsextop(&V); break; } } else { /*not firsttime*/ switch (thispath) { case auto_: if (((*V.p)->loopdepend) || loopfirstgen) segup(&V); else pseudoseg(&V); break; case mauto: segctop(&V); break; case sex: if (((*V.p)->loopdepend) || loopfirstgen) segsexup(&V); else pseudoseg(&V); break; case msex: segsexctop(&V); break; } } } else { /*phaseinfo*/ switch (thispath) { case auto_: if (((*V.p)->loopdepend) || loopfirstgen) segup(&V); else pseudoseg(&V); break; case mauto: oldsegup(&V); break; case sex: if (((*V.p)->loopdepend) || loopfirstgen) segsexup(&V); else pseudoseg(&V); break; case msex: oldsegsexup(&V); break; } } } } else { /*not peelup*/ switch (thispath) { case auto_: if (((*V.r)->loopdepend) || loopfirstgen) segdown(&V); else pseudoseg(&V); break; case mauto: msegdown(&V); break; case sex: if (((*V.r)->loopdepend) || loopfirstgen) segsexdown(&V); else pseudoseg(&V); break; case msex: msegsexdown(&V); break; } } (*V.q)->firstpass = false; (*V.p)->firstpass = false; } /*seg*/ Local Void collapseup(p, LINK) thisperson *p; struct LOC_likelihood *LINK; { thisperson *q, *child, *nextchild; boolean down; p->done = true; if (p->foff == NULL) return; down = false; child = p->foff; while (child != NULL) { down = false; if (p->male) q = child->ma; else q = child->pa; if (!q->done) { collapsedown(q, LINK); nextchild = child; while (nextchild != NULL) { if (nextchild->pa == q || nextchild->ma == q) { if (!nextchild->up) collapseup(nextchild, LINK); else down = true; } if (p->male) nextchild = nextchild->nextpa; else nextchild = nextchild->nextma; } if (q->multi) collapseup(q, LINK); if (!down) seg(&p, &q, &child, peelup, LINK); else collapsedown(p, LINK); } if (p->male) child = child->nextpa; else child = child->nextma; } } /*collapseup*/ Local Void precollapseup(p) thisperson *p; { thisperson *q, *child, *nextchild, *childonlist; boolean down; p->done = true; if (p->foff == NULL) return; down = false; child = p->foff; while (child != NULL) { down = false; if (p->male) q = child->ma; else q = child->pa; if (!q->done) { precollapsedown(q); nextchild = child; while (nextchild != NULL) { if (nextchild->pa == q || nextchild->ma == q) { if (!nextchild->up) precollapseup(nextchild); else down = true; } if (p->male) nextchild = nextchild->nextpa; else nextchild = nextchild->nextma; } if (q->multi) precollapseup(q); if (!down) { if (q->loopdepend) { p->loopdepend = true; p->loopneeded = false; } childonlist = p->foff; while (childonlist != NULL) { if (childonlist->loopdepend) { p->loopdepend = true; p->loopneeded = false; } if (p->male) childonlist = childonlist->nextpa; else childonlist = childonlist->nextma; } } else precollapsedown(p); } if (p->male) child = child->nextpa; else child = child->nextma; } } /*precollapseup*/ Local Void collapsedown(p, LINK) thisperson *p; struct LOC_likelihood *LINK; { if (p->pa == NULL) return; p->up = true; collapseup(p->pa, LINK); seg(&p->pa, &p->ma, &p, peeldown, LINK); } /*collapsedown*/ Local Void precollapsedown(p, LINK) thisperson *p; struct LOC_likelihood *LINK; { thisperson *childonlist; if (p->pa == NULL) return; p->up = true; precollapseup(p->pa); if (p->pa->loopdepend || p->ma->loopdepend) { p->loopdepend = true; p->loopneeded = false; } childonlist = p->pa->foff; while (childonlist != NULL) { if (childonlist->loopdepend) { p->loopdepend = true; p->loopneeded = false; } if (p->male) childonlist = childonlist->nextpa; else childonlist = childonlist->nextma; } } /*precollapsedown*/ Local Void riskcumul(LINK) struct LOC_likelihood *LINK; { int i; thisarray *WITH; WITH = LINK->proband->gen; if (sexlink && LINK->proband->male) { for (i = 0; i < mgeno; i++) { if (riskmale[i]) LINK->hetero += WITH->genarray[i]; } return; } for (i = 0; i < fgeno; i++) { if (risk2[i]) LINK->homo += WITH->genarray[i]; else if (risk1[i]) LINK->hetero += WITH->genarray[i]; } } /*riskcumul*/ Local Void riskcalc(LINK) struct LOC_likelihood *LINK; { double normal; LINK->homo /= like; LINK->hetero /= like; normal = 1 - LINK->homo - LINK->hetero; fprintf(outfile, "RISK FOR PERSON %6d IN PEDIGREE %7d\n", LINK->proband->id, LINK->proband->ped); if (!LINK->proband->male || !sexlink) fprintf(outfile, "HOMOZYGOTE CARRIER : %8.5f\n", LINK->homo); if (!LINK->proband->male || !sexlink) fprintf(outfile, "HETEROZYGOTE CARRIER : %8.5f\n", LINK->hetero); else fprintf(outfile, "MALE CARRIER : %8.5f\n", LINK->hetero); fprintf(outfile, "NORMAL : %8.5f\n", normal); printf("RISK FOR PERSON %6d IN PEDIGREE %7d\n", LINK->proband->id, LINK->proband->ped); if (!LINK->proband->male || !sexlink) printf("HOMOZYGOTE CARRIER : %8.5f\n", LINK->homo); if (!LINK->proband->male || !sexlink) printf("HETEROZYGOTE CARRIER : %8.5f\n", LINK->hetero); else printf("MALE CARRIER : %8.5f\n", LINK->hetero); printf("NORMAL : %8.5f\n", normal); } /*riskcalc*/ /*pollutedescendants finds which people descended from startper by depth first search and ensures that they will be reevaluated for each genotype of the loopbreaker */ /*This routine written by A. A. Schaffer*/ Local Void pollutedescendants(startper) thisperson *startper; { thisperson *nextchild; startper->loopdepend=true; nextchild = startper->foff; while(nextchild != NULL) { if (nextchild->loopdepend == false) pollutedescendants(nextchild); nextchild = nextchild->nextpa; } nextchild = startper->foff; while(nextchild != NULL) { if (nextchild->loopdepend == false) pollutedescendants(nextchild); nextchild = nextchild->nextma; } } #if LOOPSPEED /* This procedure takes the loopbreaker, joint-genotype array passed in 'loopgen' for the pedigree passed in 'ped'. It initializes the global array 'single_locus_vector_num' to hold, for each locus, the single-locus, loopbreaker vector number corresponding to 'loopgen'. (The loopbreaker vector numbers are indexes into 'loop_vectors'.) Written by Dylan in late 1994. */ static void translate_loop_vector(loopgen, ped) int loopgen[maxloop]; int ped; { int locus; /*loop index for loci*/ int loop; /*index on loops*/ int num_alleles; /*number of alleles for a locus*/ int left, mid, right; /* for binary search */ boolean found; /*used in binary search*/ int breaker; /*loop index for loop_breakers*/ int geno; /*genotype of loopbreaker*/ unsigned hap1, hap2; /*haplotypes of loop breaker*/ unsigned a, b, temp; /*hold haplotypes for swapping*/ int duplicates; /*duplicate genotypes due to heterozygous symmetry*/ /* holds at each locus the single locus genotype of each loop breaker */ int single_locus_geno[maxlocus][maxloop]; /* if no loops trivial */ if ( num_loops[ped] == 0 ) { for (locus = 0; locus < mlocus; locus++ ) { single_locus_vector_num[locus] = 0; } return; } /* for each loop breaker */ for (loop = 0; loop < num_loops[ped]; loop++) { /* get the loop breaker joint genotype and joint haplotypes */ geno = loopgen[loop] - 1; /*need to decrement since loopgen starts at 1*/ if (sexlink && (looppers[ped][loop][0]->male)) { hap1 = geno; /*already decremented*/ hap2 = geno; } else { hap1 = invgenenum1[geno] - 1; hap2 = invgenenum2[geno] - 1; } /* for each locus in reverse order */ for (locus = (mlocus - 1); locus >= 0; locus--) { num_alleles = thislocus[locus]->nallele; /* Calculate the left and right allele for this locus. I'm taking advantage of knowing how the joint haplotypes are computed in setval(). */ a = hap1 % num_alleles; hap1 = (hap1 - a) / num_alleles; b = hap2 % num_alleles; hap2 = (hap2 - b) / num_alleles; /* Calculate the the single loucs genotype, given the alleles. I'm taking advantage of knowing how the genotypes are calculated in unknown. */ if ( a > b ) { temp = a; a = b; b = temp; } duplicates = a * (a + 1) / 2; /* store the single locus genotype */ if (sexlink && (looppers[ped][loop][0]->male)) single_locus_geno[locus][loop] = a; else single_locus_geno[locus][loop] = (a * num_alleles) - duplicates + b; } } /* for each locus */ for (locus = 0; locus < mlocus; locus++) { /* binary search in 'loop_vectors[locus]' to find 'single_locus_geno[locus]' */ left = 0; right = num_loop_vectors[locus] - 1; mid = (int) right / 2; found = false; do { for (breaker = num_loops[ped] - 1; breaker >= 0; breaker--) { if ( single_locus_geno[locus][breaker] == loop_vectors[locus][mid][breaker]) { if ( breaker == 0 ) { found = true; } } else if (single_locus_geno[locus][breaker] < loop_vectors[locus][mid][breaker]) { right = mid; mid = (int) (right - left) / 2 + left; break; } else { left = mid; mid = (int) (right - left + 1) / 2 + left; break; } } /* for breaker */ if (found == true) { break; } } while (left < right); if (found == true) { single_locus_vector_num[locus] = mid; } else { printf("Error in translate loop vector.\n"); /* DYLAN error */ exit(EXIT_FAILURE); } } /* for each locus */ } /* translate_loop_vector */ #endif /*identify possible genotypes for one loop breaker and store in the two dimensional array loopbreaker_nextgeno, i is index of loop breakers and fill in loopmax[i]*/ #if LOOPSPEED Void find_loopbreaker_genotypes(ped,i, loopmax) int ped; int i; int *loopmax; { int geno, nextgeno; /*loop indices*/ int temploopmax; /*placeholder for value of loopmax[i]*/ thisarray *WITH1; /*placeholder for loop breaker genarray*/ if (i < num_loops[ped -1]) { WITH1 = looppers[ped - 1][i][0]->gen; for(geno = 0; geno < loopmax[i]; geno++) if(!(breaker_poss_genotype[i][geno])) { WITH1->genarray[geno] = 0.0; WITH1->sparseflag[geno] = false; } } /*Initialize sparse array of possible genotypes for loop-Breakers*/ loopbreaker_nextgeno[i] = (int *) malloc(loopmax[i] * sizeof(int)); if (loopbreaker_nextgeno[i] == NULL) malloc_err("loopbreaker_nextgeno entry"); WITH1 = looppers[ped - 1][i][0]->gen; for(geno = 0, nextgeno=0; geno < loopmax[i]; geno++) { while ((nextgeno < loopmax[i]) && (WITH1->genarray[nextgeno] == 0.0)) nextgeno++; loopbreaker_nextgeno[i][geno] = nextgeno; if (nextgeno < loopmax[i]) temploopmax = nextgeno + 1; geno = nextgeno; nextgeno++; } loopmax[i] = temploopmax; } #endif /*LOOP_SPEED*/ #if LOOPSPEED extern void infer_genotypes(int curr_ped); #endif /* likelihood computes the likelihood for thisped_ with proband_ as root of the computation. Modified by Dylan in late 1994 to use 'unknown_poss'. Modified further in mid 1995 by A.A. Schaffer to generate possible loop-breaker vectors more effectively */ Void likelihood(thisped_, proband_) int thisped_; thisperson *proband_; { #if !defined(LESSMEMORY) int ti, tj; /* put in by R. M. Idury */ #endif /* !defined(LESSMEMORY) */ struct LOC_likelihood V; int loopmax[maxloop]; double tmplike; int i, j; boolean gocalc, alldone; thisperson *WITH; thisarray *WITH1; int lastgen; /*last genotype that first loop breaker can have*/ #if LOOPSPEED int locus; /*loop index on loci*/ boolean is_zero; /*does this loop-breaker vector give a 0.0 likelihood?*/ int nuscale_count; /*Count how many times we get a non-zero loop-breaker so that scaling will be scale one time through (per_iter_scale) * nuscale_count */ int per_iter_scale; #if LOOP_BREAKERS int copyIndex; #endif /*LOOP_BREAKERS*/ #endif /*LOOPSPEED*/ /* cgh -- added this for gcc warning */ lastgen = 0; V.thisped = thisped_; V.proband = proband_; #if ALLELE_SPEED #if PARALLEL sharedCurrentPed[Tmk_proc_id] = thisped_; #endif /*PARALLEL*/ recompute_haps(thisped_, true); currentped = thisped_; #endif /*ALLELE_SPEED*/ if (!informative[V.thisped - 1]) { like = 0.0; return; } V.homo = 0.0; V.hetero = 0.0; tmplike = 0.0; alldone = false; V.nuscale = 0; /* Next two pieces of code added by A. A. Schaffer*/ /* initialize loop structure; all descendants of place where first loop is broken will need to be update for each genotype*/ for (i = 1; i <= totperson; i++) { person[i]->loopdepend = false; person[i]->loopneeded = false; person[i]->gen = NULL; } if (looppers[V.thisped-1][0][0] != NULL){ /*G OK*/ #if LOOP_BREAKERS for(copyIndex = 0; copyIndex < numCopies[V.thisped-1][0]; copyIndex++) pollutedescendants(looppers[V.thisped-1][0][copyIndex]); /*G OK*/ #else pollutedescendants(looppers[V.thisped-1][0][0]); /*G OK */ pollutedescendants(looppers[V.thisped-1][0][1]); /*G OK*/ #endif /*LOOP_BREAKERS*/ for (i = 1; i <= totperson; i++) { WITH = person[i]; WITH->newgenexists = false; WITH->done = false; WITH->up = false; } precollapseup(V.proband); precollapsedown(V.proband); } #if LOOPSPEED /*initialization, A.A. Schaffer*/ nuscale_count =0; per_iter_scale = 0; infer_genotypes(V.thisped); #endif for (i = 0; i < maxloop; i++) { V.loopgen[i] = 1; loopmax[i] = 1; V.holdpoint[i] = NULL; if (looppers[V.thisped - 1][i][0] != NULL) { /*G OK*/ WITH = looppers[V.thisped - 1][i][0]; /*G OK*/ WITH->gen = (thisarray *)Malloc(sizeof(thisarray)); if (WITH->gen == NULL) malloc_err("gen field in likelihood"); allocate_thisarray(WITH->gen, fgeno); WITH->newgenexists = true; /*Added by A. A. Schaffer*/ WITH1 = WITH->gen; for (j = 0; j < fgeno; j++) WITH1->genarray[j] = 0.0; getvect(looppers[V.thisped - 1][i][0], &V); /*G OK*/ if (looppers[V.thisped - 1][i][0]->pa == NULL) /*G OK*/ V.nuscale++; V.holdpoint[i] = WITH->gen; if (WITH->male) loopmax[i] = mgeno; else loopmax[i] = fgeno; #if LOOPSPEED find_loopbreaker_genotypes(V.thisped, i, loopmax); V.loopgen[i] = loopbreaker_nextgeno[i][0] + 1; #endif WITH->gen = NULL; WITH->newgenexists = false; /*Added by A. A. Schaffer*/ } } V.loopgen[0] = 0; /*find last nonzero genotype in first loop genarray*/ /*Added by A. A. Schaffer*/ if (looppers[V.thisped-1][0][0] != NULL){ /*G OK*/ for (j = loopmax[0]-1; j>=0; j--){ if (V.holdpoint[0]->genarray[j] > 0.0){ lastgen =j; break; } } } /*Next line added by A. A. Schaffer*/ loopfirstgen = 1; do { i = 1; /*Next line added by A. A. Schaffer*/ looplastgen = 0; do { V.loopgen[i - 1]++; #if LOOPSPEED /*If we have a loop get the next possible genotype for first loop-breaker or wrap-arraound to its first possible genotype*/ if (looppers[V.thisped-1][0][0] != NULL){ /*G OK*/ if (V.loopgen[i - 1] > loopmax[i - 1]) V.loopgen[i - 1] = loopbreaker_nextgeno[i-1][0] + 1; else { V.loopgen[i - 1] = loopbreaker_nextgeno[i -1][V.loopgen[i-1] - 1] + 1; i = maxloop; } /*Added by A. A. Schaffer*/ if (i == 1) loopfirstgen = 1; } else { loopfirstgen = 1; i = maxloop; } #else /*!LOOPSPEED*/ if (V.loopgen[i - 1] > loopmax[i - 1]) { V.loopgen[i - 1] = 1; /*Added by A. A. Schaffer*/ if (i == 1) loopfirstgen = 1; } else i = maxloop; #endif /*LOOPSPEED*/ i++; } while (i <= maxloop); gocalc = true; for (i = 0; i < maxloop; i++) { /*ML change*/ if (V.holdpoint[i] != NULL) { if (V.holdpoint[i]->genarray[V.loopgen[i] - 1] == 0.0) gocalc = false; else /*else clause added by A. A. Schaffer*/ if ((i == 0) && ((V.loopgen[i] - 1) == lastgen)) looplastgen = 1; } } if (gocalc) { #if LOOPSPEED nuscale_count++; /* get per locus loop vectors from joint genotype loop vector */ translate_loop_vector(V.loopgen, V.thisped - 1); is_zero = false; for(locus = 0; locus < mlocus; locus++) if (is_zero_breaker[locus] [single_locus_vector_num[locus]]) is_zero = true; if (is_zero) like = 0.0; else { #endif for (i = 1; i <= totperson; i++) { WITH = person[i]; /*next four lines written by A. A. Schaffer*/ if (loopfirstgen || !(WITH->loopneeded)) { if (WITH->gen) #if !PARALLEL { free(WITH->gen->sparseflag); free(WITH->gen->genarray); free(WITH->gen); } #else ggeninuse[currentthetanum][WITH->memindex] = 0; /*Used to free cell in genbank for parallel computation*/ #endif WITH->gen = NULL; } WITH->newgenexists = false; WITH->done = false; WITH->up = false; } /* accumulate segprob entries */ /* next test written by R. M. Idury*/ #if ((!defined(LESSMEMORY)) && ((!PARALLEL) || (PRECOMPUTE))) for(ti = 0; ti < nuneed; ti++) for(tj = 0; tj < nuneed; tj++) segprob2[ti*nuneed+tj] = maletheta->segprob[ti] * femaletheta->segprob[tj]; getprobtable(); #endif collapseup(V.proband, &V); collapsedown(V.proband, &V); like = 0.0; WITH1 = V.proband->gen; if (V.proband->male) { for (i = 0; i < mgeno; i++) like += WITH1->genarray[i]; } else { for (i = 0; i < fgeno; i++) like += WITH1->genarray[i]; } /*Added by Alex*/ loopfirstgen = 0; tmplike += like; /*Every pass through the pedigree increases the scaling by the same amount, so we can assign it to per_iter_scale and mutiply by nuscale_count. A. A. Schaffer */ #if LOOPSPEED if ((per_iter_scale == 0) && (V.nuscale != 0)) per_iter_scale = V.nuscale; #endif if (risk && like != 0.0) riskcumul(&V); for (i = 1; i <= totperson; i++) { if (person[i]->gen != NULL) cleanup(&person[i], &V); } #if LOOPSPEED } #endif } alldone = true; for (i = 0; i < maxloop; i++) alldone = (alldone && V.loopgen[i] == loopmax[i]); } while (!alldone); like = tmplike; if (risk && like != 0.0) riskcalc(&V); if (ped_nuscales[V.thisped - 1] == 0) #if LOOPSPEED ped_nuscales[V.thisped - 1] = nuscale_count * per_iter_scale; #else ped_nuscales[V.thisped - 1] = V.nuscale; #endif /*LOOPSPEED*/ looplastgen = 1; for (i = 1; i <= totperson; i++) { if (person[i]->gen != NULL) cleanup(&person[i], &V); } if (like == 0.0) like = zerolike; else /*Next line changed by A. A. Schaffer to avoid recomputation of V.nuscale*/ like = log(like) - ped_nuscales[V.thisped - 1] *log(segscale); for (i = 0; i < maxloop; i++) { if (V.holdpoint[i] != NULL) { Free(V.holdpoint[i]); V.holdpoint[i] = NULL; #if LOOPSPEED /*Cleanup the extra array to store loop-breaker genotypes*/ free(loopbreaker_nextgeno[i]); loopbreaker_nextgeno[i]= NULL; #endif } } } /*likelihood*/ void allocate_loopbreaker_vectors() { int ped; ped_nuscales = (int *) malloc(nuped * sizeof(int *)); for (ped = 1; ped <= nuped; ped++) { ped_nuscales[ped - 1] = 0; } } #if PARALLEL void allocthetas() { maletheta = (thetavalues *) malloc(sizeof(thetavalues)); femaletheta = (thetavalues *) malloc(sizeof(thetavalues)); } /*allocgen is used by the parallel code to allocate the space for genarrays and other shred memory data structures*/ void allocgen() { int i, j, k, w; double *tempwith1; unsigned char *tempflag1; unsigned numparams; /* number of parallel parameters */ unsigned maxThetas; /* max number of thetas */ if (Tmk_proc_id == 0) { #if PARALLEL_GCENTRAL numparams = maxThetas = 2 * maxn; #elif (defined(MLINK) || defined(LINKMAP)) /* cgh */ numparams = calcNumparams(); maxThetas = numIpeds; gZeroTheta = (boolean*) Tmk_malloc(sizeof(boolean) * numIpeds); if (!gZeroTheta) Tmk_errexit("MALLOC ERROR - gZeroTheta\n"); Tmk_distribute((char*) &gZeroTheta, sizeof(gZeroTheta)); absoluteThetaIndex = (int*) Tmk_malloc(sizeof(int) * numIpeds); if (!absoluteThetaIndex) Tmk_errexit("MALLOC ERROR - absoluteThetaIndex\n"); Tmk_distribute((char*) &absoluteThetaIndex, sizeof(absoluteThetaIndex)); firstThetanum = (int*) Tmk_malloc(sizeof(int)); if (!firstThetanum) Tmk_errexit("MALLOC ERROR - firstThetanum\n"); Tmk_distribute((char*) &firstThetanum, sizeof(firstThetanum)); #else /* if PARALLEL_GCENTRAL -- cgh */ numparams = maxThetas = maxn; #endif /* if PARALLEL_GCENTRAL */ gmaletheta = (thetarray *) Tmk_malloc(sizeof(thetarray) * maxThetas); if (!gmaletheta) Tmk_errexit("MALLOC ERROR - gmaletheta\n"); Tmk_distribute((char *) &gmaletheta,sizeof(gmaletheta)); gfemaletheta = (thetarray *) Tmk_malloc(sizeof(thetarray) * maxThetas); if (!gfemaletheta) Tmk_errexit("MALLOC ERROR - gfemaletheta\n"); Tmk_distribute((char *) &gfemaletheta,sizeof(gfemaletheta)); gmalesegprob = (double **) Tmk_malloc(sizeof(double *) * numparams); if (!gmalesegprob) Tmk_errexit("MALLOC ERROR - gmalesegprob\n"); Tmk_distribute((char *) &gmalesegprob,sizeof(gmalesegprob)); for(i = 0; i < numparams; i++) { gmalesegprob[i] = (double *) Tmk_malloc(sizeof(double) * nuneed); if (!gmalesegprob[i]) Tmk_errexit("MALLOC ERROR - gmalesegprob entry %d", i); } gfemalesegprob = (double **) Tmk_malloc(sizeof(double *) * numparams); if (!gfemalesegprob) Tmk_errexit("MALLOC ERROR - gfemalesegprob\n"); Tmk_distribute((char *) &gfemalesegprob,sizeof(gfemalesegprob)); for(i = 0; i < numparams; i++) { gfemalesegprob[i] = (double *) Tmk_malloc(sizeof(double) * nuneed); if (!gfemalesegprob[i]) Tmk_errexit("MALLOC ERROR - gfemalesegprob entry %d", i); } ggeninuse = (char**) Tmk_malloc(numparams * sizeof(char*)); if (!ggeninuse) Tmk_errexit("MALLOC ERROR - ggeninuse\n"); Tmk_distribute((char *) (&ggeninuse), sizeof(ggeninuse)); ggenbank = (thisarray**) Tmk_malloc(numparams * sizeof(thisarray*)); if (!ggenbank) Tmk_errexit("MALLOC ERROR - ggenbank\n"); Tmk_distribute((char *) (&ggenbank), sizeof(ggenbank)); for(i = 0; i < numparams; i++) { ggeninuse[i] = (char*) Tmk_malloc(maxworkingset * sizeof(char)); if (!ggeninuse[i]) Tmk_errexit("MALLOC ERROR - ggeninuse[i]\n"); ggenbank[i] = (thisarray*) Tmk_malloc(maxworkingset * sizeof(thisarray)); if (!ggenbank[i]) Tmk_errexit("MALLOC ERROR - ggenbank[%d]\n", i); for (w =0; w < maxworkingset; w++) { ggenbank[i][w].sparseflag = (unsigned char *) Tmk_malloc(maxfemgen * sizeof(unsigned char)); if (!(ggenbank[i][w].sparseflag)) Tmk_errexit("MALLOC ERROR - ggenbank[%d][%d]\n", i, w); ggenbank[i][w].genarray = (double *) Tmk_malloc(maxfemgen * sizeof(double)); if (!(ggenbank[i][w].genarray)) Tmk_errexit("MALLOC ERROR - ggenbank[%d][%d]\n", i, w); } } for(k = 0; k < numparams; k++) for (i = 0; i < maxworkingset; i++) { tempwith1 = (&(ggenbank[k][i]))->genarray; tempflag1 = (&(ggenbank[k][i]))->sparseflag; for(j = 0; j < fgeno; j++) { tempflag1[j] = 0; tempwith1[j] = 0.0; } ggeninuse[k][i] = 0; } arrgene = (double **) Tmk_malloc(Tmk_nprocs * (sizeof(double *))); if (!arrgene) Tmk_errexit("MALLOC ERROR - arrgene\n"); Tmk_distribute((char *) &arrgene, sizeof(arrgene)); for (i=0; i < Tmk_nprocs; i++) { arrgene[i] = (double *) Tmk_malloc(maxfemgen * sizeof(double)); if (!arrgene[i]) Tmk_errexit("MALLOC ERROR - arrgene[%d]\n", i); } arrqsumcache = (double **) Tmk_malloc(Tmk_nprocs * (sizeof(double *))); if (!arrqsumcache) Tmk_errexit("MALLOC ERROR - arrqsumcache\n"); Tmk_distribute((char *) &arrqsumcache, sizeof(arrqsumcache)); for (i=0; i < Tmk_nprocs; i++) { arrqsumcache[i] = (double *) Tmk_malloc(sizeof(double)*maxhaplo); if (!arrqsumcache[i]) Tmk_errexit("MALLOC ERROR - arrqsumcache[%d]\n", i); } arrpsumcache = (double **) Tmk_malloc(Tmk_nprocs * (sizeof(double *))); if (!arrpsumcache) Tmk_errexit("MALLOC ERROR - arrpsumcache\n"); Tmk_distribute((char *) &arrpsumcache, sizeof(arrpsumcache)); for (i = 0; i < Tmk_nprocs; i++) { arrpsumcache[i] = (double *) Tmk_malloc(sizeof(double)*maxhaplo); if (!arrpsumcache[i]) Tmk_errexit("MALLOC ERROR - arrpsumcache[%d]\n", i); } gpnonzgens = (unsigned int**) Tmk_malloc(numparams * sizeof(unsigned int*)); if(!gpnonzgens) Tmk_errexit("MALLOC ERROR - gpnonzgens\n"); Tmk_distribute((char *) &gpnonzgens, sizeof(gpnonzgens)); gqnonzgens = (unsigned int**) Tmk_malloc(numparams * sizeof(unsigned int*)); if(!gqnonzgens) Tmk_errexit("MALLOC ERROR - gqnonzgens\n"); Tmk_distribute((char *) &gqnonzgens, sizeof(gqnonzgens)); for(i = 0; i < numparams; i++) { gpnonzgens[i] = (unsigned int *) Tmk_malloc(maxfemgen * sizeof(unsigned int)); if(!gpnonzgens[i]) Tmk_errexit("MALLOC ERROR - gpnonzgens[%d]\n", i); gqnonzgens[i] = (unsigned int *) Tmk_malloc(maxfemgen * sizeof(unsigned int)); if(!gqnonzgens[i]) Tmk_errexit("MALLOC ERROR - gqnonzgens[%d]\n", i); } #if FUNTIMES #if PARALLEL_GCENTRAL executionTimes = (double *) Tmk_malloc(2 * maxn * sizeof(double)); if (!executionTimes) Tmk_errexit("MALLOC ERROR - executionTimes\n"); Tmk_distribute((char *) &executionTimes, sizeof(executionTimes)); #else /* !PARALLEL_GCENTRAL */ /* either maxn, or numIpeds */ executionTimes = (double **) Tmk_malloc(maxThetas * sizeof(double*)); if (!executionTimes) Tmk_errexit("MALLOC ERROR - executionTimes\n"); Tmk_distribute((char *) &executionTimes, sizeof(executionTimes)); for(i = 0; i < maxThetas; i++) { executionTimes[i] = (double *) Tmk_malloc(2 * sizeof(double)); if (!executionTimes[i]) Tmk_errexit("MALLOC ERROR - executionTimes[%d]\n",i); } #endif /* PARALLEL_GCENTRAL */ #endif /*FUNTIMES*/ #if ALLELE_SPEED sharedCurrentPed = (int *) Tmk_malloc(Tmk_nprocs * sizeof(int)); if (!sharedCurrentPed) Tmk_errexit("MALLOC ERROR - sharedCurrentPed\n"); Tmk_distribute((char *) &sharedCurrentPed, sizeof(sharedCurrentPed)); for(i=0; i < Tmk_nprocs; i++) sharedCurrentPed[i] = 0; #endif /*ALLELE_SPEED*/ } } #endif /* PARALLEL */ /* Memory-estimation routines */ static void mem_collapsedown(); Local Void mem_cleanup(p) thisperson **p; { thisperson *WITH; WITH = *p; if (!(WITH->loopneeded)) { WITH->newgenexists = false; memcount --; } } /*mem_cleanup*/ Local Void mem_prob(p) thisperson **p; { thisperson *WITH; WITH = *p; if (WITH->newgenexists) return; /*Fixed by A. A. Schaffer*/ WITH->newgenexists = true; memcount++; if (memcount > maxmemcount) maxmemcount = memcount; } /* mem_prob */ Local Void mem_initseg(father, mother) thisperson *father, *mother; { thisperson *child; mem_prob(&father); mem_prob(&mother); child = father->foff; nchild = 0; do { mem_prob(&child); if (child->ma == mother && (!child->up)) { nchild++; childarray[nchild - 1] = child; /*Line added by A. A. Schaffer*/ } child = child->nextpa; } while (child != NULL); if (nchild > maxchild) { fprintf(stderr, "\nA nuclear family has more children than maxchild"); fprintf(stderr, "\nThe program will exit politely to allow you to"); fprintf(stderr, "\nincrease maxchild in the file commondefs.h"); exit(EXIT_FAILURE); } } /* mem_initseg*/ Local Void mem_exitseg(father, mother) thisperson *father, *mother; { thisperson *child; child = father->foff; do { if (child->ma == mother && (!child->up)) mem_cleanup(&child); child = child->nextpa; } while (child != NULL); } /*mem_exitseg*/ Local Void mem_segup(p, q, child) thisperson *p, *q, *child; { thisperson *father, *mother; boolean depend; int i; if (p->male) { father = p; mother = q; } else { father = q; mother = p; } mem_initseg(father, mother); if (!p->loopdepend) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || (q->loopdepend)); if (depend) { p->loopdepend = depend; p->loopneeded = false; } } if (p->loopdepend) { if (!(q->loopdepend)) (q->loopneeded) = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } mem_cleanup(&q); mem_exitseg(father, mother); } /* mem_segup*/ Local Void mem_segdown(p, q, child) thisperson *p, *q, *child; { boolean depend; int i; mem_initseg(p, q); if (!(child->loopdepend)) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || (p->loopdepend) || (q->loopdepend)); if (depend) { child->loopdepend = depend; child->loopneeded = false; } } if (child->loopdepend) { if (!(p->loopdepend)) p->loopneeded = true; if (!(q->loopdepend)) q->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } mem_cleanup(&p); mem_cleanup(&q); mem_exitseg(p, q); } /* mem_segdown*/ Local Void mem_collapseup(p) thisperson *p; { thisperson *q, *child, *nextchild; boolean down; p->done = true; if (p->foff == NULL) return; down = false; child = p->foff; while (child != NULL) { down = false; if (p->male) q = child->ma; else q = child->pa; if (!q->done) { mem_collapsedown(q); nextchild = child; while (nextchild != NULL) { if (nextchild->pa == q || nextchild->ma == q) { if (!nextchild->up) mem_collapseup(nextchild); else down = true; } if (p->male) nextchild = nextchild->nextpa; else nextchild = nextchild->nextma; } if (q->multi) mem_collapseup(q); if (!down) mem_segup(p, q, child); else mem_collapsedown(p); } if (p->male) child = child->nextpa; else child = child->nextma; } } /*mem_collapseup*/ Local Void mem_collapsedown(p) thisperson *p; { if (p->pa == NULL) return; p->up = true; mem_collapseup(p->pa); mem_segdown(p->pa, p->ma, p); } /*collapsedown*/ /*Written by A. A. Schaffer to estimate the maximum size of the cutset so as to know how many thisarray's will be needed*/ int maxw_estimation() { int maxcount; int ped, id; #if LOOP_BREAKERS int copyIndex; #endif maxcount = 0; for(ped = 1; ped <=nuped; ped++) { memcount = maxmemcount = 0; for(id = 1; id <= totperson; id++) { person[id]->newgenexists = false; person[id]->up = false; person[id]->done = false; person[id]->loopdepend = false; person[id]->loopneeded = false; } if(looppers[ped -1][0][0] != NULL) { /*G OK*/ #if LOOP_BREAKERS for(copyIndex = 0; copyIndex < numCopies[ped-1][0]; copyIndex++) pollutedescendants(looppers[ped-1][0][copyIndex]); /*G OK*/ #else pollutedescendants(looppers[ped-1][0][0]); /*G OK */ pollutedescendants(looppers[ped-1][0][1]); /*G OK*/ #endif /*LOOP_BREAKERS*/ precollapseup(proband[ped - 1]); precollapsedown(proband[ped - 1]); for(id = 1; id <= totperson; id++) { person[id]->up = false; person[id]->done = false; } /*do one extra traversal for loops to simulate second genotype of loopbreaker*/ mem_collapseup(proband[ped - 1]); mem_collapsedown(proband[ped - 1]); for(id = 1; id <= totperson; id++) { person[id]->up = false; person[id]->done = false; if (person[id]->newgenexists && (!(person[id]->loopneeded))) mem_cleanup(&(person[id])); } } mem_collapseup(proband[ped - 1]); mem_collapsedown(proband[ped - 1]); if (maxmemcount > maxcount) maxcount = maxmemcount; } for(id = 1; id <= totperson; id++) { person[id]->newgenexists = false; person[id]->up = false; person[id]->done = false; person[id]->loopdepend = false; person[id]->loopneeded = false; } return(maxcount); } fastlink-4.1P-fix95/4.1P/src/unknown.h0000644000265600020320000002441210477620326016472 0ustar tilleaadmin/*header file for loopbrk.c and unknown.c*/ #include /* Shriram: begin */ #include #include /* VMS: MAY NEED TO CHANGE -- possibly remove "sys/" from the next 3 lines */ #include #include #include /* Shriram: end */ #include /* cgh */ #if !defined(vms) #include #endif /* VMS: MAY NEED TO CHANGE -- comment out any of the next 3 lines for files your system can't find */ #include #include #include /* end cgh */ #if defined(vms) #define unlink delete #endif /* If LOOPSPEED is defined, the file whose name is defined in the macro LOOPFILE_NAME is created. If defined here, define in commondefs.h as well. */ #if !defined(LOOPSPEED) #define LOOPSPEED 1 #endif #if LOOPSPEED #endif /*LOOPSPEED */ #define aVersion "5.20" /*PRESENT VERSION OF LINKAGE*/ #define fVersion "4.1P" /*PRESENT VERSION OF FASTLINK*/ #if LOOPSPEED /* max number of loop vectors that we will consider at any locus this is used to bound the number of loops we consider in unknown_poss we will always consider at least one loop if there are any */ #define max_vectors_considered 10000 int fewer_vects_size; /* used for diagnostics when above macro is too big */ #endif /*ALLELE_SPEED is used to set up renumbering of alleles when not all alleles are present in a pedigree*/ #if !defined(ALLELE_SPEED) #define ALLELE_SPEED 1 #endif #define ALLELE_SPEED_CONSTANT 61192012 #if LOOPSPEED #if !defined(LOOP_BREAKERS) #define LOOP_BREAKERS 1 #endif /*LOOP_BREAKERS*/ #else #if !defined(LOOP_BREAKERS) #define LOOP_BREAKERS 0 #endif /*LOOP_BREAKERS*/ #endif /*LOOPSPEED */ #ifndef EXIT_FAILURE #ifdef vms #define EXIT_FAILURE (02000000000L) #else #ifndef SOLARIS #define EXIT_FAILURE (-1) #endif /* SOLARIS */ #endif /*from p2c.h*/ #endif #ifndef EXIT_SUCCESS #ifdef vms #define EXIT_SUCCESS 1 #else #define EXIT_SUCCESS 0 #endif /*from p2c.h*/ #endif #define WHITE_SPACE " \n\r\t\v" #define maxlocus 30 /*MAXIMUM NUMBER OF LOCI*/ #define maxall 25 /*MAX NUMBER OF ALLELES AT A SINGLE LOCUS*/ #define maxgeno (maxall * (maxall + 1) / 2) /*MAX NUMBER OF SINGLE LOCUS GENOTYPES*/ /*Different definition than in analysis programs!*/ #define maxind 2000 /*MAXIMUM NUMBER OF INDIVIDUALS IN A PEDIGREE*/ #define maxmarriage 8 /*MAXIMUM NUMBER OF MARRIAGES FOR ONE MALE*/ #define maxloop 8 #define maxfact maxall /*MAXIMUM NUMBER OF BINARY CODES AT A SINGLE LOCUS*/ #define maxtrait 3 /*MAXIMUM NUMBER OF QUANTITATIVE FACTORS AT A SINGLE LOCUS*/ #define missval 0.0 /*MISSING VALUES FOR QUANTITATIVE TRAITS*/ #define affall 2 /*DISEASE ALLELE FOR QUANT. TRAITS OR AFFECTION STATUS*/ #define missaff 0 /*MISSING VALUE FOR AFFECTION STATUS*/ #define affval 2 /*CODE FOR AFFECTED INDIVIDUAL*/ #define maxliab 120 /*MAXIMUM NUMBER OF LIABILITY CLASSES*/ #define binformat 2 #define allformat 3 #ifndef NULL #define NULL 0 #endif #define FileNotFound 10 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef EXIT_FAILURE #ifdef vms #define EXIT_SUCCESS 1 #define EXIT_FAILURE (02000000000L) #else #define EXIT_SUCCESS 0 #define EXIT_FAILURE (-1) #endif #endif #define Malloc malloc #define Free free #if LOOPSPEED #define LOOPFILE_NAME "loopfile.dat" #if LOOP_BREAKERS #define COUNTFILE_NAME "countfile.dat" #define TPEDFILE_NAME "tpedfile.dat" #define LPEDFILE_NAME "lpedfile.dat" #endif /*LOOP_BREAKERS*/ #endif /*LOOPSPEED*/ #if !defined(ONE_ERROR_ONLY) #define ONE_ERROR_ONLY 0 /*print one sure error, or all possible errors*/ #endif #if !defined(DEPTH_MULTIPLE) #define DEPTH_MULTIPLE 3 #endif #if !defined(DOWN_CHECK) #define DOWN_CHECK TRUE #endif #define OLD 1 /*compatible with original unknown.c*/ #define NEW 2 #define NEWFIRST 3 #define NEWSECOND 4 #define OLD2 5 #define FIRST 1 #define SECOND 2 /*Possible status for inidividual number i while reading pedfile.dat*/ #define NOT_FOUND 0 #define FOUND_AS_SELF 1 #define FOUND_AS_PARENT 2 #define DUPLICATED 3 #define FILE_NAME_LENGTH 30 /*from p2c*/ typedef char boolean; typedef boolean genotype[maxgeno]; typedef enum { peelup, peeldown } direction; typedef long binset; typedef binset phenarray[maxall]; typedef boolean possvect[maxall][maxall]; typedef possvect possarray[maxlocus]; typedef enum { affection, quantitative, binary_ } locustype; typedef struct locusvalues { long nallele; long maxallele; locustype which; double onefreq; #if LOOPSPEED long fgeno; /* number of genotypes at this locus */ long mgeno; #endif union { long ntrait; struct { double pen[maxall + 1][maxall][3][maxliab]; long nclass; } U0; struct { phenarray allele; long nfactor, format; } U2; } UU; } locusvalues; typedef struct phenotype { locustype which; double x[maxtrait]; boolean missing; long aff; long liability; binset phenf; /*encodes phenotype/genotype in pedin.dat as a bit vector */ int allele1; int allele2; } phenotype; typedef phenotype *indphen[maxlocus]; typedef struct thisarray { genotype genarray; } thisarray; typedef struct information { possarray possible; } information; typedef struct thisperson { long id, paid, maid, offid, npaid, nmaid, sex, profield, oldped, nseq; struct thisperson *pa, *ma, *foff, *nextpa, *nextma; thisarray *gen; indphen phen; #if !LOOPSPEED information *store; #endif boolean thisunknown[maxlocus]; boolean unknown, multi, done, up, male; boolean downvisit; /*added by A. A. Schaffer for diagnostic*/ } thisperson; #if LOOPSPEED /* These typedefs define the table to hold the valid loopbreaker vectors for each locus. */ typedef int *vector_for_loop; typedef vector_for_loop *vector_for_locus; typedef vector_for_locus *loop_vector_array; #endif #if LOOPSPEED /* These typedefs define the table to hold the possible genotypes for each unknown person at each locus for each valid loopbreaker vector. */ typedef boolean *geno_for_loop_vector; typedef geno_for_loop_vector *geno_for_locus; typedef geno_for_locus *geno_for_unknown; #endif #if LOOPSPEED /* basic linked list stuff */ typedef struct List_Elt { struct List_Elt *next; int value; } list_elt; typedef struct Simple_List { list_elt *head; list_elt *curr; } simple_list; #endif /* Dylan -- changed haplotype from enumerated type of {a,b} -- done in mid 1994 */ typedef unsigned char haplotype; typedef long subhap[2]; typedef struct new_locus_info { int present; /*is this allele present?*/ int new_allele; /*what is this allele mapped to?*/ int old_allele; /*inverse of mapping*/ } new_locus_info; typedef int new_allele_count[maxlocus]; /*Adjusted allele counts for each pedigree and locus*/ new_allele_count *ped_new_allele_count; /* Does this pedigree have different adjusted allele counts from the previous pedigree? */ boolean *ped_must_change_locations; /* dwix: begin */ #define DEFAULT_STRING_LENGTH 500 /* type definitions for *allele_downcode_check* */ typedef new_locus_info loc_all[maxlocus][maxall+1]; loc_all *ped_loc_all; int currentped, currentlocus; int *pedidx2num; /* dwix: end */ #define maxmar 5 /* max number of marriages --- should be defined in unknown.c */ #define maxindperpedigree 300 /* max number of individuals in one pedigree --- should be defined in unknown.c */ #define maxnode maxindperpedigree*2 /* max number of individuals and families */ #define MAXIN 10000 /* max number */ #define MAXPED 500 #define epsilon 0.0000001 /* small float to reduce dividing by zero */ #define LINEN 9 /* number of relevant fields in each line */ #define COUNTFILE_WORD_LENGTH 50 /* max number of chracters in a string in countfile */ #define COUNTFILE_LINE_LENGTH 500 /* max number of characters in each line of countfile */ #define UNVISITED 0 #define VISITED 1 #define EXPANDED 2 #define MALE 1 #define FEMALE 2 /*Next 9 constants are for the first 9 columns of pedigree file*/ #define LINE_PEDIGREE 0 #define LINE_ID 1 #define LINE_PA 2 #define LINE_MA 3 #define LINE_FOFF 4 #define LINE_NEXTPA 5 #define LINE_NEXTMA 6 #define LINE_GENDER 7 #define LINE_PROFIELD 8 /* * Directed node structure */ typedef struct DNODE_ { int fSelected; /* flag = true if node is selected */ int fFamilyNode; /* flag = true if node represents a family and false if node is an individual */ int indegree, outdegree; /* number of parents, children */ int in[maxnode], out[maxnode]; /* array of possible parents, children, where in[x] is true iff x is a parent of this node */ } DNODE, *PDNODE; /* * Undirected node structure */ typedef struct NODE_ { int fSelected; /* flag = true if node selected */ int degree; /* number of neighbors */ int D[maxnode]; /* array of neighbors, where D[i]=true iff i is a neighbor of this node */ int sel[maxnode]; /* help array */ } NODE, *PNODE; /* * persons structure */ typedef struct TMPERSON_ { /*fields for id, father's id, mother's id, id of first child, id of next child with same father, id of next child with same mother, gender, cycle indicator*/ long id, paid, maid, foff, nextpa, nextma, sex, cycle; long numMarriages; /*number of marriages*/ long numCopies; /*number of clones of this person*/ long marriages[maxmar]; /*array of spouse ids*/ /*weight, number of homozygous and heterozygous single-locus genotypes possible at each locus*/ long weight, homoz[maxlocus], heteroz[maxlocus]; double weight_log; /*logarithm of weight*/ } PERSON; long nsystem; /*number of loci*/ locusvalues *thislocus[maxlocus]; /*description of each locus*/ char pedfilename[FILE_NAME_LENGTH]; #if LOOP_BREAKERS void loopbreakers(); void detectLoopedPedigrees(boolean *islooped); void loopbreakers2(FILE *lpedfile); #endif fastlink-4.1P-fix95/4.1P/src/ligetvect.c0000644000265600020320000000400006737460342016747 0ustar tilleaadmin/* This file contains some low level probability routines used in the LINKMAP program */ #include "commondefs.h" /* Local variables for getvect: */ struct LOC_getvect { struct LOC_likelihood *LINK; thisperson *p; hapvector hap1, hap2; } ; /*Local Void getgene PP((int syste, double val, struct LOC_getvect *LINK)); Local Void ugetgene PP((int syste, double val, struct LOC_getvect *LINK));*/ /*static void getgene (int syste, double val, struct LOC_getvect *LINK); static void ugetgene (int syste, double val, struct LOC_getvect *LINK);*/ static void getgene (); static void ugetgene (); Local double quanfun(phen, thislocus, i, j, mean, LINK) phenotype *phen; locusvalues *thislocus; int i, j; double *mean; struct LOC_getvect *LINK; { double val; int it, jt, FORLIM, FORLIM1; val = 1.0; if (phen->missing) return val; val = 0.0; FORLIM = thislocus->UU.U1.ntrait; for (it = 0; it < FORLIM; it++) { FORLIM1 = thislocus->UU.U1.ntrait; for (jt = 0; jt < FORLIM1; jt++) { if (i == j) val += thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); else val += thislocus->UU.U1.conmat * thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); } } val = thislocus->UU.U1.det * exp(-val * 0.5); if (i != j) val *= thislocus->UU.U1.contrait; return val; } /*quanfun*/ Local Void getval(syste, i, j, val, LINK) int syste, i, j; double *val; struct LOC_getvect *LINK; { locusvalues *WITH; phenotype *WITH1; WITH = thislocus[syste - 1]; switch (WITH->which) { case quantitative: *val *= quanfun(LINK->p->phen[syste - 1], thislocus[syste - 1], i, j, WITH->UU.U1.pm[i][j - 1], LINK); break; case affection: WITH1 = LINK->p->phen[syste - 1]; *val *= WITH->UU.U0.pen[i][j - 1][WITH1->aff] [WITH1->liability - 1]; break; /* cgh -- added this for gcc */ case binary_: case null_: default: break; } } /*getval*/ #include "comgetvect.c" fastlink-4.1P-fix95/4.1P/src/commondefs.h0000644000265600020320000007613210517437447017140 0ustar tilleaadmin#ifndef _COMMONDEFS_H #define _COMMONDEFS_H 1 /* Output from p2c, the Pascal-to-C translator */ /* From input file "ilink.p" */ /* This file contains definitions for a modified version of the ILINK program*/ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., */ /* Avoiding Recomputation in Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237. */ /* VMS: MAY NEED TO CHANGE -- possibly uncomment the following 2 lines */ /* #include unixio */ /* #include file */ #include /* Shriram: begin */ #include #include #include /* VMS: MAY NEED TO CHANGE -- possibly remove "sys/" from the next 3 lines */ #include #include #include /* Shriram: end */ /* cgh */ #if !defined(vms) #include #endif /* VMS: MAY NEED TO CHANGE -- comment out any of the next 3 lines for files your system can't find */ #include #include #include /* end cgh */ /* Define LOOPSPEED to be 1 to run with loop speedups added by Dylan and by A. A. Schaffer; cannot work with LODSCORE because lcp-produced scripts for LODSCORE do not use unknown*/ #if defined(LODSCORE) #define LOOPSPEED 0 #endif #if !defined(LOOPSPEED) #define LOOPSPEED 1 #endif /*LOOPSPEED*/ #if !defined(LOOP_BREAKERS) #if LOOPSPEED #define LOOP_BREAKERS 1 #else #define LOOP_BREAKERS 0 #endif /*LOOP_BREAKERS*/ #endif /*defined(LOOP_BREAKERS)*/ /*ALLELE_SPEED is used to set up renumbering of alleles when not all alleles are present in a pedigree*/ #if !defined(ALLELE_SPEED) #define ALLELE_SPEED 1 #endif #define ALLELE_SPEED_CONSTANT 61192012 #define true 1 #define false 0 #ifndef NULL #define NULL 0 #endif /*From p2c.h*/ #ifndef FileNotFound #define FileNotFound 10 #endif /* Kimmo Kallio */ #if defined(vms) #define unlink delete #endif /* defined(vms) */ /* end Kimmo */ #ifndef EXIT_FAILURE #ifdef vms #define EXIT_FAILURE (02000000000L) #else #ifndef SOLARIS #define EXIT_FAILURE (-1) #endif /* SOLARIS */ #endif /*from p2c.h*/ #endif #ifndef EXIT_SUCCESS #ifdef vms #define EXIT_SUCCESS 1 #else #define EXIT_SUCCESS 0 #endif /*from p2c.h*/ #endif #ifndef Void #define Void void #endif #ifndef Local #define Local static #endif #ifndef Free #define Free free #endif #ifndef Malloc #define Malloc malloc #endif #ifndef LOOPFILE_NAME /*Dylan added*/ #define LOOPFILE_NAME "loopfile.dat" #endif #define fVersion 5.1 /*PRESENT VERSION OF LINKAGE*/ #define fastversion "4.1P" /*PRESENT VERSION OF FASTLINK*/ /*A. A. Schaffer*/ #define DIAGNOSTIC true /*should we test settings of constants*/ /*MAXIMUM NUMBER OF RECOMBINATION PROBABILITIES*/ /*THE FOLLOWING SHOULD BE LARGER THAN MININT*/ #ifndef maxcensor #define maxcensor 50000L /*MAXIMUM FOR CENSORING ARRAY*/ #endif #ifndef maxsys #define maxsys 70 /*MAXIMUM NUMBER OF SYSTEMS*/ #endif #ifndef maxlocus #define maxlocus 8 /*MAXIMUM NUMBER OF LOCI */ #endif #define maxrec maxlocus /*MAXIMUM POSSIBLE NUMBER OF RECOMB/MEI*/ #ifndef maxseg #define maxseg 128 /* (maxlocus-1) */ /* = 2 I.E. 2 TO THE POWER maxlocus-1 */ #endif #ifndef BIGMAXSEG #define BIGMAXSEG 16384 #endif #ifndef BIGMAXLOCUS #define BIGMAXLOCUS 15 #endif #ifndef maxall #define maxall 25 /*MAX NUMBER OF ALLELES AT A SINGLE LOCUS*/ #endif #ifndef maxind #define maxind 1000 /*MAXIMUM NUMBER OF INDIVIDUALS*/ #endif #ifndef maxped #define maxped 150 /*MAXIMUM NUMBER OF PEDIGREES*/ #endif #ifndef maxchild #define maxchild 18 /*MAXIMUM NUMBER OF FULLSIBS IN A SIBSHIP*/ #endif #ifndef maxloop #define maxloop 8 /*MAXIMUM NUMBER OF LOOPS PER PEDIGREE*/ #endif #define minfreq 0.0 #define affall 2 /*DISEASE ALLELE FOR QUANTITATIVE TRAITS OR AFFECTION STATUS*/ /* QUANTITATIVE TRAIT */ #define maxtrait 3 /*MAXIMUM NUMBER OF QUANTITATIVE FACTORS AT A SINGLE LOCUS*/ #define missval 0.0 /*MISSING VALUES FOR QUANTITATIVE TRAITS */ /* AFFECTION STATUS */ #define missaff 0 /*MISSING VALUE FOR AFFECTION STATUS */ #define affval 2 /*CODE FOR AFFECTED INDIVIDUAL*/ #ifndef maxliab #define maxliab 60 /*MAXIMUM NUMBER OF LIABILITY CLASSES */ #endif /*Do not change the following two declarations*/ #define binformat 2 /*DO NOT CHANGE THIS !*/ #define allformat 3 /*DO NOT CHANGE THIS, AAS*/ /* BINARY (FACTOR UNION) SYSTEM */ #ifndef maxfact #define maxfact maxall #endif /*MAXIMUM NUMBER OF BINARY CODES AT A SINGLE LOCUS*/ /* OTHERS */ #define scalemult 2.0 /*SCALE WEIGHT FOR EACH LOCUS INCLUDED*/ /*TRUE IF ESTIMATING PARAMETERS OTHER THAN REC*/ #ifndef fitmodel #define fitmodel true #endif /*Note: It is probably a bad idea to change dostream to false if using LINKMAP*/ #ifndef dostream #define dostream true /*STREAM FILE OUTPUT*/ #endif #define zerolike (-1.0e20) /*FOR INCONSISTENT DATA OR RECOMBINATION */ /* Shriram: begin Shriram's additions commented out #ifdef M_LN10 #define log10_ M_LN10 #else */ #define log10_ 2.30259 /* #endif Shriram: end */ #define minint (-32767) /*MINIMUM ALLOWED INTEGER*/ /*GRADIENT APPROXIMATIONS*/ #ifndef approximate #define approximate false #endif #ifndef PARALLEL #define PARALLEL 0 #endif #if PARALLEL int maxworkingset; #endif /*PARALLEL*/ #if PARALLEL #ifndef maxn #define maxn 8 #endif /*maxn*/ #ifndef MAXNUMFAM #define MAXNUMFAM 1000 #endif #endif /*PARALLEL*/ /* dwix */ #define DEFAULT_STRING_LENGTH 200 /* end dwix */ #if PARALLEL void Tmk_errexit(); #if defined(IS_PARMACS) || defined(IS_P4) #define IS_SHMEM (IS_PARMACS || IS_P4) char* Tmk_malloc(unsigned); #if IS_P4 #include "p4.h" #define G_MALLOC(size) p4_shmalloc(size) #define CREATE(proc) p4_create(proc); #define WAIT_FOR_END(n) p4_wait_for_end(); #define Tmk_free(p) p4_shfree(p) #endif /* IS_P4 */ #else /* defined(IS_PARMACS) || defined(IS_P4) */ #define IS_SHMEM 0 #endif /* defined(IS_PARMACS) || defined(IS_P4) */ #ifndef BARRIER_OUTPUT #define BARRIER_OUTPUT 0 #endif #ifndef LOADBALANCE_OUTPUT #define LOADBALANCE_OUTPUT 0 #endif #ifndef FUNTIMES #define FUNTIMES 1 #endif #ifndef PARALLEL_GCENTRAL #define PARALLEL_GCENTRAL 0 #endif #ifndef DO_LOADBALANCE #define DO_LOADBALANCE 0 #endif #ifndef DO_PARALLELTHETAS #define DO_PARALLELTHETAS 1 #endif #define maxprocs 8 /*maximum number of processors*/ #if IS_SHMEM unsigned Tmk_proc_id; unsigned Tmk_nprocs; #endif /*IS_SHMEM*/ /*flags to determine which kind of nuclear family visit is coming next*/ #define ONEDOWN 0 #define MANYDOWN 1 #define ONEUP 2 #define MANYUP 3 #ifndef PRECOMPUTE #define PRECOMPUTE 0 #endif /*PRECOMPUTE*/ #endif #if PARALLEL extern char *optarg; #if !IS_SHMEM #include "Tmk.h" #endif /* !IS_SHMEM */ #endif /* PARALLEL */ /* cgh -- as per suggestion from alc: we use this type as paramater to functions which take boolean argument to guarantee automagic promotion to int for K&R function declarations with ANSI prototypes. */ typedef int boolInt; /*next two typedefs come from p2c*/ typedef char boolean; typedef short unschar; unschar **approxarray; typedef struct censorrec { boolean censor[maxcensor - minint]; } censorrec; typedef char hapvector[maxlocus]; typedef double covmatrix[maxtrait][maxtrait]; typedef int mutarray[3][2]; typedef double thesemeans[maxtrait]; typedef thesemeans means[maxall + 1][maxall]; typedef enum { auto_, /* autosomal, regular inheritance */ mauto, /* autosomal, mutation model */ sex, /* sexlinked, regular inheritance */ msex /* sexlinked, mutation model */ } pathway; typedef enum { peelup, peeldown } direction; typedef int binset; typedef binset phenarray[maxall]; typedef enum { affection, quantitative, binary_, null_ } locustype; typedef struct locusvalues { int nallele, format; #if LOOPSPEED /* Dylan added */ int fgeno; /*holds the number of single-locus genos possible*/ #endif double freq[maxall]; double freqcond[maxall]; /*conditional frequencies for carriers*/ struct locusvalues *privlocus; locustype which; union { struct { double pen[maxall + 1][maxall][3][maxliab]; long nclass; } U0; struct { long ntrait; means pm; covmatrix vmat; double det, contrait, conmat; } U1; phenarray allele; } UU; } locusvalues; typedef struct phenotype { locustype which; binset phenf; /*encodes phenotype/genotype in pedin.dat as a bit vector*/ /*Next two fields added by AAS to avoid hassles in dealing with phenf*/ int allele1; int allele2; double x[maxtrait]; boolean missing; int aff; long liability; } phenotype; typedef phenotype *hindphen[maxsys]; typedef phenotype *indphen[maxlocus]; /* a structure of type 'thisarray' stores the conditional genotype probabilities for an individual. The probabilities are stored in the array genarray. We expect this array to be sparse. The field sparseflag is a boolean array such that sparseflag[i] is nonzero if and only if genarray[i] is nonzero. */ typedef struct thisarray { unsigned char *sparseflag; double *genarray; } thisarray; #if !LOOPSPEED typedef boolean possvect[maxall][maxall]; typedef possvect possarray[maxlocus]; typedef struct information { possarray possible; } information; #endif /* a record of type thisperson stores information about one person in one pedigree */ typedef struct thisperson { int id, ped, inloop; struct thisperson *pa; /* father */ struct thisperson *ma; /* mother */ struct thisperson *foff; /* first offspring */ struct thisperson *nextpa; /* next (half)-sibling with the same father */ struct thisperson *nextma; /* next (half)-sibling with the same mother */ thisarray *gen; /* genotype information */ hindphen holdphen; indphen phen; phenotype *privphen; boolean unknown, multi, done, up, male, firstpass; /* next three added by A. A. Schaffer */ boolean newgenexists; boolean loopdepend; /* true if genotype of loopbreaker depends on this */ boolean loopneeded; /* true if genotype of this depends on loopbreaker */ #if LOOPSPEED /* Dylan added */ boolean thisunknown[maxlocus]; /*true if unknown at this locus*/ #else information *store; #endif #if PARALLEL short memindex; /*added to keep track of where gen is in genbank*/ #endif } thisperson; typedef int subhap[maxseg]; typedef double thetarray[maxlocus]; /* typedef double happrob[maxneed]; */ unsigned nuneed; /* Introduced by R. M. Idury, actual size of segprob arrays */ unsigned nuprobclass; /* Introduced by A. A. Schaffer, actual number of probclasses */ typedef struct thetavalues { thetarray theta; double *segprob; } thetavalues; thetavalues *maletheta, *femaletheta; thetarray *gmaletheta, *gfemaletheta; typedef struct new_locus_info { int present; /*is this allele present?*/ int new_allele; /*what is this allele mapped to?*/ int old_allele; /*inverse of mapping*/ double old_frequency; double new_frequency; double new_frequency_cond; double old_frequency_cond; /*for conditional allele frequencies, Morgan */ } new_locus_info; #if ALLELE_SPEED #if defined(LODSCORE) typedef int new_allele_count[maxsys]; #else typedef int new_allele_count[maxlocus]; #endif /*Adjusted allele counts for each pedigree and locus*/ new_allele_count *ped_new_allele_count; /* Does this pedigree have different adjusted allele counts from the previous pedigree? */ boolean *ped_must_change_locations; #endif /* dwix: begin */ /* type definitions for allele_downcode_check */ #if defined(LODSCORE) typedef new_locus_info loc_all[maxsys][maxall+1]; #else typedef new_locus_info loc_all[maxlocus][maxall+1]; #endif loc_all *ped_loc_all; int currentped; int *pedidx2num; int mymaxped; /* dwix: end */ int maxhaplo, maxfemgen; /*A. A. Schaffer*/ int maxclasssize, maxisozygclass; /*The following declarations help store a partial correspondence between genotypes and haplotypes, haps1 between base[i] and fence[i] stores the left haplotypes that genotype i can pass on to a child; haps2 stores the right haplotypes; hind stores the index into an array of recombination probabilities indicating the probability of this haplotype getting passed on from genotype i. currentfence is used as a counter to fill haps1, haps2, hind, base, and fence. */ unsigned currentfence; /* R. M. Idury */ unsigned int *base, *fence; /*R. M. Idury*/ unsigned short *haps1, *haps2; unsigned int *hind; /* The arrays invgenenum1 and invgenenum2 store an effective inverse to the genenumber mapping above. They convert an index into genenumber into two haplotypes */ unsigned *invgenenum1, *invgenenum2; /* R. M. Idury */ typedef struct cache{ unsigned first; unsigned last; } cache; pathway thispath; boolean informative[maxped]; boolean *rare, *risk1, *risk2; boolean *riskmale; censorrec *censorstruct; int thisc; boolean malechild[maxchild]; #if !PARALLEL thisarray *thischild[maxchild]; /*if parallel must be allocated dynamically*/ #endif thisperson *childarray[maxchild]; /*A. A. Schaffer*/ int nchild; int *segstart; unsigned int *probstart, *probend; boolean nohom[maxlocus]; locusvalues *thislocus[maxlocus]; int increment[maxlocus], order[maxlocus]; unsigned int *nonzgens; /*used to hold nonzero genotypes in pedigree traversal, A.A. Schaffer */ boolean *flag; /*R. M. Idury*/ double *gene; /*used for local computations in pedigree traversal routines*/ /* The arrays psumcache and qsumcache store conditional probabilities of different haplotypes being passed on from p and q respectively. They are used in some of the pedigree traversal routines. */ double *psumcache, *qsumcache; #if PARALLEL double *onechildupqsumcache; #endif /*Used in segup to keep track of entries in indpool, invpool, and nextpool that correspond to different haplotypes of a child*/ cache *phapcache1; /*PEOPLE*/ thisperson *person[maxind + 1]; thisperson *proband[maxped]; thisperson *looppers[maxped][maxloop][maxloop]; int numCopies[maxped][maxloop]; /*number of copies of loop breaker*/ /*MUTATION */ unschar *muthap; int **genenumber; /*RECOMBINATION*/ unsigned *segindex; double *tempseg, *tempseg2; double *segval; /*FREQUENCIES */ thisarray *hapfreq; /*RISK*/ int riskall; /*OTHERS*/ int risksys, mutsys, mlocus, lastpriv, i; int nuhap; int fgeno, mgeno; int nuped, totperson; double segscale, mutmale, mutfemale, like, alike, distratio; boolean interfer, disequi, sexlink, risk, sexdif, readfemale, dolod, firstapprox, lasttime; boolean firsttime; /* true if in or before first likelihood evaluation */ boolean disfreqs; /*AAS for K. Morgan, tells if we are getting two sets of allele frequencies*/ FILE *outfile, *ipedfile, *datafile, *stream, *speedfile; FILE *loopfile; /*holds information for loop speedup*/ #if LOOPSPEED /*Dylan and A. A. Schaffer added */ boolean ever_read_loopfile; /*set true if loopfile has ever been read*/ int *loopbreaker_nextgeno[maxloop]; /*sparse array of possible genotypes for loopbreakers*/ #endif /*ILINK*/ FILE *final; boolean mapping; /*Added by A. A. Schaffer to keep track of which traversal we are on for handling a loop*/ char loopfirstgen; /* false if doing a traveral for the loopbreaker and it is not the first genotype of the innermost loop breaker */ char looplastgen; #if LOOPSPEED /* Dylan added */ /* These typedefs define the table to hold the valid loopbreaker vectors for each locus. */ typedef int *vector_for_loop; typedef vector_for_loop *vector_for_locus; typedef vector_for_locus *loop_vector_array; /* These typedefs define the table to hold the possible genotypes for each unknown person at each locus for each valid loopbreaker vector. */ typedef boolean *geno_for_loop_vector; typedef geno_for_loop_vector *geno_for_locus; typedef geno_for_locus *geno_for_unknown; geno_for_unknown *unknown_poss; loop_vector_array loop_vectors; int num_loop_vectors[maxlocus]; int num_loops[maxped]; /* number of loops in pedigree */ int single_locus_vector_num[maxlocus]; boolean **is_zero_breaker; /*AAS, identifies loop breaker vectors with 0.0 likelihood*/ boolean *breaker_poss_genotype[maxloop]; #endif int *ped_nuscales; /*AAS, keeps track of scaling factors used in each pedigree */ int memcount, maxmemcount; /*AAS, used to count how many genarrays needed for memory estimation*/ #if PARALLEL #if IS_SHMEM #if IS_PARMACS typedef struct Barrier { BARDEC(barrier) } Barrier; #else /* IS_PARMACS */ /* cgh -- p4 barrier syntax */ typedef struct Barrier { p4_barrier_monitor_t barrier; } Barrier; #define BARINIT(bar) p4_barrier_init(&(bar)) #define BARRIER(bar, np) p4_barrier(&(bar), (np)) #endif /* IS_PARMACS */ Barrier **partial_barrier; #endif /* IS_SHMEM */ typedef struct GlobalMemory { int finished; /* cgh && schaffer -- got rid of distinction between PARALLEL_GCENTRAL and not, and changed maxn to maxprocs. Now indexed by mymaster. */ int nchild[maxprocs]; int trav_flag[maxprocs]; /* indicates whether in segup or segdown */ int pmale[maxprocs]; /* indicates whether parent p is male */ /* indicates whether there's one or many children */ #if IS_PARMACS BARDEC(full_barrier) #elif IS_P4 Barrier full_barrier; #else int seg_barrier; int sum_barrier; #endif int pprocbase[maxprocs]; int pprocfence[maxprocs]; int qprocbase[maxprocs]; int qprocfence[maxprocs]; /* cgh && schaffer -- got rid of distinction between PARALLEL_GCENTRAL and not, and changed maxn to maxprocs. Now indexed by mymaster. */ thisarray *pgenptr[maxprocs]; /*first parent */ thisarray *qgenptr[maxprocs]; /*sceond parent */ thisarray *rgenptr[maxprocs]; /*child*/ thisarray *gthischild[maxprocs][maxchild]; } GlobalMemory; GlobalMemory *gMem; /* Global variables added by Sandeep for Phase II: Parallel Thetas */ int *checkmaster; /* Boolean indicating if iAmAMaster should be checked */ int *usecentral; /*Are we using central differences*/ int *slavesPerGroup; /* number of slaves per parallel theta group */ int *thetasPerGroup; /* number of thetas that are calculated by each group */ int *nextTheta; /* next theta number that has not been assigned */ int *numGroups; /* number of parallel theta groups */ int *thetanumbase; /* element i contains number of first job to be done */ /* by the group led by processor i */ int *thetanumfence; /* element i contains 1 + number of last job to be done */ /* by the group led by processor i */ int currentthetanum; /* number of the theta for the current function eval */ int mymaster; /* processor number of job's master */ int parallelThetas; /* bollean indicating if doing fun calls in parallel */ int infun; /* bollean indicating if we are in fun() */ int *funfinished; /* array of booleans indicating if fun is finished */ #if ALLELE_SPEED int *sharedCurrentPed; /* array of current pedigree numbers*/ #endif double **gmalesegprob; double **gfemalesegprob; double *gf; /* global f */ #if PARALLEL_GCENTRAL double **gcentralf; /* f's calculated during gcentral */ #endif /* PARALLEL_GCENTRAL */ int barnum; /* Number of barriers (used in debugging) */ #if FUNTIMES #if PARALLEL_GCENTRAL double *executionTimes; /* Records times of executions during parallelThetas */ #else /* !PARALLEL_GCENTRAL */ double **executionTimes; /* Records times of executions during parallelThetas */ int fe; /* first or second fe during gforward, gcentral */ #endif /* PARALLEL_GCENTRAL */ #endif /* FUNTIMES */ double accumfamilytime; /* Global variables needed by Phase I: Load Balance */ double *rowtime; /* row times calculated by processor 0 on the */ double *qrowtime; /* first round of parallel thetas */ typedef int fencearray[MAXNUMFAM][maxprocs]; fencearray *rowfence; /* Stores fence values (numnuc x numproc) */ fencearray *qfence; /* Stores fence values (numnuc x numproc) */ fencearray *temprowfence; /* Temporary storage for when fences are calculated */ fencearray *tempqfence; /* Temporary storage for when fences are calculated */ int *timeExecutions; /* boolean that indicates if execution times should be stored in [q]rowtime. Only used if mymaster = 0 */ int *numNuclear; /* The number of nuclear families */ int *firstfe; /* boolean that indicates if first function evaluation */ int *secondfe; /* boolean that indicates if second function evaluation */ int onlymaster; /* indicates that only master is doing family */ /*The array genbank keeps a set of pointers to gen arrays that can be used dynamically; geninuse will keep track of which entries in genbank are in use*/ thisarray *genbank; thisarray **ggenbank; /* cgh - used to be [maxn] or [2*maxn] */ thisarray **thischild; char *geninuse; char **ggeninuse; /* cgh - used to be [maxn] or [2*maxn] */ double **arrgene; double **arrqsumcache; /* added to provide individual global qsumcaches that * can be summed - Sandhya */ double **arrpsumcache; /* added to provide individual global psumcaches that * can be summed - Sandhya */ unsigned int *pnonzgens, *qnonzgens, *stripe_pnonzgens, *stripe_qnonzgens, *privatepnonzgens, *privateqnonzgens; unsigned int **gpnonzgens, **gqnonzgens; /* cgh - used to be [maxn] or [2*maxn] */ #endif /*PARALLEL*/ /* Local variables for seg: */ struct LOC_seg { struct LOC_likelihood *LINK; /* information for pedigree */ thisperson **p; /* in segdown(): father in segup(): parent connecting traversal */ thisperson **q; /* mate of p */ thisperson **r; /* first child of p and q */ thisperson *child, *father, *mother; /* same people as p, q, and r */ int fseg, sseg, sstart, send, fstart, fend, firstseg, secondseg; int nfirst; /* number of genotypes of gender of p */ int nsecond; /* number of genotypes of gender of q */ double pf, ps; thetavalues *firstsex; /* theta info for gender of p */ thetavalues *secondsex; /* theta info for gender of q */ } ; /*Local variables for likelihood*/ struct LOC_likelihood { int thisped; thisperson *proband; int loopgen[maxloop]; double homo, hetero; int nuscale; thisarray *holdpoint[maxloop]; } ; /*Local variables for inputdata*/ #if defined(LODSCORE) struct LOC_inputdata { long nfactor[maxsys]; }; #else struct LOC_inputdata { long nfactor[maxlocus]; }; #endif /*Local variables for readloci*/ struct LOC_readloci { struct LOC_inputdata *LINK; long i, whichtype, nupriv; }; /*The following definitions are needed to do checkpointing*/ /* K. Shriram: begin */ #define DateTimeStampStringLength 27 /* see ctime()'s man page */ #define SystemCallStringLength 1024 /* length of arg for system() */ char systemCallString [ SystemCallStringLength ] ; #define ensureWrite(f) { fflush ( (f) ) ; fsync ( fileno ( f ) ) ; } FILE * checkpointDatafile ; /* K. Shriram: end */ /* begin: cgh */ /* program name */ #if defined(MLINK) #define PROGRAM "MLINK" #elif defined(LINKMAP) #define PROGRAM "LINKMAP" #elif defined(ILINK) #define PROGRAM "ILINK" #else #define PROGRAM "" #endif /* defined(MLINK) */ /* min, max macros */ #define Max(a, b) ((a) > (b)) ? (a) : (b) #define Min(a, b) ((a) < (b)) ? (a) : (b) /* used to avoid round-off errors with floats */ #define ROUNDOFF_INC 0.0001 /* no reason to call sprintf 35 times for this */ #define LINE "-----------------------------------" /* Parallel definitions */ #if PARALLEL #if IS_SHMEM #define Tmk_distribute(a,b); #endif /* IS_SHMEM */ /* cgh -- new variables for MLINK and LINKMAP */ /* Global private variable for MLINK and LINKMAP indicating which _absolute_ theta vector the current processor is working on. This is in contrast to currentthetanum which indicates which theta vector _relative_ to the current group of parallel evaluations the current processor is working on. */ int absoluteThetanum; /* Global shared array indicating reordering of theta vectors so all nonzero vectors appear first. Entry i = k means that for the ith evaluation, absoluteThetanum is k. */ int* absoluteThetaIndex; /* Global shared variable indicating which theta is the first among those being worked on in parallel */ int* firstThetanum; /* Global private variable for processor 0 indicating which relative theta vector should be considered next in AssignThetas() */ int nextThetaToAssign; /* Total number of calls to iterpeds() calculated in simIpedLoop() */ int numIpeds; /* Global variable indicating the number of theta vectors that do contain zero entries -- valid only for processor 0 */ int numZeroThetas; /* Global variable indicating the number of theta vectors that contain no zero entries -- valid only for processor 0 */ int numNonzeroThetas; /* array of booleans indicating whether or not the corresponding entry in g{male,female}theta has a zero entry */ boolean* gZeroTheta; /* Array of booleans indicating if processor is master */ boolean* iAmAMaster; /* element i contains master of processor i */ int* whoIsMyMaster; /* Unlinked likelihood evaluation -- corresponds to scorevalue in MLINK, second variable stores score for each family for lodbyfamily */ double* unlinkedLike; double* unlinkedLikeByPed; /* Status of iterpeds() loop simulation */ typedef enum { countIpeds, computeThetas } loopStatus; #include "strbuff.h" #define TEMPBUFF_SIZE 256 /* size of temporary output buffer */ /* outBuff structure An array of strBuff objects. There is one for each iteration of iterpeds(). */ typedef struct outBuff { int numIpeds; /* number of calls to iterpeds() */ strBuff** ipeds; /* array of all iterpeds() output */ } outBuff; /* global outBuff objects for stdout, outfile, and stream */ outBuff* stdoutBuff; outBuff* outfileBuff; outBuff* streamBuff; /* flag which dictates whether or not to report memory usage stats */ boolean reportMemStats; #endif /* PARALLEL */ #if 0 /* Unfortunately, the following breaks cc. We'll put this off until we can figure out a fix. -- cgh */ /* The VAX requires an `l' with an `e' in the print format string; however, on other platforms, gcc complains about this use. We use this macro instead, and rely on compile-time string concatenation to handle it for us. */ #if defined(vms) #define pt5e ".5le" #else #define pt5e ".5e" #endif /* if defined(vms) */ #endif /* if 0 */ /* function prototypes */ #if !defined(KNR_PROTO) #if PARALLEL void writeBuff(outBuff*, FILE*); void bufferPedOutput(int, double); void bufferTotalsOutput(double, double); void bufferLodOutput(double, double, boolInt); void printBarrier(char*, int); #if defined(MLINK) void bufferLikeOutput(double, double); #else /* if defined(MLINK) */ void bufferLikeOutput(double); #endif /* if defined(MLINK) */ #endif /* PARALLEL */ void malloc_err(char*); int P_eof(FILE*); int P_eoln(FILE*); unsigned MakeMask(int start, int end); void getlocus(long, struct LOC_readloci*); void inputerror(long, long, long, struct LOC_inputdata*); void inputwarning(long, long, long, struct LOC_inputdata*); void readped(struct LOC_inputdata*); #if (defined(ILINK) || defined(LINKMAP) || defined(MLINK)) void gettheta(thetavalues**, struct LOC_readloci*); #endif /* (defined(ILINK) || defined(LINKMAP) || defined(MLINK)) */ #endif /* !defined(KNR_PROTO) */ #if defined(KNR_PROTO) void seqStartup(); #else void seqStartup(int, char**); #endif #if PARALLEL outBuff* newOutBuff(); void initOutBuffs(); void writeOutBuffs(); void preLikeBufferOutput(); #if (defined(MLINK) || defined(LINKMAP)) int calcNumparams(); #endif /* (defined(MLINK) || defined(LINKMAP)) */ #endif /* PARALLEL */ void checkzero(); void getCkptTuple(); void allocgen(); void allocprob(); void allocthetas(); void manychilddown(); void manychildup(); void onechilddown(); void onechildup(); /* cgh - routines in commoncode.c */ #if !defined(KNR_PROTO) double mapfunction(double, double); double getdist(double*); double invdist(double*); #endif /* !defined(KNR_PROTO) */ void initialize(); /* cgh -- routines in commoncode.c */ void openFiles(); void ckptInit(); void ckptEnsureFileContents(); void closeInputFiles(); void miscInit(); void ckptPreIpedRecover(); void closeOutputFiles(); void ckptCleanup(); void initParams(); /* prototypes for SunOS 4.1.x gcc */ #if defined(SUNOS_4_1_X_GCC) int _filbuf(); int _flsbuf(); int close(); int fclose(); int fflush(); int fprintf(); int fread(); int fscanf(); int fseek(); int fsync(); int fwrite(); int getopt(); int gettimeofday(); int printf(); int puts(); int rename(); void rewind(); void setbuf(); time_t time(); int ungetc(); int vfprintf(); #endif /* defined(SUNOS_4_1_X_GCC) */ #if defined(KNR_PROTO) #if PARALLEL void writeBuff(); void bufferPedOutput(); void bufferTotalsOutput(); void bufferLodOutput(); void bufferLikeOutput(); void printBarrier(); #endif /* PARALLEL */ #if (defined(ILINK) || defined(LINKMAP) || defined(MLINK)) void gettheta(); #endif /* (defined(ILINK) || defined(LINKMAP) || defined(MLINK)) */ double mapfunction(); double getdist(); double invdist(); #endif /* defined(KNR_PROTO) */ #endif /* _COMMONDEFS_H */ extern void getprobtable(); extern void segup(); extern void segdown(); extern void segsexup(); extern void segsexdown(); extern void performCheckpoint(); extern void recoverCheckpoint (); extern void getvect(); extern void recombination(); extern void getlocations(); extern void readspeed(); extern void invert(); extern void cleanup(); extern void initseg(); extern void exitseg(); extern void allocategenetables(); extern void getgeneindices(); extern void freegenetables(); #if ALLELE_SPEED extern void recompute_haps(); #endif extern void seg(); extern void likelihood(); extern void allocate_loopbreaker_vectors(); extern int maxw_estimation(); extern void segsexctop(); extern void segsextop(); extern void segctop(); extern void segtop(); extern void segcapprox(); extern void msegsexdown(); extern void msegdown(); extern double mapfunction(); extern double getdist(); extern double invdist(); extern void setparam(); extern void inputdata(); extern void oldsegsexup(); extern void oldsegup(); extern void malloc_err(); extern int P_eof(); extern int P_eoln(); extern void check_constants(); extern void printErrMesg(); extern void init_ped_loc_all(); #if ALLELE_SPEED extern void adjust_alleles(); extern void allele_adjust_persons(); #endif extern int allele_downcode_check(); extern unsigned MakeMask(); extern void getlocus(); extern void inputerror(); extern void inputwarning(); extern void open_loop_file(); extern void close_loop_file(); extern void read_loop_file(); extern void readped(); extern void allocate_thisarray(); #if LOOP_SPEED extern void infer_genotypes(): #endif fastlink-4.1P-fix95/4.1P/src/ilink.c0000644000265600020320000017571510517437742016114 0ustar tilleaadmin/* This file contains the main routines in */ /* a modified version of the ILINK program*/ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr.,*/ /* Avoiding Recomputation in Linkage Analysis */ /* Human Heredity 44(1994), pp. 225-237.*/ #include "commondefs.h" #if !defined(DOS) #include "checkpointdefs.h" #endif #include "gemdefs.h" #include "ildefs.h" #ifndef LESSMEMORY #include "moddefs.h" #endif #if PARALLEL #include "compar.h" #endif /* if PARALLEL */ static Void outcontrol(z) double *z; { int i, j; j = 0; for (i = 0; i < n; i++) { fprintf(outfile, "% .5e", z[i]); j++; if (j == 4) { putc('\n', outfile); j = 0; } } if (j != 0) putc('\n', outfile); } /*saveparams saves the parameter values at the beginning of gforward or gcentral, so we capture the optimal thetas*/ Local Void saveparams() { int i; for (i=0; i < nall; i++) outsavex[i] = x[i]; } static void fun(f, x) double *f; double *x; { int i, k; #if PARALLEL #if FUNTIMES struct timeval starttime, endtime; double time; gettimeofday(&starttime, NULL); /*Get start time*/ #endif /*FUNTIMES*/ #endif /*PARALLEL */ #if PARALLEL accumfamilytime = 0; infun = 1; if (!parallelThetas) { OneMaster(); #if BARRIER_OUTPUT barnum++; printf("(%d) Full barrier (!parallelThetas) at beginning of fun\n",barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /*IS_SHMEM*/ } #endif /*PARALLEL*/ k = 0; /*Test code inserted by A. A. Schaffer for (i = 0; i < nall; i++) { printf("%lf ", x[i]); } printf("\n");*/ for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; xall[i] = x[k - 1]; } } setparam(); recombination(); if (penalty) { *f = 1.5 * penlike; return; } for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } alike = 0.0; thisc = minint; #if LOOPSPEED /*Dylan added*/ open_loop_file(); #endif for (i = 1; i <= nuped; i++) { #if LOOPSPEED read_loop_file(i); #endif likelihood(i, proband[i - 1]); likebyped[i-1] = like; /*Store likelihood for later*/ alike += like; } #if LOOPSPEED close_loop_file(); #endif if (firsttime) { if (thisc < maxcensor) printf("Maxcensor can be reduced to %12d\n", thisc); else { if (thisc > maxcensor) printf("You may gain efficiency by increasing maxcensor\n"); } } #if PARALLEL funfinished[Tmk_proc_id]++; infun = 0; if((*slavesPerGroup) > 1) { #if BARRIER_OUTPUT barnum++; printf("(%d) Group barrier at end of fun\n",barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif /*IS_SHMEM*/ } if(!parallelThetas) { #if BARRIER_OUTPUT barnum++; printf("(%d) Full barrier (!parallelThetas) at end of fun\n",barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /*IS_SHMEM*/ } if(*secondfe) { for(i=0;i<1000;i++) for(k=0;kthisval[i] = 0.0; setparam(); #if PARALLEL /* infun = 1; if(!parallelThetas) { OneMaster(); */ #if BARRIER_OUTPUT /* barnum++; printf("(%d) Full barrier at beginning of getlods\n",barnum);*/ #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM /* BARRIER(gMem->full_barrier,Tmk_nprocs);*/ #else /* Tmk_barrier(Tmk_mask);*/ #endif /*IS_SHMEM*/ /* } */ #endif /*PARALLEL*/ if (!penalty) { if (byfamily) { for (i = 1; i <= 35; i++) putc('-', final); fprintf(final, "\nPEDIGREE | LN LIKE | LOG 10 LIKE\n"); for (i = 1; i <= 35; i++) putc('-', final); putc('\n', final); } if (byfamily) { /*Then need to redo likelihoods on a by-family basis*/ for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } recombination(); thisc = minint; #if LOOPSPEED open_loop_file(); #endif for (i = 1; i <= nuped; i++) { #if LOOPSPEED read_loop_file(i); #endif likelihood(i, proband[i - 1]); LINK->thisval[i - 1] = like; } #if LOOPSPEED close_loop_file(); #endif } } /* Shriram: reindented */ #if PARALLEL /* funfinished[0]++; infun = 0; if((*slavesPerGroup) > 1) { */ #if BARRIER_OUTPUT /* barnum++; printf("(%d) Group barrier at middle of getlods\n",barnum);*/ #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM /* BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); */ #else /* Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1));*/ #endif /*IS_SHMEM*/ /* }*/ /* if(!parallelThetas) { */ #if BARRIER_OUTPUT /* barnum++; printf("(%d) Full barrier (!parallelThetas) at middle of getlods\n",barnum);*/ #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM /* BARRIER(gMem->full_barrier,Tmk_nprocs);*/ #else /* Tmk_barrier(Tmk_mask);*/ #endif /*IS_SHMEM*/ /* } */ #endif /*PARALLEL*/ firsttime = true; for (i = 0; i < mlocus; i++) { maletheta->theta[i] = 0.5; femaletheta->theta[i] = 0.5; } if (penalty) { *f = 1.5 * penlike; return; } #if PARALLEL infun = 1; if(!parallelThetas) { OneMaster(); #if BARRIER_OUTPUT barnum++; printf("(%d) Full barrier (!parallelThetas) at middle of getlods\n",barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /*IS_SHMEM*/ } #endif /*PARALLEL*/ dolod = true; for (i = 1; i <= totperson; i++) { person[i]->done = false; person[i]->firstpass = true; } recombination(); alike = 0.0; thisc = minint; #if LOOPSPEED open_loop_file(); #endif for (i = 0; i < nuped; i++) { #if LOOPSPEED read_loop_file(i+1); #endif likelihood(i + 1, proband[i]); alike += like; if (byfamily) { fprintf(final, "%9d %9d %12.6f", i + 1, proband[i]->ped, LINK->thisval[i] - like); fprintf(final, "%12.6f", (LINK->thisval[i] - like) / log10_); if (like == zerolike) fprintf(final, " inconsistent data\n"); else putc('\n', final); if (byfamily) /*Need to compute family lodscore*/ if (like != zerolike) LINK->thisval[i] -= like; } } #if PARALLEL funfinished[0]++; infun = 0; if((*slavesPerGroup) > 1) { #if BARRIER_OUTPUT barnum++; printf("(%d) Group barrier at end of getlods\n",barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif /*IS_SHMEM*/ } if(!parallelThetas) { #if BARRIER_OUTPUT barnum++; printf("(%d) Full barrier (!parallelThetas) at end of getlods\n",barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(gMem->full_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /*IS_SHMEM*/ } #endif /*PARALLEL*/ #if LOOPSPEED close_loop_file(); #endif *f = -2 * alike; penlike = *f; dolod = false; } Local Void streamout(LINK) struct LOC_outf *LINK; { int i, j, k, l; double deriv[3]; thetarray oldtheta; double dist; int FORLIM; locusvalues *WITH; int FORLIM1, FORLIM2; thetavalues *WITH1; double TEMP; inconsistent = false; setparam(); recombination(); firstapprox = true; /*Start stream*/ fprintf(stream, "@\n"); fprintf(stream, "ILINK\n"); /*Gemini information*/ fprintf(stream, "% .5e %12d % .5e %12d %12d %12d\n", f, nit, ptg, idg, nall, n); /*Valid or not*/ if ((nit > 1 && fabs(ptg) < 0.001) || n == 0) fprintf(stream, " 2\n"); else { if (nit > 1 && fabs(ptg) < 0.1) fprintf(stream, " 1\n"); else fprintf(stream, " 0\n"); } for (i = 0; i < nall; i++) fprintf(stream, " % .5e\n", xall[i]); putc('\n', stream); for (i = 0; i < nall; i++) fprintf(stream, " %2d\n", itp[i]); putc('\n', stream); for (i = 0; i < n; i++) fprintf(stream, " % .5e\n", g[i]); putc('\n', stream); /*Variance-covariance calculated if ivar=1 and icall=0*/ if (ivar == 1 && icall == 0) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); if (inconsistent) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); /*Control parameters for sexlink,interference and sex difference*/ if (sexlink) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); if (interfer) fprintf(stream, "1 "); else fprintf(stream, "0 "); if (mapping) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); if (sexdif && readfemale) fprintf(stream, "2 "); else { if (sexdif) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); } /*Genetic information*/ fprintf(stream, "%12d\n", mlocus); for (i = 1; i <= mlocus; i++) { j = 0; do { j++; } while (order[j - 1] != i); fprintf(stream, " %12d", j); } putc('\n', stream); /*Iterated locus*/ if (itsys != 0) fprintf(stream, "%12d\n", order[itsys - 1]); else fprintf(stream, " 0\n"); if (itsys != 0) { WITH = thislocus[itsys - 1]; if (disequi) { fprintf(stream, "1 %12d %12d\n", WITH->nallele, nuhap); for (i = 0; i < nuhap; i++) fprintf(stream, "%9.6f", hapfreq->genarray[i]); } else { fprintf(stream, "0 %12d\n", WITH->nallele); FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) fprintf(stream, "%9.6f", WITH->freq[i]); } putc('\n', stream); WITH = thislocus[itsys - 1]; if (WITH->which == binary_ && WITH->format == 3) fprintf(stream, " 3\n"); else { if (WITH->which == binary_ && WITH->format == 2) fprintf(stream, " 2\n"); else { if (WITH->which == quantitative) { fprintf(stream, "0 %12ld\n", WITH->UU.U1.ntrait); invert(WITH->UU.U1.vmat, WITH->UU.U1.ntrait, &WITH->UU.U1.det); FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->nallele; for (j = 1; j <= FORLIM1; j++) { FORLIM2 = WITH->nallele; for (k = j - 1; k < FORLIM2; k++) fprintf(stream, "%6.3f ", WITH->UU.U1.pm[j][k][i]); } putc('\n', stream); } FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->UU.U1.ntrait; for (j = i; j < FORLIM1; j++) fprintf(stream, "%6.3f ", WITH->UU.U1.vmat[i][j]); putc('\n', stream); } } else { if (WITH->which == affection) { fprintf(stream, "1 %12ld\n", WITH->UU.U0.nclass); FORLIM = WITH->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH->nallele; for (j = i - 1; j < FORLIM2; j++) fprintf(stream, " %5.3f", WITH->UU.U0.pen[i][j][2][l]); } putc('\n', stream); if (sexlink) { FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) fprintf(stream, "%5.3f ", WITH->UU.U0.pen[0][i][2][l]); } putc('\n', stream); } } } } } } if (interfer && !mapping) { WITH1 = maletheta; memcpy(oldtheta, WITH1->theta, sizeof(thetarray)); WITH1->theta[0] = (oldtheta[0] + oldtheta[mlocus - 1] - oldtheta[mlocus - 2]) / 2.0; WITH1->theta[mlocus - 2] = (oldtheta[mlocus - 2] + oldtheta[mlocus - 1] - oldtheta[0]) / 2.0; WITH1->theta[mlocus - 1] = (oldtheta[0] + oldtheta[mlocus - 2] - oldtheta[mlocus - 1]) / 2.0; for (i = 0; i < mlocus; i++) fprintf(stream, " %5.3f", WITH1->theta[i]); putc('\n', stream); memcpy(WITH1->theta, oldtheta, sizeof(thetarray)); if (sexdif) { WITH1 = femaletheta; memcpy(oldtheta, WITH1->theta, sizeof(thetarray)); WITH1->theta[0] = (oldtheta[0] + oldtheta[mlocus - 1] - oldtheta[mlocus - 2]) / 2.0; WITH1->theta[mlocus - 2] = (oldtheta[mlocus - 2] + oldtheta[mlocus - 1] - oldtheta[0]) / 2.0; WITH1->theta[mlocus - 1] = (oldtheta[0] + oldtheta[mlocus - 2] - oldtheta[mlocus - 1]) / 2.0; for (i = 0; i < mlocus; i++) fprintf(stream, " %5.3f", WITH1->theta[i]); putc('\n', stream); memcpy(WITH1->theta, oldtheta, sizeof(thetarray)); } if (ivar == 1 && icall == 0) { for (i = 0; i <= 2; i++) { TEMP = 1 + exp(xall[nall - i - 1]); deriv[i] = exp(xall[nall - i - 1]) / (TEMP * TEMP); } k = -1; for (i = 0; i <= 2; i++) { if (itp[nall - i - 1] == 1) { k++; l = -1; for (j = 0; j <= 2; j++) { if (itp[nall - j - 1] == 1) { l++; bmat[n - k - 1][n - l - 1] *= deriv[j] * deriv[i]; } } if (l == -1) l = 0; for (j = n - l - 1; j >= 0; j--) { bmat[j][n - k - 1] *= deriv[i]; bmat[n - k - 1][j] = bmat[j][n - k - 1]; } } } } } WITH1 = maletheta; FORLIM = mlocus - 2; /*Recombination*/ for (i = 0; i <= FORLIM; i++) fprintf(stream, " %5.3f", WITH1->theta[i]); if (interfer) fprintf(stream, " %5.3f\n", maletheta->theta[mlocus - 1]); else putc('\n', stream); if (sexdif) { WITH1 = femaletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(stream, " %5.3f", WITH1->theta[i]); if (interfer) fprintf(stream, " %5.3f\n", femaletheta->theta[mlocus - 1]); else putc('\n', stream); if (readfemale) { FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { dist = getdist(&maletheta->theta[i]); if (dist != 0.0) dist = getdist(&femaletheta->theta[i]) / dist; else dist = 0.0; fprintf(stream, " %5.3f\n", dist); } if (interfer) { dist = getdist(&maletheta->theta[mlocus - 1]); if (dist != 0.0) dist = getdist(&femaletheta->theta[mlocus - 1]) / dist; else dist = 0.0; fprintf(stream, " %5.3f\n", dist); } } else fprintf(stream, "%5.3f\n", distratio); } /*Valid parameters or not*/ /*Lod scores are valid only if penalty is false*/ if (penalty) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); /*Number of pedigrees*/ fprintf(stream, "%12d\n", nuped); for (i = 0; i < nuped; i++) fprintf(stream, "%12d % .5e % .5e\n", proband[i]->ped, outsavelike[i], outsavelike[i] / log10_); /*Total lod-score*/ fprintf(stream, "% .5e\n", (LINK->lods - f) / (2 * log10_)); if (ivar == 1 && icall == 0) { for (i = 0; i < n; i++) { for (j = i; j < n; j++) fprintf(stream, " % .5e\n", 2.0 * bmat[i][j]); putc('\n', stream); } } /*Stop stream*/ fprintf(stream, "~\n"); /*sexdif=true and readfemale=false*/ } Void outf() { struct LOC_outf V; int i, j, k, l; double deriv[3]; thetarray oldtheta; double dist; int FORLIM; locusvalues *WITH; int FORLIM1, FORLIM2; thetavalues *WITH1; double TEMP; #if PARALLEL long finalnfe; #endif /*PARALLEL*/ #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_outf ; performCheckpoint ( functionLocation , funCallPath , 0 ) ; fclose ( final ) ; copyFile ( "final.dat" , OutfILINKFinalDat ) ; #ifdef vms final = fopen ( "final.dat" , "a", "ctx=rec","shr=get,put,upd" ) ; #else final = fopen ( "final.dat" , "a" ) ; #endif if ( dostream ) { fclose ( stream ) ; copyFile ( "stream.dat" , OutfILINKStreamDat ) ; #ifdef vms stream = fopen ( "stream.dat" , "a", "ctx=rec","shr=get,put,upd" ) ; #else stream = fopen ( "stream.dat" , "a" ) ; #endif } } else { if ( functionLocation == ckptTuple . ckptLocation ) { recoverCheckpoint ( NULL ) ; fclose ( final ) ; copyFile ( OutfILINKFinalDat , "final.dat" ) ; #ifdef vms final = fopen ( "final.dat" , "a", "ctx=rec","shr=get,put,upd" ) ; #else final = fopen ( "final.dat" , "a" ) ; #endif if ( dostream ) { fclose ( stream ) ; copyFile ( OutfILINKStreamDat , "stream.dat" ) ; #ifdef vms stream = fopen ( "stream.dat" , "a", "ctx=rec","shr=get,put,upd" ) ; #else stream = fopen ( "stream.dat" , "a" ) ; #endif } } } /* Shriram: end */ #endif firstapprox = true; lasttime = true; /*recover optimal x and f values, put x value into xall*/ f = outsavefvalue; k = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; xall[i] = outsavex[k - 1]; } } /*recover xall values into maletheta and femaletheta*/ setparam(); fprintf(final, "CHROMOSOME ORDER OF LOCI : \n"); for (i = 1; i <= mlocus; i++) { j = 0; do { j++; } while (order[j - 1] != i); fprintf(final, "%3d", j); } putc('\n', final); if (itsys != 0) { fprintf(final, "****************** FINAL VALUES **********************\n"); fprintf(final, "PROVIDED FOR LOCUS %3d (CHROMOSOME ORDER)\n", order[itsys - 1]); fprintf(final, "******************************************************\n"); WITH = thislocus[itsys - 1]; if (disequi) { fprintf(final, "HAPLOTYPE FREQUENCIES:\n"); for (i = 0; i < nuhap; i++) fprintf(final, "%9.6f", hapfreq->genarray[i]); } else { fprintf(final, "GENE FREQUENCIES :\n"); FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) fprintf(final, "%9.6f", WITH->freq[i]); if (disfreqs && (binary_ == WITH->which)) { fprintf(final, "\nCONDITIONAL (on disease allele) GENE FREQUENCIES :\n"); FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) fprintf(final, "%9.6f", WITH->freqcond[i]); } } putc('\n', final); if (WITH->which == quantitative) { fprintf(final, "VALUES FOR GENOTYPE MEANS:\n"); invert(WITH->UU.U1.vmat, WITH->UU.U1.ntrait, &WITH->UU.U1.det); FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->nallele; for (j = 1; j <= FORLIM1; j++) { FORLIM2 = WITH->nallele; for (k = j - 1; k < FORLIM2; k++) fprintf(final, "%6.3f ", WITH->UU.U1.pm[j][k][i]); } putc('\n', final); } fprintf(final, "COVARIANCE MATRIX:\n"); FORLIM = WITH->UU.U1.ntrait; for (i = 1; i <= FORLIM; i++) { for (j = 0; j < i; j++) fprintf(final, "%6.3f ", WITH->UU.U1.vmat[i - 1][j]); putc('\n', final); } } else { if (WITH->which == affection) { fprintf(final, "PENETRANCES:\n"); FORLIM = WITH->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH->nallele; for (j = i - 1; j < FORLIM2; j++) fprintf(final, "%5.3f ", WITH->UU.U0.pen[i][j][2][l]); } putc('\n', final); if (sexlink) { FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) fprintf(final, "%5.3f ", WITH->UU.U0.pen[0][i][2][l]); } putc('\n', final); } } } } fprintf(final, "******************************************************\n"); if (interfer && !mapping) { fprintf(final, "P VALUES:\n"); WITH1 = maletheta; memcpy(oldtheta, WITH1->theta, sizeof(thetarray)); WITH1->theta[0] = (oldtheta[0] + oldtheta[mlocus - 1] - oldtheta[mlocus - 2]) / 2.0; WITH1->theta[mlocus - 2] = (oldtheta[mlocus - 2] + oldtheta[mlocus - 1] - oldtheta[0]) / 2.0; WITH1->theta[mlocus - 1] = (oldtheta[0] + oldtheta[mlocus - 2] - oldtheta[mlocus - 1]) / 2.0; for (i = 0; i < mlocus; i++) fprintf(final, " %5.3f", WITH1->theta[i]); putc('\n', final); memcpy(WITH1->theta, oldtheta, sizeof(thetarray)); if (sexdif) { WITH1 = femaletheta; memcpy(oldtheta, WITH1->theta, sizeof(thetarray)); WITH1->theta[0] = (oldtheta[0] + oldtheta[mlocus - 1] - oldtheta[mlocus - 2]) / 2.0; WITH1->theta[mlocus - 2] = (oldtheta[mlocus - 2] + oldtheta[mlocus - 1] - oldtheta[0]) / 2.0; WITH1->theta[mlocus - 1] = (oldtheta[0] + oldtheta[mlocus - 2] - oldtheta[mlocus - 1]) / 2.0; fprintf(final, "FEMALE: \n"); for (i = 0; i < mlocus; i++) fprintf(final, " %5.3f", WITH1->theta[i]); putc('\n', final); memcpy(WITH1->theta, oldtheta, sizeof(thetarray)); } if (ivar == 1 && icall == 0) { for (i = 0; i <= 2; i++) { TEMP = 1 + exp(xall[nall - i - 1]); deriv[i] = exp(xall[nall - i - 1]) / (TEMP * TEMP); } k = -1; for (i = 0; i <= 2; i++) { if (itp[nall - i - 1] == 1) { k++; l = -1; for (j = 0; j <= 2; j++) { if (itp[nall - j - 1] == 1) { l++; bmat[n - k - 1][n - l - 1] *= deriv[j] * deriv[i]; } } if (l == -1) l = 0; for (j = n - l - 1; j >= 0; j--) { bmat[j][n - k - 1] *= deriv[i]; bmat[n - k - 1][j] = bmat[j][n - k - 1]; } } } } } fprintf(final, "THETAS:\n"); WITH1 = maletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(final, " %5.3f", WITH1->theta[i]); if (interfer) fprintf(final, " %5.3f\n", maletheta->theta[mlocus - 1]); else putc('\n', final); if (sexdif) { fprintf(final, "FEMALE:\n"); WITH1 = femaletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) fprintf(final, " %5.3f", WITH1->theta[i]); if (interfer) fprintf(final, " %5.3f\n", femaletheta->theta[mlocus - 1]); else putc('\n', final); if (readfemale) { fprintf(final, "FEMALE/MALE DIST RATIO :\n"); FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { dist = getdist(&maletheta->theta[i]); if (dist != 0.0) dist = getdist(&femaletheta->theta[i]) / dist; else dist = 0.0; fprintf(final, " %5.3f", dist); } if (interfer) { dist = getdist(&maletheta->theta[mlocus - 1]); if (dist != 0.0) dist = getdist(&femaletheta->theta[mlocus - 1]) / dist; else dist = 0.0; fprintf(final, " %5.3f", dist); } putc('\n', final); } else { fprintf(final, "CONSTANT FEMALE/MALE DIST RATIO :\n"); fprintf(final, "%5.3f\n", distratio); } } fprintf(final, "******************************************************\n"); fprintf(final, "-2 LN(LIKE) = % .5e\n", f); getlods(&V.lods, x, &V); if (mlocus != 2) fprintf(final, "OTTS GENERALIZED LOD SCORE =% .5e\n", (V.lods - f) / (2 * log10_)); else fprintf(final, "LOD SCORE =% .5e\n", (V.lods - f) / (2 * log10_)); fprintf(final, "NUMBER OF ITERATIONS = %5d\n", nit); #if PARALLEL finalnfe = nfe; for(i=0;i cont ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_iter_st_first == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( & LINK -> cont ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif sumt = 0.0; idg = 0; for (i = 0; i < n; i++) { /*printf("first %lf %lf %lf %lf\n", xt[i], x[i], t, p[i]);*/ /*Alex*/ xt[i] = x[i] + t * p[i]; } fun(&ft, xt); /*save likelihood values for later*/ for (i=0; i < nuped; i++) outsavelike[i] = likebyped[i]; nfe++; } Local Void decreaset(LINK) struct LOC_step *LINK; { int i; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_gem_iter_st_decr ; performCheckpoint ( functionLocation , funCallPath , LINK -> cont ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_iter_st_decr == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( & LINK -> cont ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif /*Modified by M. Lathrop 29/04/86 to trap tmin=0 problem*/ if (tmin < small) tmin = small; LINK->cont = go_; while (LINK->cont == go_) { if (f - fsave == 0.0 && idif == 2) idg = 2; if (t < tmin) { LINK->cont = exit3; break; } t = 0.5 * t; for (i = 0; i < n; i++) xt[i] = x[i] + t * p[i]; fun(&ft2, xt); nfe++; if (ft2 < f) { sumt += t; f = ft2; idg = 0; memcpy(x, xt, sizeof(vector)); /*save likelihood values for later*/ for (i=0; i < nuped; i++) outsavelike[i] = likebyped[i]; if (sumt < tmin) LINK->cont = exit3; else LINK->cont = exit2; continue; } if (ft + f - ft2 - ft2 <= 0.0) scal = 0.1; else { scal = 1.0 + 0.5 * (f - ft) / (f + ft - ft2 - ft2); if (scal < 0.1) scal = 0.1; } t = scal * t; for (i = 0; i < n; i++) xt[i] = x[i] + t * p[i]; fun(&ft, xt); nfe++; if (f <= ft) continue; sumt += t; idg = 0; f = ft; memcpy(x, xt, sizeof(vector)); /*save likelihood values for later*/ for (i=0; i < nuped; i++) outsavelike[i] = likebyped[i]; if (t < tmin) LINK->cont = exit3; else LINK->cont = exit2; } } Local Void increaset(LINK) struct LOC_step *LINK; { int i, j; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_gem_iter_st_incr ; performCheckpoint ( functionLocation , funCallPath , LINK -> cont ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_iter_st_incr == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( & LINK -> cont ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif sumt += t; LINK->cont = go_; while (LINK->cont == go_) { twot = t + t; if (ibnd > 0 && tbnd >= 0.0 && twot > tbnd) { f = ft; memcpy(x, xt, sizeof(vector)); fprintf(outfile, "****** ACTIVE BOUNDARY CONSTRAINT *****\n"); LINK->cont = exit1; continue; } memcpy(x, xt, sizeof(vector)); for (i = 0; i < n; i++) xt[i] = x[i] + t * p[i]; fun(&f2t, xt); nfe++; if (f2t > ft) { f = ft; LINK->cont = exit2; break; } if (f2t + f - ft - ft < 0.0 || ft - f2t + curv * (ft - f) >= 0.0) { sumt += t; t += t; ft = f2t; } else { sumt += t; f = f2t; memcpy(x, xt, sizeof(vector)); /*save likelihood values for later*/ for (j=0; j < nuped; j++) outsavelike[i] = likebyped[i]; LINK->cont = exit2; } } } static Void step() { struct LOC_step V; #if !defined(DOS) /* Shriram: begin */ int ckptFunCallPath = ckptTuple . ckptAttribute ; if ( ( checkpointedRun == checkpointStatus ) && ( functionLocation == ckptTuple . ckptLocation ) ) { if ( fCP_gem_iter_st_first == ckptFunCallPath ) goto FunRecover3 ; else if ( fCP_gem_iter_st_decr == ckptFunCallPath ) goto FunRecover4 ; else if ( fCP_gem_iter_st_incr == ckptFunCallPath ) goto FunRecover5 ; } /* Shriram: end */ #endif firstapprox = true; #if !defined(DOS) /* cgh -- gcc */ FunRecover3: #endif /* !defined(DOS) */ firststep(&V); if (f > ft) #if !defined(DOS) /* cgh -- gcc */ FunRecover5: #endif /* !defined(DOS) */ increaset(&V); else #if !defined(DOS) /* cgh -- gcc */ FunRecover4: #endif /* !defined(DOS) */ decreaset(&V); if (V.cont == exit2) t = sumt; if (V.cont == exit3) { iret = 1; return; } memcpy(gsave, g, sizeof(vector)); isw = 0; iret = 2; } /* Local variables for update: */ struct LOC_update { int j, jm1; boolean cont, dfp; } ; Local Void prep(LINK) struct LOC_update *LINK; { int i, k; iswup = 1; wtil[0] = -gsave[0]; ztil[0] = y[0]; for (k = 2; k <= n; k++) { wtil[k - 1] = -gsave[k - 1]; ztil[k - 1] = y[k - 1]; for (i = 0; i <= k - 2; i++) { tl[i][k - 1] = tl[k - 1][i]; wtil[k - 1] -= tl[k - 1][i] * wtil[i]; ztil[k - 1] -= tl[k - 1][i] * ztil[i]; } } sb = 0.0; sc = 0.0; sd = 0.0; for (i = 0; i < n; i++) { sb += t * ztil[i] * wtil[i] / d[i]; sc += t * t * wtil[i] * wtil[i] / d[i]; sd += ztil[i] * ztil[i] / d[i]; } } Local Void sr1update(LINK) struct LOC_update *LINK; { alpha = -1.0; if (sc - sb == 0.0 || sb - sd == 0.0 || sd - 2.0 * sb + sc == 0.0) { idg = 3; return; } sa = 1.0 / (sqrt(fabs(sc - sb)) * sqrt(fabs(sb - sd))); thet1 = ((sd - sb) * sa + 1.0) / (2.0 * sb - sd - sc); thet2 = sa + (sa * (sb - sc) + 1.0) / (sd - 2.0 * sb + sc); } Local Void sr2update(LINK) struct LOC_update *LINK; { aa = sb / sc - 2.0 * (sd / sb) + sd / sc; bb = sb / sc - 1.0; cc = 1.0 - sb / sd; del2 = bb * bb - aa * cc; LINK->dfp = true; if (del2 > 0.00000001) { LINK->dfp = false; del = sqrt(del2); alph1 = (del - bb) / aa; alph2 = (-bb - del) / aa; if (fabs(alph1) < fabs(alph2)) alpha = alph1; else alpha = alph2; if (fabs(alpha) < 0.00001) LINK->dfp = true; else { sa = (alpha + 1.0) * (alpha + 1.0) + sc / sb - alpha * alpha * (sc / sb) * (sd / sb) - 1.0 + alpha * alpha * sd / sb; if (sa <= 0.0) sa = 0.0; else { sa = sqrt(sa); sa = 1.0 / (sa * sb); } rdiv = 1.0 / (alpha * alpha * sd + 2.0 * alpha * sb + sc); thet1 = -(sa * alpha * (alpha * sd + sb) + 1.0) * rdiv; thet2 = sa + (alpha * sa * (sc + alpha * sb) - alpha) * rdiv; } } if (!LINK->dfp) return; alpha = 0.0; sa = 1.0 / (sqrt(sb) * sqrt(sc)); thet1 = -1.0 / sc; thet2 = sa; } Local Void getwzs(LINK) struct LOC_update *LINK; { int i, k; for (i = 0; i < n; i++) { w[i] = t * wtil[i] + alpha * ztil[i]; z[i] = t * thet1 * wtil[i] + thet2 * ztil[i]; } s[n - 1] = 0.0; for (k = 1; k < n; k++) { LINK->j = n - k + 1; LINK->jm1 = LINK->j - 1; s[LINK->jm1 - 1] = s[LINK->j - 1] + w[LINK->j - 1] * w[LINK->j - 1] / d[LINK->j - 1]; } nu = 1.0; eta = 0.0; } Local Void recur(LINK) struct LOC_update *LINK; { int i, k; LINK->cont = true; while (LINK->cont) { LINK->cont = false; if (iswup < 2) { for (i = 0; i < n; i++) wtjp1[i] = -gsave[i]; memcpy(ztjp1, y, sizeof(vector)); } else { for (i = 0; i < n; i++) { wtil[i] = alpha * y[i] - t * g[i]; ztil[i] = thet2 * y[i] - t * thet1 * g[i]; } } LINK->j = 0; lambj2 = 0.0; while (LINK->j < n - 1) { LINK->j++; if (iswup < 2) { for (k = LINK->j; k < n; k++) { wtjp1[k] -= wtil[LINK->j - 1] * tl[k][LINK->j - 1]; ztjp1[k] -= ztil[LINK->j - 1] * tl[k][LINK->j - 1]; } } else { for (k = LINK->j; k < n; k++) { wtjp1[k] = wtil[k] - w[LINK->j - 1] * tl[k][LINK->j - 1]; ztjp1[k] = ztil[k] - z[LINK->j - 1] * tl[k][LINK->j - 1]; } } aj = nu * z[LINK->j - 1] - eta * w[LINK->j - 1]; thj = 1.0 + aj * w[LINK->j - 1] / d[LINK->j - 1]; lambj2 = thj * thj + aj * aj * s[LINK->j - 1] / d[LINK->j - 1]; if (iswup < 2) { if (lambj2 > 10.0) { LINK->cont = true; iswup = 2; for (k = 2; k <= n; k++) { for (i = 0; i <= k - 2; i++) tl[k - 1][i] = tl[i][k - 1]; } LINK->j = n; } } if (LINK->cont) continue; dp[LINK->j - 1] = d[LINK->j - 1] * lambj2; lambj = sqrt(lambj2); if (thj > 0.0) lambj = -lambj; muj = thj - lambj; bj = thj * w[LINK->j - 1] + aj * s[LINK->j - 1]; gamlj = bj * nu / (lambj2 * d[LINK->j - 1]); betlj = (aj - bj * eta) / (lambj2 * d[LINK->j - 1]); nu = -(nu / lambj); eta = -((eta + aj * aj / (muj * d[LINK->j - 1])) / lambj); if (iswup < 2) { for (k = LINK->j; k < n; k++) tl[k][LINK->j - 1] += t * (betlj + thet1 * gamlj) * wtjp1[k] + (alpha * betlj + thet2 * gamlj) * ztjp1[k]; } else { for (k = LINK->j; k < n; k++) { tl[k][LINK->j - 1] = tl[k][LINK->j - 1] / lambj2 + betlj * wtil[k] + gamlj * ztil[k]; wtil[k] = wtjp1[k]; ztil[k] = ztjp1[k]; } } } } aj = nu * z[n - 1] - eta * w[n - 1]; lambj = 1.0 + aj * w[n - 1] / d[n - 1]; dp[n - 1] = d[n - 1] * lambj * lambj; memcpy(d, dp, sizeof(vector)); } /*UPDATE*/ static Void update() { struct LOC_update V; prep(&V); if (sb < sc) fbcd = sb; else fbcd = sc; if (sd < fbcd) fbcd = sd; if (fbcd > small) { fbcd = 2.0 * sc * (sd / sb) / (sc + sd); if (fbcd < 1.0) sr1update(&V); else sr2update(&V); } else sr1update(&V); if (idg != 3) { getwzs(&V); recur(&V); } } Local Void bldlt(b) vector *b; { int i, j, ic, k; double su, tlic, ff, hh, temp, temp1; matrix s; vector tu, xvec; firstapprox = true; ff = f; if (icall > 0 && ihess <= 0) { memcpy(xvec, xall, sizeof(vector)); hh = 10 * h; for (i = 0; i < n; i++) { temp = x[i]; x[i] += hh; fun(&f, x); tu[i] = f; for (j = 0; j < i + 1; j++) { temp1 = x[j]; x[j] += hh; fun(&f, x); b[i][j] = f; b[j][i] = b[i][j]; x[j] = temp1; } x[i] = temp; } memcpy(xall, xvec, sizeof(vector)); for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) { b[i][j] = (ff + b[i][j] - tu[i] - tu[j]) / (hh * hh); b[j][i] = b[i][j]; } } } ic = 1; while (b[ic - 1][ic - 1] > 0.0 && ic <= n) { temp = b[ic - 1][ic - 1]; d[ic - 1] = b[ic - 1][ic - 1]; tl[ic - 1][ic - 1] = 1.0; if (ic != n) { for (k = ic; k < n; k++) tl[k][ic - 1] = b[k][ic - 1] / temp; for (i = ic; i < n; i++) { tlic = tl[i][ic - 1]; for (k = i; k < n; k++) b[k][i] -= tlic * tl[k][ic - 1] * temp; } } ic++; } if (ic > n) { icall--; fprintf(outfile, "FACTORIZATION SUCCEEDED\n"); } else { icall++; fprintf(outfile, "FACTORIZATION FAILED\n"); } if (icall != 0) return; s[0][0] = 1.0; for (i = 2; i <= n; i++) { for (k = 0; k <= i - 2; k++) { su = 0.0; for (j = k; j <= i - 2; j++) su += tl[i - 1][j] * s[j][k]; s[i - 1][k] = -su; } s[i - 1][i - 1] = 1.0; } for (i = 0; i < n; i++) { for (j = i; j < n; j++) { su = 0.0; for (k = j; k < n; k++) su += s[k][i] * s[k][j] / d[k]; b[i][j] = su; b[j][i] = su; } } fprintf(outfile, "B-MATRIX\n"); for (i = 1; i <= n; i++) { for (j = 0; j < i; j++) fprintf(outfile, "% .5e", b[i - 1][j]); putc('\n', outfile); } if (ivar != 1) return; k = 0; for (i = 0; i < nall; i++) { se[i] = 0.0; if (itp[i] == 1) { k++; se[i] = sqrt(b[k - 1][k - 1]); } } } Local Void inib() { int i, j; FILE *in1; in1 = NULL; if (icall != 1 && ihess > 1) { if (in1 != NULL) in1 = freopen("in1.dat", "r", in1); else in1 = fopen("in1.dat", "r"); if (in1 == NULL) exit(FileNotFound); for (i = 1; i <= n; i++) { for (j = 0; j < i; j++) fscanf(in1, "%lf", &bmat[i - 1][j]); } for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) bmat[j][i] = bmat[i][j]; } } bldlt(bmat); if (icall == 1) { for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) tl[i][j] = 0.0; tl[i][i] = 1.0; d[i] = 1.0; } } if (in1 != NULL) fclose(in1); } Local Void initilink() { int i, j; #if !defined(DOS) /* Shriram: begin */ if ( normalRun == checkpointStatus ) { funCallPath = fCP_gem_init ; performCheckpoint ( functionLocation , funCallPath , 0 ) ; } else { if ( ( functionLocation == ckptTuple . ckptLocation ) && ( fCP_gem_init == ckptTuple . ckptAttribute ) ) { recoverCheckpoint ( NULL ) ; funCallPath = ckptTuple . ckptAttribute ; } } /* Shriram: end */ #endif firstapprox = true; fprintf(outfile, "DIFFER INTER = % .5e TRUNC UPPER = % .5e\n", h, trupb); nit = 0; /*Number of iterations*/ idg = 0; /*Exit condition*/ idif = 1; t = 0.1; tmin = 0.0; fsmf = 0.0; #if PARALLEL temprowfence = (fencearray *) Malloc(sizeof(fencearray)); tempqfence = (fencearray *) Malloc(sizeof(fencearray)); *secondfe = 0; *numNuclear = 0; *firstfe = 1; #endif fun(&f, x); #if PARALLEL /*If there are too many nuclear families (usually due to multiple loops), then dynamic load balancing should not be enabled*/ if ((*numNuclear) <= MAXNUMFAM) *firstfe = 0; else *numNuclear = 0; #endif /*save likelihood values for later*/ for (i=0; i < nuped; i++) outsavelike[i] = likebyped[i]; nfe = 1; for (i = 0; i < n; i++) { for (j = 0; j < i + 1; j++) tl[i][j] = 0.0; tl[i][i] = 1.0; d[i] = 1.0; } if (ihess <= 0) return; icall = 0; inib(); icall = 1; t = 1.0; } #if PARALLEL /*Figure out which processors will be masters for which theta evaluations*/ void AssignThetas() { int i,j; int procNum; if((n >= Tmk_nprocs) || (continue_ == quit)) { /* At least as many thetas as processors */ *slavesPerGroup = 1; *numGroups = Tmk_nprocs; } else { /* More processors than thetas */ for(i=2;i<=Tmk_nprocs;i++) { if((Tmk_nprocs % i) != 0) continue; if((Tmk_nprocs/i) <= n) break; } *slavesPerGroup = i; *numGroups = Tmk_nprocs/i; } *thetasPerGroup = n/(*numGroups); *nextTheta = (*numGroups) * (*thetasPerGroup); for(i=0, procNum=0; i<(*numGroups); i++) for(j=0; j<(*slavesPerGroup); j++, procNum++) { whoIsMyMaster[procNum] = i*(*slavesPerGroup); if(j == 0) { iAmAMaster[procNum] = true; thetanumbase[procNum] = i*(*thetasPerGroup); thetanumfence[procNum] = thetanumbase[procNum] + (*thetasPerGroup); } else iAmAMaster[procNum] = false; } } #endif Void gforward() { int i, k; #if PARALLEL int j; #endif /*The following declaration was introduced by A. A. Schaffer 7/27/94 to fix a bug where the wrong xall was being used to move to the next theta*/ double xallsave[maxn]; /*Save value of xall to recover it later*/ firstapprox = true; outsavefvalue = f; saveparams(); k = 0; for (i = 0; i < maxn; i++) { if (itp[i] == 1) { k++; xallsave[i] = outsavex[k - 1]; } else xallsave[i] = xall[i]; } #if PARALLEL #if DO_PARALLELTHETAS parallelThetas = 1; /* Turn on parallel thetas */ if(Tmk_proc_id == 0) { /* If master, assign thetas, and setup global info */ AssignThetas(); if (continue_ == quit) *slavesPerGroup = 1; for(i=0;ifull_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask); #endif /*IS_SHMEM*/ } firstapprox = false; for(j=0;jgthischild[mymaster]; pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; hx = h; if (ihx == 1) { if (fabs(x[i]) < 0.1) hx = h * 0.1; else hx = h * fabs(x[i]); } #if !PARALLEL_GCENTRAL fe = 0; #endif /* !PARALLEL_GCENTRAL */ x[i] += hx; if (continue_ != quit) { fun(&fxph, x); gnfe[i]++; } firstapprox = false; (*gg)[i] = (fxph - (*gf)) / hx; /* Store slope value globally */ for(j=0;jfull_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask);/* Wait for everybody to finish */ #endif /*IS_SHMEM*/ #endif /*DO_PARALLELTHETAS*/ #if DO_PARALLELTHETAS #if FUNTIMES if (continue_ != quit) { for(i=0;i<*nextTheta;i++) { #if PARALLEL_GCENTRAL printf("Execution time (likelihood evaluation done by %d processor(s)) for %d = %7.3f\n", *(slavesPerGroup),i,executionTimes[i]); #else /* !PARALLEL_GCENTRAL */ printf("Execution time (likelihood evaluation done by %d processor(s)) for %d = %7.3f\n", *(slavesPerGroup),i,executionTimes[i][0]); #endif /* PARALLEL_GCENTRAL */ fflush(stdout); } } #endif /*FUNTIMES*/ #endif /*DO_PARALLELTHETAS*/ if(*nextTheta < n) { for (i = *nextTheta; i < n; i++) { hx = h; if (ihx == 1) { if (fabs(x[i]) < 0.1) hx = h * 0.1; else hx = h * fabs(x[i]); } x[i] += hx; if (continue_ != quit) { fun(&fxph, x); gnfe[i]++; } firstapprox = false; (*gg)[i] = (fxph - f) / hx; x[i] -= hx; /* for(j=0;j= n ) break ; funCallPath = ckptTuple . ckptAttribute ; } /* Shriram: end */ #endif hx = h; if (ihx == 1) { if (fabs(x[i]) < 0.1) hx = h * 0.1; else hx = h * fabs(x[i]); } xsave = x[i]; x[i] += hx; if (continue_ != quit) { fun(&fxph, x); savedf[i] = fxph; } else fxph = savedf[i]; firstapprox = false; g[i] = (fxph - f) / hx; x[i] = xsave; } if (continue_ != quit) nfe += n; #endif /*PARALLEL*/ for (i = 0; i < maxn; i++) xall[i] = xallsave[i]; } void gcentral() { /* B+1*/ int i, k; double xallsave[maxn]; /*see similar declaration in gforward, above*/ #if PARALLEL int j; #endif firstapprox = true; outsavefvalue = f; saveparams(); k = 0; for (i = 0; i < maxn; i++) { /*B+2*/ if (itp[i] == 1) { /*B + 3*/ k++; xallsave[i] = outsavex[k - 1]; } /*B+2*/ else xallsave[i] = xall[i]; } /*B+1*/ #if PARALLEL #if DO_PARALLELTHETAS parallelThetas = 1; /* Turn on parallel thetas */ *usecentral = 1; if(Tmk_proc_id == 0) { /*B+2*/ #if PARALLEL_GCENTRAL n=n*2; /* Double number of fun calls */ #endif /* PARALLEL_GCENTRAL */ AssignThetas(); if (continue_ == quit) /* cgh -- gcc found this: used to be *slavesPerGroup == 1 */ *slavesPerGroup = 1; #if PARALLEL_GCENTRAL n=n/2; /* Fix value of n */ #endif /* PARALLEL_GCENTRAL */ for(i=0;ifull_barrier,Tmk_nprocs); #else /*!IS_SHMEM*/ Tmk_barrier(Tmk_mask); #endif /*IS_SHMEM*/ firstapprox = true; } /*B+1*/ else firstapprox = false; for(j=0;jgthischild[mymaster]; pnonzgens = gpnonzgens[currentthetanum]; qnonzgens = gqnonzgens[currentthetanum]; hx = h; if (ihx == 1) { /*B+3*/ #if PARALLEL_GCENTRAL if (fabs(x[i/2]) < 0.1) #else /* !PARALLEL_GCENTRAL */ if (fabs(x[i]) < 0.1) #endif /* PARALLEL_GCENTRAL */ hx = h * 0.1; else #if PARALLEL_GCENTRAL hx = h * fabs(x[i/2]); #else /* !PARALLEL_GCENTRAL */ hx = h * fabs(x[i]); #endif /* PARALLEL_GCENTRAL */ } /*B+2*/ #if PARALLEL_GCENTRAL if((i%2) == 0) { /* doing first fe */ /*B+3*/ x[i/2] += hx; if (continue_ != quit) { fun(&fxph, x); gcentralf[i/2][0] = fxph; /* Store fun value */ gnfe[i/2]+=2; } } /*B+2*/ else { /* fe == 1, doing second fe */ /*B+3*/ firstapprox = false; x[i/2] -= hx; if (continue_ != quit) { fun(&fxmh, x); gcentralf[i/2][1] = fxmh; /* Store fun value */ } } /*B+2*/ #else /* !PARALLEL_GCENTRAL */ xsave = x[i]; x[i] += hx; fe = 0; if (continue_ != quit) { fun(&fxph, x); gnfe[i]++; } firstapprox = false; x[i] = xsave - hx; fe = 1; if (continue_ != quit) { fun(&fxmh, x); gnfe[i]++; (*gg)[i] = (fxph - fxmh) / (hx + hx); } #endif /* PARALLEL_GCENTRAL */ for(j=0;jfull_barrier,Tmk_nprocs); #else Tmk_barrier(Tmk_mask);/* Wait for everybody to finish */ #endif /*IS_SHMEM*/ #endif /*DO_PARALLELTHETAS*/ #if DO_PARALLELTHETAS #if FUNTIMES if (continue_ != quit) { for(i=0;i<*nextTheta;i++) { /*B+3*/ #if PARALLEL_GCENTRAL printf("Execution time (likelihood evaluation done by %d processor(s)) for %d,%d = %7.3f\n",*(slavesPerGroup),i/2,(i%2)+1,executionTimes[i]); #else /* !PARALLEL_GCENTRAL */ printf("Execution time (likelihood evaluation done by %d processor(s)) for %d,1 = %7.3f\n",*(slavesPerGroup),i,executionTimes[i][0]); printf("Execution time (likelihood evaluation done by %d processor(s)) for %d,2 = %7.3f\n",*slavesPerGroup,i,executionTimes[i][1]); #endif /* PARALLEL_GCENTRAL */ fflush(stdout); } /*B+3*/ } #endif /*FUNTIMES*/ #endif /*DO_PARALLELTHETAS*/ #if PARALLEL_GCENTRAL if(*nextTheta < 2*n) { /*B+3*/ for (i = *nextTheta; i < (2*n); i++) { /*B+4*/ #else /* !PARALLEL_GCENTRAL */ if(*nextTheta < n) { /*B+3*/ for (i = *nextTheta; i < n; i++) { /*B+4*/ #endif /* PARALLEL_GCENTRAL */ hx = h; if (ihx == 1) { /*B+5*/ #if PARALLEL_GCENTRAL if (fabs(x[i/2]) < 0.1) #else /* !PARALLEL_GCENTRAL */ if (fabs(x[i]) < 0.1) #endif /* PARALLEL_GCENTRAL */ hx = h * 0.1; else #if PARALLEL_GCENTRAL hx = h * fabs(x[i/2]); #else /* !PARALLEL_GCENTRAL */ hx = h * fabs(x[i]); #endif /* PARALLEL_GCENTRAL */ } /*B+5*/ #if PARALLEL_GCENTRAL if((i%2) == 0) { /* doing first fe */ /*B+5*/ x[i/2] += hx; if (continue_ != quit) { fun(&fxph, x); gcentralf[i/2][0] = fxph; gnfe[i/2]+=2; } x[i/2] -= hx; } /*B+5 */ else { /* fe == 1 */ /*B+5*/ firstapprox = false; x[i/2] -= hx; if (continue_ != quit) { fun(&fxmh, x); gcentralf[i/2][1] = fxmh; } x[i/2] += hx; } /*B+5*/ #else /* !PARALLEL_GCENTRAL */ xsave = x[i]; x[i] += hx; if (continue_ != quit) { fun(&fxph, x); gnfe[i]++; } firstapprox = false; x[i] = xsave - hx; if (continue_ != quit) { fun(&fxmh, x); gnfe[i]++; (*gg)[i] = (fxph - fxmh) / (hx + hx); } x[i] = xsave; #endif /* PARALLEL_GCENTRAL */ /* for(j=0;j= n ) break ; funCallPath = ckptTuple . ckptAttribute ; } /*B+3*/ /* Shriram: end */ #endif hx = h; if (ihx == 1) { /*B+3*/ if (fabs(x[i]) < 0.1) hx = h * 0.1; else hx = h * fabs(x[i]); } /*B+3*/ xsave = x[i]; x[i] += hx; if (continue_ != quit) { /*B+3*/ fun(&fxph, x); savedf[2*i] = fxph; } /*B+3*/ else fxph = savedf[2*i]; firstapprox = false; x[i] = xsave - hx; if (continue_ != quit) { /*B+3*/ fun(&fxmh, x); savedf[2 * i + 1] = fxmh; } /*B+3*/ else fxmh = savedf[2 * i + 1]; g[i] = (fxph - fxmh) / (hx + hx); x[i] = xsave; } /*B+2*/ if (continue_ != quit) nfe += 2 * n ; /* Shriram */ #endif for (i = 0; i < maxn; i++) xall[i] = xallsave[i]; } Local Void getp() { int i, nmj, j; #if PARALLEL int currentnfe; #endif nit++; fsav2 = fsave; fsave = f; #if PARALLEL currentnfe = nfe; for(i=0;i maxit) { idg = 6; return; } if (n < 20) { fprintf(outfile, "X= "); outcontrol(x); fprintf(outfile, "G= "); outcontrol(g); } if (n == 1) p[0] = -(g[0] / d[0]); else { v[0] = -g[0]; for (i = 2; i <= n; i++) { v[i - 1] = -g[i - 1]; for (j = 0; j <= i - 2; j++) v[i - 1] -= tl[i - 1][j] * v[j]; } p[n - 1] = v[n - 1] / d[n - 1]; for (j = 1; j < n; j++) { nmj = n - j; p[nmj - 1] = v[nmj - 1] / d[nmj - 1]; for (i = nmj; i < n; i++) p[nmj - 1] -= tl[i][nmj - 1] * p[i]; } } fprintf(outfile, "P= "); outcontrol(p); if (ibnd == 1) { for (i = 0; i < n; i++) { if (p[i] == 0.0) idg = 7; } } if (idg == 7) return; ptg = 0.0; for (i = 0; i < n; i++) ptg += p[i] * g[i]; if (ptg >= 0.0) { idg = 1; return; } if (fabs(ptg) < tol) { idg = 4; fsmf = fsav2 - f; fprintf(outfile, "FSMF = % .5e PTG = % .5e TMIN = % .5e\n", fsmf, ptg, tmin); return; } xpm = xpmcon; if (nit == 1) return; for (i = 0; i < n; i++) { if (ihx == 1) { xp = fabs(x[i]); if (xp < 0.1) xp = 0.1; xp /= fabs(p[i]); if (xp < xpm) xpm = xp; } else { if (xpm > fabs(1.0 / p[i])) xpm = fabs(1.0 / p[i]); } } tmin = 0.5 * xpm * h / trupb; if (idif == 2) t = 1.0; else { t = -2.0 * fsmf / ptg; if (t <= 0.0) t = 1.0; else { if (1.0 < t) t = 1.0; } } fprintf(outfile, "FSMF = % .5e PTG =% .5e TMIN=% .5e\n", fsmf, ptg, tmin); fprintf(outfile, "INITIAL T = % .5e\n", t); } Local Void getytp() { int i; ytp = 0.0; fsmf = fsave - f; for (i = 0; i < n; i++) { y[i] = g[i] - gsave[i]; ytp += y[i] * p[i]; } } Local Void chkbnd() { /*This procedure modified by M. Lathrop 29/04/86 with the introduction of continue and repeat*/ int i, j, k, ik, ii, jk; boolean continue_; /* cgh -- gcc warning fix */ ii = ik = jk = 0; do { clb = clbcon; for (j = 1; j <= 2; j++) { k = 0; for (i = 1; i <= nall; i++) { if (itp[i - 1] == 1) { k++; check = fabs(x[k - 1] - bnd[i - 1][j - 1]); if (check <= clb) { clb = check; ik = k; ii = i; jk = j; } } } } if (clb < 0.1 * h) { ihess = 0; if (jk == 2) eh = -h - h; else eh = h + h; x[ik - 1] = bnd[ii - 1][jk - 1] + eh; xall[ii - 1] = x[ik - 1]; itp[ii - 1] = 0; /*slide down saved x*/ for(k = ik; k < nall; k++) outsavex[k-1] = outsavex[k]; k = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; x[k - 1] = xall[i]; } } n = k; tol = tolconst; /* tol:=tolconst*sqrt(n);*/ continue_ = true; fprintf(outfile, "******* A VARIABLE WAS SET TO A BOUND ***********\n"); } else { tbnd = tbndcon; for (j = 0; j <= 1; j++) { k = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { k++; teq = (bnd[i][j] - x[k - 1]) / p[k - 1]; if (teq < tbnd && teq > 0.0) tbnd = teq; } } } continue_ = false; if (t * (2.0 + h) >= tbnd) t = tbnd * (0.5 - h); fprintf(outfile, "TBND = % .5e RESET T = % .5e\n", tbnd, t); } } while (continue_); } Local Void iterate() { #if !defined(DOS) /* Shriram: begin */ int ckptFunCallPath = ckptTuple . ckptAttribute ; if ( normalRun == checkpointStatus ) funCallPath = fCP_gem_iter_ ; /* Shriram: end */ #endif #if PARALLLEL #if DO_LOADBALANCE if (0 == (*firstfe)) /*changes by AAS to handle multiple loops*/ *secondfe = 1; #endif /*DO_LOADBALANCE*/ #endif /*PARALLEL*/ while (continue_ == go) { active = false; #if !defined(DOS) /* Shriram: begin */ if ( checkpointedRun == checkpointStatus ) { if ( iterationLocation == ckptTuple . ckptLocation ) checkpointStatus = normalRun ; else /* checkpointedRun AND functionLocation */ { if ( ( fCP_gem_iter_st_first == ckptFunCallPath ) || ( fCP_gem_iter_st_decr == ckptFunCallPath ) || ( fCP_gem_iter_st_incr == ckptFunCallPath ) ) goto FunRecover345 ; else if ( fCP_gem_iter_gcen1 == ckptFunCallPath ) goto FunRecover6 ; else if ( fCP_gem_iter_gfor == ckptFunCallPath ) goto FunRecover7 ; else if ( fCP_gem_iter_gcen2 == ckptFunCallPath ) goto FunRecover9 ; } } else performCheckpoint ( iterationLocation , nit , 0 ) ; #endif getp(); /* Shriram: end */ if (idg != 0) continue_ = quit; else { /*idg == 0*/ /*Shriram*/ iret = 2; if (ibnd == 1) chkbnd(); if (n == 0) continue_ = quit; if (!active) { #if !defined(DOS) FunRecover345: #endif step(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif } } /* THE NEXT IS NOT TRUE IF ACTIVE */ if (iret != 2) { if (idif != 1) { continue_ = quit; break; } idif = 2; isw = 1; #if !defined(DOS) FunRecover9: funCallPath = fCP_gem_iter_gcen2_ ; #endif gcentral(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif fprintf(outfile, "***** SWITCHING TO CENTRAL DIFFERERENCE*****\n"); continue; } if (active) { continue_ = restart; break; } if (idif == 1) { #if !defined(DOS) FunRecover7: funCallPath = fCP_gem_iter_gfor ; #endif #if PARALLEL *usecentral = 0; #endif gforward(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif } else { #if !defined(DOS) FunRecover6: funCallPath = fCP_gem_iter_gcen1_ ; #endif gcentral(); #if !defined(DOS) funCallPath = fCP_gem_iter_ ; #endif } if (isw != 0) continue; getytp(); if (ytp <= 0.0) continue; if (n == 1) d[0] = -(y[0] * d[0] / (t * gsave[0])); else update(); if (idg == 3) continue_ = quit; } } /*START GEMINI*/ Void gemini() { #if !defined(DOS) /* Shriram: begin */ int ckptFunCallPath = ckptTuple . ckptAttribute ; if ( normalRun == checkpointStatus ) funCallPath = fCP_gem_ ; /* Shriram: end */ #endif continue_ = go; while (continue_ != quit) { #if !defined(DOS) /* Shriram: begin */ if ( ( checkpointedRun == checkpointStatus ) && ( iterationLocation == ckptTuple . ckptLocation ) ) recoverCheckpoint ( NULL ) ; else { if ( checkpointedRun == checkpointStatus ) { /* must be a functionLocation checkpoint, but which? */ if ( fCP_gem_init == ckptFunCallPath ) goto FunRecover2 ; else if ( ( fCP_gem_iter_st_first == ckptFunCallPath ) || ( fCP_gem_iter_st_decr == ckptFunCallPath ) || ( fCP_gem_iter_st_incr == ckptFunCallPath ) || ( fCP_gem_iter_gcen1 == ckptFunCallPath ) || ( fCP_gem_iter_gcen2 == ckptFunCallPath ) || ( fCP_gem_iter_gfor == ckptFunCallPath ) ) goto FunRecover34567 ; else if ( fCP_gem_gfor == ckptFunCallPath ) goto FunRecover8 ; } FunRecover2: #endif initilink(); #if !defined(DOS) funCallPath = fCP_gem_ ; FunRecover8: #endif isw = 0; gforward(); #if !defined(DOS) funCallPath = fCP_gem_ ; } #endif /* Shriram: end */ continue_ = go; #if !defined(DOS) FunRecover34567: #endif iterate(); #if !defined(DOS) funCallPath = fCP_gem_ ; #endif } if (ivar == 1) inib(); } int main(argc, argv) int argc; char *argv[]; { #if PARALLEL /* cgh */ parStartup(argc, argv); #else seqStartup(argc, argv); #endif /* if PARALLEL -- cgh */ init_ped_loc_all(); /* dwix */ #if LOOPSPEED /*Dylan*/ ever_read_loopfile = false; #endif openFiles(); #if !defined(DOS) ckptInit(); #endif /* !defined(DOS) */ #if PARALLEL #if !IS_SHMEM if (reportMemStats == false) gMemAndBarrierAlloc(); #endif /* !IS_SHMEM */ allocthetas(); /* this must be done before inputdata() */ #endif /* PARALLEL */ inputdata(); initParams(); #if PARALLEL /* cgh */ if (Tmk_proc_id == 0) checkNotImplemented(); #endif /* if PARALLEL -- cgh */ #if !defined(DOS) ckptEnsureFileContents(); #endif /* !defined(DOS) */ miscInit(); #if !ALLELE_SPEED allocategenetables(); getlocations(); #endif getgeneindices(); /* R. M. Idury */ allocate_loopbreaker_vectors(); /*A. A. Schaffer*/ closeInputFiles(); #if PARALLEL if (0 == maxworkingset) { /*number was not input by user*/ maxworkingset = maxw_estimation(); if (Tmk_proc_id == 0) printf("\nEstimating %d for maxworkingset\n", maxworkingset); } else printf("\nOverriding computed value of maxworkingset with input value %d\n",maxworkingset); #endif #if PARALLEL if (Tmk_proc_id == 0) { initParLib(argc, argv); #if IS_SHMEM gMemAndBarrierAlloc(); #endif /* IS_SHMEM */ allocgen(); /*Added by Alex*/ #if PRECOMPUTE allocprob(); #endif /* PRECOMPUTE */ parThetaSetup(); } #endif /*PARALLEL*/ #if !defined(DOS) /* Shriram: begin */ if ((checkpointedRun != checkpointStatus) || (functionLocation != ckptTuple.ckptLocation) || (fCP_outf != ckptTuple.ckptAttribute)) { ; /* just in case PARALLEL is set, we can't have an if with no body -- cgh */ /* Shriram: end */ #endif #if !PARALLEL gemini(); #endif /* !PARALLEL */ #if !defined(DOS) } #endif /* !defined(DOS) */ #if !PARALLEL outf(); #endif /* !PARALLEL */ #if PARALLEL childLoop(); if (Tmk_proc_id == 0) #endif /*PARALLEL*/ closeOutputFiles(); #if !defined(DOS) ckptCleanup(); #endif /* !defined(DOS) */ #if PARALLEL /* cgh */ parFinish(); #endif /* if PARALLEL -- cgh */ exit(EXIT_SUCCESS); } /* End. */ fastlink-4.1P-fix95/4.1P/src/comrec.c0000644000265600020320000002446006737460341016244 0ustar tilleaadmin/* Output from p2c, the Pascal-to-C translator */ /* From input file "linkmap.p" */ /* This file contains input code shared by modified versions of the */ /* LODSCORE, ILINK, LINKMAP, and MLINK programs */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis*/ /* Human Heredity 44(1994), pp. 225-237. */ /* Most of the code in this file is not changed from LINKAGE 5.1 */ /* The code in this file computes the recombination probabilities*/ #include "commondefs.h" #if !defined(DOS) #include "checkpointdefs.h" #endif #ifdef LODSCORE #include "lodefs.h" #endif /* Local variables for recombination: */ struct LOC_recombination { int here; double p1, p2, p3, p4; } ; /* Local variables for recombine: */ struct LOC_recombine { struct LOC_recombination *LINK; double *theta; double *segprob; int there, nhap; boolean thishet[maxlocus]; hapvector hap1, hap2; hapvector thishap1[maxseg], thishap2[maxseg]; } ; Local Void scramble(LINK) struct LOC_recombine *LINK; { int whichhap, start, length, i, j, k, nrec; double recval, val; int FORLIM2; start = 0; do { start++; } while (!LINK->thishet[start - 1]); length = LINK->there - LINK->LINK->here; for (i = 1; i < length; i++) { memcpy(LINK->hap1, LINK->thishap1[i], sizeof(hapvector)); for (j = 1; j <= length; j++) { nrec = 0; val = 0.5; whichhap = 1; recval = LINK->theta[start - 1]; #ifdef LODSCORE FORLIM2 = nlocus; #else FORLIM2 = mlocus; #endif for (k = start; k < FORLIM2; k++) { if (!LINK->thishet[k]) recval = recval * (1.0 - LINK->theta[k]) + LINK->theta[k] * (1.0 - recval); else { if (whichhap == 1) { if (LINK->thishap1[j - 1][k] == LINK->hap1[k]) val *= 1 - recval; else { nrec++; val *= recval; whichhap = 2; } } else { if (LINK->thishap2[j - 1][k] == LINK->hap1[k]) val *= 1 - recval; else { nrec++; val *= recval; whichhap = 1; } } recval = LINK->theta[k]; } } LINK->there++; if (nrec > maxrec) LINK->segprob[LINK->there - 1] = 0.0; else LINK->segprob[LINK->there - 1] = val; } } } Local Void setrec(val, LINK) double val; struct LOC_recombine *LINK; { LINK->nhap++; memcpy(LINK->thishap1[LINK->nhap - 1], LINK->hap1, sizeof(hapvector)); memcpy(LINK->thishap2[LINK->nhap - 1], LINK->hap2, sizeof(hapvector)); LINK->there++; LINK->segprob[LINK->there - 1] = val; } Local Void dointer(LINK) struct LOC_recombine *LINK; { int i; boolean temphet[3]; for (i = 0; i < mlocus; i++) temphet[i] = LINK->thishet[i]; if (temphet[0] && temphet[1] && !temphet[2]) { setrec(0.5 - 0.5 * LINK->theta[0], LINK); setrec(0.5 * LINK->theta[0], LINK); setrec(0.5 * LINK->theta[0], LINK); setrec(0.5 - 0.5 * LINK->theta[0], LINK); return; } if (temphet[2] && temphet[1] && !temphet[0]) { setrec(0.5 - 0.5 * LINK->theta[mlocus - 2], LINK); setrec(0.5 * LINK->theta[mlocus - 2], LINK); setrec(0.5 * LINK->theta[mlocus - 2], LINK); setrec(0.5 - 0.5 * LINK->theta[mlocus - 2], LINK); return; } if (temphet[2] && temphet[0] && !temphet[1]) { setrec(0.5 - 0.5 * LINK->theta[mlocus - 1], LINK); setrec(0.5 * LINK->theta[mlocus - 1], LINK); setrec(0.5 * LINK->theta[mlocus - 1], LINK); setrec(0.5 - 0.5 * LINK->theta[mlocus - 1], LINK); return; } if (!(temphet[0] && temphet[1] && temphet[2])) { setrec(0.5, LINK); return; } setrec(0.5 * LINK->LINK->p4, LINK); setrec(0.5 * LINK->LINK->p2, LINK); setrec(0.5 * LINK->LINK->p3, LINK); setrec(0.5 * LINK->LINK->p1, LINK); setrec(0.5 * LINK->LINK->p2, LINK); setrec(0.5 * LINK->LINK->p4, LINK); setrec(0.5 * LINK->LINK->p1, LINK); setrec(0.5 * LINK->LINK->p3, LINK); setrec(0.5 * LINK->LINK->p3, LINK); setrec(0.5 * LINK->LINK->p1, LINK); setrec(0.5 * LINK->LINK->p4, LINK); setrec(0.5 * LINK->LINK->p2, LINK); setrec(0.5 * LINK->LINK->p1, LINK); setrec(0.5 * LINK->LINK->p3, LINK); setrec(0.5 * LINK->LINK->p2, LINK); setrec(0.5 * LINK->LINK->p4, LINK); /*not informative*/ } Local Void nexthet(i, val, inphase, LINK) int i; double val; boolInt inphase; struct LOC_recombine *LINK; { double newval, recval; recval = LINK->theta[i - 1]; do { i++; LINK->hap1[i - 1] = 0; LINK->hap2[i - 1] = 0; if (!LINK->thishet[i - 1] && i != mlocus) recval = recval * (1 - LINK->theta[i - 1]) + (1 - recval) * LINK->theta[i - 1]; } while (!(i == mlocus || LINK->thishet[i - 1])); if (i != mlocus) { if (inphase) newval = val * (1 - recval); else newval = val * recval; LINK->hap1[i - 1] = 1; LINK->hap2[i - 1] = 2; nexthet(i, newval, true, LINK); LINK->hap2[i - 1] = 1; LINK->hap1[i - 1] = 2; if (!inphase) newval = val * (1 - recval); else newval = val * recval; nexthet(i, newval, false, LINK); return; } if (!LINK->thishet[i - 1]) { setrec(val, LINK); return; } if (inphase) newval = val * (1 - recval); else newval = val * recval; LINK->hap1[i - 1] = 1; LINK->hap2[i - 1] = 2; setrec(newval, LINK); if (!inphase) newval = val * (1 - recval); else newval = val * recval; LINK->hap2[i - 1] = 1; LINK->hap1[i - 1] = 2; setrec(newval, LINK); } Local Void getrecprob(LINK) struct LOC_recombine *LINK; { int i; LINK->nhap = 0; LINK->there = LINK->LINK->here; i = 0; do { i++; if (LINK->thishet[i - 1]) { LINK->hap1[i - 1] = 1; LINK->hap2[i - 1] = 2; } else { LINK->hap1[i - 1] = 0; LINK->hap2[i - 1] = 0; } } while (!(LINK->thishet[i - 1] || i == mlocus)); if (i == mlocus) setrec(0.5, LINK); else if (interfer) dointer(LINK); else nexthet(i, 0.5, true, LINK); if (LINK->nhap > 1 && !interfer) scramble(LINK); LINK->LINK->here = LINK->there; } Local Void gethet(system, LINK) int *system; struct LOC_recombine *LINK; { int newsystem; newsystem = *system + 1; LINK->thishet[*system - 1] = false; if (*system != mlocus) gethet(&newsystem, LINK); else getrecprob(LINK); LINK->thishet[*system - 1] = true; if (*system != mlocus) gethet(&newsystem, LINK); else getrecprob(LINK); } Local Void recombine(theta_, segprob_, LINK) double *theta_; double *segprob_; struct LOC_recombination *LINK; { struct LOC_recombine V; int system; V.LINK = LINK; V.theta = theta_; V.segprob = segprob_; LINK->here = 0; system = 1; gethet(&system, &V); } Local Void getfemaletheta(LINK) struct LOC_recombination *LINK; { double dist; int ntheta, i; if (interfer) ntheta = mlocus; else ntheta = mlocus - 1; for (i = 0; i < ntheta; i++) { dist = getdist(&maletheta->theta[i]) * distratio; femaletheta->theta[i] = invdist(&dist); } } Void recombination() { struct LOC_recombination V; int i; thetarray oldtheta; thetavalues *WITH; if (interfer) { WITH = maletheta; if (mapping) WITH->theta[mlocus - 1] = mapfunction(WITH->theta[mlocus - 2], WITH->theta[0]); memcpy(oldtheta, WITH->theta, sizeof(thetarray)); if (!mapping && !dolod) { for (i = 0; i < mlocus; i++) oldtheta[i] = 1 / (1 + exp(oldtheta[i])); WITH->theta[0] = oldtheta[0] + oldtheta[mlocus - 1]; WITH->theta[mlocus - 2] = oldtheta[mlocus - 2] + oldtheta[mlocus - 1]; WITH->theta[mlocus - 1] = oldtheta[0] + oldtheta[mlocus - 2]; V.p1 = oldtheta[0]; V.p2 = oldtheta[mlocus - 2]; V.p3 = oldtheta[mlocus - 1]; V.p4 = 1.0 - V.p1 - V.p2 - V.p3; } else { V.p1 = (WITH->theta[0] + WITH->theta[mlocus - 1] - WITH->theta[mlocus - 2]) / 2.0; V.p2 = (WITH->theta[mlocus - 2] + WITH->theta[mlocus - 1] - WITH->theta[0]) / 2.0; V.p3 = (WITH->theta[mlocus - 2] + WITH->theta[0] - WITH->theta[mlocus - 1]) / 2.0; V.p4 = 1.0 - V.p1 - V.p2 - V.p3; } recombine(WITH->theta, WITH->segprob, &V); } else recombine(maletheta->theta, maletheta->segprob, &V); if (sexdif) { if (!readfemale) { if (interfer && !dolod) { WITH = maletheta; WITH->theta[0] = oldtheta[0] + oldtheta[mlocus - 1]; WITH->theta[mlocus - 2] = oldtheta[mlocus - 2] + oldtheta[mlocus - 1]; WITH->theta[mlocus - 1] = oldtheta[0] + oldtheta[mlocus - 2]; } getfemaletheta(&V); } if (interfer) { WITH = femaletheta; if (mapping) WITH->theta[mlocus - 1] = mapfunction(WITH->theta[mlocus - 2], WITH->theta[0]); if (readfemale && !mapping && !dolod) { memcpy(oldtheta, WITH->theta, sizeof(thetarray)); for (i = 0; i < mlocus; i++) oldtheta[i] = 1 / (1 + exp(oldtheta[i])); WITH->theta[0] = oldtheta[0] + oldtheta[mlocus - 1]; WITH->theta[mlocus - 2] = oldtheta[mlocus - 2] + oldtheta[mlocus - 1]; WITH->theta[mlocus - 1] = oldtheta[0] + oldtheta[mlocus - 2]; V.p1 = oldtheta[0]; V.p2 = oldtheta[mlocus - 2]; V.p3 = oldtheta[mlocus - 1]; V.p4 = 1.0 - V.p1 - V.p2 - V.p3; } else { V.p1 = (WITH->theta[0] + WITH->theta[mlocus - 1] - WITH->theta[mlocus - 2]) / 2.0; V.p2 = (WITH->theta[mlocus - 2] + WITH->theta[mlocus - 1] - WITH->theta[0]) / 2.0; V.p3 = (WITH->theta[mlocus - 2] + WITH->theta[0] - WITH->theta[mlocus - 1]) / 2.0; V.p4 = 1.0 - V.p1 - V.p2 - V.p3; } recombine(WITH->theta, WITH->segprob, &V); } else recombine(femaletheta->theta, femaletheta->segprob, &V); } #if ((!defined DOS) && (defined(ILINK) || defined(LODSCORE))) if (firsttime || (checkpointStatus == normalRun)) { #else if (firsttime) { #endif } #if PARALLEL /* Propagate thetas to slaves if in fun() */ if(infun) { for(i=0;isegprob[i]; gfemalesegprob[currentthetanum][i] = femaletheta->segprob[i]; } if((*slavesPerGroup) > 1) { #if BARRIER_OUTPUT printBarrier("(%d) Group barrier at end of recombination\n",++barnum); #endif /*BARRIER_OUTPUT*/ #if IS_SHMEM BARRIER(partial_barrier[mymaster]->barrier,*slavesPerGroup); #else Tmk_barrier(MakeMask(mymaster,mymaster+(*slavesPerGroup)-1)); #endif /*IS_SHMEM*/ } } #endif /*PARALLEL*/ } fastlink-4.1P-fix95/4.1P/src/slowsexmodified.c0000644000265600020320000006760310517437704020205 0ustar tilleaadmin/* This file contains new versions of the routines */ /* segsexup, segsexdown, and some auxiliary routines for use with */ /* LODSCORE, ILINK, LINKMAP, and MLINK */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Anlayis */ /* Human Heredity 44(1994), pp. 225-237. */ /* The versions in this file do not incorporate some of the changes */ /* described in the paper that require lots of memory */ /* Faster versions that use more memory are in sexmodified.c */ /*Most of the code in this file was written by R. M. Idury*/ #include "commondefs.h" unsigned lsegsexfun2(first,second) unsigned first, second; { int g1, g2; /*two gene numbers*/ int j, k; /* loop indices*/ int s1, s2; /*haplotype numbers*/ int FORLIM1, FORLIM2; /*loop bounds*/ int *TEMPGENE1; /* store pointers into genenumber*/ unsigned char *tempflag3; /*stores sparsity pattern for child's genarray*/ FORLIM1 = base[second];/*find beginning and end of isozygote class for second*/ FORLIM2 = fence[second]; TEMPGENE1 = genenumber[first];/*get pointer into genenumber for this haplotype*/ /*try to find a non-zero value for each child*/ for (k = 0; k < nchild; k++) { /*retrieve sparsity pattern for child k*/ tempflag3 = thischild[k]->sparseflag; /*iterate over all the recombined isozygotes of second*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*get haplotypes of this genotype*/ s2 = haps2[j]; if(malechild[k]) { if(tempflag3[s1 - 1] != 0 || tempflag3[s2 - 1] != 0) goto notzero; else continue; } g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*if any of the flags is TRUE, then this child can have this genotype, and we move immediately to testing the next child*/ if(tempflag3[g1 - 1] != 0 || tempflag3[g2 - 1] != 0) goto notzero; } return 0; /*this child failed to have any of the genotypes for the isozygote class, so this isozygote class is not possible*/ notzero: continue; } return 1; /*all children passed the test and have a possible joint genotype*/ } /* segsexsum2 is used in segsexup to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class of both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ Local void segsexsum2(first,second,fslength) unsigned first,second; int fslength; { int g1, g2; /*indices to store gene numbers*/ int f1, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int i, j, k, l; /*loop indices*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ i = base[first]; f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the two ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the two joint genotypes that the child can get from the current parental joint genotypes*/ if(malechild[k]) tempseg[l] = (tempwith3[s1 - 1] + tempwith3[s2 - 1]); else tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1]); } index++; /*increment isozygote class counter*/ } } /*segsexsumdown2 is used in segdown to compute some common subexpressions in the probability updates. first and second are the joint genotypes of the two parents. fslength is the number of probabilities needed for the combined isozygote class for both parental genotypes; fs stands for the product of first and second. LINK is used to pass the genetic information for parents and children */ Local void segsexsumdown2(first,second,fslength,male) unsigned first, second, fslength; unsigned char male; { int g1, g2; /*indices to store gene numbers*/ int f1, s1, s2; /*indices to store haplotype numbers*/ int index; /*counter for combined isozygote equivalence class, will range from 0 to fslength-1*/ int index2; /*used as index for isozygote class*/ int i, j, k, l; /*loop indices*/ int FORLIM1, FORLIM2; /*lower and upper limits on a for loop*/ int *TEMPGENE1; /*temporary pointers into genenumber table*/ double *tempwith3; /*temporarily stores genarray for current child*/ FORLIM1 = base[second]; /*start of the isozygote class for second*/ FORLIM2 = fence[second]; /*end of the isozygote class for second*/ index = 0; /*start with first isozygote in the class*/ index2 = 0; /*iterate over isozygotes of i*/ i = base[first]; f1 = haps1[i]; /*retrieve first haplotype of joint genotype i*/ TEMPGENE1 = genenumber[f1 - 1]; /*lookup partial information in genenumber table*/ /*iterate over isozygotes of j*/ for (j = FORLIM1; j < FORLIM2; j++) { s1 = haps1[j]; /*retrieve first haplotype of joint genotype j*/ s2 = haps2[j]; /*retrieve second haplotype*/ /*lookup the two ways to combine one haplotype from i and one from j*/ g1 = TEMPGENE1[s1 - 1]; g2 = TEMPGENE1[s2 - 1]; /*store these gene numbers for later use; the key point is that we will want these numbers consecutively later, so we store them consecutively in segindex*/ if(male) { segindex[index2++] = s1; segindex[index2++] = s2; } else { segindex[index2++] = g1; segindex[index2++] = g2; } /*iterate over children; update partial computations of new probabilities and store in array tempseg note that tempseg has nchild*fslength relevant entries The fslength entries for child 1 come first, then the fslength entries, for child 2, etc. This is why the increment on l is fslength for each change of child*/ for (l = index, k = 0 ; k < nchild; l += fslength, k++) { tempwith3 = thischild[k]->genarray; /*retrieve genarray*/ /* sum the probabilities for the two joint genotypes that the child can get from the current parental joint genotypes*/ if(malechild[k]) tempseg[l] = (tempwith3[s1 - 1] + tempwith3[s2 - 1]); else tempseg[l] = (tempwith3[g1 - 1] + tempwith3[g2 - 1]); } index++; /*increment isozygote class counter*/ } } /*segsexup updates the genotype probabilities for a parent (p) based on the probabilities of children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children*/ Void segsexup(LINK) struct LOC_seg *LINK; { int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int step1, step2; /*size of isozygote classes*/ double val, temp1; /*temporaries to store intermediate values*/ int i, j, first, second; /*genotype indices*/ int jointisoindex; /*index to work within isozygote classes*/ int k; /*index to loop over children*/ char skip; /*used to skip iterations of a loop*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr; /*store genarrays for p,q, and children*/ unsigned char *newflag2, *newflag3; /*store sparsity patterns for p and q genarrays*/ /* newsegprob2 is used to hold a segprob array, which contain the probabilities for various patterns of recombination events*/ double *newsegprob2; double *tempprob; /*temporary holder for probability array*/ boolean depend; /*used to handle loops*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p and q genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2=WITH2->genarray; /*get genarray for p*/ newwith3=WITH3->genarray; /*get genarray for q*/ newwithr=thischild[0]->genarray; /*get genarray for first child*/ if((*LINK->p)->male) { /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob2 = femaletheta->segprob; /*get female probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0) continue; /*initialize update multiple for each isozygote in class*/ segval[0] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; /*call segsexsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsum2(first,second,step2); /*now specialize update for each member of first's class*/ /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) continue; /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ tempprob = newsegprob2 + probstart[second+j] - 1; /*combine for all children*/ /*due to the arrangement in segsexsum all the probability contributions for a given child are contiguous in the tempseg array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + step2; /*move the base of newwithr*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; val *= temp1; newwithr += step2; } /*update segval entry for this isozygote of first*/ segval[0] += newwith3[second+j] * val; } } /*update p's genarray for each isozygote in this class*/ newwith2[first] *= segval[0] * segscale; } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < mgeno; i++) if((newflag2[i]==1) && (newwith2[i] == 0.0)) newflag2[i] = 0; } else { /* p is female */ /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < mgeno; i++) if(newflag3[i] != 0) nonzgens[nonzcount++] = i; /*store index of nonzero value*/ newsegprob2 = maletheta->segprob; /*get male probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < fgeno; first += step1) { /*number of distinct probabilties needed for first's isoz. class*/ step1 = probend[first] - probstart[first] + 1; skip = 1; /*work only on those isozygotes that are possible*/ for(i = first; i < first+step1; i++) if(newflag2[i] != 0) { skip = 0; break; /*go to next isozygote in class*/ } if(skip) continue; /*initialize update multiple for each isozygote in class*/ for(i = 0; i < step1; i++) segval[i] = 0.0; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(second,first) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ /*call segsexsum2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsum2(second,first,step1); /*now specialize update for each member of first's class*/ for(i = 0; i < step1; i++) { if(newflag2[first+i] == 0) { continue; /*skip if this isozygote is not possible*/ } /*further specialize update for each member of second's isozygote class*/ /*skip if this isozygote not possible*/ if(newflag3[second] == 0) continue; /*get offset into probtable; the offset depends on the isozygote class size and index of each parent note that fisozygoteindex gets incremented by the size of the joint class each time, so it represents a sum of all the numbers of distinct probabilities needed for all joint iso. classes considered before the current p isozygote class*/ tempprob = newsegprob2 + probstart[first+i] - 1; /*combine for all children*/ /*due to the arrangement in segsum all the probability contributions for a given child are contiguous in the tempseg array. the number of contributions is fslength which is the number of probabilities needed for the joint isozygote class of the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step1; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithr = tempseg + step1; /*move the base of newwithr*/ /*iterate over all the remainting children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithr has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithr[0]; for(jointisoindex = 1; jointisoindex < step1; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithr[jointisoindex]; val *= temp1; newwithr += step1; } /*update segval entry for this isozygote of first*/ segval[i] += newwith3[second] * val; } } /*update p's genarray for each isozygote in this class*/ for(i = 0; i < step1; i++) newwith2[first+i] *= segval[i] * segscale; } /* If any of the nonzero entries in p's genarray became 0, we want to set them to zero to avoid computations on subsequent calls*/ for(i = 0; i < fgeno; i++) if((newflag2[i]==1) && (newwith2[i] == 0.0)) newflag2[i] = 0; } /*Added by A. A. Schaffer to handle loops */ if (loopfirstgen && (!(*LINK->p)->loopdepend)) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->p)->loopdepend = depend; (*LINK->p)->loopneeded = false; } } if ((*LINK->p)->loopdepend) { if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexup*/ /* segsexdown updates the genotype probabilities for a child based on the probabilities of parents and other children. The parameter LINK includes all the genetic information about p, p's spouse q, and their children */ Void segsexdown(LINK) struct LOC_seg *LINK; { int FORLIM; /*loop bound*/ int nonzindex, nonzcount; /*loop index and counter for nonzero values*/ int cgeno; int step2; /*size of mother's isozygote class*/ double valtemp; /*intermediate value in probability updates*/ double val, temp1; /*temporaries to store intermediate values*/ int f1, f2; /*two haplotypes from parent*/ int here, i, j, first, second; /*genotype indices*/ int jointisoindex; /*index to work within isozygote classes*/ int currentindex; /*index to update genarray within isozygote class*/ int k; /*index to loop over children*/ thisarray *WITH2; /*stores genetic information about p*/ thisarray *WITH3; /*stores gnetic information about q*/ double *newwith2, *newwith3, *newwithr, *newwithc; /*store genarrays for p,q, and children*/ int c1, c2; /*haplotypes*/ unsigned char *newflag2, *newflag3, *newflagr; /*store sparsity patterns for p and q genarrays*/ char male; /* newsegprob, and newsegprob2 are used to hold segprob arrays, which contain the probabilities for various patterns of recombination events*/ double *newsegprob, *newsegprob2; double *tempprob; /*temporary holder for probability array*/ boolean depend; /*used to handle loops*/ initseg(LINK); /*get data about this p,q,children triple*/ /*get sparsity patterns for p, q, and child genarrays*/ newflag2 = (*LINK->p)->gen->sparseflag; newflag3 = (*LINK->q)->gen->sparseflag; newflagr = (*LINK->r)->gen->sparseflag; /*In segsexdown p is always male and q is always female; this is not true in segsexup*/ WITH2 = (*LINK->p)->gen; /*get genetic data for p*/ WITH3 = (*LINK->q)->gen; /*get genetic data for q*/ newwith2 = WITH2->genarray; /*get genarray for p*/ newwith3 = WITH3->genarray; /*get genarray for q*/ newwithr = (*LINK->r)->gen->genarray; /*get genarray for first child*/ male = (*LINK->r)->male; if(male) cgeno = mgeno; else cgeno = fgeno; /*The case of 1 child (nchild==0) is handled specially because the subcomputations are much simpler. In particular we do not need to multiply the probabilities among the different children. In a typical pedigree many pairs will have only one child about which information is known (in essence this is the child that keeps the pedigree connected), so this is an important and common special case. */ if(nchild == 0) { /*initialize cache data structures*/ for(i = 0;i < maxhaplo;i++) { flag[i] = 0; psumcache[i] = 0.0; qsumcache[i] = 0.0; } /*initialize gene array and set up flag array*/ for(i = 0; i < cgeno; i++) { gene[i] = 0.0; flag[invgenenum1[i]-1] = 1; flag[invgenenum2[i]-1] = 1; } newsegprob = femaletheta->segprob; /*use female probabilities*/ /*iterate over all joint genotypes*/ for (first = 0; first < fgeno; first++ ) { if(newflag3[first] == 0) continue; /*check if joint genotype is possible*/ valtemp = newwith3[first]; /*get cond. prob. that q has genotype first*/ FORLIM = fence[first]; /*find bounds for the isozygote class of first*/ /*iterate over all the recombined genotypes of the isozygote class*/ for (i = base[first]; i < FORLIM; i++) { f1 = haps1[i]; f2 = haps2[i]; if((flag[f1-1] !=0) || (flag[f2-1] !=0)) { /*condition probability of first as a genotype multiplied by probability of passing on f1 (alternatively f2) as a haplotype*/ /*get probability offset for i*/ val = valtemp*newsegprob[hind[i]]; /*store in qsumcache*/ if(flag[f1-1] != 0) { qsumcache[f1 - 1] += val; } if(flag[f2-1] != 0) { qsumcache[f2 - 1] += val; } } } } /*In this section of the code we update the probabilities for the child based on the probabilities for the parents*/ /*Iterate over all joint genotypes of the child*/ if(male) { double temp1 = 0.0; for(here = 0; here < mgeno; here++) { temp1 += newwith2[here]; } for(here = 0; here < mgeno; here++) { if(newflagr[here] == 0) continue; gene[here] = temp1 * qsumcache[here]; } } else { for(here = 0; here < fgeno; here++) { if(newflagr[here] == 0) continue; c1 = invgenenum1[here]; c2 = invgenenum2[here]; /*probability of child getting genotype here as a result of p passing on c1 and q passing on c2 is summed to gene[here] */ gene[here] += newwith2[c1-1] * qsumcache[c2-1]; /*if c1 is distinct from c2 we need to do the same computation reversing the roles of the two haplotypes*/ if(c1 != c2) { gene[here] += newwith2[c2-1] * qsumcache[c1-1]; } } } /*set up new genarray for r; it is gene scaled by segscale*/ for (first = 0; first < cgeno; first++) { if(newflagr[first] == 0) continue; if(gene[first] == 0.0) newflagr[first] = 0; newwithr[first] *= segscale*gene[first]; } } else { /*nchild is bigger than 0*/ /*initialize genarray entries for child to 0*/ for(i = 0; i < cgeno; i++) { gene[i] = 0.0; } /*find nonzero entries in q's genarray and make a list of them stored in nonzgens; just get one per isozygote class*/ nonzcount = 0; /*iterate over genotypes for q*/ for(i = 0; i < fgeno; i += step2) { /*number of distinct probabilties needed for i's isoz. class*/ step2 = probend[i] - probstart[i] + 1; for(j = i; j < i+step2; j++) if(newflag3[j] != 0) { nonzgens[nonzcount++] = i; /*store index of nonzero value*/ break; /*go to next isozygote class*/ } } newsegprob2 = maletheta->segprob; /*get second parent probabilties*/ /*iterate over genotypes for p*/ for (first = 0; first < mgeno; first++) { if(newflag2[first] == 0) continue; /*iterate over the genotypes representing isozygote classes that q may have*/ for (nonzindex = 0; nonzindex < nonzcount; nonzindex++) { second = nonzgens[nonzindex]; /*check if this first, second pair yield a nonzero value among children's probabilities*/ if(lsegsexfun2(first,second) == 0) continue; /*number of distinct probabilties needed for second's isoz. class*/ step2 = probend[second] - probstart[second] + 1; /*call segsexsumdown2 to compute the part of the conditional probability update that is common to all the members of the combined isozygote class defined by first and second */ segsexsumdown2(first,second,step2,male); for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) segval[jointisoindex] = 0.0; /*now specialize update for each member of first's class*/ if(newflag2[first] == 0) continue; /*further specialize update for each member of second's isozygote class*/ for(j = 0; j < step2; j++) { /*skip if this isozygote not possible*/ if(newflag3[second+j] == 0) { continue; } tempprob = newsegprob2 + probstart[second+j] - 1; /*combine for all children*/ /*due to arrangement segsexsumdown2 all the probability contributions for a given child are contiguous in the tempseg array. the number of contributions is fslength which is the number of probabilties needed for the joint isozygote class for the parents. We get the contribution of the first child (index 0) and then loop over the rest*/ val = tempprob[0] * tempseg[0]; /*iterate over joint isozygote class*/ for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) val += tempprob[jointisoindex] * tempseg[jointisoindex]; newwithc = tempseg + step2; /*move the base of newwithc*/ /*iterate over all the remaining children; notice that the loop index k is not used inside the loop. this is because the last loop statement which moves the offset of newwithc has the effect of incrementing the child*/ for(k = 1; k < nchild; k++) { temp1 = tempprob[0] * newwithc[0]; for(jointisoindex = 1; jointisoindex < step2; jointisoindex++) temp1 += tempprob[jointisoindex] * newwithc[jointisoindex]; val *= temp1; newwithc += step2; } /*probability of this combination of parent genotypes*/ val *= newwith2[first] * newwith3[second+j]; for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) { /*probability of this recombination pattern (based on other children)*/ segval[jointisoindex] += tempprob[jointisoindex] * val; } } /*update the probabilities of two joint genotypes the child might get; each different choice of recombination pattern will lead to a different set of two genotypes*/ currentindex = 0; for(jointisoindex = 0; jointisoindex < step2; jointisoindex++) { temp1 = segval[jointisoindex]; gene[segindex[currentindex++]-1] += temp1; gene[segindex[currentindex++]-1] += temp1; } } } /*finally update child's real genarray by coppy gene multiplied by scale factor segscale*/ for(i = 0; i < cgeno; i++) { if(gene[i] == 0.0) newflagr[i] = 0; /*if probability changes from nonzero to 0.0 change flag to 0*/ newwithr[i] *= segscale * gene[i]; } } /*Added by A. A. Schaffer to handle loops */ if (loopfirstgen && (!((*LINK->r)->loopdepend))) { depend = false; for(i=0; iloopdepend) { depend = true; break; } depend = (depend || ((*LINK->p)->loopdepend) || ((*LINK->q)->loopdepend)); if (depend) { (*LINK->r)->loopdepend = depend; (*LINK->r)->loopneeded = false; } } if ((*LINK->r)->loopdepend) { if (!((*LINK->p)->loopdepend)) (*LINK->p)->loopneeded = true; if (!((*LINK->q)->loopdepend)) (*LINK->q)->loopneeded = true; for(i=0; i< nchild; i++) if (!(childarray[i]->loopdepend)) childarray[i]->loopneeded = true; } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexdown*/ fastlink-4.1P-fix95/4.1P/src/linkmap.c0000644000265600020320000006430307726134436016431 0ustar tilleaadmin/* This file contains a modified version of the LINKMAP program */ /* The modifications are described in the papers: */ /* R. W. Cottignham, Jr., R. M. idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis*/ /* Human Heredity 44(1994), pp. 225-237. */ #include "commondefs.h" #include "gemdefs.h" #include "lidefs.h" #if !defined(DOS) #include "checkpointdefs.h" #endif #ifndef LESSMEMORY #include "moddefs.h" #endif #if PARALLEL /* cgh */ #include "compar.h" /* parallel support code */ #endif /* if PARALLEL -- cgh */ extern void checkzero(); #if !defined(KNR_PROTO) extern boolean zerotest(double); #else extern boolean zerotest(); #endif /* !defined(KNR_PROTO) */ #if PARALLEL /* cgh */ /* Calculate the number of calls to iterpeds() by simulating the loop in main where it is called. We utilize temporary copies of volatile global variables to ensure nothing external is affected. */ void simIpedLoop(status) loopStatus status; { int i, j; int currentIter; /* current number of simulated iteration */ strBuff* strmBuff; /* buffer for stream output */ char tempBuff[TEMPBUFF_SIZE]; /* temporary buffer */ /* initialize temporaries */ thetarray tMaletheta; thetarray tFemaletheta; boolean tContinue_ = continue_; double tThisdist, tThisdistm, tThisdistf; tThisdist = thisdist; tThisdistm = thisdistm; tThisdistf = thisdistf; for (i = 0; i < mlocus - 1; i++) tMaletheta[i] = maletheta->theta[i]; if (readfemale) for (i = 0; i < mlocus - 1; i++) tFemaletheta[i] = femaletheta->theta[i]; currentIter = 0; if (status == countIpeds) /* initialize zero theta counter */ numZeroThetas = 0; /* simulate loop in main that calls iterpeds */ do { if (status == computeThetas) { /* save the computed theta values */ gZeroTheta[currentIter] = false; for (i = 0; i < mlocus - 1; i++) { gmaletheta[currentIter][i] = tMaletheta[i]; if (zerotest(tMaletheta[i])) /* if this thetarray has a 0, record it */ gZeroTheta[currentIter] = true; } if (readfemale) for (i = 0; i < mlocus - 1; i++) gfemaletheta[currentIter][i] = tFemaletheta[i]; /* buffer output as well */ /* stream buffer entry for this loop iteration */ strmBuff = streamBuff->ipeds[currentIter]; if (dostream) { if (whichvary == 1) tThisdist = tThisdistm - getdist(tMaletheta); else tThisdist = tThisdistm + getdist(&tMaletheta[whichvary - 2]); if (normalRun == checkpointStatus) { sprintf(tempBuff, "% .5e\n", tThisdist); append(strmBuff, tempBuff); } if (sexdif) { if (whichvary == 1) tThisdist = tThisdistf - getdist(tFemaletheta); else tThisdist = tThisdistf + getdist(&tFemaletheta[whichvary - 2]); if (normalRun == checkpointStatus) { sprintf(tempBuff, "% .5e\n", tThisdist); append(strmBuff, tempBuff); } } for (i = 1; i < mlocus; i++) if (normalRun == checkpointStatus) { sprintf(tempBuff, "% .5e\n", tMaletheta[i - 1]); append(strmBuff, tempBuff); } if (normalRun == checkpointStatus) append(strmBuff, "\n"); if (sexdif) { for (i = 1; i < mlocus; i++) if (normalRun == checkpointStatus) { sprintf(tempBuff, "% .5e\n", tFemaletheta[i - 1]); append(strmBuff, tempBuff); } } if (normalRun == checkpointStatus) append(strmBuff, "\n"); } /* if dostream */ } else { /* we are counting iterations -- but we also want to count the number of zero thetas */ for (i = 0; i < mlocus - 1; i++) { if (zerotest(tMaletheta[i])) { numZeroThetas++; break; } } } /* this is where iterpeds() is called */ currentIter++; if (whichvary == 1) { tMaletheta[0] -= thetainc; if (zerotest(tMaletheta[0])) tMaletheta[0] = 0.0; /* don't care about this when counting iterations */ if (status == computeThetas) if (readfemale) { tFemaletheta[0] = distratio * getdist(tMaletheta); tFemaletheta[0] = invdist(tFemaletheta); if (zerotest(tFemaletheta[0])) tFemaletheta[0] = 0.0; } } else if (whichvary == mlocus) { tMaletheta[mlocus - 2] += thetainc; if (zerotest(tMaletheta[mlocus - 2])) tMaletheta[mlocus - 2] = 0.0; /* don't care about this when counting iterations */ if (status == computeThetas) if (readfemale) { tFemaletheta[mlocus - 2] = distratio * getdist(&tMaletheta[mlocus - 2]); tFemaletheta[mlocus - 2] = invdist(&tFemaletheta[mlocus - 2]); if (zerotest(tFemaletheta[mlocus - 2])) tFemaletheta[mlocus - 2] = 0.0; } } else { tMaletheta[whichvary - 2] += thetainc; if (zerotest(tMaletheta[whichvary - 2])) tMaletheta[whichvary - 2] = 0.0; tMaletheta[whichvary - 1] = (thetatot - tMaletheta[whichvary - 2]) / (1.0 - 2.0 * tMaletheta[whichvary - 2]); if (zerotest(tMaletheta[whichvary - 1])) tMaletheta[whichvary - 1] = 0.0; /* don't care about this when counting iterations */ if (status == computeThetas) if (readfemale) { tFemaletheta[whichvary - 2] = distratio * getdist(&tMaletheta[whichvary - 2]); tFemaletheta[whichvary - 2] = invdist(&tFemaletheta[whichvary - 2]); if (zerotest(tFemaletheta[whichvary - 2])) tFemaletheta[whichvary - 2] = 0.0; tFemaletheta[whichvary - 1] = distratio * getdist(&tMaletheta[whichvary - 1]); tFemaletheta[whichvary - 1] = invdist(&tFemaletheta[whichvary - 1]); if (zerotest(tFemaletheta[whichvary - 1])) tFemaletheta[whichvary - 1] = 0.0; } } if (whichvary == 1) tContinue_ = (tMaletheta[0] >= finaltheta && tMaletheta[0] >= 0.0); else { if (whichvary == mlocus) tContinue_ = (tMaletheta[whichvary - 2] <= finaltheta && tMaletheta[whichvary - 2] <= 0.5); else tContinue_ = (tMaletheta[whichvary - 2] <= finaltheta && tMaletheta[whichvary - 1] >= 0.0); } } while (tContinue_); /* if it was our job to count the calls to iterpeds(), set the global numIpeds variable */ if (status == countIpeds) { numIpeds = currentIter; } else { /* calculate the number of nonzero theta vectors */ for (i = 0, numNonzeroThetas = 0; i < numIpeds; i++) if (gZeroTheta[i] == false) /* increment count of nonzero thetas, and save ordering of nozero thetas */ absoluteThetaIndex[numNonzeroThetas++] = i; /* save ordering of theta vectors that contain zeros */ for (i = 0, j = numNonzeroThetas; i < numIpeds; i++) if (gZeroTheta[i] == true) absoluteThetaIndex[j++] = i; } return; } #else /* if PARALLEL -- cgh */ /* The following routine iterates over the different pedigrees and handles output. */ void iterpeds() { int i; short thisped; int locus_loop; /* dwix */ /* dwix: begin */ /* I have improved the performace of this function by letting it */ /* save it's results on runs which will be recomputed next */ /* iteration of the linkmap program in the script. The */ /* recomputations will not be performed, but rather the saved data */ /* is used. I use the files s_screen, s_outfile, and s_stream to */ /* save the output to the screen, outfile, and stream respectively. */ /* I have mirrored every output to the screen with an output to */ /* s_screen, every output to outfile to s_outfile, and every output */ /* to stream to s_stream. On the restore, I put the contents of */ /* each file back to its respective place. */ int srun; /* saved run */ int rrun; /* restored run */ #if !defined(vms) && !defined(DOS) && (!PARALLEL) && (MULTI_LINKMAP) int ppid; /* the parent process ID of this process */ int omlocus; /* the mlocus of the run LINKSAVE was from */ int count; /* a counter variable for loops */ double otheta; /* the thetas of the other run */ char instr[DEFAULT_STR_LENGTH]; /* str to read files with */ #endif /* !defined(vms) && !defined(DOS) && !PARALLEL && MULTI_LINKMAP */ FILE *s_screen; /* file to save screen output */ FILE *s_outfile; /* file to save outfile output */ FILE *s_stream; /* file to save stream output */ FILE *s_save; /* file with information regarding to save */ locus_loop = mlocus - 2; /* common number for loop iterations */ srun = false; /* is this a saved run? */ rrun = false; /* is this a restored run */ s_screen = NULL; /* init all FILE* to NULL */ s_outfile = NULL; s_stream = NULL; s_save = NULL; /* dwix: end */ tlike = 0.0; alike = 0.0; for (i = 1; i <= totperson; i++) person[i]->done = false; for (i = 1; i <= totperson; i++) person[i]->firstpass = true; thisc = minint; recombination(); checkzero(); #if !defined(vms) && !defined(DOS) && (!PARALLEL) && (MULTI_LINKMAP) /* dwix: begin */ /* check if it is a run we need to save */ if (maletheta->theta[whichvary-1]==0.0) srun = true; /* if it's a run we also need to restore, then we should not save */ if ((whichvary > 1) && (maletheta->theta[whichvary-2]==0.0)) srun = false; if (srun) { /* if run to save */ unlink(LINKSAVE); /* delete all the old save files */ unlink(SCREENSAVE); unlink(OUTFILESAVE); unlink(STREAMSAVE); s_screen = fopen(SCREENSAVE,"w"); /* open the files for output */ s_outfile = fopen(OUTFILESAVE,"w"); s_stream = fopen(STREAMSAVE,"w"); if ((s_screen==NULL) || (s_outfile==NULL) || (s_stream==NULL)) { /* dwix err msg */ fprintf(stderr,"ERROR opening the save files.\n"); srun = false; fclose(s_screen); fclose(s_outfile); fclose(s_stream); } } /* check if it is a run to restore */ if ((whichvary > 1) && (maletheta->theta[whichvary-2] == 0.0)) rrun = true; if (rrun) { /* if run to restore */ s_save = fopen(LINKSAVE,"r"); /* try to open the head save file */ if (s_save==NULL) rrun = false; /* if error no restore */ } if (rrun) { /* still to restore */ fscanf(s_save,"%d",&ppid); /* get ppid from the file */ /* check it against ours */ if (ppid != getppid()) rrun = false; fscanf(s_save,"%d",&omlocus); /* get mlocus from other run */ if (mlocus != omlocus) /* check it against ours */ rrun = false; if (rrun) { /* still valid for restore -- do loop for loci */ for (count=1;counttheta[count]) > epsilon) rrun = false; } } fclose(s_save); /* and close the file */ } if (rrun) { /* if still to restore */ s_screen = fopen(SCREENSAVE,"r"); /* open the files for restore */ s_outfile = fopen(OUTFILESAVE,"r"); s_stream = fopen(STREAMSAVE,"r"); if ((s_screen==NULL) || (s_outfile==NULL) || (s_stream==NULL)) { /* dwix err msg */ fprintf(stderr,"ERROR opening the save files.\n"); rrun = false; fclose(s_screen); fclose(s_outfile); fclose(s_stream); } } if (rrun) { /* if still to restore */ /* output the screen file's data to screen */ fgets(instr,DEFAULT_STR_LENGTH,s_screen); while (!feof(s_screen)) { printf("%s",instr); fgets(instr,DEFAULT_STR_LENGTH,s_screen); } /* output the outfile file's data to outfile */ fgets(instr,DEFAULT_STR_LENGTH,s_outfile); while (!feof(s_outfile)) { fprintf(outfile,"%s",instr); fgets(instr,DEFAULT_STR_LENGTH,s_outfile); } /* output the stream file's data to stream */ fgets(instr,DEFAULT_STR_LENGTH,s_stream); while (!feof(s_stream)) { fprintf(stream,"%s",instr); fgets(instr,DEFAULT_STR_LENGTH,s_stream); } /* close and delete all the files */ fclose(s_screen); fclose(s_outfile); fclose(s_stream); unlink(LINKSAVE); unlink(SCREENSAVE); unlink(OUTFILESAVE); unlink(STREAMSAVE); return; } /* dwix: end */ #endif /* !defined(vms) && !defined(DOS) && !PARALLEL && MULTI_LINKMAP */ fprintf(outfile, "%s\n%s\n", LINE, LINE); if (srun) fprintf(s_outfile, "%s\n%s\n", LINE, LINE); if (sexdif) { fprintf(outfile, "MALE THETAS "); if (srun) fprintf(s_outfile, "MALE THETAS "); } else { fprintf(outfile, "THETAS "); if (srun) fprintf(s_outfile, "THETAS "); } for (i = 0; i <= locus_loop; i++) { fprintf(outfile, "%6.3f", maletheta->theta[i]); if (srun) fprintf(s_outfile, "%6.3f", maletheta->theta[i]); } putc('\n', outfile); if (srun) putc('\n', s_outfile); if (sexdif) { fprintf(outfile, "FEMALE THETAS "); if (srun) fprintf(s_outfile, "FEMALE THETAS "); for (i = 0; i <= locus_loop; i++) { fprintf(outfile, "%6.3f", femaletheta->theta[i]); if (srun) fprintf(s_outfile, "%6.3f", femaletheta->theta[i]); } putc('\n', outfile); if (srun) putc('\n', s_outfile); } fprintf(outfile, "%s\n", LINE); fprintf(outfile, "PEDIGREE | LN LIKE | LOG 10 LIKE\n"); fprintf(outfile, "%s\n", LINE); if (srun) { fprintf(s_outfile, "%s\n", LINE); fprintf(s_outfile, "PEDIGREE | LN LIKE | LOG 10 LIKE\n"); fprintf(s_outfile, "%s\n", LINE); } printf("%s\n%s\n", LINE, LINE); if (srun) fprintf(s_screen, "%s\n%s\n", LINE, LINE); if (sexdif) { printf("MALE THETAS "); if (srun) fprintf(s_screen,"MALE THETAS "); } else { printf("THETAS "); if (srun) fprintf(s_screen,"THETAS "); } for (i = 0; i <= locus_loop; i++) { printf("%6.3f", maletheta->theta[i]); if (srun) fprintf(s_screen,"%6.3f", maletheta->theta[i]); } if (interfer) { printf("%6.3f", maletheta->theta[mlocus - 1]); if (srun) fprintf(s_screen,"%6.3f", maletheta->theta[mlocus - 1]); } putchar('\n'); if (srun) putc('\n',s_screen); if (sexdif) { printf("FEMALE THETAS "); if (srun) fprintf(s_screen,"FEMALE THETAS "); for (i = 0; i <= locus_loop; i++) { printf("%6.3f", femaletheta->theta[i]); if (srun) fprintf(s_screen,"%6.3f", femaletheta->theta[i]); } if (interfer) { printf("%6.3f", femaletheta->theta[mlocus - 1]); if (srun) fprintf(s_screen,"%6.3f", femaletheta->theta[mlocus - 1]); } putchar('\n'); if (srun) putc('\n',s_screen); } printf("%s\n", LINE); printf("PEDIGREE | LN LIKE | LOG 10 LIKE\n"); printf("%s\n", LINE); if (srun) { fprintf(s_screen, "%s\n", LINE); fprintf(s_screen,"PEDIGREE | LN LIKE | LOG 10 LIKE\n"); fprintf(s_screen, "%s\n", LINE); } #if LOOPSPEED open_loop_file(); #endif for (thisped = 0; thisped < nuped; thisped++) { #if LOOPSPEED read_loop_file(thisped + 1); #endif likelihood((int)(thisped + 1), proband[thisped]); if (byfamily) { fprintf(outfile, "%9d %12.6f ", proband[thisped]->ped, like); if (srun) fprintf(s_outfile, "%9d %12.6f ", proband[thisped]->ped,like); } if (dostream) { fprintf(stream, "%12d % .5e ", proband[thisped]->ped, like); if (srun) fprintf(s_stream, "%12d % .5e ", proband[thisped]->ped, like); } printf("%9d %12.6f ", proband[thisped]->ped, like); if (srun) fprintf(s_screen,"%9d %12.6f ", proband[thisped]->ped, like); alike += like; like /= log10_; if (byfamily) { fprintf(outfile, "%12.6f\n", like); if (srun) fprintf(s_outfile, "%12.6f\n", like); } if (dostream) { fprintf(stream, "%12.6f\n", like); if (srun) fprintf(s_stream, "%12.6f\n", like); } printf("%12.6f\n", like); if (srun) fprintf(s_screen,"%12.6f\n", like); tlike += like; } #if LOOPSPEED close_loop_file(); #endif fprintf(outfile, "%s\n", LINE); fprintf(outfile, "TOTALS %12.6f %12.6f\n", alike, tlike); if (srun) { fprintf(s_outfile, "%s\n", LINE); fprintf(s_outfile, "TOTALS %12.6f %12.6f\n", alike, tlike); } printf("%s\n", LINE); printf("TOTALS %12.6f %12.6f\n", alike, tlike); if (srun) { fprintf(s_screen, "%s\n", LINE); fprintf(s_screen,"TOTALS %12.6f %12.6f\n", alike, tlike); } if (dostream) { fprintf(stream, "% .5e % .5e\n", -2 * alike, tlike); if (srun) fprintf(s_stream, "% .5e % .5e\n", -2 * alike, tlike); } alike = -2 * alike; fprintf(outfile, "-2 LN(LIKE) = % .5e\n", alike); if (srun) fprintf(s_outfile, "-2 LN(LIKE) = % .5e\n", alike); printf("-2 LN(LIKE) = % .5e\n", alike); if (srun) fprintf(s_screen,"-2 LN(LIKE) = % .5e\n", alike); if (firsttime) { if (thisc < maxcensor) { printf("Maxcensor can be reduced to %12d\n", thisc); if (srun) fprintf(s_screen,"Maxcensor can be reduced to %12d\n", thisc); } else { if (thisc > maxcensor) { printf("You may gain efficiency by increasing maxcensor\n"); if (srun) fprintf(s_screen, "You may gain efficiency by increasing maxcensor\n"); } } } /* exit(EXIT_SUCCESS); */ /* exitramana */ firsttime = false; #if !defined(vms) && !defined(DOS) && (!PARALLEL) && (MULTI_LINKMAP) if (srun) { fclose(s_screen); fclose(s_outfile); fclose(s_stream); s_save = fopen(LINKSAVE,"w"); if (s_save==NULL) { /* dwix err msg */ fprintf(stderr,"ERROR: could not open LINKSAVE file.\n"); exit(EXIT_FAILURE); } fprintf(s_save,"%d",getppid()); fprintf(s_save," %d",mlocus); for (count = 1; count < mlocus; count++) fprintf(s_save," %lf",maletheta->theta[count]); fclose(s_save); } /* need to get rid of files because this might be the last theta */ if ((maletheta->theta[whichvary-1] != 0.0) && (whichvary > 1) && (maletheta->theta[whichvary-2] != 0.0)) { unlink(LINKSAVE); unlink(SCREENSAVE); unlink(OUTFILESAVE); unlink(STREAMSAVE); } #endif /* !defined(vms) && !defined(DOS) && !PARALLEL && MULTI_LINKMAP */ } /* iterpeds */ #endif /* if PARALLEL -- cgh */ void preIpedLoop() { if (dostream) { if (checkpointStatus !=checkpointedRun ) { fprintf(stream, "@\n"); fprintf(stream, "LINKMAP\n"); fprintf(stream, "%12d %12d %12d ", mlocus, whichvary, gridsize); if (sexlink) fprintf(stream, " 1 "); else fprintf(stream, " 0 "); if (sexdif && readfemale) fprintf(stream, "2 "); else { if (sexdif) fprintf(stream, "1\n"); else fprintf(stream, "0\n"); } fprintf(stream, "%12d\n", nuped); for (i = 1; i <= mlocus; i++) { j = 0; do { j++; } while (j != order[i - 1]); fprintf(stream, "%12d\n", j); } putc('\n', stream); } /* This call to recombination() is needed to make sure that the proper theta values are printed to stream. recombination() is called again before liklihood() is ever called from within iterpeds() (in sequential LINKMAP), or multiPedLike() (in parallel LINKMAP). Therefore, if dostream is false, this call can be safely omitted. In parallel LINKMAP, we don't want the barrier inside of recombination() to get called, and we don't want g{male,female}segprob assigned to. This code in recombination() is only executed when the boolean flag infun is true, so we set it to false before the call. -- cgh */ #if PARALLEL /* cgh */ infun = false; #endif /* if PARALLEL -- cgh */ recombination(); if (normalRun == checkpointStatus) { for (i = 1; i < mlocus; i++) fprintf(stream, "% .5e\n", maletheta->theta[i - 1]); putc('\n', stream); if (sexdif) { for (i = 1; i < mlocus; i++) fprintf(stream, "% .5e\n", femaletheta->theta[i - 1]); } putc('\n', stream); } thisdistm = 0.0; if (normalRun == checkpointStatus) fprintf(stream, "% .5e\n", thisdistm); if (whichvary == 1) j = 2; else j = 1; for (i = j; i < mlocus; i++) { thisdistm += getdist(&maletheta->theta[i - 1]); if ((i + 1 != whichvary) && (normalRun == checkpointStatus)) fprintf(stream, "% .5e\n", thisdistm); } if (normalRun == checkpointStatus) putc('\n', stream); if (sexdif) { thisdistf = 0.0; fprintf(stream, "% .5e\n", thisdistf); if (whichvary == 1) j = 2; else j = 1; for (i = j; i < mlocus; i++) { thisdistf += getdist(&femaletheta->theta[i - 1]); if ((i + 1 != whichvary) && (normalRun == checkpointStatus)) fprintf(stream, "% .5e\n", thisdistf); } if (normalRun == checkpointStatus) putc('\n', stream); } thisdistm = 0.0; if (whichvary != 1) { for (i = 2; i <= whichvary; i++) thisdistm += getdist(&maletheta->theta[i - 2]); } thisdistf = 0.0; if (sexdif) { if (whichvary != 1) { for (i = 2; i <= whichvary; i++) thisdistf += getdist(&femaletheta->theta[i - 2]); } } } if (whichvary != mlocus && whichvary != 1) { thetatot = maletheta->theta[whichvary - 2] + maletheta->theta[whichvary - 1] - 2 * maletheta->theta[whichvary - 2] * maletheta->theta[whichvary - 1]; thetainc = thetatot / gridsize; if (readfemale) { distratio = femaletheta->theta[whichvary - 2] + femaletheta->theta[whichvary - 1] - 2 * femaletheta->theta[whichvary - 2] * femaletheta->theta[whichvary - 1]; distratio = getdist(&distratio) / getdist(&maletheta->theta[whichvary - 1]); } } else { thetainc = 0.5 / gridsize; if (readfemale) { if (whichvary == 1) { distratio = femaletheta->theta[1]; distratio = getdist(&distratio) / getdist(&maletheta->theta[1]); } else { distratio = femaletheta->theta[mlocus - 3]; distratio = getdist(&distratio) / getdist(&maletheta->theta[mlocus - 3]); } } } } #if !PARALLEL void ipedLoop() { #if !defined(DOS) iterpeds_counter = 0; /*set up for checkpointing*/ #endif /* !defined(DOS) */ do { if (dostream) { if (whichvary == 1) thisdist = thisdistm - getdist(maletheta->theta); else thisdist = thisdistm + getdist(&maletheta->theta[whichvary - 2]); if (normalRun == checkpointStatus) fprintf(stream, "% .5e\n", thisdist); if (sexdif) { if (whichvary == 1) thisdist = thisdistf - getdist(femaletheta->theta); else thisdist = thisdistf + getdist(&femaletheta->theta[whichvary - 2]); if (normalRun == checkpointStatus) fprintf(stream, "% .5e\n", thisdist); } for (i = 1; i < mlocus; i++) if (normalRun == checkpointStatus) fprintf(stream, "% .5e\n", maletheta->theta[i - 1]); if (normalRun == checkpointStatus) putc('\n', stream); if (sexdif) { for (i = 1; i < mlocus; i++) if (normalRun == checkpointStatus) fprintf(stream, "% .5e\n", femaletheta->theta[i - 1]); } if (normalRun == checkpointStatus) putc('\n', stream); } #if !defined(DOS) if ((checkpoint_counter == 0) && (iterped_call_before == checkpoint_place)) checkpointStatus = normalRun; #endif /* if !defined(DOS) */ if (normalRun == checkpointStatus) { ensureWrite(outfile); ensureWrite(stream); #if !defined(DOS) performCheckpoint(functionLocation, iterpeds_counter, iterped_call_before); copyFile("outfile.dat", MainLINKMAPOutfileDat); if (dostream) copyFile("stream.dat", MainLINKMAPStreamDat); #endif /* if !defined(DOS) */ } #if !defined(DOS) if ((checkpoint_counter == 0) && (iterped_call_before == checkpoint_place)){ #endif /* if !defined(DOS) */ iterpeds(); ensureWrite(outfile); ensureWrite(stream); #if !defined(DOS) performCheckpoint(functionLocation, iterpeds_counter, iterped_call_after); } if ((checkpoint_counter == 0) && (iterped_call_after == checkpoint_place)){ checkpoint_place = iterped_call_before; checkpointStatus = normalRun; } if (normalRun == checkpointStatus) { copyFile("outfile.dat", MainLINKMAPOutfileDat); if (dostream) copyFile("stream.dat", MainLINKMAPStreamDat); } #endif /* if !defined(DOS) */ if (whichvary == 1) { maletheta->theta[0] -= thetainc; if (zerotest(maletheta->theta[0])) maletheta->theta[0] = 0.0; if (readfemale) { femaletheta->theta[0] = distratio * getdist(maletheta->theta); femaletheta->theta[0] = invdist(femaletheta->theta); if (zerotest(femaletheta->theta[0])) femaletheta->theta[0] = 0.0; } } else if (whichvary == mlocus) { maletheta->theta[mlocus - 2] += thetainc; if (zerotest(maletheta->theta[mlocus - 2])) maletheta->theta[mlocus - 2] = 0.0; if (readfemale) { femaletheta->theta[mlocus - 2] = distratio * getdist(&maletheta->theta[mlocus - 2]); femaletheta->theta[mlocus - 2] = invdist(&femaletheta->theta[mlocus - 2]); if (zerotest(femaletheta->theta[mlocus - 2])) femaletheta->theta[mlocus - 2] = 0.0; } } else { maletheta->theta[whichvary - 2] += thetainc; if (zerotest(maletheta->theta[whichvary - 2])) maletheta->theta[whichvary - 2] = 0.0; maletheta->theta[whichvary - 1] = (thetatot - maletheta->theta[whichvary - 2]) / (1.0 - 2.0 * maletheta->theta[whichvary - 2]); if (zerotest(maletheta->theta[whichvary - 1])) maletheta->theta[whichvary - 1] = 0.0; if (readfemale) { femaletheta->theta[whichvary - 2] = distratio * getdist(&maletheta->theta[whichvary - 2]); femaletheta->theta[whichvary - 2] = invdist(&femaletheta->theta[whichvary - 2]); if (zerotest(femaletheta->theta[whichvary - 2])) femaletheta->theta[whichvary - 2] = 0.0; femaletheta->theta[whichvary - 1] = distratio * getdist(&maletheta->theta[whichvary - 1]); femaletheta->theta[whichvary - 1] = invdist(&femaletheta->theta[whichvary - 1]); if (zerotest(femaletheta->theta[whichvary - 1])) femaletheta->theta[whichvary - 1] = 0.0; } } if (whichvary == 1) continue_ = (maletheta->theta[0] >= finaltheta && maletheta->theta[0] >= 0.0); else { if (whichvary == mlocus) continue_ = (maletheta->theta[whichvary - 2] <= finaltheta && maletheta->theta[whichvary - 2] <= 0.5); else continue_ = (maletheta->theta[whichvary - 2] <= finaltheta && maletheta->theta[whichvary - 1] >= 0.0); } #if !defined(DOS) if (checkpoint_counter > 0) checkpoint_counter--; iterpeds_counter++; #endif /* !defined(DOS) */ } while (continue_); } #endif /* if !PARALLEL */ /* End. */ fastlink-4.1P-fix95/4.1P/src/mldefs.h0000644000265600020320000000241606737460342016251 0ustar tilleaadmin#ifndef _MLDEFS_H #define _MLDEFS_H 1 /* Output from p2c, the Pascal-to-C translator */ /* From input file "mlink.p" */ /* This file contains definitions for a modified version of MLINK */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Linkage Analysis, Human Heredity */ /* 44(1994), pp. 225-237 */ #ifndef _COMMONDEFS_H #include #endif #define scale 2.0 /*SCALE FACTOR*/ #define score true /*CALCULATE LOD SCORES*/ #ifndef byfamily #define byfamily true /*GIVE LIKELIHOODSS BY FAMILY*/ #endif #ifndef lodbyfamily #define lodbyfamily true #endif #ifndef BIGNEGATIVE #define BIGNEGATIVE (-150) #endif #define epsilon 1.0e-6 boolean zeromale[maxlocus], zerofemale[maxlocus]; /*OTHERS*/ long j, nlocus, which, thissystem; double tlike, finish, inc, scorevalue, holdtheta; int continue_; /* cgh */ #if defined(DOS) typedef enum { normalRun , checkpointedRun } checkpointType; checkpointType checkpointStatus; #endif #endif fastlink-4.1P-fix95/4.1P/src/liinputcode.c0000644000265600020320000001074610517437654017317 0ustar tilleaadmin/* Output from p2c, the Pascal-to-C translator */ /* From input file "linkmap.p" */ /* This file contains part of a modified version of the LINKMAP program */ /* The modifications are described in the papers: */ /* R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer, */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Genetic Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237 */ #include "commondefs.h" #include "gemdefs.h" #include "lidefs.h" Void readloci(LINK) struct LOC_inputdata *LINK; { struct LOC_readloci V; long i, j, coupling, autosomal, independent, difference; locusvalues *WITH; V.LINK = LINK; lastpriv = 0; fscanf(datafile, "%d%d%ld%*[^\n]", &mlocus, &risksys, &autosomal); getc(datafile); /*Replace the above line with the next when using epistasis*/ /*readln(datafile,mlocus,risksys,autosomal,lastpriv);*/ if (mlocus > maxlocus) inputerror(0L, mlocus, mlocus, LINK); if (mlocus <= 0) inputerror(1L, mlocus, mlocus, LINK); if (risksys > maxlocus) inputerror(37L, risksys, risksys, LINK); if (risksys < 0) inputerror(38L, risksys, risksys, LINK); risk = (risksys != 0); sexlink = (autosomal == 1); #if PARALLEL if (Tmk_proc_id == 0) { #endif printf("YOU ARE USING LINKAGE (V%3.1f (1-Feb-1991)) WITH%3d-POINT\n", fVersion, mlocus); printf("YOU ARE USING FASTLINK (V%s (6-Oct-1997))", fastversion); if (sexlink) printf(" SEXLINKED DATA\n"); else printf(" AUTOSOMAL DATA\n"); #if PARALLEL } #endif fscanf(datafile, "%d%lf%lf%ld%*[^\n]", &mutsys, &mutmale, &mutfemale, &coupling); getc(datafile); if (mutsys > maxlocus) inputerror(39L, mutsys, mutsys, LINK); if (mutsys < 0) inputerror(40L, mutsys, mutsys, LINK); if (coupling == 1) disequi = true; else disequi = false; if (disequi) { hapfreq = (thisarray *)Malloc(sizeof(thisarray)); if (!(hapfreq)) malloc_err("hapfreq"); } for (i = 1; i <= mlocus; i++) { fscanf(datafile, "%ld", &j); if (j > mlocus) inputerror(2L, i, j, LINK); if (j <= 0) inputerror(3L, i, j, LINK); order[j - 1] = i; } for (i = 1; i <= mlocus; i++) { for (j = 1; j < i; j++) { if (order[i - 1] == order[j - 1]) inputerror(4L, i, j, LINK); } } fscanf(datafile, "%*[^\n]"); getc(datafile); if (mutsys != 0) mutsys = order[mutsys - 1]; if (risksys != 0) risksys = order[risksys - 1]; V.nupriv = 0; for (i = 0; i < mlocus; i++) getlocus(order[i], &V); increment[mlocus - 1] = 1; for (i = mlocus - 1; i >= 1; i--) increment[i - 1] = increment[i] * thislocus[i]->nallele; fgeno = 1; for (j = 0; j < mlocus; j++) fgeno *= thislocus[j]->nallele; mgeno = fgeno; nuhap = fgeno; for (i = 0; i < mlocus; i++) nohom[i] = false; if (disequi) { allocate_thisarray(hapfreq, mgeno); for (i = 0; i < mgeno; i++) fscanf(datafile, "%lf", &hapfreq->genarray[i]); fscanf(datafile, "%*[^\n]"); getc(datafile); } else { for (i = 0; i < mlocus; i++) { WITH = thislocus[i]; if (WITH->which == affection || WITH->which == quantitative) { if (WITH->freq[affall - 1] < minfreq) nohom[i] = true; } } } fgeno = fgeno * (fgeno + 1) / 2; if (!sexlink) mgeno = fgeno; fscanf(datafile, "%ld", &difference); if ((unsigned long)difference > 2) { inputwarning(0L, difference, difference, LINK); difference = 0; } sexdif = (difference != 0); readfemale = (difference == 2); fscanf(datafile, "%ld%*[^\n]", &independent); getc(datafile); if ((unsigned long)independent > 2) { inputwarning(1L, independent, independent, LINK); independent = 0; } interfer = (independent != 0); mapping = (independent == 2); gettheta(&maletheta, &V); if (sexdif) gettheta(&femaletheta, &V); else femaletheta = maletheta; if (sexlink && sexdif) { inputwarning(2L, difference, difference, LINK); sexdif = false; readfemale = false; } fscanf(datafile, "%d%lf%d%*[^\n]", &whichvary, &finaltheta, &gridsize); getc(datafile); /*Transform whichvary to chromosome order*/ whichvary = order[whichvary - 1]; if (!sexlink) { if (mutsys == 0) thispath = auto_; else thispath = mauto; } else if (mutsys == 0) thispath = sex; else thispath = msex; segscale = scale; for (i = 1; i <= mlocus; i++) segscale *= scalemult; } fastlink-4.1P-fix95/4.1P/src/comgetvect.c0000644000265600020320000007002407232403237017121 0ustar tilleaadmin/*This file is part of FASTLINK, version 2.2. The algorithms in FASTLINK are described in: R. W. Cottingham Jr., R. M. Idury, A. A. Schaffer (1993), Faster sequential genetic linkage computations, American Journal of Human Genetics 53(1993), pp. 252-263. and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham Jr., Avoiding Recomputation in Linkage Analysis, Hum. Hered. 44(1994), pp. 225-237. This file contains low level probability routines.*/ /* Modified by Dylan in late 1994 to speed up pedigrees with loops. Main difference is that for unknown people the possible genotypes are stored in 'unknown_poss' rather than their 'possible' fields. Please read README.loopfile. See also unknown.c and commondefs.c. */ /* Local variables for setval: */ struct LOC_setval { struct LOC_getvect *LINK; double val; int nhap1, nhap2; } ; static void prior(LINK) struct LOC_setval *LINK; { int i; /*prior*/ locusvalues *WITH; thisarray *WITH1; double tempfreq1, tempfreq2; /*frequency of allele*/ boolean condhap1, condhap2; #if defined(LODSCORE) int locusindex; #endif condhap1 = condhap2 = false; if (disfreqs) { for (i = 0; i < mlocus; i++) if (affection == thislocus[i]->which) { if (affall == LINK->LINK->hap1[i]) condhap1 = true; if (((!sexlink ) || (!(LINK->LINK->p->male))) && (affall == LINK->LINK->hap2[i])) condhap2 = true; break; } } if (!disequi) { if (sexlink && LINK->LINK->p->male) { for (i = 0; i < mlocus; i++) { WITH = thislocus[i]; #if ALLELE_SPEED if ((binary_ == thislocus[i]->which) && (allformat == thislocus[i]->format)) { #if defined(LODSCORE) if (0 == i) locusindex = locuslist1[iplace - 1] - 1; else locusindex = locuslist2[jplace - 1] - 1; #endif /*defined(LODSCORE) */ #if defined(LODSCORE) tempfreq1 = ped_loc_all[currentped - 1][locusindex] [LINK->LINK->hap1[i]].new_frequency; if (disfreqs && condhap1) tempfreq1 = ped_loc_all[currentped - 1][locusindex] [LINK->LINK->hap1[i]].new_frequency_cond; #else /*defined(LODSCORE) */ tempfreq1 = ped_loc_all[currentped - 1][i] [LINK->LINK->hap1[i]].new_frequency; if (disfreqs && condhap1) tempfreq1 = ped_loc_all[currentped - 1][i] [LINK->LINK->hap1[i]].new_frequency_cond; #endif /*defined(LODSCORE) */ } else #endif /*ALLELE_SPEED*/ if (!disfreqs || (binary_ != thislocus[i]->which) || (!condhap1)) tempfreq1 = WITH->freq[LINK->LINK->hap1[i] - 1]; else tempfreq1 = WITH->freqcond[LINK->LINK->hap1[i] - 1]; LINK->val *= tempfreq1; } } else { for (i = 0; i < mlocus; i++) { WITH = thislocus[i]; #if ALLELE_SPEED if ((binary_ == thislocus[i]->which) && (allformat == thislocus[i]->format)) { #if defined(LODSCORE) if (0 == i) locusindex = locuslist1[iplace - 1] - 1; else locusindex = locuslist2[jplace - 1] - 1; #endif #if defined(LODSCORE) tempfreq1 = ped_loc_all[currentped - 1][locusindex] [LINK->LINK->hap1[i]].new_frequency; tempfreq2 = ped_loc_all[currentped - 1][locusindex] [LINK->LINK->hap2[i]].new_frequency; if (disfreqs) { if (condhap1) tempfreq1 = ped_loc_all[currentped - 1][locusindex] [LINK->LINK->hap1[i]].new_frequency_cond; if (condhap2) tempfreq2 = ped_loc_all[currentped - 1][locusindex] [LINK->LINK->hap2[i]].new_frequency_cond; } #else tempfreq1 = ped_loc_all[currentped - 1][i] [LINK->LINK->hap1[i]].new_frequency; tempfreq2 = ped_loc_all[currentped - 1][i] [LINK->LINK->hap2[i]].new_frequency; if (disfreqs) { if (condhap1) tempfreq1 = ped_loc_all[currentped - 1][i] [LINK->LINK->hap1[i]].new_frequency_cond; if (condhap2) tempfreq2 = ped_loc_all[currentped - 1][i] [LINK->LINK->hap2[i]].new_frequency_cond; } #endif } else { #endif tempfreq1 = WITH->freq[LINK->LINK->hap1[i] - 1]; tempfreq2 = WITH->freq[LINK->LINK->hap2[i] - 1]; if (disfreqs && (binary_ == thislocus[i]->which)) { if (condhap1) tempfreq1 = WITH->freqcond[LINK->LINK->hap1[i] - 1]; if (condhap2) tempfreq2 = WITH->freqcond[LINK->LINK->hap2[i] - 1]; } #if ALLELE_SPEED } #endif LINK->val *= tempfreq1 * tempfreq2; } if (LINK->nhap1 != LINK->nhap2) LINK->val = 2.0 * LINK->val; } } else { WITH1 = hapfreq; if (sexlink && LINK->LINK->p->male) LINK->val *= WITH1->genarray[LINK->nhap1 - 1]; else { LINK->val *= WITH1->genarray[LINK->nhap1 - 1] * WITH1->genarray[LINK->nhap2 - 1]; if (LINK->nhap1 != LINK->nhap2) LINK->val = 2.0 * LINK->val; } } LINK->val *= segscale; } /* prior */ /*getval*/ static void setval(val_, LINK) double val_; struct LOC_getvect *LINK; { struct LOC_setval V; int here, count, i; thisarray *WITH1; here = 0; /*cgh -- to avoid gcc warning*/ V.LINK = LINK; V.val = val_; count = 1; V.nhap1 = 1; V.nhap2 = 1; if (sexlink && LINK->p->male) { /* WARNING!!! If you change the way that the joint haplotype is computed you need to change translate_loop_vector(). Dylan */ for (i = 0; i < mlocus; i++) V.nhap1 += increment[i] * (LINK->hap1[i] - 1); here = V.nhap1; } else { for (i = 0; i < mlocus; i++) { V.nhap1 += increment[i] * (LINK->hap1[i] - 1); V.nhap2 += increment[i] * (LINK->hap2[i] - 1); if (LINK->hap1[i] != LINK->hap2[i]) count *= 2; here = genenumber[V.nhap1 - 1][V.nhap2 - 1]; } } if (LINK->p->pa == NULL) prior(&V); WITH1 = LINK->p->gen; if (disequi || disfreqs) { WITH1->genarray[here - 1] = V.val; WITH1->sparseflag[here - 1] = 1; /*R. M. Idury, A. A. Schaffer*/ return; } if (count != 1) count /= 2; for (i = 1; i <= count; i++) { WITH1->genarray[here - 1] = V.val; WITH1->sparseflag[here - 1] = 1; /*R. M. Idury, A. A. Schaffer*/ here++; } } /* setval */ /* Local variables for getgene: */ struct LOC_getgene { struct LOC_getvect *LINK; int syste; double val; double newval; } ; static void facmale(LINK) struct LOC_getgene *LINK; { int j; /*facmale*/ thisperson *WITH; locusvalues *WITH1; int FORLIM; WITH = LINK->LINK->p; WITH1 = thislocus[LINK->syste - 1]; FORLIM = WITH1->nallele; for (j = 1; j <= FORLIM; j++) { if (((binformat == WITH1->format) && (WITH->phen[LINK->syste - 1]->phenf == WITH1->UU.allele[j - 1] || WITH->phen[LINK->syste - 1]->phenf == 0)) || ((allformat == WITH1->format) && (WITH->phen[LINK->syste - 1]->allele1 == j || WITH->phen[LINK->syste - 1]->allele1 == 0))) { LINK->LINK->hap1[LINK->syste - 1] = j; if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->val, LINK->LINK); else setval(LINK->val, LINK->LINK); } } } /* facmale */ /*facmale*/ static void affmale(LINK) struct LOC_getgene *LINK; { int j; /*affmale*/ locusvalues *WITH; int FORLIM; WITH = thislocus[LINK->syste - 1]; FORLIM = WITH->nallele; for (j = 1; j <= FORLIM; j++) { LINK->newval = LINK->val; getval(LINK->syste, 0L, j, &LINK->newval, LINK->LINK); LINK->LINK->hap1[LINK->syste - 1] = j; if (LINK->newval != 0.0) { if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } /* affmale */ /*affmale*/ static void quanmale(LINK) struct LOC_getgene *LINK; { int j; /*quanmale*/ thisperson *WITH; locusvalues *WITH1; int FORLIM; WITH = LINK->LINK->p; WITH1 = thislocus[LINK->syste - 1]; if (WITH->phen[LINK->syste - 1]->aff == affall || WITH->phen[LINK->syste - 1]->aff == missaff) { LINK->newval = LINK->val; LINK->LINK->hap1[LINK->syste - 1] = affall; if (LINK->newval != 0.0) { if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } if (WITH->phen[LINK->syste - 1]->aff == affall && WITH->phen[LINK->syste - 1]->aff != missaff) return; FORLIM = WITH1->nallele; for (j = 1; j <= FORLIM; j++) { if (j != affall) { LINK->newval = LINK->val; LINK->LINK->hap1[LINK->syste - 1] = j; if (LINK->newval != 0.0) { if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } /* quanmale */ /*quanmale*/ static void fac(LINK) struct LOC_getgene *LINK; { int i, j; /*fac*/ thisperson *WITH; locusvalues *WITH1; int FORLIM, FORLIM1; WITH = LINK->LINK->p; WITH1 = thislocus[LINK->syste - 1]; FORLIM = WITH1->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[LINK->syste - 1] = i; FORLIM1 = WITH1->nallele; for (j = i; j <= FORLIM1; j++) { if (((binformat == WITH1->format) && ((WITH->phen[LINK->syste - 1]->phenf == (WITH1->UU.allele[i - 1] | WITH1->UU.allele[j - 1]) || WITH->phen[LINK->syste - 1]->phenf == 0))) || ((allformat == WITH1->format) && ((WITH->phen[LINK->syste - 1]->allele1 == i && WITH->phen[LINK->syste - 1]->allele2 == j) || WITH->phen[LINK->syste - 1]->allele1 == 0))) { LINK->LINK->hap2[LINK->syste - 1] = j; if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->val, LINK->LINK); else setval(LINK->val, LINK->LINK); } } } if ((!disequi) && (!disfreqs)) return; WITH = LINK->LINK->p; WITH1 = thislocus[LINK->syste - 1]; FORLIM = WITH1->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap2[LINK->syste - 1] = i; FORLIM1 = WITH1->nallele; for (j = i; j <= FORLIM1; j++) { if (((binformat == WITH1-> format) && (WITH->phen[LINK->syste - 1]->phenf == (WITH1->UU.allele[i - 1] | WITH1->UU.allele[j - 1]) || WITH->phen[LINK->syste - 1]->phenf == 0)) || ((allformat == WITH1->format) && ((WITH->phen[LINK->syste - 1]->allele1 == i && WITH->phen[LINK->syste - 1]->allele2 == j) || WITH->phen[LINK->syste - 1]->allele1 == 0))) { LINK->LINK->hap1[LINK->syste - 1] = j; if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->val, LINK->LINK); else setval(LINK->val, LINK->LINK); } } } } /* fac */ /*fac*/ static void aff(LINK) struct LOC_getgene *LINK; { /*Used with an affection status phenotype or when thislocus[syste]^which is null*/ int i, j; locusvalues *WITH; int FORLIM, FORLIM1; WITH = thislocus[LINK->syste - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[LINK->syste - 1] = i; FORLIM1 = WITH->nallele; for (j = i; j <= FORLIM1; j++) { if (!nohom[LINK->syste - 1] || i != affall || j != affall) { LINK->LINK->hap2[LINK->syste - 1] = j; LINK->newval = LINK->val; getval(LINK->syste, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } if ((!disequi) && (!disfreqs)) return; WITH = thislocus[LINK->syste - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap2[LINK->syste - 1] = i; FORLIM1 = WITH->nallele; for (j = i; j <= FORLIM1; j++) { if (!nohom[LINK->syste - 1] || i != affall || j != affall) { LINK->LINK->hap1[LINK->syste - 1] = j; LINK->newval = LINK->val; getval(LINK->syste, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } } /* aff */ static void quanval(LINK) struct LOC_getgene *LINK; { /*Uses this only when thislocus[syste]^.which is not null*/ int i, j; locusvalues *WITH; int FORLIM, FORLIM1; WITH = thislocus[LINK->syste - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[LINK->syste - 1] = i; FORLIM1 = WITH->nallele; for (j = i; j <= FORLIM1; j++) { if (!nohom[LINK->syste - 1] || i != affall || j != affall) { LINK->LINK->hap2[LINK->syste - 1] = j; LINK->newval = LINK->val; getval(LINK->syste, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } if ((!disequi) && (!disfreqs)) return; WITH = thislocus[LINK->syste - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap2[LINK->syste - 1] = i; FORLIM1 = WITH->nallele; for (j = i; j <= FORLIM1; j++) { if (!nohom[LINK->syste - 1] || i != affall || j != affall) { LINK->LINK->hap1[LINK->syste - 1] = j; LINK->newval = LINK->val; getval(LINK->syste, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) getgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } } /* quanval */ /*setval*/ static void getgene(syste_, val_, LINK) int syste_; double val_; struct LOC_getvect *LINK; { struct LOC_getgene V; locusvalues *WITH; V.LINK = LINK; V.syste = syste_; V.val = val_; WITH = thislocus[V.syste - 1]; if (sexlink && LINK->p->male) { switch (WITH->which) { case binary_: facmale(&V); break; case affection: affmale(&V); break; case quantitative: quanmale(&V); break; case null_: if (WITH->privlocus->which == affection) affmale(&V); else quanmale(&V); break; } return; } switch (WITH->which) { case binary_: fac(&V); break; case affection: aff(&V); break; case quantitative: quanval(&V); break; case null_: aff(&V); break; } } /* getgene */ /* Local variables for ugetgene: */ struct LOC_ugetgene { struct LOC_getvect *LINK; int syste; double val; double newval; } ; /* This procedure finds the possible allele combinations for the current person at the current locus. The person is unknown and male the locus is a binary locus. The run is sexlinked. Modified by Dylan in late 1994 to use 'unknown_poss'. */ static void facmale_(LINK) struct LOC_ugetgene *LINK; { int j; /*facmale*/ thisperson *WITH; #if LOOPSPEED int loop_vect_to_check; #else information *WITH1; #endif locusvalues *WITH2; int locus; locus = LINK->syste - 1; WITH = LINK->LINK->p; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if ( person[WITH->id]->unknown) loop_vect_to_check= single_locus_vector_num[locus]; else { loop_vect_to_check = 0; } #else WITH1 = LINK->LINK->p->store; #endif WITH2 = thislocus[locus]; for (j = 1; j <= WITH2->nallele; j++) { if (((binformat == WITH2->format) && (WITH->phen[locus]->phenf == WITH2->UU.allele[j - 1] || WITH->phen[locus]->phenf == 0)) || ((allformat == WITH2->format) && (WITH->phen[LINK->syste - 1]->allele1 == j || WITH->phen[LINK->syste - 1]->allele1 == 0))) { #if LOOPSPEED if (unknown_poss[LINK->LINK->p->id][locus][loop_vect_to_check][j - 1] ) { #else if (WITH1->possible[locus][0][j - 1]) { #endif LINK->LINK->hap1[locus] = j; if (LINK->syste != mlocus) /* do next locus */ ugetgene(locus + 2, LINK->val, LINK->LINK); else setval(LINK->val, LINK->LINK); } } } } /* facmale_ */ /* This procedure finds the possible allele combinations for the current person at the current locus. The person is unknown and male and the locus is an affection locus. The run is sexlinked. Modified by Dylan in late 1994 to use 'unknown_poss'. */ static void affmale_(LINK) struct LOC_ugetgene *LINK; { int j; #if LOOPSPEED int loop_vect_to_check; #else information *WITH; #endif locusvalues *WITH1; int locus; locus = LINK->syste - 1; WITH1 = thislocus[locus]; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if ( person[LINK->LINK->p->id]->unknown) loop_vect_to_check= single_locus_vector_num[locus]; else { loop_vect_to_check = 0; } #else WITH = LINK->LINK->p->store; #endif for (j = 1; j <= WITH1->nallele; j++) { #if LOOPSPEED if (unknown_poss[LINK->LINK->p->id][locus][loop_vect_to_check][j - 1] ) { #else if (WITH->possible[locus][0][j - 1]) { #endif LINK->newval = LINK->val; getval(locus + 1, 0L, j, &LINK->newval, LINK->LINK); LINK->LINK->hap1[locus] = j; if (LINK->newval != 0.0) { if (LINK->syste != mlocus) ugetgene(locus + 2, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } /* affmale_ */ /* This procedure finds the possible allele combinations for the current person at the current locus. The person is unknown and male the locus is a quantified locus. The run is sexlinked. Modified by Dylan in late 1994 to use 'unknown_poss'. */ static void quanmale_(LINK) struct LOC_ugetgene *LINK; { int j; thisperson *WITH; locusvalues *WITH2; int locus; #if LOOPSPEED int loop_vect_to_check; #else information *WITH1; information *WITH3; #endif locus = LINK->syste - 1; WITH = LINK->LINK->p; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if ( person[WITH->id]->unknown) loop_vect_to_check= single_locus_vector_num[locus]; else { loop_vect_to_check = 0; } #else WITH1 = LINK->LINK->p->store; #endif WITH2 = thislocus[locus]; if (WITH->phen[locus]->aff == affall || WITH->phen[locus]->aff == missaff) { #if LOOPSPEED if (unknown_poss[LINK->LINK->p->id][locus][loop_vect_to_check][affall-1]) { #else if (WITH1->possible[locus][0][affall - 1]) { #endif LINK->newval = LINK->val; LINK->LINK->hap1[locus] = affall; if (LINK->newval != 0.0) { if (LINK->syste != mlocus) ugetgene(locus + 2, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } if (WITH->phen[locus]->aff == affall && WITH->phen[locus]->aff != missaff) return; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if ( person[WITH->id]->unknown) loop_vect_to_check= single_locus_vector_num[locus]; else { loop_vect_to_check = 0; } #else WITH3 = LINK->LINK->p->store; #endif for (j = 1; j <= WITH2->nallele; j++) { if (j != affall) { #if LOOPSPEED if (unknown_poss[LINK->LINK->p->id][locus][loop_vect_to_check][j - 1] ) { #else if (WITH3->possible[locus][0][j - 1]) { #endif LINK->newval = LINK->val; LINK->LINK->hap1[locus] = j; if (LINK->newval != 0.0) { if (LINK->syste != mlocus) ugetgene(locus + 2, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } } /* quanmale_ */ /* This procedure finds the possible allele combinations for the current person at the current locus. The person is unknown and the locus is a binary locus. The run is not sexlinked and/or the person is female. Modified by Dylan in late 1994 to use 'unknown_poss'. */ static void fac_(LINK) struct LOC_ugetgene *LINK; { int i, j; thisperson *WITH; #if LOOPSPEED int duplicates; int loop_vect_to_check; #else information *WITH1; #endif locusvalues *WITH2; int FORLIM; int locus; WITH = LINK->LINK->p; locus = LINK->syste - 1; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if (person[WITH->id]->unknown) loop_vect_to_check= single_locus_vector_num[locus]; else { loop_vect_to_check = 0; } #else WITH1 = LINK->LINK->p->store; #endif WITH2 = thislocus[locus]; FORLIM = WITH2->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[locus] = i; for (j = i; j <= FORLIM; j++) { if (((binformat == WITH2->format) && ((WITH->phen[locus]->phenf == (WITH2->UU.allele[i - 1] | WITH2->UU.allele[j - 1]) || WITH->phen[locus]->phenf == 0))) || ((allformat == WITH2->format) && ((WITH->phen[LINK->syste - 1]->allele1 == i && WITH->phen[LINK->syste - 1]->allele2 == j) || WITH->phen[LINK->syste - 1]->allele1 == 0))) { #if LOOPSPEED duplicates = (i - 1) * i / 2; if (unknown_poss[LINK->LINK->p->id][locus][loop_vect_to_check] [ (i - 1) * thislocus[locus]->nallele - duplicates + (j - 1)] ) { #else if (WITH1->possible[locus][i - 1][j - 1]) { #endif LINK->LINK->hap2[locus] = j; if (LINK->syste != mlocus) ugetgene(locus + 2, LINK->val, LINK->LINK); else setval(LINK->val, LINK->LINK); } } } } if ((!disequi) && (!disfreqs)) return; WITH = LINK->LINK->p; locus = LINK->syste - 1; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if ( person[WITH->id]->unknown) loop_vect_to_check= single_locus_vector_num[locus]; else { loop_vect_to_check = 0; } #else WITH1 = LINK->LINK->p->store; #endif WITH2 = thislocus[locus]; FORLIM = WITH2->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap2[locus] = i; for (j = i; j <= FORLIM; j++) { if (((binformat == WITH2->format) && (WITH->phen[locus]->phenf == (WITH2->UU.allele[i - 1] | WITH2->UU.allele[j - 1]) || WITH->phen[locus]->phenf == 0)) || ((allformat == WITH2->format) && ((WITH->phen[LINK->syste - 1]->allele1 == i && WITH->phen[LINK->syste - 1]->allele2 == j) || WITH->phen[LINK->syste - 1]->allele1 == 0))) { #if LOOPSPEED duplicates = (i - 1) * i / 2; if (unknown_poss[LINK->LINK->p->id][locus][loop_vect_to_check] [ (i - 1) * thislocus[locus]->nallele - duplicates + (j - 1)] ) { #else if (WITH1->possible[locus][i - 1][j - 1]) { #endif LINK->LINK->hap1[locus] = j; if (LINK->syste != mlocus) ugetgene(LINK->syste + 1, LINK->val, LINK->LINK); else setval(LINK->val, LINK->LINK); } } } } } /* fac_ */ /* This procedure finds the possible allele combinations for the current person at the current locus. The person is unknown and the locus is a quantified locus. The run is not sexlinked and/or the person is female. Modified by Dylan in late 1994 to compile when LOOPSPEED is defined. This was identical to aff_() so I only modified aff_(); */ #if !LOOPSPEED static void quanval_(LINK) struct LOC_ugetgene *LINK; { /*Used with an affection status phenotype or when thislocus[syste]^which is null*/ int i, j; thisperson *WITH; #if !LOOPSPEED information *WITH1; #endif locusvalues *WITH2; int FORLIM, FORLIM1; WITH = LINK->LINK->p; WITH1 = LINK->LINK->p->store; WITH2 = thislocus[LINK->syste - 1]; FORLIM = WITH2->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[LINK->syste - 1] = i; FORLIM1 = WITH2->nallele; for (j = i; j <= FORLIM1; j++) { if (!nohom[LINK->syste - 1] || i != affall || j != affall) { if (WITH1->possible[LINK->syste - 1][i - 1][j - 1]) { LINK->LINK->hap2[LINK->syste - 1] = j; LINK->newval = LINK->val; getval(LINK->syste, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) ugetgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } } if ((!disequi) && (!disfreqs)) return; WITH = LINK->LINK->p; WITH1 = LINK->LINK->p->store; WITH2 = thislocus[LINK->syste - 1]; FORLIM = WITH2->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap2[LINK->syste - 1] = i; FORLIM1 = WITH2->nallele; for (j = i; j <= FORLIM1; j++) { if (!nohom[LINK->syste - 1] || i != affall || j != affall) { if (WITH1->possible[LINK->syste - 1][i - 1][j - 1]) { LINK->LINK->hap1[LINK->syste - 1] = j; LINK->newval = LINK->val; getval(LINK->syste, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) ugetgene(LINK->syste + 1, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } } } /* quanval_ */ #endif /* This procedure finds the possible allele combinations for the current person at the current locus. The person is unknown and the locus is an affection locus. The run is not sexlinked and/or the person is female. Modified by Dylan in late 1994 to use 'unknown_poss'. When LOOPSPEED is defined this is also called when the locus is quantified. */ static void aff_(LINK) struct LOC_ugetgene *LINK; { /* aff_ comment: Used with an affection status phenotype or when thislocus[syste]^which is nul quanval_ comment: Uses this only when thislocus[syste]^.which is not null--quanval_ comment */ int i, j; thisperson *WITH; #if LOOPSPEED int duplicates; int loop_vect_to_check; #else information *WITH1; #endif locusvalues *WITH2; int FORLIM; int locus; WITH = LINK->LINK->p; locus = LINK->syste - 1; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if (person[WITH->id]->unknown) loop_vect_to_check = single_locus_vector_num[locus]; else loop_vect_to_check = 0; #else WITH1 = LINK->LINK->p->store; #endif WITH2 = thislocus[locus]; FORLIM = WITH2->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[locus] = i; for (j = i; j <= FORLIM; j++) { if (!nohom[locus] || i != affall || j != affall) { #if LOOPSPEED duplicates = (i - 1) * i / 2; if (unknown_poss[WITH->id][locus][loop_vect_to_check] [ (i - 1) * thislocus[locus]->nallele - duplicates + (j - 1)] ) { #else if (WITH1->possible[locus][i - 1][j - 1]) { #endif LINK->LINK->hap2[locus] = j; LINK->newval = LINK->val; getval(LINK->syste, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) ugetgene(locus + 2, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } } if ((!disequi) && (!disfreqs)) return; WITH = LINK->LINK->p; locus = LINK->syste - 1; #if LOOPSPEED /* if known, possibles held in loop vector 0 */ if ( person[WITH->id]->unknown) loop_vect_to_check= single_locus_vector_num[locus]; else { loop_vect_to_check = 0; } #else WITH1 = LINK->LINK->p->store; #endif WITH2 = thislocus[locus]; FORLIM = WITH2->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap2[locus] = i; for (j = i; j <= FORLIM; j++) { if (!nohom[locus] || i != affall || j != affall) { #if LOOPSPEED duplicates = (i - 1) * i / 2; if (unknown_poss[LINK->LINK->p->id][locus][loop_vect_to_check] [ (i - 1) * thislocus[locus]->nallele - duplicates + (j - 1)] ) { #else if (WITH1->possible[locus][i - 1][j - 1]) { #endif LINK->LINK->hap1[locus] = j; LINK->newval = LINK->val; getval(locus + 1, i, j, &LINK->newval, LINK->LINK); if (LINK->newval != 0.0) { if (LINK->syste != mlocus) ugetgene(locus + 2, LINK->newval, LINK->LINK); else setval(LINK->newval, LINK->LINK); } } } } } } /* aff_ */ /* This procedure determines the genotype of an unknown individual. Modified by Dylan in late 1994 to work with LOOPSPEED defined. */ static void ugetgene(syste_, val_, LINK) int syste_; double val_; struct LOC_getvect *LINK; { struct LOC_ugetgene V; locusvalues *WITH; V.LINK = LINK; V.syste = syste_; V.val = val_; WITH = thislocus[V.syste - 1]; if (sexlink && LINK->p->male) { switch (WITH->which) { case binary_: facmale_(&V); break; case affection: affmale_(&V); break; case quantitative: quanmale_(&V); break; case null_: if (WITH->privlocus->which == affection) affmale_(&V); else quanmale_(&V); break; } return; } switch (WITH->which) { case binary_: fac_(&V); break; case affection: aff_(&V); break; case quantitative: #if LOOPSPEED /* Dylan -- aff_ and quanval_ are identical so I */ aff_(&V); /* only modified aff_ */ #else quanval_(&V); #endif break; case null_: aff_(&V); break; } } /* ugetgene */ void getvect(p_, LINK) thisperson *p_; struct LOC_likelihood *LINK; { struct LOC_getvect V; V.LINK = LINK; V.p = p_; if (V.p->unknown) ugetgene(1L, 1.0, &V); else getgene(1L, 1.0, &V); } /* getvect */ /*getvect*/ fastlink-4.1P-fix95/4.1P/src/comnuclear.c0000644000265600020320000013047606737460341017131 0ustar tilleaadmin/* This file contains some of the old nuclear family update routines */ /* shared by modified versions of the LODSCORE, ILINK, LINKMAP, and MLINK programs*/ Local double msegsex(LINK) struct LOC_seg *LINK; { int g1, g2, g3, g4, g5, g6, g7, g8, ms, mf, ms1, ms2, mf1, mf2, j, k, f1, f2, s1, s2; double val, temp2; double temp[maxchild]; int FORLIM; thetavalues *WITH1; thisarray *WITH2; for (k = 0; k < nchild; k++) temp[k] = 0.0; if ((*LINK->p)->male) { mf = muthap[LINK->fseg - 1]; LINK->secondseg = LINK->sseg; WITH1 = LINK->secondsex; FORLIM = LINK->send; for (j = LINK->sstart - 1; j < FORLIM; j++) { if (WITH1->segprob[j] == 0.0) LINK->secondseg++; else { temp2 = WITH1->segprob[j]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; ms1 = muthap[s1 - 1]; ms2 = muthap[s2 - 1]; if (s1 != s2) { g1 = genenumber[LINK->fseg - 1][s1 - 1]; g2 = genenumber[LINK->fseg - 1][s2 - 1]; g3 = genenumber[LINK->fseg - 1][ms1 - 1]; g4 = genenumber[LINK->fseg - 1][ms2 - 1]; g5 = genenumber[mf - 1][s1 - 1]; g6 = genenumber[mf - 1][s2 - 1]; g7 = genenumber[mf - 1][ms1 - 1]; g8 = genenumber[mf - 1][ms2 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += temp2 * ((1 - LINK->ps) * (WITH2->genarray[s1 - 1] + WITH2->genarray[s2 - 1]) + LINK->ps * (WITH2->genarray[ms1 - 1] + WITH2->genarray[ms2 - 1])); else temp[k] += temp2 * ((1 - LINK->pf) * (1 - LINK->ps) * (WITH2->genarray[g1 - 1] + WITH2->genarray[g2 - 1]) + (1 - LINK->pf) * LINK->ps * (WITH2->genarray[g3 - 1] + WITH2->genarray[g4 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH2->genarray[g5 - 1] + WITH2->genarray[g6 - 1]) + LINK->pf * LINK->ps * (WITH2->genarray[g7 - 1] + WITH2->genarray[g8 - 1])); } } else { g1 = genenumber[LINK->fseg - 1][s1 - 1]; g3 = genenumber[LINK->fseg - 1][ms1 - 1]; g5 = genenumber[mf - 1][s1 - 1]; g7 = genenumber[mf - 1][ms1 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += 2.0 * temp2 * ((1 - LINK->ps) * WITH2->genarray[s1 - 1] + LINK->ps * WITH2->genarray[ms1 - 1]); else temp[k] += 2.0 * temp2 * ((1 - LINK->pf) * (1 - LINK->ps) * WITH2->genarray[g1 - 1] + LINK->ps * (1 - LINK->pf) * WITH2->genarray[g3 - 1] + LINK->pf * (1 - LINK->ps) * WITH2->genarray[g5 - 1] + LINK->pf * LINK->ps * WITH2->genarray[g7 - 1]); } } LINK->secondseg++; } } } else { LINK->firstseg = LINK->fseg; ms = muthap[LINK->sseg - 1]; WITH1 = LINK->firstsex; FORLIM = LINK->fend; for (j = LINK->fstart - 1; j < FORLIM; j++) { if (WITH1->segprob[j] == 0.0) LINK->firstseg++; else { temp2 = WITH1->segprob[j]; f1 = invgenenum1[LINK->firstseg - 1]; f2 = invgenenum2[LINK->firstseg - 1]; mf1 = muthap[f1 - 1]; mf2 = muthap[f2 - 1]; if (f1 != f2) { g1 = genenumber[LINK->sseg - 1][f1 - 1]; g2 = genenumber[LINK->sseg - 1][f2 - 1]; g3 = genenumber[LINK->sseg - 1][mf1 - 1]; g4 = genenumber[LINK->sseg - 1][mf2 - 1]; g5 = genenumber[ms - 1][f1 - 1]; g6 = genenumber[ms - 1][f2 - 1]; g7 = genenumber[ms - 1][mf1 - 1]; g8 = genenumber[ms - 1][mf2 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += temp2 * ((1 - LINK->pf) * (WITH2->genarray[f1 - 1] + WITH2->genarray[f2 - 1]) + LINK->pf * (WITH2->genarray[mf1 - 1] + WITH2->genarray[mf2 - 1])); else temp[k] += temp2 * ((1 - LINK->pf) * (1 - LINK->ps) * (WITH2->genarray[g1 - 1] + WITH2->genarray[g2 - 1]) + (1 - LINK->ps) * LINK->pf * (WITH2->genarray[g3 - 1] + WITH2->genarray[g4 - 1]) + LINK->ps * (1 - LINK->pf) * (WITH2->genarray[g5 - 1] + WITH2->genarray[g6 - 1]) + LINK->pf * LINK->ps * (WITH2->genarray[g7 - 1] + WITH2->genarray[g8 - 1])); } } else { g1 = genenumber[LINK->sseg - 1][f1 - 1]; g3 = genenumber[LINK->sseg - 1][mf1 - 1]; g5 = genenumber[ms - 1][f1 - 1]; g7 = genenumber[ms - 1][mf1 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += 2.0 * temp2 * ((1 - LINK->pf) * WITH2->genarray[f1 - 1] + LINK->pf * WITH2->genarray[mf1 - 1]); else temp[k] += 2.0 * temp2 * ((1 - LINK->pf) * (1 - LINK->ps) * WITH2->genarray[g1 - 1] + LINK->pf * (1 - LINK->ps) * WITH2->genarray[g3 - 1] + LINK->ps * (1 - LINK->pf) * WITH2->genarray[g5 - 1] + LINK->ps * LINK->pf * WITH2->genarray[g7 - 1]); } } LINK->firstseg++; } } } val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k]; return val; } /*msegsex*/ Local double msegsexf(LINK) struct LOC_seg *LINK; { int g1, g2, g3, g4, g5, g6, g7, g8, mf, ms1, ms2, j, k, l, s1, s2, slength; double val, temp1; double temp[maxchild][maxseg]; double temp2[maxseg]; int FORLIM; thetavalues *WITH1; thisarray *WITH2; mf = muthap[LINK->fseg - 1]; slength = LINK->send - LINK->sstart + 1; for (k = 0; k < nchild; k++) { for (l = 0; l < slength; l++) temp[k][l] = 0.0; } LINK->secondseg = LINK->sseg; WITH1 = LINK->secondsex; FORLIM = LINK->send; for (j = LINK->sstart - 1; j < FORLIM; j++) { for (l = 0; l < slength; l++) temp2[l] = WITH1->segprob[j + l * slength]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; ms1 = muthap[s1 - 1]; ms2 = muthap[s2 - 1]; if (s1 != s2) { g1 = genenumber[LINK->fseg - 1][s1 - 1]; g2 = genenumber[LINK->fseg - 1][s2 - 1]; g3 = genenumber[LINK->fseg - 1][ms1 - 1]; g4 = genenumber[LINK->fseg - 1][ms2 - 1]; g5 = genenumber[mf - 1][s1 - 1]; g6 = genenumber[mf - 1][s2 - 1]; g7 = genenumber[mf - 1][ms1 - 1]; g8 = genenumber[mf - 1][ms2 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) val = (1 - LINK->ps) * (WITH2->genarray[s1 - 1] + WITH2->genarray[s2 - 1]) + LINK->ps * (WITH2->genarray[ms1 - 1] + WITH2->genarray[ms2 - 1]); else val = (1 - LINK->pf) * (1 - LINK->ps) * (WITH2->genarray[g1 - 1] + WITH2->genarray[g2 - 1]) + (1 - LINK->pf) * LINK->ps * (WITH2->genarray[g3 - 1] + WITH2->genarray[g4 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH2->genarray[g5 - 1] + WITH2-> genarray[g6 - 1]) + LINK->pf * LINK->ps * (WITH2->genarray[g7 - 1] + WITH2->genarray[g8 - 1]); for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } else { g1 = genenumber[LINK->fseg - 1][s1 - 1]; g3 = genenumber[LINK->fseg - 1][ms1 - 1]; g5 = genenumber[mf - 1][s1 - 1]; g7 = genenumber[mf - 1][ms1 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) val = 2.0 * ((1 - LINK->ps) * WITH2->genarray[s1 - 1] + LINK->ps * WITH2->genarray[ms1 - 1]); else val = 2.0 * ((1 - LINK->pf) * (1 - LINK->ps) * WITH2->genarray[g1 - 1] + LINK->ps * (1 - LINK->pf) * WITH2->genarray[g3 - 1] + LINK->pf * (1 - LINK->ps) * WITH2->genarray[g5 - 1] + LINK->ps * LINK->pf * WITH2->genarray[g7 - 1]); for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } LINK->secondseg++; } temp1 = 0.0; for (l = 0; l < slength; l++) { val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k][l]; temp1 += val; } return temp1; } /*msegsexf*/ Local double segsex(LINK) struct LOC_seg *LINK; { int g1, g2, j, k, f1, f2, s1, s2; double val, temp2; double temp[maxchild]; int FORLIM; thetavalues *WITH1; thisarray *WITH2; for (k = 0; k < nchild; k++) temp[k] = 0.0; if ((*LINK->p)->male) { LINK->secondseg = LINK->sseg; WITH1 = LINK->secondsex; FORLIM = LINK->send; for (j = LINK->sstart - 1; j < FORLIM; j++) { if (WITH1->segprob[j] == 0.0) LINK->secondseg++; else { temp2 = WITH1->segprob[j]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; if (s1 != s2) { g1 = genenumber[LINK->fseg - 1][s1 - 1]; g2 = genenumber[LINK->fseg - 1][s2 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += temp2 * (WITH2->genarray[s1 - 1] + WITH2->genarray[s2 - 1]); else temp[k] += temp2 * (WITH2->genarray[g1 - 1] + WITH2->genarray[g2 - 1]); } } else { g1 = genenumber[LINK->fseg - 1][s1 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += 2.0 * temp2 * WITH2->genarray[s1 - 1]; else temp[k] += 2.0 * temp2 * WITH2->genarray[g1 - 1]; } } LINK->secondseg++; } } } else { LINK->firstseg = LINK->fseg; WITH1 = LINK->firstsex; FORLIM = LINK->fend; for (j = LINK->fstart - 1; j < FORLIM; j++) { if (WITH1->segprob[j] == 0.0) LINK->firstseg++; else { temp2 = WITH1->segprob[j]; f1 = invgenenum1[LINK->firstseg - 1]; f2 = invgenenum2[LINK->firstseg - 1]; if (f1 != f2) { g1 = genenumber[LINK->sseg - 1][f1 - 1]; g2 = genenumber[LINK->sseg - 1][f2 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += temp2 * (WITH2->genarray[f1 - 1] + WITH2->genarray[f2 - 1]); else temp[k] += temp2 * (WITH2->genarray[g1 - 1] + WITH2->genarray[g2 - 1]); } } else { g1 = genenumber[LINK->sseg - 1][f1 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) temp[k] += 2.0 * temp2 * WITH2->genarray[f1 - 1]; else temp[k] += 2.0 * temp2 * WITH2->genarray[g1 - 1]; } } LINK->firstseg++; } } } val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k]; return val; } /*segsex*/ Local double segsexf(LINK) struct LOC_seg *LINK; { int g1, g2, j, k, l, s1, s2, slength; double val, temp1; double temp[maxchild][maxseg]; double temp2[maxseg]; int FORLIM; thetavalues *WITH1; thisarray *WITH2; slength = LINK->send - LINK->sstart + 1; for (k = 0; k < nchild; k++) { for (l = 0; l < slength; l++) temp[k][l] = 0.0; } LINK->secondseg = LINK->sseg; WITH1 = LINK->secondsex; FORLIM = LINK->send; for (j = LINK->sstart - 1; j < FORLIM; j++) { for (l = 0; l < slength; l++) temp2[l] = WITH1->segprob[j + l * slength]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; if (s1 != s2) { g1 = genenumber[LINK->fseg - 1][s1 - 1]; g2 = genenumber[LINK->fseg - 1][s2 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) val = WITH2->genarray[s1 - 1] + WITH2->genarray[s2 - 1]; else val = WITH2->genarray[g1 - 1] + WITH2->genarray[g2 - 1]; if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } else { g1 = genenumber[LINK->fseg - 1][s1 - 1]; for (k = 0; k < nchild; k++) { WITH2 = thischild[k]; if (malechild[k]) val = 2.0 * WITH2->genarray[s1 - 1]; else val = 2.0 * WITH2->genarray[g1 - 1]; if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } LINK->secondseg++; } temp1 = 0.0; for (l = 0; l < slength; l++) { val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k][l]; temp1 += val; } return temp1; } Local double segfun(LINK) struct LOC_seg *LINK; { int g1, g2, g3, g4, i, j, k, f1, f2, s1, s2; double val, temp1, temp2; double temp[maxchild]; int FORLIM, FORLIM1; thetavalues *WITH1, *WITH2; thisarray *WITH3; LINK->firstseg = LINK->fseg; for (k = 0; k < nchild; k++) temp[k] = 0.0; WITH1 = LINK->firstsex; FORLIM = LINK->fend; for (i = LINK->fstart - 1; i < FORLIM; i++) { if (WITH1->segprob[i] == 0.0) LINK->firstseg++; else { temp1 = WITH1->segprob[i]; f1 = invgenenum1[LINK->firstseg - 1]; f2 = invgenenum2[LINK->firstseg - 1]; LINK->secondseg = LINK->sseg; WITH2 = LINK->secondsex; if (f1 != f2) { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { if (WITH2->segprob[j] == 0.0) LINK->secondseg++; else { temp2 = temp1 * WITH2->segprob[j]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; g4 = genenumber[f2 - 1][s2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += temp2 * (WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1] + WITH3->genarray[g3 - 1] + WITH3->genarray[g4 - 1]); } } else { g1 = genenumber[f1 - 1][s1 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += 2 * temp2 * (WITH3->genarray[g1 - 1] + WITH3->genarray[g3 - 1]); } } LINK->secondseg++; } } } else { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { if (WITH2->segprob[j] == 0.0) LINK->secondseg++; else { temp2 = temp1 * WITH2->segprob[j]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += 2 * temp2 * (WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1]); } } else { g1 = genenumber[f1 - 1][s1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += 4 * temp2 * WITH3->genarray[g1 - 1]; } } LINK->secondseg++; } } } LINK->firstseg++; } } val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k]; return val; } Local double msegfast(LINK) struct LOC_seg *LINK; { int g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, i, j, k, l, f1, f2, s1, s2, ms1, ms2, mf1, mf2, slength; double val, temp1; double temp[maxchild][maxseg]; double temp2[maxseg]; int FORLIM, FORLIM1; thetavalues *WITH1, *WITH2; thisarray *WITH3; LINK->firstseg = LINK->fseg; slength = LINK->send - LINK->sstart + 1; for (k = 0; k < nchild; k++) { for (l = 0; l < slength; l++) temp[k][l] = 0.0; } WITH1 = LINK->firstsex; FORLIM = LINK->fend; for (i = LINK->fstart - 1; i < FORLIM; i++) { if (WITH1->segprob[i] == 0.0) LINK->firstseg++; else { temp1 = WITH1->segprob[i]; f1 = invgenenum1[LINK->firstseg - 1]; f2 = invgenenum2[LINK->firstseg - 1]; mf1 = muthap[f1 - 1]; mf2 = muthap[f2 - 1]; LINK->secondseg = LINK->sseg; WITH2 = LINK->secondsex; if (f1 != f2) { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { for (l = 0; l < slength; l++) temp2[l] = temp1 * WITH2->segprob[j + l * slength]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; ms1 = muthap[s1 - 1]; ms2 = muthap[s2 - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; g4 = genenumber[f2 - 1][s2 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g6 = genenumber[f1 - 1][ms2 - 1]; g7 = genenumber[f2 - 1][ms1 - 1]; g8 = genenumber[f2 - 1][ms2 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g10 = genenumber[mf1 - 1][s2 - 1]; g11 = genenumber[mf2 - 1][s1 - 1]; g12 = genenumber[mf2 - 1][s2 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; g14 = genenumber[mf1 - 1][ms2 - 1]; g15 = genenumber[mf2 - 1][ms1 - 1]; g16 = genenumber[mf2 - 1][ms2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = (1 - LINK->ps) * (1 - LINK->pf) * (WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1] + WITH3->genarray[g3 - 1] + WITH3->genarray[g4 - 1]) + LINK->ps * (1 - LINK->pf) * (WITH3->genarray[g5 - 1] + WITH3->genarray[g6 - 1] + WITH3->genarray[g7 - 1] + WITH3->genarray[g8 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH3->genarray[g9 - 1] + WITH3->genarray[g10 - 1] + WITH3->genarray[g11 - 1] + WITH3->genarray[g12 - 1]) + LINK->pf * LINK->ps * (WITH3->genarray[g13 - 1] + WITH3->genarray[g14 - 1] + WITH3->genarray[g15 - 1] + WITH3->genarray[g16 - 1]); if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } else { g1 = genenumber[f1 - 1][s1 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g7 = genenumber[f2 - 1][ms1 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g11 = genenumber[mf2 - 1][s1 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; g15 = genenumber[mf2 - 1][ms1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = 2 * ((1 - LINK->ps) * (1 - LINK->pf) * (WITH3->genarray[g1 - 1] + WITH3->genarray[g3 - 1]) + LINK->ps * (1 - LINK->pf) * (WITH3->genarray[g5 - 1] + WITH3->genarray[g7 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH3->genarray[g9 - 1] + WITH3->genarray[g11 - 1]) + LINK->pf * LINK->ps * (WITH3->genarray[g13 - 1] + WITH3->genarray[g15 - 1])); for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } LINK->secondseg++; } } else { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { for (l = 0; l < slength; l++) temp2[l] = temp1 * WITH2->segprob[j + l * slength]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; ms1 = muthap[s1 - 1]; ms2 = muthap[s2 - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g6 = genenumber[f1 - 1][ms2 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g10 = genenumber[mf1 - 1][s2 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; g14 = genenumber[mf1 - 1][ms2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = 2 * ((1 - LINK->ps) * (1 - LINK->pf) * (WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1]) + LINK->ps * (1 - LINK->pf) * (WITH3->genarray[g5 - 1] + WITH3->genarray[g6 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH3->genarray[g9 - 1] + WITH3->genarray[g10 - 1]) + LINK->pf * LINK->ps * (WITH3->genarray[g13 - 1] + WITH3->genarray[g14 - 1])); if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } else { g1 = genenumber[f1 - 1][s1 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = 4 * ((1 - LINK->ps) * (1 - LINK->pf) * WITH3->genarray[g1 - 1] + LINK->ps * (1 - LINK->pf) * WITH3->genarray[g5 - 1] + LINK->pf * (1 - LINK->ps) * WITH3->genarray[g9 - 1] + LINK->pf * LINK->ps * WITH3->genarray[g13 - 1]); if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } LINK->secondseg++; } } LINK->firstseg++; } } temp1 = 0.0; for (l = 0; l < slength; l++) { val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k][l]; temp1 += val; } return temp1; } /*msegfast*/ Local double msegfun(LINK) struct LOC_seg *LINK; { int g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, i, j, k, f1, f2, s1, s2, ms1, ms2, mf1, mf2; double val, temp1, temp2; double temp[maxchild]; int FORLIM, FORLIM1; thetavalues *WITH1, *WITH2; thisarray *WITH3; LINK->firstseg = LINK->fseg; for (k = 0; k < nchild; k++) temp[k] = 0.0; WITH1 = LINK->firstsex; FORLIM = LINK->fend; for (i = LINK->fstart - 1; i < FORLIM; i++) { if (WITH1->segprob[i] == 0.0) LINK->firstseg++; else { temp1 = WITH1->segprob[i]; f1 = invgenenum1[LINK->firstseg - 1]; f2 = invgenenum2[LINK->firstseg - 1]; mf1 = muthap[f1 - 1]; mf2 = muthap[f2 - 1]; LINK->secondseg = LINK->sseg; WITH2 = LINK->secondsex; if (f1 != f2) { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { if (WITH2->segprob[j] == 0.0) LINK->secondseg++; else { temp2 = temp1 * WITH2->segprob[j]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; ms1 = muthap[s1 - 1]; ms2 = muthap[s2 - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; g4 = genenumber[f2 - 1][s2 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g6 = genenumber[f1 - 1][ms2 - 1]; g7 = genenumber[f2 - 1][ms1 - 1]; g8 = genenumber[f2 - 1][ms2 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g10 = genenumber[mf1 - 1][s2 - 1]; g11 = genenumber[mf2 - 1][s1 - 1]; g12 = genenumber[mf2 - 1][s2 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; g14 = genenumber[mf1 - 1][ms2 - 1]; g15 = genenumber[mf2 - 1][ms1 - 1]; g16 = genenumber[mf2 - 1][ms2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += temp2 * ((1 - LINK->ps) * (1 - LINK->pf) * (WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1] + WITH3->genarray[g3 - 1] + WITH3->genarray[g4 - 1]) + LINK->ps * (1 - LINK->pf) * (WITH3->genarray[g5 - 1] + WITH3->genarray[g6 - 1] + WITH3->genarray[g7 - 1] + WITH3->genarray[g8 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH3->genarray[g9 - 1] + WITH3-> genarray[g10 - 1] + WITH3->genarray[g11 - 1] + WITH3->genarray[g12 - 1]) + LINK->pf * LINK->ps * (WITH3->genarray[g13 - 1] + WITH3->genarray[g14 - 1] + WITH3->genarray[g15 - 1] + WITH3->genarray[g16 - 1])); } } else { g1 = genenumber[f1 - 1][s1 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g7 = genenumber[f2 - 1][ms1 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g11 = genenumber[mf2 - 1][s1 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; g15 = genenumber[mf2 - 1][ms1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += 2 * temp2 * ((1 - LINK->ps) * (1 - LINK->pf) * (WITH3->genarray[g1 - 1] + WITH3->genarray[g3 - 1]) + LINK->ps * (1 - LINK->pf) * (WITH3->genarray[g5 - 1] + WITH3->genarray[g7 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH3->genarray[g9 - 1] + WITH3->genarray[g11 - 1]) + LINK->pf * LINK->ps * (WITH3->genarray[g13 - 1] + WITH3->genarray[g15 - 1])); } } LINK->secondseg++; } } } else { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { if (WITH2->segprob[j] == 0.0) LINK->secondseg++; else { temp2 = temp1 * WITH2->segprob[j]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; ms1 = muthap[s1 - 1]; ms2 = muthap[s2 - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g6 = genenumber[f1 - 1][ms2 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g10 = genenumber[mf1 - 1][s2 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; g14 = genenumber[mf1 - 1][ms2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += 2 * temp2 * ((1 - LINK->ps) * (1 - LINK->pf) * (WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1]) + LINK->ps * (1 - LINK->pf) * (WITH3->genarray[g5 - 1] + WITH3->genarray[g6 - 1]) + LINK->pf * (1 - LINK->ps) * (WITH3->genarray[g9 - 1] + WITH3->genarray[g10 - 1]) + LINK->pf * LINK->ps * (WITH3->genarray[g13 - 1] + WITH3->genarray[g14 - 1])); } } else { g1 = genenumber[f1 - 1][s1 - 1]; g5 = genenumber[f1 - 1][ms1 - 1]; g9 = genenumber[mf1 - 1][s1 - 1]; g13 = genenumber[mf1 - 1][ms1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; temp[k] += 4 * temp2 * ((1 - LINK->ps) * (1 - LINK->pf) * WITH3->genarray[g1 - 1] + LINK->ps * (1 - LINK->pf) * WITH3->genarray[g5 - 1] + LINK->pf * (1 - LINK->ps) * WITH3->genarray[g9 - 1] + LINK->pf * LINK->ps * WITH3->genarray[g13 - 1]); } } LINK->secondseg++; } } } LINK->firstseg++; } } val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k]; return val; } /*msegfun*/ Local double segfast(LINK) struct LOC_seg *LINK; { int g1, g2, g3, g4, i, j, k, l, f1, f2, s1, s2, slength; double val, temp1; double temp[maxchild][maxseg]; double temp2[maxseg]; int FORLIM, FORLIM1; thetavalues *WITH1, *WITH2; thisarray *WITH3; LINK->firstseg = LINK->fseg; slength = LINK->send - LINK->sstart + 1; for (k = 0; k < nchild; k++) { for (l = 0; l < slength; l++) temp[k][l] = 0.0; } WITH1 = LINK->firstsex; FORLIM = LINK->fend; for (i = LINK->fstart - 1; i < FORLIM; i++) { if (WITH1->segprob[i] == 0.0) LINK->firstseg++; else { temp1 = WITH1->segprob[i]; f1 = invgenenum1[LINK->firstseg - 1]; f2 = invgenenum2[LINK->firstseg - 1]; LINK->secondseg = LINK->sseg; WITH2 = LINK->secondsex; if (f1 != f2) { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { for (l = 0; l < slength; l++) temp2[l] = temp1 * WITH2->segprob[j + l * slength]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; g4 = genenumber[f2 - 1][s2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1] + WITH3->genarray[g3 - 1] + WITH3->genarray[g4 - 1]; if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } else { g1 = genenumber[f1 - 1][s1 - 1]; g3 = genenumber[f2 - 1][s1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = 2.0 * (WITH3->genarray[g1 - 1] + WITH3->genarray[g3 - 1]); if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } LINK->secondseg++; } } else { FORLIM1 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM1; j++) { for (l = 0; l < slength; l++) temp2[l] = temp1 * WITH2->segprob[j + l * slength]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; if (s1 != s2) { g1 = genenumber[f1 - 1][s1 - 1]; g2 = genenumber[f1 - 1][s2 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = 2.0 * (WITH3->genarray[g1 - 1] + WITH3->genarray[g2 - 1]); if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } else { g1 = genenumber[f1 - 1][s1 - 1]; for (k = 0; k < nchild; k++) { WITH3 = thischild[k]; val = 4.0 * WITH3->genarray[g1 - 1]; if (val != 0.0) { for (l = 0; l < slength; l++) temp[k][l] += temp2[l] * val; } } } LINK->secondseg++; } } LINK->firstseg++; } } temp1 = 0.0; for (l = 0; l < slength; l++) { val = 1.0; for (k = 0; k < nchild; k++) val *= temp[k][l]; temp1 += val; } return temp1; } /*segfast*/ Void segsexctop(LINK) struct LOC_seg *LINK; { double segval; int first, second, sstop; boolean thiscensor, thisrare; censorrec *WITH; thisarray *WITH1; int FORLIM; thisarray *WITH2; initseg(LINK); WITH = censorstruct; if ((*LINK->p)->male) { WITH1 = (*LINK->p)->gen; FORLIM = LINK->nfirst; for (first = 0; first < FORLIM; first++) { if (WITH1->genarray[first] != 0.0) { segval = 0.0; LINK->fseg = first + 1; thisrare = rare[first]; second = 1; if (thisrare) { WITH2 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc < maxcensor) { thisc++; thiscensor = WITH->censor[thisc - minint]; } else thiscensor = (WITH2->genarray[second - 1] == 0.0) || (rare[second - 1] == true); if (!thiscensor) { if (mutsys != 0) segval += WITH2->genarray[second - 1] * msegsexf(LINK); else segval += WITH2->genarray[second - 1] * segsexf(LINK); } second = sstop; } while (second <= LINK->nsecond); } else { WITH2 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc < maxcensor) { thisc++; thiscensor = WITH->censor[thisc - minint]; } else thiscensor = (WITH2->genarray[second - 1] == 0.0); if (!thiscensor) { if (mutsys != 0) segval += WITH2->genarray[second - 1] * msegsexf(LINK); else segval += WITH2->genarray[second - 1] * segsexf(LINK); } second = sstop; } while (second <= LINK->nsecond); } WITH1->genarray[first] *= segval * segscale; } } } else { WITH1 = (*LINK->p)->gen; FORLIM = LINK->nfirst; for (first = 0; first < FORLIM; first++) { if (WITH1->genarray[first] != 0.0) { segval = 0.0; LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; thisrare = rare[first]; second = 1; if (thisrare) { WITH2 = (*LINK->q)->gen; do { LINK->sseg = second; if (thisc < maxcensor) { thisc++; thiscensor = WITH->censor[thisc - minint]; } else thiscensor = (WITH2->genarray[second - 1] == 0.0) || (rare[second - 1] == true); if (!thiscensor) { if (mutsys != 0) segval += WITH2->genarray[second - 1] * msegsex(LINK); else segval += WITH2->genarray[second - 1] * segsex(LINK); } second++; } while (second <= LINK->nsecond); } else { WITH2 = (*LINK->q)->gen; do { LINK->sseg = second; if (thisc < maxcensor) { thisc++; thiscensor = WITH->censor[thisc - minint]; } else thiscensor = (WITH2->genarray[second - 1] == 0.0); if (!thiscensor) { if (mutsys != 0) segval += WITH2->genarray[second - 1] * msegsex(LINK); else segval += WITH2->genarray[second - 1] * segsex(LINK); } second++; } while (second <= LINK->nsecond); } WITH1->genarray[first] *= segval * segscale; } } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsexctop*/ Void segsextop(LINK) struct LOC_seg *LINK; { double segval, val; int first, second, sstop; censorrec *WITH; thisarray *WITH1; int FORLIM; thisarray *WITH2; initseg(LINK); WITH = censorstruct; if ((*LINK->p)->male) { WITH1 = (*LINK->p)->gen; FORLIM = LINK->nfirst; for (first = 1; first <= FORLIM; first++) { if (WITH1->genarray[first - 1] != 0.0) { segval = 0.0; LINK->fseg = first; second = 1; WITH2 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc <= maxcensor) thisc++; if (WITH2->genarray[second - 1] == 0.0) { second = sstop; if (thisc <= maxcensor) WITH->censor[thisc - minint] = true; } else { if (mutsys != 0) val = msegsexf(LINK); else val = segsexf(LINK); if (thisc <= maxcensor) { WITH->censor[thisc - minint] = (val==0.0); } segval += WITH2->genarray[second - 1] * val; second = sstop; } } while (second <= LINK->nsecond); WITH1->genarray[first - 1] *= segval * segscale; } } } else { WITH1 = (*LINK->p)->gen; FORLIM = LINK->nfirst; for (first = 0; first < FORLIM; first++) { if (WITH1->genarray[first] != 0.0) { segval = 0.0; LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; second = 1; WITH2 = (*LINK->q)->gen; do { LINK->sseg = second; if (thisc <= maxcensor) thisc++; if (WITH2->genarray[second - 1] == 0.0) { second++; if (thisc <= maxcensor) WITH->censor[thisc - minint] = true; } else { if (mutsys != 0) val = msegsex(LINK); else val = segsex(LINK); if (thisc <= maxcensor) { WITH->censor[thisc - minint] = (val == 0.0); } segval += WITH2->genarray[second - 1] * val; second++; } } while (second <= LINK->nsecond); WITH1->genarray[first] *= segval * segscale; } } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segsextop*/ Void segctop(LINK) struct LOC_seg *LINK; { double segval; int first, second, sstop; boolean thiscensor, thisrare; censorrec *WITH; thisarray *WITH1; thisarray *WITH2; initseg(LINK); WITH = censorstruct; WITH1 = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH1->genarray[first] != 0.0) { segval = 0.0; LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; thisrare = rare[first]; second = 1; if (thisrare) { WITH2 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc < maxcensor) { thisc++; thiscensor = WITH->censor[thisc - minint]; } else thiscensor = (WITH2->genarray[second - 1] == 0.0) || rare[second - 1]; if (thiscensor) second = sstop; else { if (mutsys != 0) segval += WITH2->genarray[second - 1] * msegfast(LINK); else segval += WITH2->genarray[second - 1] * segfast(LINK); second = sstop; } } while (second <= fgeno); } else { WITH2 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc < maxcensor) { thisc++; thiscensor = WITH->censor[thisc - minint]; } else thiscensor = (WITH2->genarray[second - 1] == 0.0); if (thiscensor) second = sstop; else { if (mutsys != 0) segval += WITH2->genarray[second - 1] * msegfast(LINK); else segval += WITH2->genarray[second - 1] * segfast(LINK); second = sstop; } } while (second <= fgeno); } WITH1->genarray[first] *= segval * segscale; } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); if (approximate && firstapprox && ((*LINK->p)->pa==NULL)) getapprox(LINK); } /*segctop*/ Void segtop(LINK) struct LOC_seg *LINK; { double segval, val; int first, second, sstop; boolean thisrare; censorrec *WITH; thisarray *WITH1; thisarray *WITH2; initseg(LINK); WITH = censorstruct; WITH1 = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH1->genarray[first] != 0.0) { thisrare = rare[first]; segval = 0.0; LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; second = 1; if (thisrare) { WITH2 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc <= maxcensor) thisc++; if ((WITH2->genarray[second - 1] == 0.0) || (rare[second - 1])) { second = sstop; if (thisc <= maxcensor) WITH->censor[thisc - minint] = true; } else { if (mutsys != 0) val = msegfast(LINK); else val = segfast(LINK); if (thisc <= maxcensor) { WITH->censor[thisc - minint] = (val == 0.0); } segval += WITH2->genarray[second - 1] * val; second = sstop; } } while (second <= fgeno); } else { WITH2 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc <= maxcensor) thisc++; if (WITH2->genarray[second - 1] == 0.0) { second = sstop; if (thisc <= maxcensor) WITH->censor[thisc - minint] = true; } else { if (mutsys != 0) val = msegfast(LINK); else val = segfast(LINK); if (thisc <= maxcensor) { WITH->censor[thisc - minint] = (val == 0.0); } segval += WITH2->genarray[second - 1] * val; second = sstop; } } while (second <= fgeno); } WITH1->genarray[first] *= segval * segscale; } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); if (approximate && firstapprox && ((*LINK->p)->pa==NULL)) getapprox(LINK); } /*segtop*/ Void segcapprox(LINK) struct LOC_seg *LINK; { double segval; int first, second, sstop; boolean thiscensor; censorrec *WITH; thisarray *WITH2; thisarray *WITH3; initseg(LINK); WITH = censorstruct; WITH2 = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH2->genarray[first] != 0.0) { segval = 0.0; LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; second = 1; WITH3 = (*LINK->q)->gen; do { LINK->sstart = probstart[second - 1]; LINK->send = probend[second - 1]; LINK->sseg = segstart[second - 1]; sstop = second + LINK->send - LINK->sstart + 1; if (thisc < maxcensor) { thisc++; thiscensor = WITH->censor[thisc - minint]; } else thiscensor = (WITH3->genarray[second - 1] == 0.0); if (thiscensor || (!(approxarray[LINK->LINK->thisped - 1][first]))) second = sstop; else { if (mutsys != 0) segval += WITH3->genarray[second - 1] * msegfast(LINK); else segval += WITH3->genarray[second - 1] * segfast(LINK); second = sstop; } } while (second <= fgeno); WITH2->genarray[first] *= segval * segscale; } } cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*segcapprox*/ #include "oldsegup.c" Void msegsexdown(LINK) struct LOC_seg *LINK; { int here; double val, temp2; int ms2, ms1, mf, j, first, second; censorrec *WITH1; thisarray *WITH2; int FORLIM1; thisarray *WITH3; int FORLIM2; thetavalues *WITH4; int FORLIM3; initseg(LINK); for (here = 0; here < fgeno; here++) gene[here] = 0.0; WITH1 = censorstruct; WITH2 = (*LINK->p)->gen; FORLIM1 = LINK->nfirst; for (first = 0; first < FORLIM1; first++) { if (WITH2->genarray[first] != 0.0) { LINK->fseg = first + 1; second = 1; WITH3 = (*LINK->q)->gen; FORLIM2 = LINK->nsecond; for (second = 0; second < FORLIM2; second++) { if (WITH3->genarray[second] != 0.0) { val = WITH3->genarray[second] * (*LINK->p)->gen->genarray[first] * segscale; LINK->sstart = probstart[second]; LINK->send = probend[second]; LINK->sseg = segstart[second]; if (nchild != 0) val *= msegsex(LINK); if (val != 0.0) { mf = muthap[invgenenum1[LINK->fseg - 1] - 1]; LINK->secondseg = LINK->sseg; WITH4 = femaletheta; FORLIM3 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM3; j++) { ms1 = muthap[invgenenum1[LINK->secondseg - 1] - 1]; ms2 = muthap[invgenenum2[LINK->secondseg - 1] - 1]; temp2 = WITH4->segprob[j]; if (temp2 != 0.0) { if ((*LINK->r)->male) { here = invgenenum1[LINK->secondseg - 1]; gene[here - 1] += (1 - LINK->ps) * temp2 * val; here = invgenenum2[LINK->secondseg - 1]; gene[here - 1] += (1 - LINK->ps) * temp2 * val; here = ms1; gene[here - 1] += LINK->ps * temp2 * val; here = ms2; gene[here - 1] += LINK->ps * temp2 * val; } else { here = genenumber[invgenenum1[LINK->secondseg - 1] - 1] [first]; gene[here - 1] += (1 - LINK->pf) * (1 - LINK->ps) * temp2 * val; here = genenumber[invgenenum2[LINK->secondseg - 1] - 1] [first]; gene[here - 1] += (1 - LINK->pf) * (1 - LINK->ps) * temp2 * val; here = genenumber[invgenenum1[LINK->secondseg - 1] - 1] [mf - 1]; gene[here - 1] += LINK->pf * (1 - LINK->ps) * temp2 * val; here = genenumber[invgenenum2[LINK->secondseg - 1] - 1] [mf - 1]; gene[here - 1] += LINK->pf * (1 - LINK->ps) * temp2 * val; here = genenumber[ms1 - 1][first]; gene[here - 1] += (1 - LINK->pf) * LINK->ps * temp2 * val; here = genenumber[ms2 - 1][first]; gene[here - 1] += (1 - LINK->pf) * LINK->ps * temp2 * val; here = genenumber[ms1 - 1][mf - 1]; gene[here - 1] += LINK->pf * LINK->ps * temp2 * val; here = genenumber[ms2 - 1][mf - 1]; gene[here - 1] += LINK->pf * LINK->ps * temp2 * val; } } LINK->secondseg++; } } } /*second*/ } } /*first*/ } memcpy((*LINK->p)->gen->genarray, (*LINK->r)->gen->genarray, maxfemgen * sizeof(double)); memcpy((*LINK->r)->gen->genarray, gene, maxfemgen * sizeof(double)); WITH2 = (*LINK->r)->gen; for (first = 0; first < fgeno; first++) WITH2->genarray[first] *= (*LINK->p)->gen->genarray[first]; cleanup(LINK->p, LINK->LINK); cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*msegsexdown*/ Void msegdown(LINK) struct LOC_seg *LINK; { int here; double val, temp, temp1, temp2; int i, j, first, second, f1, f2, s1, s2, mf1, mf2, ms1, ms2; censorrec *WITH1; thisarray *WITH2; thisarray *WITH3; thetavalues *WITH4; int FORLIM3; thetavalues *WITH5; int FORLIM4; initseg(LINK); for (here = 0; here < fgeno; here++) gene[here] = 0.0; WITH1 = censorstruct; WITH2 = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH2->genarray[first] != 0.0) { LINK->fstart = probstart[first]; LINK->fend = probend[first]; LINK->fseg = segstart[first]; WITH3 = (*LINK->q)->gen; for (second = 0; second < fgeno; second++) { if (WITH3->genarray[second] != 0.0) { LINK->sstart = probstart[second]; LINK->send = probend[second]; LINK->sseg = segstart[second]; val = WITH3->genarray[second] * (*LINK->p)->gen->genarray[first] * segscale; if (nchild != 0) val = msegfun(LINK) * val; if (val != 0.0) { LINK->firstseg = LINK->fseg; WITH4 = maletheta; FORLIM3 = LINK->fend; for (i = LINK->fstart - 1; i < FORLIM3; i++) { temp1 = WITH4->segprob[i]; LINK->secondseg = LINK->sseg; if (temp1 != 0.0) { WITH5 = femaletheta; FORLIM4 = LINK->send; for (j = LINK->sstart - 1; j < FORLIM4; j++) { if (WITH5->segprob[j] == 0.0) LINK->secondseg++; else { temp2 = WITH5->segprob[j]; f1 = invgenenum1[LINK->firstseg - 1]; f2 = invgenenum2[LINK->firstseg - 1]; s1 = invgenenum1[LINK->secondseg - 1]; s2 = invgenenum2[LINK->secondseg - 1]; temp = (1 - LINK->pf) * (1 - LINK->ps) * temp1 * temp2 * val; here = genenumber[s1 - 1][f1 - 1]; gene[here - 1] += temp; here = genenumber[s1 - 1][f2 - 1]; gene[here - 1] += temp; here = genenumber[s2 - 1][f1 - 1]; gene[here - 1] += temp; here = genenumber[s2 - 1][f2 - 1]; gene[here - 1] += temp; ms1 = muthap[s1 - 1]; ms2 = muthap[s2 - 1]; temp = (1 - LINK->pf) * LINK->ps * temp1 * temp2 * val; here = genenumber[ms1 - 1][f1 - 1]; gene[here - 1] += temp; here = genenumber[ms1 - 1][f2 - 1]; gene[here - 1] += temp; here = genenumber[ms2 - 1][f1 - 1]; gene[here - 1] += temp; here = genenumber[ms2 - 1][f2 - 1]; gene[here - 1] += temp; mf1 = muthap[f1 - 1]; mf2 = muthap[f2 - 1]; temp = LINK->pf * (1 - LINK->ps) * temp1 * temp2 * val; here = genenumber[mf1 - 1][s1 - 1]; gene[here - 1] += temp; here = genenumber[mf1 - 1][s2 - 1]; gene[here - 1] += temp; here = genenumber[mf2 - 1][s1 - 1]; gene[here - 1] += temp; here = genenumber[mf2 - 1][s2 - 1]; gene[here - 1] += temp; temp = LINK->pf * LINK->ps * temp1 * temp2 * val; here = genenumber[mf1 - 1][ms1 - 1]; gene[here - 1] += temp; here = genenumber[mf1 - 1][ms2 - 1]; gene[here - 1] += temp; here = genenumber[mf2 - 1][ms1 - 1]; gene[here - 1] += temp; here = genenumber[mf2 - 1][ms2 - 1]; gene[here - 1] += temp; LINK->secondseg++; } } } LINK->firstseg++; } } } /*second*/ } } /*first*/ } memcpy((*LINK->p)->gen->genarray, (*LINK->r)->gen->genarray, maxfemgen * sizeof(double)); memcpy((*LINK->r)->gen->genarray, gene, maxfemgen * sizeof(double)); WITH2 = (*LINK->r)->gen; for (first = 0; first < fgeno; first++) WITH2->genarray[first] *= (*LINK->p)->gen->genarray[first]; cleanup(LINK->p, LINK->LINK); cleanup(LINK->q, LINK->LINK); exitseg(LINK); } /*msegdown*/ fastlink-4.1P-fix95/4.1P/src/iostuff.c0000644000265600020320000005150210517437732016447 0ustar tilleaadmin/* This file contains a few input/output routines for use with the faster versions of LODSCORE, ILINK, LINKMAP, and MLINK described in: R. W. Cottingham, Jr., R. M. Idury, and A. A. Schaffer Faster Sequential Genetic Linkage Computations American Journal of Human Genetics, 53(1993), pp. 252--263 and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Linkage Analysis Human Heredity 44(1994), pp. 225-237. */ /* Two routines taken from * "p2c" Copyright (C) 1989, 1990, 1991 Free Software Foundation. * By Dave Gillespie, daveg@csvax.cs.caltech.edu. Version --VERSION--. * This file may be copied, modified, etc. in any way. It is not restricted * by the licence agreement accompanying p2c itself. */ /* Check if at end of file, using Pascal "eof" semantics. End-of-file for stdin is broken; remove the special case for it to be broken in a different way. */ #include #include "commondefs.h" #if defined(LODSCORE) #include "lodefs.h" #endif #if defined(ILINK) #include "ildefs.h" #endif #if defined(LINKMAP) #include "lidefs.h" #endif #if defined(MLINK) #include "mldefs.h" #endif int P_eof(f) FILE *f; { register int ch; if (feof(f)) return 1; if (f == stdin) return 0; /* not safe to look-ahead on the keyboard! */ ch = getc(f); if (ch == EOF) return 1; ungetc(ch, f); return 0; } /* Check if at end of line (or end of entire file). */ int P_eoln(f) FILE *f; { register int ch; ch = getc(f); if (ch == EOF) return 1; ungetc(ch, f); return (ch == '\n'); } /*This routine is a simple exit routine, when the sytem is out of memory*/ void malloc_err(message) char * message; { FILE *errorfile; time_t secondsNow; fprintf(stderr, "\nProblem with malloc, probably not enough space\n"); fprintf(stderr, "Problem occurred when allocating %s\n", message); errorfile = fopen("FASTLINK.err","a"); if (errorfile) { time (&secondsNow); fprintf(errorfile,"\n%s",ctime(&secondsNow)); fprintf(errorfile, "\nProblem with malloc, probably not enough space\n"); fprintf(errorfile, "Problem occurred when allocating %s\n", message); fclose(errorfile); } #if PARALLEL Tmk_errexit("\nProblem with malloc of private memory\n"); #else exit(EXIT_FAILURE); #endif /*PARALLEL*/ } /*The routine check_consatnts checks to see if some constants have been set appropriately and reports the maximum number of haplotypes*/ void check_constants() { int prod, l; #if ALLELE_SPEED int pedprod, worst_ped, pedidx; #endif boolean shouldexit, firstprint; time_t secondsNow; FILE *errorfile = NULL; /* cgh -- made NULL for gcc */ #if defined(LODSCORE) int locus1, locus2; #endif /* Added by Dylan in late 1994 */ /*Done in 2.3P*/ #if (!LOOPSPEED && !defined(LODSCORE)) { FILE *f; f = fopen(LOOPFILE_NAME, "r"); if ( f != NULL ) { fclose(f); printf("Warning: LOOPSPEED is not set for this run, but\n"); printf(" %s exists, which suggests that\n", LOOPFILE_NAME); printf(" LOOPSPEED is set in unknown.c.\n"); } } #endif shouldexit = false; firstprint = false; time(&secondsNow); #if defined(LODSCORE) #if ALLELE_SPEED prod = 0; locus1 = locuslist1[iplace - 1] - 1; locus2 = locuslist2[jplace - 1] - 1; for (pedidx = 0; pedidx < mymaxped; pedidx++) { pedprod = 1; if ((binary_ == holdlocus[locus1]->which) && (allformat == holdlocus[locus1]->format)) pedprod *= ped_new_allele_count[pedidx][locus1]; else pedprod *= holdlocus[locus1]->nallele; if ((binary_ == holdlocus[locus2]->which) && (allformat == holdlocus[locus2]->format)) pedprod *= ped_new_allele_count[pedidx][locus2]; else pedprod *= holdlocus[locus2]->nallele; if (pedprod > prod) { prod = pedprod; worst_ped = pedidx; } } printf("\nThe maximum number of haplotypes needed is %d, given by a pedigree in which:", prod); if ((binary_ == holdlocus[locus1]->which) && (allformat == holdlocus[locus1]->format)) printf("\n%d alleles are needed at locus %d",ped_new_allele_count[worst_ped][locus1], locus1 + 1); else printf("\n%d alleles are needed at locus %d",holdlocus[locus1]->nallele, locus1 + 1); if ((binary_ == holdlocus[locus2]->which) && (allformat == holdlocus[locus2]->format)) printf("\n%d alleles are needed at locus %d",ped_new_allele_count[worst_ped][locus2], locus2 + 1); else printf("\n%d alleles are needed at locus %d",holdlocus[locus2]->nallele, locus2 + 1); #else prod = 1; for(l=0; l < mlocus; l++){ printf("\nNumber of alleles at locus %d is %d",l+1, holdlocus[l]->nallele); prod *= holdlocus[l]->nallele; } printf("\nThe number of haplotypes used is %d", prod); #endif /*ALLELE_SPEED*/ #else /*defined(LODSCORE)*/ #if ALLELE_SPEED prod = 0; for (pedidx = 0; pedidx < mymaxped; pedidx++) { pedprod = 1; for(l = 0; l < mlocus; l++) if ((binary_ == thislocus[l]->which) && (allformat == thislocus[l]->format)) pedprod *= ped_new_allele_count[pedidx][l]; else pedprod *= thislocus[l]->nallele; if (pedprod > prod) { prod = pedprod; worst_ped = pedidx; } } printf("\nThe maximum number of haplotypes needed is %d, given by a pedigree in which:", prod); for(l = 0; l < mlocus; l++) if ((binary_ == thislocus[l]->which) && (allformat == thislocus[l]->format)) printf("\n%d alleles are needed at locus %d",ped_new_allele_count[worst_ped][l], l + 1); else printf("\n%d alleles are needed at locus %d",thislocus[l]->nallele, l + 1); #else prod = 1; for(l=0; l < mlocus; l++){ printf("\nNumber of alleles at locus %d is %d",l+1, thislocus[l]->nallele); prod *= thislocus[l]->nallele; } printf("\nThe number of haplotypes used is %d", prod); #endif /*ALLELE_SPEED*/ #endif /*defined(LODSCORE) */ if (maxseg > BIGMAXSEG){ printf("\nYour value of maxseg is dangerously high."); printf("\nIt is safest to keep maxseg below %d and maxlocus below %d",BIGMAXSEG,BIGMAXLOCUS); printf("\nRemember that maxlocus is only a limit on how many loci are in one analysis."); printf("\nYou can have many more loci in your pedin.dat file."); if (!firstprint) errorfile = fopen("FASTLINK.err", "a"); if (errorfile) { fprintf(errorfile,"\n%s", ctime(&secondsNow)); fprintf(errorfile,"\nYour value of maxseg is dangerously high."); fprintf(errorfile,"\nIt is safest to keep maxseg below %d and maxlocus below %d",BIGMAXSEG,BIGMAXLOCUS); firstprint = true; } shouldexit = true; } printf("\n"); if (firstprint && errorfile) fclose(errorfile); if (shouldexit) #if PARALLEL Tmk_errexit("\n Problem with constants"); #else exit(EXIT_FAILURE); #endif /*PARALLEL*/ } /* dwix: begin */ /* this struct is a linked list of integers used to store the pedigree */ /* numbers, which will be saved with an association to an index */ struct int_list_ { int ped_number; struct int_list_ *next; }; typedef struct int_list_ int_list; /****************************************************************************** function: read_till_blank_line this function will read from the file given and return the file read through until a blank line was encountered. This function returns the file so the next read will read the line after the blank line, not the blank line itself. ******************************************************************************/ static int read_till_blank_line(infile) FILE* infile; { int blank_line = false; /* is this a blank line */ char intext[DEFAULT_STRING_LENGTH]; /* the line read from the file */ char *tstr; /* a temporary char * */ while (!blank_line) /* while we have not reached a blank line */ { fgets(intext,DEFAULT_STRING_LENGTH,infile); /* get new line */ tstr = intext; /* scan whitespace */ while ((tstr[0]==' ') || (tstr[0]=='\011')) tstr++; /* if after scanning through whitespace, we are at then end of tstr, */ /* then we had a blank line */ if (tstr[0]=='\0') blank_line=true; } } /****************************************************************************** function: foundped this function will scan ipedfile.dat and read the pedigrees in that file. It uses a linked list to save all the different pedigree's it finds. As it goes through the pedigrees, it counts them, and returns the count. The linked list is converted into an array of integers. This array is the global variable pedidx2num. It also saves the calculation in the static variable saved_ped, so there is no recomputation if the function is called more than once. ******************************************************************************/ static int foundped() { static int saved_ped = 0; /* saved result */ FILE *ipedfile = NULL; /* the ipedfile */ char inputline[DEFAULT_STRING_LENGTH]; /* line read from ipedfile */ int ped_count = 0; /* pedigrees counted */ int inped; /* pedigree read */ int prev_ped = 0; /* the last pedigree read */ int_list *ped_list = NULL; /* linked list to save pedigrees */ int_list *tmp_ped_list = NULL; /* temp pointer into ped_list */ int count; /* counter for loops */ /* if we ran before and saved the result - return it */ if ( saved_ped != 0 ) return(saved_ped); /* open ipedfile.dat */ ipedfile = fopen("ipedfile.dat","r"); if (ipedfile == NULL) ipedfile = fopen("pedfile.dat","r"); if (ipedfile == NULL) /* if the open failed - print error and exit */ { /* dwix err msg */ fprintf(stderr,"Error opening ipedfile.dat and pedfile.dat.\n"); exit(EXIT_FAILURE); } ped_list = NULL; /* read all the pedigrees and process */ while (!feof(ipedfile)) /* go through all of file */ { fgets(inputline,DEFAULT_STRING_LENGTH,ipedfile); /* get a line */ sscanf(inputline," %d",&inped); /* read it's ped */ if (inped!=prev_ped) /* if a new ped number */ { /* make new node in the list */ tmp_ped_list = NULL; tmp_ped_list = (int_list *)malloc(sizeof(int_list)); if (tmp_ped_list == NULL) /* if error mallocing exit w/ error */ malloc_err("tmp_ped_list"); /* place data into new node */ tmp_ped_list->ped_number = inped; /* add ped number */ tmp_ped_list->next = ped_list; /* tack list onto end */ /* note: this makes the list */ /* backward */ ped_list = tmp_ped_list; /* make ped_list new leader */ ped_count++; /* increase ped_count */ prev_ped = inped; /* save the previos ped */ } } fclose(ipedfile); /* close the file */ /* allocate space for the array to convert index to pedigree number */ pedidx2num = (int *)calloc(ped_count,sizeof(int)); if (pedidx2num==NULL) /* if error exit w/ message */ malloc_err("pedidx2num"); /* copy list data into array - go backwards */ tmp_ped_list = ped_list; for (count=ped_count-1;count >= 0; count--) { pedidx2num[count] = tmp_ped_list->ped_number; tmp_ped_list = tmp_ped_list->next; } /* delete allocated space for the linked list */ while (ped_list!=NULL) /* while members to delete */ { tmp_ped_list = ped_list; /* save this member */ ped_list = ped_list->next; /* get next member */ free(tmp_ped_list); /* delete this member */ } saved_ped = ped_count; /* save the result */ return(ped_count); /* return the result */ } /****************************************************************************** function: init_ped_loc_all this function initializes the variable ped_loc_all after it has been allocated. This function initializes all entries in the 3d array to 0 ******************************************************************************/ void init_ped_loc_all() { int a,b,c; int pedidx; locusvalues **templocus; int loopbound; #if defined(LODSCORE) templocus = holdlocus; #else templocus = thislocus; #endif mymaxped = foundped(); if (mymaxped==0) { /* dwix err msg */ fprintf(stderr,"foundped() found 0 pedigree's - wrong.\n"); exit(EXIT_FAILURE); } ped_loc_all = NULL; ped_loc_all = (loc_all *)malloc(mymaxped*sizeof(loc_all)); if (ped_loc_all==NULL) malloc_err("ped_loc_all"); #if ALLELE_SPEED ped_must_change_locations = NULL; ped_must_change_locations = (boolean *) malloc((mymaxped + 1) * sizeof(boolean)); ped_must_change_locations[0] = true; for(pedidx = 1; pedidx <= mymaxped; pedidx++) ped_must_change_locations[pedidx] = false; ped_new_allele_count = NULL; ped_new_allele_count = (new_allele_count *) malloc(mymaxped * sizeof(new_allele_count)); #endif #if defined(LODSCORE) loopbound = maxsys; #else loopbound = maxlocus; #endif for (a=0;awhich) && (allformat == templocus[locidx]->format)) { total_freq_sum[locidx] = 0.0; if (disfreqs) cond_total_freq_sum[locidx] = 0.0; for(allidx = 0; allidx < templocus[locidx]->nallele; allidx++) { total_freq_sum[locidx] += templocus[locidx]->freq[allidx]; if (disfreqs) cond_total_freq_sum[locidx] += templocus[locidx]->freqcond[allidx]; } #if PARALLEL if (Tmk_proc_id == 0) #endif if ((total_freq_sum[locidx] < (1.0 - epsilon)) || (total_freq_sum[locidx] > (1.0 + epsilon))) { fprintf(stderr,"\nALLELE FREQUENCY ALERT: The frequencies at locus index"); fprintf(stderr,"\n%d sum to %10.7lf rather than 1.0",locidx + 1, total_freq_sum[locidx]); } } } for(pedidx = 0; pedidx < nuped; pedidx++) for(locidx = 0; locidx < mlocus; locidx++) if ((binary_ == templocus[locidx]->which) && (allformat == templocus[locidx]->format)) { for(allidx =1; allidx <= templocus[locidx]->nallele; allidx++) { ped_loc_all[pedidx][locidx][allidx].old_frequency = templocus[locidx]->freq[allidx - 1]; if (disfreqs) ped_loc_all[pedidx][locidx][allidx].old_frequency_cond = templocus[locidx]->freqcond[allidx - 1]; } /*map old alleles to new alleles preserving present ones*/ present_freq_sum = 0.0; if (disfreqs) cond_present_freq_sum = 0.0; old_all = 1; new_all = 1; missed = 0; while (old_all <= templocus[locidx]->nallele) { if (ped_loc_all[pedidx][locidx][old_all].present) { ped_loc_all[pedidx][locidx][old_all].new_allele = new_all; ped_loc_all[pedidx][locidx][new_all].old_allele = old_all; ped_loc_all[pedidx][locidx][new_all].new_frequency = ped_loc_all[pedidx][locidx][old_all].old_frequency; present_freq_sum += ped_loc_all[pedidx][locidx][new_all].new_frequency; if (disfreqs) { ped_loc_all[pedidx][locidx][new_all].new_frequency_cond = ped_loc_all[pedidx][locidx][old_all].old_frequency_cond; cond_present_freq_sum += ped_loc_all[pedidx][locidx][new_all].new_frequency_cond; } new_all++; } else missed = old_all; old_all++; } /*create new allele if not all present as new allele new_all */ if (new_all < old_all) { /*missed must have a non-zero value*/ ped_loc_all[pedidx][locidx][new_all].old_allele = missed; ped_loc_all[pedidx][locidx][new_all].new_frequency = total_freq_sum[locidx] - present_freq_sum; if (disfreqs) ped_loc_all[pedidx][locidx][new_all].new_frequency_cond = cond_total_freq_sum[locidx] - cond_present_freq_sum; new_all++; } ped_new_allele_count[pedidx][locidx] = new_all - 1; /*if this pedigree has different adjusted allele counts than the previous one, we must adjust the gene tables before working on this pedigree*/ if ((pedidx > 0) && (ped_new_allele_count[pedidx][locidx] != ped_new_allele_count[pedidx -1][locidx])) ped_must_change_locations[pedidx] = true; } } #endif /*ALLELE_SPEED*/ /****************************************************************************** function: allele_downcode_check although named poorly - I can't think of anything else to name it. This function will use the data in ped_loc_all to determine if the data can be restructured to decrease the allele product, and thereby increase the speed of the run. ******************************************************************************/ int allele_downcode_check() { int ped_check; /* if there is a problem with a given pedigree */ int ped_count, loc_count, all_count; /* counters for loops */ int one_missing; locusvalues **templocus; boolean firstError = true; #if defined(LODSCORE) templocus = holdlocus; #else templocus = thislocus; #endif for (ped_count = 0; ped_count < nuped; ped_count++) { ped_check = false; for (loc_count = 0; loc_count < mlocus; loc_count++) { /* scan loci */ if ((binary_ == templocus[loc_count]->which) && (allformat == templocus[loc_count]->format)) { /* for each pedigree-locus pair, we start with nothing wrong */ one_missing = false; ped_check = false; for (all_count = 1; all_count <= (templocus[loc_count]->nallele); all_count++) { /* scan alleles */ if (!(ped_loc_all[ped_count][loc_count][all_count].present)) { /* allele missing */ if (one_missing) ped_check = true; else one_missing = true; } } if (ped_check) { /* dwix err msg */ if (firstError) { #if PARALLEL if (Tmk_proc_id == 0) { #endif fprintf(stderr,"\nSee README.allele\n"); fprintf(stderr,"FASTLINK will renumber alleles for you automagically\n"); #if PARALLEL } #endif firstError = false; } #if PARALLEL if (Tmk_proc_id == 0) { #endif fprintf(stderr,"ALLELE DIAGNOSIS: pedigree %d does not use all alleles at locus index %d\n", pedidx2num[ped_count], loc_count + 1); #if PARALLEL } #endif } } } } free(pedidx2num); return(0); /* if reporting on peds - */ } /* dwix: end */ #if ALLELE_SPEED /*The following procedure written by A.A. Schaffer to adjust the alleles of persons based on renumbering of alleles. Uses the fact that old allele -> new allele mapping is montonic */ void allele_adjust_persons() { int pedix, locidx, personidx; thisperson *next_to_mutate; /*next person to have alleles changed*/ int prev_ped; locusvalues **templocus; #if defined(LODSCORE) templocus = holdlocus; #else templocus = thislocus; #endif personidx = 1; pedix = -1; prev_ped = -1; while ((next_to_mutate = person[personidx]) != NULL) { if (prev_ped != (next_to_mutate->ped - 1)) { prev_ped = next_to_mutate->ped - 1; pedix++; } for(locidx = 0; locidx < mlocus; locidx++) { if ((binary_ == templocus[locidx]->which) && (allformat == templocus[locidx]->format)) { #if defined(LODSCORE) next_to_mutate->holdphen[locidx]->allele1 = ped_loc_all[pedix][locidx] [next_to_mutate->holdphen[locidx]->allele1].new_allele; next_to_mutate->holdphen[locidx]->allele2 = ped_loc_all[pedix][locidx] [next_to_mutate->holdphen[locidx]->allele2].new_allele; #else next_to_mutate->phen[locidx]->allele1 = ped_loc_all[pedix][locidx] [next_to_mutate->phen[locidx]->allele1].new_allele; next_to_mutate->phen[locidx]->allele2 = ped_loc_all[pedix][locidx] [next_to_mutate->phen[locidx]->allele2].new_allele; #endif } } personidx++; } } #endif fastlink-4.1P-fix95/4.1P/src/lidefs.h0000644000265600020320000000247006737460342016245 0ustar tilleaadmin#ifndef _LIDEFS_H #define _LIDEFS_H 1 /* Output from p2c, the Pascal-to-C translator */ /* From input file "linkmap.p" */ /* This file contains definitions for a modified version of LINKMAP */ /* The modifications are described in the papers: */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer. S. K. Gupta, K. Shriram, and R. W. Cottingham Jr. */ /* Avoiding Recomputation in Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237. */ #ifndef _COMMONDEFS_H #include #endif #define scale 2.0 /*SCALE FACTOR*/ #ifndef byfamily #define byfamily true #endif #define epsilon 1.0e-6 boolean zeromale[maxlocus], zerofemale[maxlocus]; int j, whichvary, gridsize; double thetatot, thetainc, thisdist, thisdistm, thisdistf, finaltheta, tlike; int continue_; #if defined(DOS) typedef enum { normalRun , checkpointedRun } checkpointType; checkpointType checkpointStatus; #endif /* dwix: begin */ #define DEFAULT_STR_LENGTH (200) #define MULTI_LINKMAP (true) #define LINKSAVE "linksave" #define SCREENSAVE "linksave.screen" #define OUTFILESAVE "linksave.outfile" #define STREAMSAVE "linksave.stream" /* dwix: end */ #endif /* _LIDEFS_H */ fastlink-4.1P-fix95/4.1P/src/ilinputcode.c0000644000265600020320000003326506737460341017316 0ustar tilleaadmin/* This file contains the input routines in */ /* a modified version of the ILINK program*/ /* The modifications are described in the papers: */ /* R. W. Cotingham, R. M. Idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Genetics, 53(1993), pp. 252-263*/ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr. */ /* Avoiding Recomputation in Genetic Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237. */ #include "commondefs.h" #include "gemdefs.h" #include "ildefs.h" Void setparam() { long i, j, k, l, m; #if !PARALLEL /* cgh -- gcc */ thetavalues *WITH; #endif /* !PARALLEL */ long FORLIM; locusvalues *WITH1; thisarray *WITH2; long FORLIM1, FORLIM2; penalty = false; k = 0; #if !PARALLEL WITH = maletheta; #endif FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; #if PARALLEL maletheta->theta[i] = gmaletheta[currentthetanum][i] = xall[k - 1]; #else WITH->theta[i] = xall[k - 1]; #endif } if (interfer && !mapping) { k++; #if PARALLEL maletheta->theta[mlocus - 1] = gmaletheta[currentthetanum][mlocus - 1] = xall[k -1]; #else maletheta->theta[mlocus - 1] = xall[k - 1]; #endif } if (sexdif) { if (readfemale) { #if !PARALLEL WITH = femaletheta; #endif FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; #if PARALLEL femaletheta->theta[i] = gfemaletheta[currentthetanum][i] = xall[k - 1]; #else WITH->theta[i] = xall[k - 1]; #endif } if (interfer && !mapping) { k++; #if PARALLEL femaletheta->theta[mlocus - 1] = gfemaletheta[currentthetanum][mlocus - 1] = xall[k - 1]; #else femaletheta->theta[mlocus - 1] = xall[k - 1]; #endif } } else { k++; distratio = xall[k - 1]; } } if (itsys == 0) return; WITH1 = thislocus[itsys - 1]; if (disequi) { WITH2 = hapfreq; for (i = 0; i < nuhap; i++) WITH2->genarray[i] = xall[i + k]; WITH2->genarray[nuhap - 1] = 1.0; FORLIM = nuhap - 2; for (i = 0; i <= FORLIM; i++) WITH2->genarray[nuhap - 1] -= WITH2->genarray[i]; penalty = (WITH2->genarray[nuhap - 1] < 0.0); k += nuhap - 1; } else { FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) WITH1->freq[i] = xall[i + k]; WITH1->freq[WITH1->nallele - 1] = 1.0; FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) WITH1->freq[WITH1->nallele - 1] -= WITH1->freq[i]; penalty = (WITH1->freq[WITH1->nallele - 1] < 0.0); k += WITH1->nallele - 1; if (disfreqs && (binary_ == WITH1->which)) { FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) WITH1->freqcond[i] = xall[i + k]; WITH1->freqcond[WITH1->nallele - 1] = 1.0; FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) WITH1->freqcond[WITH1->nallele - 1] -= WITH1->freqcond[i]; penalty = penalty || (WITH1->freqcond[WITH1->nallele - 1] < 0.0); k += WITH1->nallele - 1; } } if (WITH1->which == affection) { FORLIM = WITH1->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH1->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH1->nallele; for (j = i; j <= FORLIM2; j++) { k++; WITH1->UU.U0.pen[i][j - 1][2][l] = xall[k - 1]; WITH1->UU.U0.pen[i][j - 1][1][l] = 1.0 - xall[k - 1]; for (m = 0; m <= 2; m++) WITH1->UU.U0.pen[j][i - 1][m][l] = WITH1->UU.U0.pen[i][j - 1][m] [l]; } } if (sexlink) { FORLIM1 = WITH1->nallele; for (i = 0; i < FORLIM1; i++) { k++; WITH1->UU.U0.pen[0][i][2][l] = xall[k - 1]; WITH1->UU.U0.pen[0][i][1][l] = 1.0 - xall[k - 1]; } } } return; } if (WITH1->which != quantitative) return; FORLIM = WITH1->UU.U1.ntrait; /*USER MUST CHANGE FOR SYSTEMS WITH MORE THAN 2 ALLELES*/ for (i = 0; i < FORLIM; i++) { WITH1->UU.U1.pm[1][0][i] = xall[k]; WITH1->UU.U1.pm[2][1][i] = xall[k + 1] + xall[k]; WITH1->UU.U1.pm[1][1][i] = xall[k + 2] * xall[k + 1] + xall[k]; WITH1->UU.U1.pm[0][0][i] = xall[k]; WITH1->UU.U1.pm[0][1][i] = WITH1->UU.U1.pm[1][1][i]; WITH1->UU.U1.pm[2][0][i] = WITH1->UU.U1.pm[1][1][i]; k += 3; } FORLIM = WITH1->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH1->UU.U1.ntrait; for (j = i; j < FORLIM1; j++) { k++; WITH1->UU.U1.vmat[i][j] = xall[k - 1]; WITH1->UU.U1.vmat[j][i] = xall[k - 1]; } } invert(WITH1->UU.U1.vmat, WITH1->UU.U1.ntrait, &WITH1->UU.U1.det); WITH1->UU.U1.det = 1 / sqrt(WITH1->UU.U1.det); } typedef enum { nobnd, probnd, zerobnd, logbnd } boundary; Void setiterate(LINK) struct LOC_inputdata *LINK; { boundary bndtype[maxn]; long i, j, k, l; thetavalues *WITH; long FORLIM; locusvalues *WITH1; long FORLIM1, FORLIM2; fscanf(datafile, "%ld%*[^\n]", &i); getc(datafile); if (i > mlocus) inputerror(23L, mlocus, i, LINK); if (i < 0) inputerror(24L, i, i, LINK); itsys = i; /*AAS, used when we want to estimate frequencies at locus i*/ if (itsys != 0) itsys = order[itsys - 1]; k = 0; WITH = maletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = WITH->theta[i]; if (interfer && !mapping) bndtype[k - 1] = logbnd; else bndtype[k - 1] = probnd; } if (interfer && !mapping) { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = maletheta->theta[mlocus - 1]; bndtype[k - 1] = logbnd; } if (sexdif) { if (readfemale) { WITH = femaletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = WITH->theta[i]; if (interfer && !mapping) bndtype[k - 1] = logbnd; else bndtype[k - 1] = probnd; } if (interfer && !mapping) { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = femaletheta->theta[mlocus - 1]; bndtype[k - 1] = logbnd; } } else { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = distratio; bndtype[k - 1] = zerobnd; } } nall = k; if (itsys != 0) { /*AAS, if we are estimating allele frequencies, then the improvements under the guise of ALLELE_SPEED cannot be applied*/ if (ALLELE_SPEED) { fprintf(stderr,"\nYou are attempting to estimate allele frequencies."); fprintf(stderr,"\nYou must have ALLELE_SPEED set to 0 in both "); fprintf(stderr,"\nunknown.c and commondefs.h, so that your alleles"); fprintf(stderr,"\nare not mutated, then recompile UNKNOWN and ILINK."); fprintf(stderr,"\nFASTLINK will exit politely to allow you to change ALLELE_SPEED"); exit(EXIT_FAILURE); } WITH1 = thislocus[itsys - 1]; if (disequi) { FORLIM = nuhap - 2; for (i = 0; i <= FORLIM; i++) xall[i + k] = hapfreq->genarray[i]; nall = nuhap + k - 1; } else { FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) xall[i + k] = WITH1->freq[i]; nall = WITH1->nallele + k - 1; if (disfreqs && (binary_ == WITH1->which)) { for (i = 0; i <= FORLIM; i++) xall[i + k + FORLIM + 1] = WITH1->freqcond[i]; nall = k + (2 * (WITH1->nallele - 1)); } } if (nall > maxn) inputerror(25L, (long)maxn, nall, LINK); for (i = k; i < nall; i++) bndtype[i] = probnd; k = nall; if (WITH1->which == quantitative) { nall += WITH1->UU.U1.ntrait * (WITH1->UU.U1.ntrait + 1) / 2 + WITH1->UU.U1.ntrait * 3; } else { if (WITH1->which == affection) { nall += WITH1->UU.U0.nclass * WITH1->nallele * (WITH1->nallele + 1) / 2; if (sexlink) nall += WITH1->nallele; } } if (nall > maxn) inputerror(25L, (long)maxn, nall, LINK); if (WITH1->which == affection) { FORLIM = WITH1->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH1->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH1->nallele; for (j = i - 1; j < FORLIM2; j++) { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = WITH1->UU.U0.pen[i][j][2][l]; bndtype[k - 1] = probnd; } } if (sexlink) { FORLIM1 = WITH1->nallele; for (i = 0; i < FORLIM1; i++) { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = WITH1->UU.U0.pen[0][i][2][l]; bndtype[k - 1] = probnd; } } } } else { if (WITH1->which == quantitative) { invert(WITH1->UU.U1.vmat, WITH1->UU.U1.ntrait, &WITH1->UU.U1.det); FORLIM = WITH1->UU.U1.ntrait; /*USER MUST MODIFY FOR A SYSTEM WILL MORE THAN 2 ALLELES */ for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH1->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH1->nallele; for (j = i; j <= FORLIM2; j++) { k++; if (i == 1 && j == 1) xall[k - 1] = WITH1->UU.U1.pm[i][j - 1][l]; else { if (i == 1) xall[k - 1] = WITH1->UU.U1.pm[j][j - 1][l] - xall[k - 2]; else xall[k - 1] = (WITH1->UU.U1.pm[i - 1][j - 1] [l] - xall[k - 3]) / xall[k - 2]; } bndtype[k - 1] = nobnd; } } } FORLIM = WITH1->UU.U1.ntrait; for (i = 1; i <= FORLIM; i++) { FORLIM1 = WITH1->UU.U1.ntrait; for (j = i; j <= FORLIM1; j++) { k++; if (k > maxn) inputerror(25L, (long)maxn, k, LINK); xall[k - 1] = WITH1->UU.U1.vmat[i - 1][j - 1]; if (i == j) bndtype[k - 1] = zerobnd; else bndtype[k - 1] = nobnd; } } } } } for (i = 0; i < nall; i++) itp[i] = 0; i = 0; while ((i <= nall) & (!P_eoln(datafile))) { i++; fscanf(datafile, "%d", &itp[i - 1]); } n = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { n++; x[n - 1] = xall[i]; } } for (i = 0; i < nall; i++) { bnd[i][0] = -1000.0; bnd[i][1] = 1000.0; if (bndtype[i] == probnd) { bnd[i][0] = 0.0; bnd[i][1] = 1.0; } else { if (bndtype[i] == logbnd) { bnd[i][0] = -20.0; bnd[i][1] = 20.0; } else { if (bndtype[i] == zerobnd) bnd[i][0] = 0.0; } } } } Void readloci(LINK) struct LOC_inputdata *LINK; { struct LOC_readloci V; long i, j, coupling, autosomal, independent, difference; locusvalues *WITH; V.LINK = LINK; lastpriv = 0; fscanf(datafile, "%d%d%ld%*[^\n]", &mlocus, &risksys, &autosomal); getc(datafile); /*Replace the above line with the next when using epistasis*/ /*readln(datafile,mlocus,risksys,autosomal,lastpriv);*/ if (mlocus > maxlocus) inputerror(0L, mlocus, mlocus, LINK); if (mlocus <= 0) inputerror(1L, mlocus, mlocus, LINK); if (risksys > maxlocus) inputerror(37L, risksys, risksys, LINK); if (risksys < 0) inputerror(38L, risksys, risksys, LINK); risk = (risksys != 0); sexlink = (autosomal == 1); #if PARALLEL if (Tmk_proc_id == 0) { #endif printf("YOU ARE USING LINKAGE (V%3.1f (1-Feb-1991)) WITH%3d-POINT\n", fVersion, mlocus); printf("YOU ARE USING FASTLINK (V%s (6-Oct-1997))", fastversion); if (sexlink) printf(" SEXLINKED DATA\n"); else printf(" AUTOSOMAL DATA\n"); #if PARALLEL } #endif fscanf(datafile, "%d%lf%lf%ld%*[^\n]", &mutsys, &mutmale, &mutfemale, &coupling); getc(datafile); if (mutsys > maxlocus) inputerror(39L, mutsys, mutsys, LINK); if (mutsys < 0) inputerror(40L, mutsys, mutsys, LINK); if (coupling == 1) disequi = true; else disequi = false; if (disequi) { hapfreq = (thisarray *)Malloc(sizeof(thisarray)); if (hapfreq == NULL) malloc_err("hapfreq"); } for (i = 1; i <= mlocus; i++) { fscanf(datafile, "%ld", &j); if (j > mlocus) inputerror(2L, i, j, LINK); if (j <= 0) inputerror(3L, i, j, LINK); order[j - 1] = i; } for (i = 1; i <= mlocus; i++) { for (j = 1; j < i; j++) { if (order[i - 1] == order[j - 1]) inputerror(4L, i, j, LINK); } } fscanf(datafile, "%*[^\n]"); getc(datafile); if (mutsys != 0) mutsys = order[mutsys - 1]; if (risksys != 0) risksys = order[risksys - 1]; V.nupriv = 0; for (i = 0; i < mlocus; i++) getlocus(order[i], &V); increment[mlocus - 1] = 1; for (i = mlocus - 1; i >= 1; i--) increment[i - 1] = increment[i] * thislocus[i]->nallele; fgeno = 1; for (j = 0; j < mlocus; j++) fgeno *= thislocus[j]->nallele; mgeno = fgeno; nuhap = fgeno; for (i = 0; i < mlocus; i++) nohom[i] = false; if (disequi) { allocate_thisarray(hapfreq, mgeno); for (i = 0; i < mgeno; i++) fscanf(datafile, "%lf", &hapfreq->genarray[i]); fscanf(datafile, "%*[^\n]"); getc(datafile); } else { for (i = 0; i < mlocus; i++) { WITH = thislocus[i]; if (WITH->which == affection || WITH->which == quantitative) { if (WITH->freq[affall - 1] < minfreq) nohom[i] = true; } } } fgeno = fgeno * (fgeno + 1) / 2; if (!sexlink) mgeno = fgeno; fscanf(datafile, "%ld", &difference); if ((unsigned long)difference > 2) { inputwarning(0L, difference, difference, LINK); difference = 0; } sexdif = (difference != 0); readfemale = (difference == 2); fscanf(datafile, "%ld%*[^\n]", &independent); getc(datafile); if ((unsigned long)independent > 2) { inputwarning(1L, independent, independent, LINK); independent = 0; } interfer = (independent != 0); mapping = (independent == 2); gettheta(&maletheta, &V); if (sexdif) gettheta(&femaletheta, &V); else femaletheta = maletheta; if (sexlink && sexdif) { inputwarning(2L, difference, difference, LINK); sexdif = false; readfemale = false; } if (!sexlink) { if (mutsys == 0) thispath = auto_; else thispath = mauto; } else if (mutsys == 0) thispath = sex; else thispath = msex; segscale = scale; for (i = 1; i <= mlocus; i++) segscale *= scalemult; } fastlink-4.1P-fix95/4.1P/src/logetvect.c0000644000265600020320000000401106737460342016757 0ustar tilleaadmin/* This file contains some low level probability */ /* routines used in the LODSCORE program */ #include "commondefs.h" #include "lodefs.h" /* Local variables for getvect: */ struct LOC_getvect { struct LOC_likelihood *LINK; thisperson *p; hapvector hap1, hap2; } ; /* Local Void getgene PP((int syste, double val, struct LOC_getvect *LINK)); Local Void ugetgene PP((int syste, double val, struct LOC_getvect *LINK)); */ /*static void getgene (int syste, double val, struct LOC_getvect *LINK); static void ugetgene (int syste, double val, struct LOC_getvect *LINK); */ static void getgene(); static void ugetgene(); Local double quanfun(phen, thislocus, i, j, mean, LINK) phenotype *phen; locusvalues *thislocus; int i, j; double *mean; struct LOC_getvect *LINK; { double val; int it, jt, FORLIM, FORLIM1; val = 1.0; if (phen->missing) return val; val = 0.0; FORLIM = thislocus->UU.U1.ntrait; for (it = 0; it < FORLIM; it++) { FORLIM1 = thislocus->UU.U1.ntrait; for (jt = 0; jt < FORLIM1; jt++) { if (i == j) val += thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); else val += thislocus->UU.U1.conmat * thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); } } val = thislocus->UU.U1.det * exp(-val * 0.5); if (i != j) val *= thislocus->UU.U1.contrait; return val; } /*quanfun*/ Local Void getval(syste, i, j, val, LINK) int syste, i, j; double *val; struct LOC_getvect *LINK; { locusvalues *WITH; phenotype *WITH1; WITH = thislocus[syste - 1]; switch (WITH->which) { case quantitative: *val *= quanfun(LINK->p->phen[syste - 1], thislocus[syste - 1], i, j, WITH->UU.U1.pm[i][j - 1], LINK); break; case affection: WITH1 = LINK->p->phen[syste - 1]; *val *= WITH->UU.U0.pen[i][j - 1][WITH1->aff][WITH1->liability - 1]; break; /* cgh -- added to make gcc happy */ case binary_: case null_: default: break; } } /*getval*/ #include "comgetvect.c" fastlink-4.1P-fix95/4.1P/src/loinputcode.c0000644000265600020320000012521706737460342017324 0ustar tilleaadmin/* This file contains input code for a */ /* modified version of the LODSCORE program */ /* described in the papers: */ /* R. W. Cottingham Jr., R. M. idury, and A. A. Schaffer */ /* Faster Sequential Genetic Linkage Computations */ /* American Journal of Human Gentics, 53(1993), pp. 252-263 */ /* and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., */ /* Avoiding Recomputation in Genetic Linkage Analysis, */ /* Human Heredity 44(1994), pp. 225-237. */ #include "commondefs.h" #if !defined(DOS) #include "checkpointdefs.h" #endif #include "gemdefs.h" #include "lodefs.h" Void setparam() { long i, j, k, l, m; thetavalues *WITH; long FORLIM; locusvalues *WITH1; thisarray *WITH2; long FORLIM1, FORLIM2; penalty = false; k = 0; WITH = maletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; WITH->theta[i] = xall[k - 1]; } if (sexdif) { if (readfemale) { WITH = femaletheta; FORLIM = mlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; WITH->theta[i] = xall[k - 1]; } } else { k++; distratio = xall[k - 1]; } } if (itsys == 0) return; WITH1 = thislocus[itsys - 1]; if (disequi) { WITH2 = hapfreq; FORLIM = nuhap; for (i = 0; i < FORLIM; i++) WITH2->genarray[i] = xall[i + k]; WITH2->genarray[nuhap - 1] = 1.0; FORLIM = nuhap - 2; for (i = 0; i <= FORLIM; i++) WITH2->genarray[nuhap - 1] -= WITH2->genarray[i]; penalty = (WITH2->genarray[nuhap - 1] < 0.0); k += nuhap - 1; } else { FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) WITH1->freq[i] = xall[i + k]; WITH1->freq[WITH1->nallele - 1] = 1.0; FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) WITH1->freq[WITH1->nallele - 1] -= WITH1->freq[i]; penalty = (WITH1->freq[WITH1->nallele - 1] < 0.0); k += WITH1->nallele - 1; } if (WITH1->which == affection) { FORLIM = WITH1->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH1->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH1->nallele; for (j = i; j <= FORLIM2; j++) { k++; WITH1->UU.U0.pen[i][j - 1][2][l] = xall[k - 1]; WITH1->UU.U0.pen[i][j - 1][1][l] = 1.0 - xall[k - 1]; for (m = 0; m <= 2; m++) WITH1->UU.U0.pen[j][i - 1][m][l] = WITH1->UU.U0.pen[i][j - 1][m] [l]; } } if (sexlink) { FORLIM1 = WITH1->nallele; for (i = 0; i < FORLIM1; i++) { k++; WITH1->UU.U0.pen[0][i][2][l] = xall[k - 1]; WITH1->UU.U0.pen[0][i][1][l] = 1.0 - xall[k - 1]; } } } return; } if (WITH1->which != quantitative) return; FORLIM = WITH1->UU.U1.ntrait; /*USER MUST CHANGE FOR SYSTEMS WITH MORE THAN 2 ALLELES*/ for (i = 0; i < FORLIM; i++) { WITH1->UU.U1.pm[1][0][i] = xall[k]; WITH1->UU.U1.pm[2][1][i] = xall[k + 1] + xall[k]; WITH1->UU.U1.pm[1][1][i] = xall[k + 2] * xall[k + 1] + xall[k]; WITH1->UU.U1.pm[0][0][i] = xall[k]; WITH1->UU.U1.pm[0][1][i] = WITH1->UU.U1.pm[1][1][i]; WITH1->UU.U1.pm[2][0][i] = WITH1->UU.U1.pm[1][1][i]; k += 3; } FORLIM = WITH1->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH1->UU.U1.ntrait; for (j = i; j < FORLIM1; j++) { k++; WITH1->UU.U1.vmat[i][j] = xall[k - 1]; WITH1->UU.U1.vmat[j][i] = xall[k - 1]; } } invert(WITH1->UU.U1.vmat, WITH1->UU.U1.ntrait, &WITH1->UU.U1.det); WITH1->UU.U1.det = 1 / sqrt(WITH1->UU.U1.det); } /* Local variables for getlocations: */ struct LOC_getlocations { long ngene, nseg, here, there, start, nhet, thisseg; boolean rarepresent, riskhom, riskhet; hapvector hap1, hap2; boolean thishet[maxlocus]; } ; Local boolean checkrare(LINK) struct LOC_getlocations *LINK; { long i; boolean check; locusvalues *WITH; check = false; for (i = 0; i < mlocus; i++) { if (nohom[i]) { WITH = thislocus[i]; if (WITH->freq[LINK->hap1[i] - 1] < minfreq || WITH->freq[LINK->hap2[i] - 1] < minfreq) check = true; } } return check; } Local Void checkrisk(riskhet, riskhom, LINK) boolean *riskhet, *riskhom; struct LOC_getlocations *LINK; { *riskhet = false; *riskhom = false; if (LINK->hap1[risksys - 1] == riskall && LINK->hap2[risksys - 1] == riskall) *riskhom = true; else { if ((LINK->hap1[risksys - 1] != riskall && LINK->hap2[risksys - 1] == riskall) || (LINK->hap2[risksys - 1] != riskall && LINK->hap1[risksys - 1] == riskall)) *riskhet = true; } } Local long gethapn(hap, LINK) hapvector hap; struct LOC_getlocations *LINK; { long i, n; n = 1; for (i = 0; i < mlocus; i++) n += increment[i] * (hap[i] - 1); return n; } /* Local variables for domalerisk: */ struct LOC_domalerisk { struct LOC_getlocations *LINK; } ; Local Void setrisk(LINK) struct LOC_domalerisk *LINK; { long n; n = gethapn(LINK->LINK->hap1, LINK->LINK); if (LINK->LINK->hap1[risksys - 1] == riskall) riskmale[n - 1] = true; else riskmale[n - 1] = false; } Local Void getriskhap(system, LINK) long system; struct LOC_domalerisk *LINK; { long i; locusvalues *WITH; long FORLIM; WITH = thislocus[system - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[system - 1] = i; if (system != mlocus) getriskhap(system + 1, LINK); else setrisk(LINK); } } Local Void domalerisk(LINK) struct LOC_getlocations *LINK; { struct LOC_domalerisk V; V.LINK = LINK; getriskhap(1L, &V); } /* Local variables for domutation: */ struct LOC_domutation { struct LOC_getlocations *LINK; } ; Local Void setmutation(LINK) struct LOC_domutation *LINK; { long i, n; n = gethapn(LINK->LINK->hap1, LINK->LINK); if (LINK->LINK->hap1[mutsys - 1] == thislocus[mutsys - 1]->nallele) { muthap[n - 1] = n; return; } i = LINK->LINK->hap1[mutsys - 1]; LINK->LINK->hap1[mutsys - 1] = thislocus[mutsys - 1]->nallele; muthap[n - 1] = gethapn(LINK->LINK->hap1, LINK->LINK); LINK->LINK->hap1[mutsys - 1] = i; } Local Void getmuthap(system, LINK) long system; struct LOC_domutation *LINK; { long i; locusvalues *WITH; long FORLIM; WITH = thislocus[system - 1]; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->LINK->hap1[system - 1] = i; if (system != mlocus) getmuthap(system + 1, LINK); else setmutation(LINK); } } Local Void domutation(LINK) struct LOC_getlocations *LINK; { struct LOC_domutation V; V.LINK = LINK; getmuthap(1L, &V); } Local Void setnumbers(LINK) struct LOC_getlocations *LINK; { long nhap1, nhap2; LINK->ngene++; segstart[LINK->ngene - 1] = LINK->here + 1; probstart[LINK->ngene - 1] = LINK->there + 1; probend[LINK->ngene - 1] = LINK->there + LINK->nseg; LINK->there += LINK->nseg; nhap1 = gethapn(LINK->hap1, LINK); nhap2 = gethapn(LINK->hap2, LINK); genenumber[nhap1 - 1][nhap2 - 1] = LINK->ngene; genenumber[nhap2 - 1][nhap1 - 1] = LINK->ngene; if (minfreq != 0.0) { if (LINK->rarepresent) rare[LINK->ngene - 1] = true; else rare[LINK->ngene - 1] = false; } else rare[LINK->ngene - 1] = false; if (risk) { risk1[LINK->ngene - 1] = LINK->riskhet; risk2[LINK->ngene - 1] = LINK->riskhom; } LINK->thisseg++; invgenenum1[LINK->thisseg - 1] = nhap1; invgenenum2[LINK->thisseg - 1] = nhap2; } Local Void hapscr(system, nscramble, LINK) long system, nscramble; struct LOC_getlocations *LINK; { long i, j; if (LINK->thishet[system - 1]) nscramble++; if (system != mlocus) hapscr(system + 1, nscramble, LINK); else setnumbers(LINK); if (nscramble <= 1) return; if (LINK->hap1[system - 1] == LINK->hap2[system - 1]) return; i = LINK->hap1[system - 1]; j = LINK->hap2[system - 1]; LINK->hap1[system - 1] = j; LINK->hap2[system - 1] = i; if (system != mlocus) hapscr(system + 1, nscramble, LINK); else setnumbers(LINK); LINK->hap1[system - 1] = i; LINK->hap2[system - 1] = j; } Local Void sethap(system, LINK) long system; struct LOC_getlocations *LINK; { long i, j; locusvalues *WITH; long FORLIM, FORLIM1; WITH = thislocus[system - 1]; if (LINK->thishet[system - 1]) { FORLIM = WITH->nallele; for (i = 1; i < FORLIM; i++) { LINK->hap1[system - 1] = i; FORLIM1 = WITH->nallele; for (j = i + 1; j <= FORLIM1; j++) { LINK->hap2[system - 1] = j; if (system != mlocus) sethap(system + 1, LINK); else { LINK->rarepresent = checkrare(LINK); if (risk) checkrisk(&LINK->riskhet, &LINK->riskhom, LINK); LINK->there = LINK->start; LINK->thisseg = LINK->here; hapscr(1L, 0L, LINK); LINK->here += LINK->nseg; } } } return; } FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) { LINK->hap1[system - 1] = i; LINK->hap2[system - 1] = i; if (system != mlocus) sethap(system + 1, LINK); else { LINK->rarepresent = checkrare(LINK); if (risk) checkrisk(&LINK->riskhet, &LINK->riskhom, LINK); LINK->thisseg = LINK->here; LINK->there = LINK->start; hapscr(1L, 0L, LINK); LINK->here += LINK->nseg; } } } Local Void starthap(LINK) struct LOC_getlocations *LINK; { long i, FORLIM; LINK->nseg = 1; FORLIM = LINK->nhet; for (i = 2; i <= FORLIM; i++) LINK->nseg *= 2; sethap(1L, LINK); LINK->start = LINK->there; } Local Void gethet1(system, LINK) long system; struct LOC_getlocations *LINK; { LINK->thishet[system - 1] = false; if (system != mlocus) gethet1(system + 1, LINK); else starthap(LINK); LINK->thishet[system - 1] = true; LINK->nhet++; if (system != mlocus) gethet1(system + 1, LINK); else starthap(LINK); LINK->nhet--; } Void getlocations() { struct LOC_getlocations V; V.nhet = 0; V.here = 0; V.there = 0; V.ngene = 0; V.start = 0; gethet1(1L, &V); if (mutsys != 0) domutation(&V); if (sexlink && risk) domalerisk(&V); } typedef enum { nobnd, probnd, zerobnd, logbnd } boundary; Void setiterate() { boundary bndtype[maxn]; long i, j, k, l; thetavalues *WITH; long FORLIM; locusvalues *WITH1; long FORLIM1, FORLIM2; k = 0; WITH = maletheta; FORLIM = nlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; xall[k - 1] = WITH->theta[i]; if (interfer && !mapping) bndtype[k - 1] = logbnd; else bndtype[k - 1] = probnd; } if (sexdif) { if (readfemale) { WITH = femaletheta; FORLIM = nlocus - 2; for (i = 0; i <= FORLIM; i++) { k++; xall[k - 1] = WITH->theta[i]; bndtype[k - 1] = probnd; } } else { k++; xall[k - 1] = distratio; bndtype[k - 1] = zerobnd; } } nall = k; if (itsys != 0) { /*AAS, if we are estimating allele frequencies, then the improvements under the guise of ALLELE_SPEED cannot be applied*/ if (ALLELE_SPEED) { fprintf(stderr,"\nYou are attempting to estimate allele frequencies."); fprintf(stderr,"\nYou must have ALLELE_SPEED set to 0 in"); fprintf(stderr,"\ncommondefs.h, so that your alleles"); fprintf(stderr,"\nare not mutated, then recompile LODSCORE."); fprintf(stderr,"\nFASTLINK will exit politely to allow you to change ALLELE_SPEED"); exit(EXIT_FAILURE); } WITH1 = thislocus[itsys - 1]; if (disequi) { FORLIM = nuhap - 2; for (i = 0; i <= FORLIM; i++) xall[i + k] = hapfreq->genarray[i]; nall = nuhap + k - 1; } else { FORLIM = WITH1->nallele - 2; for (i = 0; i <= FORLIM; i++) xall[i + k] = WITH1->freq[i]; nall = WITH1->nallele + k - 1; } FORLIM = nall; for (i = k; i < FORLIM; i++) bndtype[i] = probnd; k = nall; if (WITH1->which == quantitative) { nall += WITH1->UU.U1.ntrait * (WITH1->UU.U1.ntrait + 1) / 2 + WITH1->UU.U1.ntrait * 3; } else { if (WITH1->which == affection) { nall += WITH1->UU.U0.nclass * WITH1->nallele * (WITH1->nallele + 1) / 2; if (sexlink) nall += WITH1->nallele; } } if (WITH1->which == affection) { FORLIM = WITH1->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH1->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH1->nallele; for (j = i - 1; j < FORLIM2; j++) { k++; xall[k - 1] = WITH1->UU.U0.pen[i][j][2][l]; bndtype[k - 1] = probnd; } } if (sexlink) { FORLIM1 = WITH1->nallele; for (i = 0; i < FORLIM1; i++) { k++; xall[k - 1] = WITH1->UU.U0.pen[0][i][2][l]; bndtype[k - 1] = probnd; } } } } else { if (WITH1->which == quantitative) { invert(WITH1->UU.U1.vmat, WITH1->UU.U1.ntrait, &WITH1->UU.U1.det); FORLIM = WITH1->UU.U1.ntrait; /*USER MUST MODIFY FOR A SYSTEM WILL MORE THAN 2 ALLELES */ for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH1->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH1->nallele; for (j = i; j <= FORLIM2; j++) { k++; if (i == 1 && j == 1) xall[k - 1] = WITH1->UU.U1.pm[i][j - 1][l]; else { if (i == 1) xall[k - 1] = WITH1->UU.U1.pm[j][j - 1][l] - xall[k - 2]; else xall[k - 1] = (WITH1->UU.U1.pm[i - 1][j - 1] [l] - xall[k - 3]) / xall[k - 2]; } bndtype[k - 1] = nobnd; } } } FORLIM = WITH1->UU.U1.ntrait; for (i = 1; i <= FORLIM; i++) { FORLIM1 = WITH1->UU.U1.ntrait; for (j = i; j <= FORLIM1; j++) { k++; xall[k - 1] = WITH1->UU.U1.vmat[i - 1][j - 1]; if (i == j) bndtype[k - 1] = zerobnd; else bndtype[k - 1] = nobnd; } } } } } nall = k; n = 0; for (i = 0; i < nall; i++) { if (itp[i] == 1) { n++; x[n - 1] = xall[i]; } } for (i = 0; i < nall; i++) { bnd[i][0] = -1000.0; bnd[i][1] = 1000.0; if (bndtype[i] == probnd) { bnd[i][0] = 0.0; bnd[i][1] = 1.0; } else { if (bndtype[i] == logbnd) { bnd[i][0] = -20.0; bnd[i][1] = 20.0; } else { if (bndtype[i] == zerobnd) bnd[i][0] = 0.0; } } } } Void inputerror(nerror, par1, par2, LINK) long nerror, par1, par2; struct LOC_inputdata *LINK; { printf("Fatal error detected in procedure inputdata\n"); switch (nerror) { case 0: printf("Number of loci %2ld exceeds the constant maxsys\n", par1); break; case 1: printf("Number of loci read %2ld. Less than minimum of 1\n", par1); break; case 2: printf( "Error detected reading loci order. Locus number %2ld in position %2ld exceeds number of loci\n", par2, par1); break; case 3: printf( "Error detected reading loci order. Illegal locus number %2ld in position %2ld\n", par2, par1); break; case 4: printf( "Error detected reading loci order. Locus number repeated in positions %2ld and %2ld\n", par1, par2); break; case 5: printf( "Error detected reading locus description. Illegal locus type %2ld for locus %2ld\n", par2, par1); break; case 6: printf( "Error detected reading locus description for system %2ld. Number of alleles %2ld exceeds maxall\n", par1, par1); break; case 7: printf( "Error detected reading locus description for system %2ld. Illegal number of alleles %2ld\n", par1, par2); break; case 8: printf( "Error detected reading locus description for system %2ld.\n Number of factors %2ld exceeds maxfact or length of a long int\n", par1, par2); break; case 9: printf( "Error detected reading locus description for system %2ld. Illegal number of factors %2ld\n", par1, par2); break; case 10: printf( "Error detected reading locus description for system %2ld. Alleles not codominant\n", par1); break; case 11: printf("Error detected reading pedigree record %2ld. Illegal code for sex %2ld\n", par1, par2); break; case 12: printf( "Error detected reading pedigree record at pedigree%2ld. Maximum number of pedigree records exceeded\n", par1); break; case 13: printf( "Error detected reading pedigree record %2ld. Maximum number of individuals exceeded\n", par1); break; case 14: printf( "Error detected reading pedigree record %2ld. Illegal binary factor code %2ld\n", par1, par2); break; case 15: printf( "Error detected reading pedigree record %2ld. No allelic pair for genotype\n", par1); break; case 16: printf( "Error detected reading pedigree record %2ld. Allele number %2ld exceeds maxall\n", par1, par2); break; case 17: printf( "Error detected reading pedigree record %2ld. Illegal allele number %2ld\n", par1, par2); break; case 18: printf("Number of systems after factorization (%3ld) exceeds maxsystem\n", par1); break; case 19: printf("Number of systems after factorization (%3ld) less than minimum of 1\n", par1); break; case 20: printf("Number of recombination types (%3ld) exceeds maxrectype\n", par1); break; case 21: printf("Number of recombination types (%3ld) less than minimum of 1\n", par1); break; case 22: printf( "End of file detected in tempdat by procedure readthg before all data found\n"); break; case 23: printf( "Error detected reading iterated locus in datafile. Value (%3ld) greater than nlocus\n", par1); break; case 24: printf( "Error detected reading iterated locus in datafile. Illegal value (%3ld)\n", par1); break; case 25: printf("Number of iterated parameters greater then maxn\n"); break; case 26: printf( "Error detected reading pedigree record %2ld. Liability class (%2ld) exceeds nclass\n", par1, par2); break; case 27: printf( "Error detected reading pedigree record %2ld. Illegal liability class (%2ld)\n", par1, par2); break; case 28: printf( "Error detected reading locus description for system%2ld. Liability classes (%3ld) exceed maxliab\n", par1, par2); break; case 29: printf( "Error detected reading locus description for system%2ld. Illegal number of liability classes (%3ld)\n", par1, par2); break; case 30: printf( "Error detected reading locus description for system%2ld. Penetrance out of range\n", par1); break; case 31: printf( "Error detected reading locus description for system%2ld. Number of traits (%3ld) exceeds maxtrait\n", par1, par2); break; case 32: printf( "Error detected reading locus description for system%2ld. Number of traits out of range (%3ld)\n", par1, par2); break; case 33: printf( "Error detected reading locus description for system%2ld. Variance must be positive\n", par1); break; case 34: printf( "Error detected reading locus description for system%2ld. Variance multiplier must be positive\n", par1); break; case 35: printf( "Error detected reading locus description for system%2ld. Risk allele %3ld) exceeds nallele\n", par1, par2); break; case 36: printf( "Error detected reading locus description for system%2ld. Illegal risk allele (%3ld)\n", par1, par2); break; case 37: printf("Error detected reading datafile. Risk locus %3ld) exceeds nlocus\n", par2); break; case 38: printf("Error detected reading datafile. Illegal value for risk locus %3ld)\n", par2); break; case 39: printf("Error detected reading datafile. Mutation locus %3ld) exceeds nlocus\n", par2); break; case 40: printf( "Error detected reading datafile. Illegal value for mutation locus %3ld)\n", par2); break; case 41: printf( "Error detected reading datafile. Linkage disequilbirium is not allowed with this program\n"); break; case 42: printf("Locus %5ld in lod score list exceeds mlocus %5ld\n", par1, par2); break; case 43: printf("Illegal locus number %5ld in lod score list\n", par1); break; } exit(EXIT_FAILURE); } Void inputwarning(nwarning, par1, par2, LINK) long nwarning, par1, par2; struct LOC_inputdata *LINK; { printf("Warning number from procedure inputdata\n"); switch (nwarning) { case 0: printf("Illegal sex difference parameter %2ld Parameter should be 0, 1, or 2\n", par1); break; case 1: printf("Illegal interference parameter %2ld Lack of interference assumed\n", par1); break; case 2: printf( "Illegal sex difference parameter %2ld Parameter must be 0 with sex-linked data\n", par1); break; case 3: printf( "Non-standard affection status%4ld interpreted as normal in pedigree record%5ld\n", par2, par1); break; } } /* Local variables for readped: */ struct LOC_readped { struct LOC_inputdata *LINK; long sequence; } ; /* Local variables for getphenotype: */ struct LOC_getphenotype { struct LOC_readped *LINK; thisperson **p; long system; } ; Local Void readbin(phen, ourlocus, LINK) phenotype **phen; locusvalues *ourlocus; struct LOC_getphenotype *LINK; { long i, j; phenotype *WITH; long FORLIM; WITH = *phen; WITH->which = binary_; WITH->phenf = 0; FORLIM = LINK->LINK->LINK->nfactor[LINK->system - 1]; for (i = 1; i <= FORLIM; i++) { fscanf(pedfile, "%ld", &j); if (j != 0 && j != 1) inputerror(14L, (*LINK->p)->id, j, LINK->LINK->LINK); if (j == 1) WITH->phenf = ((long)WITH->phenf) | (1 << ((long)i)); } } Local Void readnumber(phen, ourlocus, LINK) phenotype **phen; locusvalues *ourlocus; struct LOC_getphenotype *LINK; { long i, j, l; phenotype *WITH; /* dwix: begin */ static int pedidx = 0; static int pednum = -1; int locidx, allidx; /* dwix: end */ int allfirst, allsecond; WITH = *phen; WITH->which = binary_; WITH->phenf = 0; for (i = 1; i <= 2; i++) { fscanf(pedfile, "%ld", &j); if (j > maxall) inputerror(16L, (*LINK->p)->id, j, LINK->LINK->LINK); if ((j < 0) || (j > ourlocus->nallele)) inputerror(17L, (*LINK->p)->id, j, LINK->LINK->LINK); if (j != 0) #if ALLELE_SPEED WITH->phenf = 1; #else WITH->phenf = ((long)WITH->phenf) | (1L << ((int)j)); #endif if (1==i) allfirst = j; else allsecond = j; /* dwix: begin */ allidx = j; /*Note: lodscore uses holdlocus; other programs use thislocus*/ locidx = -1; for(l=0; l < mlocus; l++) if(ourlocus == holdlocus[l]) locidx = l; if (pednum != (*LINK->p)->ped) { pedidx++; pednum = (*LINK->p)->ped; } ped_loc_all[pedidx - 1][locidx][allidx].present = true; /* dwix: end */ } if (allfirst <= allsecond) { WITH->allele1 = allfirst; WITH->allele2 = allsecond; } else { WITH->allele1 = allsecond; WITH->allele2 = allfirst; } } Local Void readaff(phen, thislocus, LINK) phenotype **phen; locusvalues *thislocus; struct LOC_getphenotype *LINK; { long thisval; phenotype *WITH; WITH = *phen; fscanf(pedfile, "%ld", &thisval); if (thisval == missaff) WITH->aff = 0; else { if (thisval == affval) WITH->aff = 2; else { if (thisval != 1) inputwarning(3L, (*LINK->p)->id, thisval, LINK->LINK->LINK); WITH->aff = 1; } } if (thislocus->UU.U0.nclass == 1) WITH->liability = 1; else fscanf(pedfile, "%ld", &(*phen)->liability); if (WITH->liability > thislocus->UU.U0.nclass) inputerror(26L, (*LINK->p)->id, WITH->liability, LINK->LINK->LINK); if (WITH->liability <= 0) inputerror(27L, (*LINK->p)->id, WITH->liability, LINK->LINK->LINK); } Local Void readquan(phen, thislocus, LINK) phenotype **phen; locusvalues *thislocus; struct LOC_getphenotype *LINK; { long i; double xval; phenotype *WITH; long FORLIM; WITH = *phen; if (!sexlink || !(*LINK->p)->male) { FORLIM = thislocus->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) fscanf(pedfile, "%lf", &(*phen)->x[i]); WITH->missing = true; FORLIM = thislocus->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { if (WITH->x[i] != missval) WITH->missing = false; } return; } fscanf(pedfile, "%lf", &xval); if (xval == missval) WITH->aff = missaff; else { if (xval == affall) WITH->aff = affall; else WITH->aff = -11; } WITH->liability = 1; FORLIM = thislocus->UU.U1.ntrait; for (i = 2; i <= FORLIM; i++) fscanf(pedfile, "%lf", &xval); } Local Void getphenotype(p_, LINK) thisperson **p_; struct LOC_readped *LINK; { struct LOC_getphenotype V; long thisread; thisperson *WITH; V.LINK = LINK; V.p = p_; WITH = *V.p; for (thisread = 1; thisread <= mlocus; thisread++) { V.system = thisread; WITH->holdphen[V.system - 1] = NULL; if (holdlocus[V.system - 1]->which != null_) { WITH->holdphen[V.system - 1] = (phenotype *)Malloc(sizeof(phenotype)); if (WITH->holdphen[V.system - 1] == NULL) malloc_err("holdphen entry"); } switch (holdlocus[V.system - 1]->which) { case quantitative: readquan(&WITH->holdphen[V.system - 1], holdlocus[V.system - 1], &V); break; case affection: readaff(&WITH->holdphen[V.system - 1], holdlocus[V.system - 1], &V); break; case binary_: if (holdlocus[V.system - 1]->format == allformat) readnumber(&WITH->holdphen[V.system - 1], holdlocus[V.system - 1], &V); else readbin(&WITH->holdphen[V.system - 1], holdlocus[V.system - 1], &V); break; /* cgh -- make gcc happy */ case null_: default: break; } if (lastpriv == V.system) { WITH->privphen = (phenotype *)Malloc(sizeof(phenotype)); if (WITH->privphen == NULL) malloc_err("privphen field"); switch (holdlocus[V.system - 1]->privlocus->which) { case quantitative: readquan(&WITH->privphen, holdlocus[V.system - 1]->privlocus, &V); break; case affection: readaff(&WITH->privphen, holdlocus[V.system - 1]->privlocus, &V); break; /* cgh -- gcc */ case binary_: case null_: default: break; } } } } Local Void getind(id, LINK) long *id; struct LOC_readped *LINK; { fscanf(pedfile, "%ld", id); if (*id == 0) return; *id += LINK->sequence; if (*id > maxind) inputerror(13L, *id, *id, LINK->LINK); if (person[*id] == NULL) { person[*id] = (thisperson *)Malloc(sizeof(thisperson)); if (person[*id] == NULL) malloc_err("person entry"); } } /*getind*/ Local Void multimarriage(p, LINK) thisperson **p; struct LOC_readped *LINK; { thisperson *q, *child, *WITH; if ((*p)->foff == NULL) { (*p)->multi = false; return; } WITH = *p; if (WITH->male) q = WITH->foff->ma; else q = WITH->foff->pa; child = WITH->foff; (*p)->multi = false; do { if (WITH->male) { WITH->multi = (q == child->ma); child = child->nextpa; } else { WITH->multi = (q == child->pa); child = child->nextma; } } while (!(child == NULL || WITH->multi)); } /*multimarriage*/ Void readped(LINK) struct LOC_inputdata *LINK; { struct LOC_readped V; long i, newid, sex_, profield, newped, nuperson, thisone, thisped; thisperson *holdloop; thisperson *WITH; V.LINK = LINK; for (i = 0; i <= maxind; i++) person[i] = NULL; V.sequence = 0; nuperson = 0; nuped = 1; for (i = 0; i < maxloop; i++) { looppers[nuped - 1][i][0] = NULL; looppers[nuped - 1][i][1] = NULL; } proband[nuped - 1] = NULL; fscanf(pedfile, "%ld", &newped); thisped = newped; startped[0] = 1; while (!P_eof(pedfile)) { nuperson++; getind(&thisone, &V); if (proband[nuped - 1] == NULL) proband[nuped - 1] = person[thisone]; WITH = person[thisone]; WITH->ped = thisped; WITH->id = thisone; getind(&newid, &V); WITH->pa = person[newid]; getind(&newid, &V); WITH->ma = person[newid]; getind(&newid, &V); WITH->foff = person[newid]; getind(&newid, &V); WITH->nextpa = person[newid]; getind(&newid, &V); WITH->nextma = person[newid]; fscanf(pedfile, "%ld", &sex_); if (sex_ != 1 && sex_ != 2) inputerror(11L, WITH->id, sex_, LINK); if (sex_ == 1) WITH->male = true; else WITH->male = false; WITH->unknown = false; WITH->inloop = 0; WITH->loopdepend = false; /*A. A. Schaffer*/ WITH->loopneeded = false; fscanf(pedfile, "%ld", &profield); /* Diagnostic added by A. A. Schaffer 7/25/94 */ if ((profield - 1) > maxloop) { fprintf(stderr, "\nYour pedigree has more loops than allowed by the constant maxloop "); fprintf(stderr, "\nYou must increase the constant maxloop defined in commondefs.h and recompile "); fprintf(stderr, "\nYou are encouraged to read the loops.ps document distributed with FASTLINK "); fprintf(stderr, "\nThe program will exit politely to allow you to correct the problem "); exit(EXIT_FAILURE); } if (profield == 1) proband[nuped - 1] = person[thisone]; else if (profield > 1 && profield - 1 <= maxloop) { if (looppers[nuped - 1][profield - 2][1] == NULL) looppers[nuped - 1][profield - 2][1] = person[thisone]; else looppers[nuped - 1][profield - 2][0] = person[thisone]; } getphenotype(&person[thisone], &V); fscanf(pedfile, "%*[^\n]"); getc(pedfile); if (!P_eof(pedfile)) fscanf(pedfile, "%ld", &newped); if (newped == thisped) continue; V.sequence += nuperson; endped[nuped - 1] = V.sequence; nuperson = 0; nuped++; if (nuped > maxped) inputerror(12L, newped, nuped, LINK); startped[nuped - 1] = V.sequence + 1; for (i = 0; i < maxloop; i++) { looppers[nuped - 1][i][0] = NULL; looppers[nuped - 1][i][1] = NULL; } proband[nuped - 1] = NULL; thisped = newped; } totperson = V.sequence + nuperson; endped[nuped - 1] = totperson; for (newped = 0; newped < nuped; newped++) { if (looppers[newped][0][1] != NULL && looppers[newped][0][0] == NULL) looppers[newped][0][0] = proband[newped]; for (i = 0; i < maxloop; i++) { if (looppers[newped][i][0] == NULL) looppers[newped][i][1] = NULL; else { looppers[newped][i][0]->inloop = i + 1; looppers[newped][i][1]->inloop = i + 1; if (looppers[newped][i][0]->pa == NULL && looppers[newped][i][1]->pa != NULL) { holdloop = looppers[newped][i][0]; looppers[newped][i][0] = looppers[newped][i][1]; looppers[newped][i][1] = holdloop; } } } } for (thisone = 1; thisone <= totperson; thisone++) { multimarriage(&person[thisone], &V); } } /* Local variables for getlocus: */ struct LOC_getlocus { struct LOC_readloci *LINK; long system; } ; Local Void getbin(locus, system, LINK) locusvalues **locus; long *system; struct LOC_getlocus *LINK; { long i, j, k; locusvalues *WITH; long FORLIM, FORLIM1; fscanf(datafile, "%ld%*[^\n]", &LINK->LINK->LINK->nfactor[*system - 1]); getc(datafile); if ((LINK->LINK->LINK->nfactor[*system - 1] > maxfact) || (LINK->LINK->LINK->nfactor[*system - 1] > (sizeof(long) * 8 - 1))) inputerror(8L, *system, LINK->LINK->LINK->nfactor[*system - 1], LINK->LINK->LINK); if (LINK->LINK->LINK->nfactor[*system - 1] <= 0) inputerror(9L, *system, LINK->LINK->LINK->nfactor[*system - 1], LINK->LINK->LINK); WITH = *locus; FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) WITH->UU.allele[i] = 0; FORLIM = WITH->nallele; for (i = 0; i < FORLIM; i++) { FORLIM1 = LINK->LINK->LINK->nfactor[*system - 1]; for (j = 1; j <= FORLIM1; j++) { fscanf(datafile, "%ld", &k); if (k == 1) WITH->UU.allele[i] = ((long)WITH->UU.allele[i]) | (1L << ((int)j)); } } fscanf(datafile, "%*[^\n]"); getc(datafile); } Local Void getnumber(locus, system, LINK) locusvalues **locus; long *system; struct LOC_getlocus *LINK; { long i; locusvalues *WITH; long FORLIM; WITH = *locus; FORLIM = WITH->nallele; for (i = 1; i <= FORLIM; i++) WITH->UU.allele[i - 1] = 1; } Local Void getpen(locus, LINK) locusvalues **locus; struct LOC_getlocus *LINK; { long i, j, k, l; locusvalues *WITH; long FORLIM, FORLIM1, FORLIM2; WITH = *locus; fscanf(datafile, "%ld%*[^\n]", &(*locus)->UU.U0.nclass); getc(datafile); if (WITH->UU.U0.nclass > maxliab) inputerror(28L, LINK->system, WITH->UU.U0.nclass, LINK->LINK->LINK); if (WITH->UU.U0.nclass <= 0) inputerror(29L, LINK->system, WITH->UU.U0.nclass, LINK->LINK->LINK); FORLIM = WITH->UU.U0.nclass; for (l = 0; l < FORLIM; l++) { FORLIM1 = WITH->nallele; for (i = 1; i <= FORLIM1; i++) { FORLIM2 = WITH->nallele; for (j = i - 1; j < FORLIM2; j++) { fscanf(datafile, "%lf", &(*locus)->UU.U0.pen[i][j][2][l]); if ((unsigned)WITH->UU.U0.pen[i][j][2][l] > 1.0) inputerror(30L, LINK->system, LINK->system, LINK->LINK->LINK); WITH->UU.U0.pen[i][j][1][l] = 1 - WITH->UU.U0.pen[i][j][2][l]; WITH->UU.U0.pen[i][j][0][l] = 1.0; for (k = 0; k <= 2; k++) WITH->UU.U0.pen[j + 1][i - 1][k][l] = WITH->UU.U0.pen[i][j][k][l]; } } fscanf(datafile, "%*[^\n]"); getc(datafile); FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) WITH->UU.U0.pen[0][i][0][l] = 1.0; if (sexlink) { /* This code was an error in LINKAGE 5.1. It tries to read an extra penetrance line on sexlinked data. -Bob Cottingham 8/18/93 FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) fscanf(datafile, "%lf", &(*locus)->UU.U0.pen[0][i][2][l]); */ FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) { fscanf(datafile, "%lf", &(*locus)->UU.U0.pen[0][i][2][l]); if ((unsigned)WITH->UU.U0.pen[0][i][2][l] > 1.0) inputerror(30L, LINK->system, LINK->system, LINK->LINK->LINK); } FORLIM1 = WITH->nallele; for (i = 0; i < FORLIM1; i++) WITH->UU.U0.pen[0][i][1][l] = 1.0 - WITH->UU.U0.pen[0][i][2][l]; fscanf(datafile, "%*[^\n]"); getc(datafile); } } } Local Void getquan(locus, privelege, LINK) locusvalues **locus; boolInt privelege; struct LOC_getlocus *LINK; { /*Get information of a quantitative locus. Privelege says whether it is a priveleged locus or not*/ long i, j, k; locusvalues *WITH; long FORLIM, FORLIM1, FORLIM2; WITH = *locus; fscanf(datafile, "%ld%*[^\n]", &(*locus)->UU.U1.ntrait); getc(datafile); if (WITH->UU.U1.ntrait > maxtrait) inputerror(31L, LINK->system, WITH->UU.U1.ntrait, LINK->LINK->LINK); if (WITH->UU.U1.ntrait <= 0) inputerror(32L, LINK->system, WITH->UU.U0.nclass, LINK->LINK->LINK); FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->nallele; for (j = 1; j <= FORLIM1; j++) { FORLIM2 = WITH->nallele; for (k = j; k <= FORLIM2; k++) { fscanf(datafile, "%lf", &(*locus)->UU.U1.pm[j][k - 1][i]); WITH->UU.U1.pm[k][j - 1][i] = WITH->UU.U1.pm[j][k - 1][i]; } } } fscanf(datafile, "%*[^\n]"); getc(datafile); if (privelege && LINK->LINK->nupriv != lastpriv) return; FORLIM = WITH->UU.U1.ntrait; for (i = 0; i < FORLIM; i++) { FORLIM1 = WITH->UU.U1.ntrait; for (j = i; j < FORLIM1; j++) { fscanf(datafile, "%lf", &(*locus)->UU.U1.vmat[i][j]); if (i + 1 == j + 1 && WITH->UU.U1.vmat[i][j] <= 0.0) inputerror(33L, LINK->system, LINK->system, LINK->LINK->LINK); WITH->UU.U1.vmat[j][i] = WITH->UU.U1.vmat[i][j]; } } fscanf(datafile, "%*[^\n]"); getc(datafile); invert(WITH->UU.U1.vmat, WITH->UU.U1.ntrait, &WITH->UU.U1.det); WITH->UU.U1.det = 1 / sqrt(WITH->UU.U1.det); fscanf(datafile, "%lf%*[^\n]", &(*locus)->UU.U1.conmat); getc(datafile); if (WITH->UU.U1.conmat <= 0) inputerror(34L, LINK->system, LINK->system, LINK->LINK->LINK); WITH->UU.U1.conmat = 1 / WITH->UU.U1.conmat; WITH->UU.U1.contrait = 1.0; FORLIM = WITH->UU.U1.ntrait; for (i = 1; i <= FORLIM; i++) WITH->UU.U1.contrait *= WITH->UU.U1.conmat; WITH->UU.U1.contrait = sqrt(WITH->UU.U1.contrait); } Void getlocus(system_, LINK) long system_; struct LOC_readloci *LINK; { struct LOC_getlocus V; long j; locusvalues *WITH, *WITH1; long FORLIM; int TEMP; V.LINK = LINK; V.system = system_; holdlocus[V.system - 1] = (locusvalues *)Malloc(sizeof(locusvalues)); if (holdlocus[V.system - 1] == NULL) malloc_err("holdlocus entry"); WITH = holdlocus[V.system - 1]; WITH->privlocus = NULL; fscanf(datafile, "%ld%d", &LINK->whichtype, &holdlocus[V.system - 1]->nallele); if (LINK->whichtype < 0 && LINK->whichtype > 4) inputerror(5L, V.system, LINK->whichtype, LINK->LINK); if (WITH->nallele > maxall) inputerror(6L, V.system, WITH->nallele, LINK->LINK); if (WITH->nallele <= 0) inputerror(7L, V.system, WITH->nallele, LINK->LINK); switch (LINK->whichtype) { case 0: WITH->which = quantitative; break; case 1: WITH->which = affection; break; case 2: WITH->which = binary_; break; case 3: WITH->which = binary_; break; } WITH->format = LINK->whichtype; if (lastpriv == 0) { fscanf(datafile, "%*[^\n]"); getc(datafile); } else { fscanf(datafile, "%ld%*[^\n]", &LINK->whichtype); getc(datafile); if (LINK->whichtype == 0 || LINK->whichtype == 1) { LINK->nupriv++; WITH->privlocus = (locusvalues *)Malloc(sizeof(locusvalues)); if (WITH->privlocus == NULL) malloc_err("privlocus field"); WITH->privlocus->nallele = WITH->nallele; WITH1 = WITH->privlocus; switch (LINK->whichtype) { case 0: WITH1->which = quantitative; break; case 1: WITH1->which = affection; break; } } } if (!disequi) { FORLIM = WITH->nallele; for (j = 0; j < FORLIM; j++) { fscanf(datafile, "%lf", &holdlocus[V.system - 1]->freq[j]); if (holdlocus[V.system - 1]->freq[j] <= minfreq) fprintf(stderr, "\nWarning: one of your allele frequencies is dangerously low"); } fscanf(datafile, "%*[^\n]"); getc(datafile); } switch (WITH->which) { case binary_: if (WITH->format == allformat) getnumber(&holdlocus[V.system - 1], &V.system, &V); else getbin(&holdlocus[V.system - 1], &V.system, &V); break; case affection: getpen(&holdlocus[V.system - 1], &V); break; case quantitative: getquan(&holdlocus[V.system - 1], false, &V); break; /* cgh - gcc */ case null_: default: break; } if (WITH->privlocus != NULL) { switch (WITH->privlocus->which) { case affection: getpen(&WITH->privlocus, &V); break; case quantitative: getquan(&WITH->privlocus, true, &V); break; /* cgh - gcc */ case null_: case binary_: default: break; } } if (LINK->nupriv == lastpriv && lastpriv != 0) lastpriv = V.system; if (!risk) return; if (LINK->i == risksys) { fscanf(datafile, "%d%*[^\n]", &TEMP); getc(datafile); riskall = TEMP; } if (riskall > holdlocus[LINK->i - 1]->nallele) inputerror(35L, LINK->i, (long)riskall, LINK->LINK); if (riskall < 0) inputerror(36L, LINK->i, (long)riskall, LINK->LINK); } Void gettheta(sex_, male, LINK) double *sex_; boolInt male; struct LOC_readloci *LINK; { if (readfemale || male) { fscanf(datafile, "%lf%*[^\n]", sex_); getc(datafile); } else { fscanf(datafile, "%lf%*[^\n]", &distratio); getc(datafile); } holdratio = distratio; } Local Void readloci(LINK) struct LOC_inputdata *LINK; { struct LOC_readloci V; long coupling, autosomal, independent, difference; V.LINK = LINK; lastpriv = 0; fscanf(datafile, "%d%d%ld%*[^\n]", &mlocus, &risksys, &autosomal); getc(datafile); /*Replace the above line with the next when using epistasis*/ /*readln(datafile,mlocus,risksys,autosomal,lastpriv);*/ if (mlocus > maxsys) inputerror(0L, mlocus, mlocus, LINK); if (mlocus <= 0) inputerror(1L, mlocus, mlocus, LINK); risk = (risksys != 0); sexlink = (autosomal == 1); printf("YOU ARE USING LINKAGE (V%3.1f (1-Feb-1991)) WITH%3d-POINT\n", fVersion, mlocus); printf("YOU ARE USING FASTLINK (V%s (6-Oct-1997))", fastversion); if (sexlink) printf(" SEXLINKED DATA\n"); else printf(" AUTOSOMAL DATA\n"); fscanf(datafile, "%d%lf%lf%ld%*[^\n]", &mutsys, &mutmale, &mutfemale, &coupling); getc(datafile); if (mutsys > maxsys) inputerror(39L, mutsys, mutsys, LINK); if (mutsys < 0) inputerror(40L, mutsys, mutsys, LINK); if (coupling != 0) inputerror(41L, coupling, coupling, LINK); disequi = false; fscanf(datafile, "%*[^\n]"); getc(datafile); V.nupriv = 0; for (V.i = 1; V.i <= mlocus; V.i++) getlocus(V.i, &V); fscanf(datafile, "%ld", &difference); if ((unsigned long)difference > 2) { inputwarning(0L, difference, difference, LINK); difference = 0; } sexdif = (difference != 0); readfemale = (difference == 2); fscanf(datafile, "%ld%*[^\n]", &independent); getc(datafile); if ((unsigned long)independent > 2) { inputwarning(1L, independent, independent, LINK); independent = 0; } interfer = (independent != 0); mapping = (independent == 2); gettheta(&holdmtheta, true, &V); nuneed = 7; /*value for 2 loci*/ maletheta = (thetavalues *)Malloc(sizeof(thetavalues)); if (maletheta == NULL) malloc_err("maletheta"); /*Next allocation added by A. A. Schaffer*/ maletheta->segprob = (double *) malloc(nuneed * sizeof(double)); if ((maletheta->segprob)==NULL) malloc_err("segprob array in maletheta"); if (sexlink && sexdif) { inputwarning(2L, difference, difference, LINK); sexdif = false; readfemale = false; } if (sexdif) { gettheta(&holdftheta, false, &V); femaletheta = (thetavalues *)Malloc(sizeof(thetavalues)); if (femaletheta == NULL) malloc_err("female_theta"); /*Next allocation added by A. A. Schaffer*/ femaletheta->segprob = (double *) malloc(nuneed * sizeof(double)); if ((femaletheta->segprob)==NULL) malloc_err("segprob array in femaletheta"); } else femaletheta = maletheta; if (!sexlink) { if (mutsys == 0) thispath = auto_; else thispath = mauto; } else if (mutsys == 0) thispath = sex; else thispath = msex; segscale = scale; for (V.i = 1; V.i <= 2; V.i++) segscale *= scalemult; fscanf(datafile, "%d%*[^\n]", &hitsys); getc(datafile); itsys = 0; for (V.i = 1; V.i <= maxn; V.i++) itp[V.i - 1] = 0; V.i = 0; while ((V.i <= maxn) & (!P_eoln(datafile))) { V.i++; fscanf(datafile, "%d", &itp[V.i - 1]); } fscanf(datafile, "%*[^\n]"); getc(datafile); memcpy(holditp, itp, sizeof(itertype)); V.i = 0; while (!P_eoln(datafile)) { V.i++; fscanf(datafile, "%d", &locuslist1[V.i - 1]); if (locuslist1[V.i - 1] > mlocus) inputerror(42L, locuslist1[V.i - 1], mlocus, LINK); if (locuslist1[V.i - 1] <= 0) inputerror(43L, locuslist1[V.i - 1], mlocus, LINK); } fscanf(datafile, "%*[^\n]"); getc(datafile); nlocus1 = V.i; V.i = 0; while (!P_eoln(datafile)) { V.i++; fscanf(datafile, "%d", &locuslist2[V.i - 1]); if (locuslist2[V.i - 1] > mlocus) inputerror(42L, locuslist2[V.i - 1], mlocus, LINK); if (locuslist2[V.i - 1] <= 0) inputerror(43L, locuslist2[V.i - 1], mlocus, LINK); } nlocus2 = V.i; risk = false; } Void inputdata() { struct LOC_inputdata V; readloci(&V); readped(&V); } fastlink-4.1P-fix95/4.1P/src/mloldnuclear.c0000644000265600020320000000151106737460342017446 0ustar tilleaadmin/* This file contains old nuclear family update routines */ /* used in the MLINK program */ #include "commondefs.h" #include "mldefs.h" Local Void getapprox(LINK) struct LOC_seg *LINK; { long first; double maxval; thisarray *WITH; maxval = (*LINK->p)->gen->genarray[0]; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (WITH->genarray[first] > maxval) maxval = WITH->genarray[first]; } WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { approxarray[LINK->LINK->thisped - 1][first] = WITH->genarray[first] > (maxval *epsilon); } if (lasttime) return; WITH = (*LINK->p)->gen; for (first = 0; first < fgeno; first++) { if (!(approxarray[LINK->LINK->thisped - 1][first])) WITH->genarray[first] = 0.0; } } /*getapprox*/ #include "comnuclear.c" fastlink-4.1P-fix95/4.1P/src/mlgetvect.c0000644000265600020320000000355306737460342016767 0ustar tilleaadmin/* This file contains some low level probability routines used in the MLINK program */ #include "commondefs.h" /* Local variables for getvect: */ struct LOC_getvect { struct LOC_likelihood *LINK; thisperson *p; hapvector hap1, hap2; } ; /*static void getgene (long syste, double val, struct LOC_getvect *LINK); static void ugetgene (long syste, double val, struct LOC_getvect *LINK);*/ static void getgene (); static void ugetgene (); Local double quanfun(phen, thislocus, i, j, mean, LINK) phenotype *phen; locusvalues *thislocus; long i, j; double *mean; struct LOC_getvect *LINK; { double val; long it, jt, FORLIM, FORLIM1; val = 1.0; if (phen->missing) return val; val = 0.0; FORLIM = thislocus->UU.U1.ntrait; for (it = 0; it < FORLIM; it++) { FORLIM1 = thislocus->UU.U1.ntrait; for (jt = 0; jt < FORLIM1; jt++) { if (i == j) val += thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); else val += thislocus->UU.U1.conmat * thislocus->UU.U1.vmat[it] [jt] * (phen->x[jt] - mean[jt]) * (phen->x[it] - mean[it]); } } val = thislocus->UU.U1.det * exp(-val * 0.5); if (i != j) val *= thislocus->UU.U1.contrait; return val; } /*quanfun*/ Local Void getval(syste, i, j, val, LINK) long syste, i, j; double *val; struct LOC_getvect *LINK; { locusvalues *WITH; phenotype *WITH1; WITH = thislocus[syste - 1]; switch (WITH->which) { case quantitative: *val *= quanfun(LINK->p->phen[syste - 1], thislocus[syste - 1], i, j, WITH->UU.U1.pm[i][j - 1], LINK); break; case affection: WITH1 = LINK->p->phen[syste - 1]; *val *= WITH->UU.U0.pen[i][j - 1][WITH1->aff] [WITH1->liability - 1]; break; /* cgh -- added this for gcc */ case binary_: case null_: default: break; } } /*getval*/ #include "comgetvect.c" fastlink-4.1P-fix95/README.makefile0000644000265600020320000002660706737457627016075 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 FASTLINK, version 4.1P This file describes using the Makefile included in this distribution to build FASTLINK, version 4.1P. See README for an overview of all the documentation. FTP instructions, source code organization, and an overview of compilation is described in README.install. README.constants explains the meaning of some constants that you will need to set in the Makefile for compilation. If you plan to run parallel FASTLINK, please also refer to README.parallel, and either README.p4 (for shared-memory), or README.TreadMarks (for networks) to fully install the parallel version. |*| Makefile, Introduction ---------------------- There file Makefile residing in the 3.0P/src directory is used by the make utility to determine how to build FASTLINK. They are: The Makefile is broken into two main sections. The first includes the definition of parameters, while the second describes dependencies among source files, compilation rules, and targets. You will only need to be concerned with the first section. |*| Makefile, Variables ------------------- Parameters, or variables for compilation are defined in the Makefile with the syntax: = where variable is assigned the value . For example, to define the variable CC (denoting the name of the C compiler) to be gcc, the Makefile would include: CC = gcc Variables can be referred to by surrounding the variable name in a $(...) enclosure. For example, given the definition above, the statement: $(CC) file.c would be interpreted by make as: gcc file.c Your editing of the Makefile will consist of choosing, or defining variables to suit your particular needs. For example, if you were instructed to set the variable CC to the compiler you want to use, and you wanted to use cc instead of gcc, you would change the above definition to: CC = cc |*| Makefile, Comments ------------------ In a Makefile, the pound symbol "#" denotes a comment. Any line that begins with a "#" is a comment included to make the file more readable, or to explain the meaning of a variable. These lines are ignored by make, and have no effect on the compilation. In addition to defining variables as described above, you will in places be instructed to either "comment out", or to "uncomment" a line. "Uncommenting" a line has the effect of making a line visible to make that it previously could not see (because make ignores comments). For example, if you are running Sun's Solaris operating system, you will be instructed to uncomment the definition of the SYSDEP variable. This means that you need to erase the "#" character from the beginning of the line. The line: #SYSDEP = -DSOLARIS should be changed to: SYSDEP = -DSOLARIS Conversely, "commenting out" a line has the effect of telling make to ignore the line. For example, if you don't want to use compiler optimization, you would comment out the line: OPTFLAG = -O2 by adding a "#" to the beginning of the line, so it reads: #OPTFLAG = -O2 Note that when there are two possible definitions of a variable, you should make sure that no more than one are uncommented. This can lead to unexpected problems. |*| FASTLINK, Memory Usage Options ------------------------------ One of the issues you will be asked to consider when editing the Makefile is the level of memory FASTLINK can use. There are two variables that combine to give three different levels of possible memory usage. The variables are: LESSMEMORY If defined (using the -D flag described in README.install), LESSMEMORY instructs FASTLINK to use an alternate algorithm which requires considerably less memory, but is slower. The file README.memory discusses the differences. PRECOMPUTE This variable is defined as either 1, 0, where PRECOMPUTE=1 instructs FASTLINK to use an alternate algorithm which requires more memory, and is faster. PRECOMPUTE=0 uses the normal approach. The possible combinations of these variables is as follows: Lowest Memory Used -- Slowest LESSMEMORY defined and PRECOMPUTE=0 Middle Level -- Medium Speed, available only for parallel version LESSMEMORY not defined and PRECOMPUTE=0 Highest Level -- Fastest LESSMEMORY not defined and PRECOMPUTE=1 You should always be able to use the fastest level for 2 and 3 locus analysis. Depending on how much memory you have, you may need to go down to the Middle Level or Lowest Level for 4 point analysis. You should use the Lowest Level for 5 or more loci. |*| Makefile, Editing ----------------- Editing the Makefile amounts to simply answering a number of questions. Much of the following information appears within comments in the Makefile itself to simplify the editing process. All of the relevant information occurs in the first 200 lines or so of the Makefile; this corresponds to roughly 25 decisions. Most of these decisions are relevant only to the parallel version. Start at the beginning of the Makefile, and work through the variables one at a time until you reach the line: # You shouldn't need to change anything beyond this point. # The variables are grouped together in logical sections. The following is an explanation of each of the variables, section by section, including their definitions as they appear in the Makefile. |*| Makefile, Miscellaneous Variables --------------------------------- The following variables apply to compilation of *both* sequential *and* parallel FASTLINK BINDIR = ./bin This is the destination directory where you want your executables installed. Note: this directory *must* exist, or compilation will fail during linkage. OPTFLAG = -O Compiler optimization flag. Comment this out if your compiler complains. PROTO = -DKNR_PROTO If you use the cc compiler, uncomment this flag to use K&R (Kernighan and Ritchie) style function prototypes. Note: FASTLINK will *not* compile under cc without this flag set. SYSDEP = -DSUNOS_4_1_X_GCC SYSDEP = -DSOLARIS SYSDEP = -D_POSIX_SOURCE SYSDEP = All of these variables are commented out by default. - Uncomment the -DSOLARIS option if you are compiling on a Sun Solaris platform. - If you are using gcc under SunOS 4.1.x, you can use -DSUNOS_4_1_X_GCC to get rid of compiler warnings if they appear. - Uncomment -D_POSIX_SOURCE if you are compiling for AIX. - If you have other system-specific compiler flags that you need to pass to FASTLINK, uncomment the line "SYSDEP =", and add the flag there. Otherwise, leave this alone. |*| Makefile, Sequential Code Variables ----------------------------------- The following variables apply to sequential FASTLINK only. CC = gcc This defines the C compiler for sequential code. CKPT = -DDOS This variable determines whether or not to include checkpointing code in FASTLINK. Uncomment this if you are compiling for DOS, or if you want to turn off checkpointing in FASTLINK. |*| Makefile, Parallel Code Variables --------------------------------- These variables apply only to parallel FASTLINK. You do not need to touch any of this stuff if you are running sequentially. PARCC = gcc C compiler for parallel code. PARLIB = -DIS_P4=1 PARLIB = -DIS_PARMACS=1 Parallel support library. If you are using TreadMarks, leave these commented out. If you are using P4 or PARMACS, uncomment the appropriate variable. Make sure that no more than one of these variables is uncommented! PARINCLPATH = -I$(TmkDIR)/include -I/usr/local/include PARINCLPATH = -I$(P4_INCLDIR) Parallel include path. If you are using TreadMarks or P4, uncomment the appropriate variable. If you are using PARMACS, comment these out, or supply your own, appropriate path. Make sure that no more than one of these variables is uncommented! |*| Makefile, Parallel Code Variables, TreadMarks specifics ------------------------------------------------------- These variables apply only to users of TreadMarks. Please refer to the README.TreadMarks for more details. TmkDIR = /usr/lib/Tmk-0.9.3 Set this to the root directory of your TreadMarks installation ARCH = sparc Target architecture. For example, if your TreadMarks library is in $(TmkDIR)/lib.mips, you should set this variable to mips. Consult your TreadMarks documentation for more details. ATMDIR = /usr/fore/lib If you are using TreadMarks on an ATM network, set this to the location of libatm.a on your system. |*| Makefile, Parallel Code Variables, P4 specifics ----------------------------------------------- These variables apply only to users of P4. Please refer to the README.p4 for more details. P4_HOME_DIR = /usr/lib/p4-1.4 Set this to the root directory of your p4 installation. Refer to the README.p4 for details. P4_MDEP_LD = -lsocket -lnsl -lthread Uncomment this variable if you are running in parallel on SOLARIS. This is *very* important -- FASTLINK will not compile without it. |*| Makefile, Parallel Code Variables, Parallel C Compiler Flags ------------------------------------------------------------ Edit the following variables when compiling parallel FASTLINK to suit your particular run. There are 3 sets of variables provided -- one each for ILINK, MLINK, and LINKMAP. The variables are **PARMEM, **PRECOMP, where ** represents one of IL, ML, or LI, for ILINK, MLINK and LINKMAP respectively. They are briefly described below. Please refer to the files README.constants, README.memory, and README.parallel, as well as to the section above on Memory Usage Options. **PARMEM Defines the variable LESSMEMORY, instructing FASTLINK to use an alternate algorithm which requires less memory, but is slower. Please refer to the README.memory, as well as to the section on Memory Usage Options above. Uncomment this if you wish to use less memory. Note: setting this value to 0 *or* 1 will both have the same effect of defining LESSMEMORY. If you don't want less memory, be sure to comment this out. **PRECOMPUTE Defines the variable PRECOMPUTE as 1 or 0. PRECOMPUTE=1 instructs FASTLINK to use an alternate algorithm which requires more memory, and is faster. PRECOMPUTE=0 uses the normal approach. Please refer to the README.memory, as well as to the section above on Memory Usage Options for more details. Note: Unlike **PARMEM, this value *must* be set to either 0 or 1. |*| Makefile, Unix Utilities on Your System --------------------------------------- If any of the following utilities are different on your system, you can change them here. If not, there is nothing more to do. RM = rm -f RM is used for "make clean", so if you want to use that, you'll need something defined here. |*| Makefile, Passing Extra Flags ----------------------------- Most versions of make allows you to override Makefile variables from the command line. The Makefile includes a variable EXTRAFLAGS that is intentionally left empty to allow you to add command-line flags without editing the Makefile. EXTRAFLAGS is automatically passed to each of the different targets. If you want to change a constant, such as maxloop, you would add a suitable -D command to EXTRAFLAGS (see README.constants). For example, if you wanted to pass along an additional include directive to the compiler when making ILINK, you could type: make ilink EXTRAFLAGS="-I/usr/ucb/include -I/usr/lib/include" Note that if you want to add more than one flag, you need to protect the argument in double quotes (") as above. fastlink-4.1P-fix95/README.TreadMarks0000644000265600020320000001671006737457627016347 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: October 6, 1997 Running FASTLINK 3.0P or later in parallel on networks of workstations |*| Introduction ------------ TreadMarks is a parallel programming system developed at Rice University to allow programs written in a shared-memory style to run on network of unix workstations. The TreadMarks project is separate from the FASTLINK project, but we collaborate on making FASTLINK run in parallel on top of TreadMarks. References for TreadMarks can be found in README.parallel. |*| Retrieving and Installing TreadMarks ------------------------------------ TreadMarks is not available by ftp without getting a license first. Write to treadmarks@ece.rice.edu and to schaffer@helix.nih.gov if you are interested and we will arrange with you to do the installation. You can obtain a free 30-day demo copy of TreadMarks or you can get a normal license. Licensing and pricing are available by writing to treadmarks@ece.rice.edu. |*| Hooking TreadMarks and FASTLINK together ---------------------------------------- The file called Makefile has two variables that need to be set: TmkDIR should be set to the root directory of your TreadMarks installation The ARCH flag needs to be set for your specific architecture The PARINCLPATH flag line that reads -I$(TmkDIR)/include -I/usr/local/include needs to be uncommented. See README.Makefile for more details. To compile parallel ilink, mlink, or linkmap, do make ilink.udp make mlink.udp make linkmap.udp respectively. These will put the corresponding executables wherever the BINDIR flag points to. |*| Running TreadMarks FASTLINK --------------------------- You would typically want to make a soft link between the regular name without the udp extension in your data directory and the actual executable. E.g. ln -s ../bin/ilink.udp ilink There are some compilation flags you may want to set to prepare for a run. See README.Makefile or the Makefile itself for instructions. |*| Running TreadMarks FASTLINK, Command line flags ----------------------------------------------- Specific command line flags are discussed below. First, though, it is important to note how TreadMarks and FASTLINK distinguish which flags are meant for which program. Every command line *must* contain the string `--' (without the quotes). This string delimits FASTLINK flags from TreadMarks flags. All arguments *before* the `--' are read by FASTLINK, while those appearing *after* the `--' are read by TreadMarks. For example, in the command: linkmap -w 40 -- -f machines the "-w 40" is seen by FASTLINK, while the "-f machines" is seen by TreadMarks. |*| Running TreadMarks FASTLINK, Specifying number of processors ------------------------------------------------------------ One small modification is needed either in the command line (if you call ilink, linkmap, or mlink directly) or in the lcp-produced shell script. At the line where the main program is invoked, the string -- -f machines is appended. E.g. linkmap becomes linkmap -- -f machines When modifying lcp-produced scripts be careful that the first occurrence of the string ilink, linkmap, or mlink is a parameter to lsp. It is the second occurrence which is actually the call to the program. In the data directory you need to have a file called machines that specifies which machines should be used. The format is one machine name per line. This is the only thing you need to change if you want to change which machines the program runs on. |*| Running TreadMarks FASTLINK, Specifying maxworkingset ----------------------------------------------------- You may also specify a value for the variable maxworkingset, which represents the maximum number of people active during the analysis (sometimes known as maximum cutset). In FASTLINK 3.0P, maxworkingset is estimated automatically at runtime. In some pedigrees with loops, the estimate is unnecessarily high, so you may wish to override the estimate with a different value. If you use the automatic estimate of maxworkingset, and the code complains that this estimate is too low, you have hit a bug and should report it (see README.bugreport). However, you can still use the -w flag to work around the bug, while I fix it. For example, to run ILINK with maxworkingset defined to 40, you would type: ilink -w 40 -- -f machines The error message you would encounter if maxworkingset is too low will report what the current value is. You may try incrementally larger values until the run succeeds. |*| Running TreadMarks FASTLINK, Analyzing memory usage --------------------------------------------------- Depending on your system configuration, you may not be able to complete arbitrarily large (in terms of memory usage) FASTLINK runs. As described in README.makefile, there are different levels of memory usage for FASTLINK. The -m option for parallel FASTLINK provides a simple way to determine shared memory requirements for a specific run. When you run with this option, FASTLINK will do some brief i/o and computation, and then exit (before starting the actual linkage analysis) with a diagnostic message. Because TreadMarks itself is never actually started up for this kind of run, you must also specify the number of processors you plan to run on, so FASTLINK can properly calculate memory requirements. You can specify number of processors with -n where is the number of processors. Also note that in this case, the `--' is not necessary. For example, to calculate memory usage for a LINKMAP run on 2 processors, you would type: linkmap -n 2 -m A sample run of LINKMAP with this command yielded: LINKMAP is currently compiled with PRECOMPUTE=1. This run will require at least: 7004071 bytes of shared memory on 2 processor(s) 6421943 bytes of shared memory on 1 processor(s) Recompiling with PRECOMPUTE=0 would yield: 6733607 bytes of shared memory on 2 processor(s) 6094621 bytes of shared memory on 1 processor(s) Please refer to the README.makefile and README.TreadMarks for details. You can see from this message the difference in memory usage between compiling with PRECOMPUTE=0 and PRECOMPUTE=1. This can be useful when determining whether or not you can expect to compute a given run on your system. As with the -f flag above, -w, -n, and -m would need to be added to your lcp-produced script if you use them in conjunction with a script. |*| Parallel FASTLINK, Running times -------------------------------- Due to the way theta evaluations are done in parallel, unlike the sequential version, output will not appear on the screen after each theta is complete. However, you will see periodic reports of execution times for each group of thetas as they are evaluated. A sample run might show: Execution time (!parallelThetas) = 0.099 Execution time (parallelThetas) for 1 = 0.052 Execution time (parallelThetas) for 2 = 0.896 Execution time (parallelThetas) for 3 = 0.096 Execution time (!parallelThetas) = 0.086 Elapsed time: 1.28 seconds Each of the "Execution time" statements will appear one at a time as computation progresses. The difference between parallelThetas and !parallelThetas has to do with whether all processors are working together on a single theta, or whether they are working independently on different thetas. The "Elapsed time" statement shows the total execution time for the entire run. This is wall-clock time. fastlink-4.1P-fix95/README.loopfile0000644000265600020320000001306506737457627016123 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 All about loopfile.dat by Dylan Cooper and Alejandro A. Schaffer |*| What is loopfile.dat? Beginning with version 3.0 of FASTLINK we are making a fundamental change in the way loops are handled. The most important manifestation of the change is that the specifications for the preprocessor program UNKNOWN have changed. In particular, for pedigrees with loops, the new UNKNOWN will produce an extra output file to assist the main program. This applies to ILINK, MLINK, and LINKMAP where the standard scripts call UNKNOWN immediately before calling the main program. The change does not apply to LODSCORE for which the standard scripts do not use UNKNOWN. The main programs will still work correctly if the extra file is not present (in particular, if the old version of UNKNOWN is used) and the extra file gets deleted when the main program exits without a crash. The file whose name is held in the macro LOOPFILE_NAME (probably "loopfile.dat") is produced by the new unknown.c when LOOPSPEED is defined. This file is used to speed up runs of ILINK, LINKMAP, and MLINK when at least one pedigree contains at least one loop. The contents of the file and the method by which the speed up was obtained rely on the concept of a loop-breaker vector. A loop-breaker vector is an array of single locus genotypes which assigns one single locus genotype to each loop breaker. To understand more about loop breakers, readers of this file are strongly encouraged to read the FASTLINK documentation files traverse.ps and loops.ps. |*| Syntax of loopfile.dat loopfile.dat describes the contents of data structures that are created in unknown.c and used in ILINK, LINKMAP, and MLINK The entries in the file are as follows: Pedigree: The pedigree for which the following information pertains. Pedigrees are numbered consecutively from 1. fewer_vects_size: Used for diagnostic output when a malloc fails. num_loops_considered: Due to space constraints, the number of loops considered in these data structures is bounded. A noticeable speedup is achieved even when only some of the loops in the pedigree are considered. Reducing the macro 'max_vectors_considered' in unknown.c may reduce the value of this variable. num_loop_vectors: a table indexed by the locus numbers, holding the number of loopbreaker vectors at that locus loop_vectors: a table indexed by the locus numbers, holding the loopbreaker vectors at each locus unknown_poss: a table indexed by person id, locus, loopbreaker vector, and single locus genotype. If the corresponding entry is true, the person may have that genotype at that locus when the loopbreakers have been assigned the single locus genotypes specified in the loopbreaker vector. Single locus genotypes are encoded in order by allele number, discarding genotypes where the second allele is greater than the first allele. (These allele combinations are discarded because phase is unimportant for the calculations.) For example, if a locus has 4 alleles there are ten possible genotypes: allele 1 allele 2 genotype -------- -------- -------- 1 1 0 1 2 1 1 3 2 1 4 3 2 2 4 2 3 5 2 4 6 3 3 7 3 4 8 4 4 9 Below is a commented hypothetical file with comments indicating what each line means. Due to the comments, the placement of white space may be distorted. Starting in FASTLINK 4.1P, some improvements have been made to the genotype inference code, so that information about some loop breaker vectors that are not consistent (i.e., the asignment of the genotype to each loop breaker causes a violation of Mendelian rules of inheritance) are not printed. As a result, for some multi-loop pedigrees, loopfile.dat will be much shorter be different from the loopfile.dat generated by earlier versions of unknown. Pedigree: 1 : This information is for the first pedigree fewer_vects_size: 800 : Used in error messages num_loops_considered: 3 : Three loops were considered num_loop_vectors: 0 : 6 : 6 loopbreaker vectors at the locus 0 1 : 2 : 2 loopbreaker vectors at the locus 1 2 : 3 : 3 loopbreaker vectors at the locus 2 loop_vectors: L : 0 : at locus 0 0 : 1 0 0 : loopbreaker vector 0 has single locus 1 : 2 0 0 : genotype 1, 0, and 0 at loci 0, 1, 2 : 0 2 0 : and 2 respectively 3 : 1 2 0 : etc 4 : 2 2 0 5 : 0 0 1 + L : 1 0 : 0 0 0 1 : 1 0 0 + L : 2 0 : 0 0 0 1 : 0 1 0 2 : 0 0 1 + unknown_poss: id: 3 : person 3 is unknown and has children L: 0 : at locus 0 0 : 1 : person 3 can have single locus genotype 1 - : - indicates that person 3 is known at locus 0 L: 1 : at locus 1 0 : 0 1 : if loopbreakers have vector 1, person 3 can 1 : 0 1 : have single locus genotype 0 or 1 + : + indicates unknown at locus 1 L: 2 0 : 0 1 1 : 0 1 2 : : indicates that no genotypes are possible at + this locus when the loopbreakers are assigned this loopbreaker vector id: 4 L: 0 0 : 0 1 2 1 : 0 1 2 2 : 3 : 0 1 2 4 : 0 1 2 5 : + L: 1 0 : 0 1 2 - L: 2 0 : 0 1 2 1 : 0 1 2 2 : + fastlink-4.1P-fix95/README.portability0000644000265600020320000001201610517441174016624 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: October 23, 2006 Portability Information With the assistance of many users, I have investigated the portability of FASTLINK to the following operating systems. In this file I summarize the results. In those cases where there is something interesting to be said, I refer to another README file with more details. In general, some more portability information is badly needed, especially for the LINKAGE auxiliary programs (preplink, makeped, lcp, lrp, lsp, unknown). User assistance with portability tests would be greatly appreciated! |*| AIX --- the standard operating system for IBVM RS6000 workstations. Code in the main programs seems to port fine. Compilation requires some minor changes to the Makefile. Of the auxiliary programs, I could only get lsp and unknown to compile and work. See README.AIX for more details. |*| Digital UNIX --- operating system for DEC Alpha workstations. Earlier versions of this operating system are called OSF. The code compiles fine. While running it may hit a floating point exception due to a bug in some C compilers. See README.Digital for more details. Auxiliary programs are available at ftp.well.ox.ac.uk (maintained by Dan Weeks) |*| DOS/Windows --- the standard operating system for IBM-compatible PC's Ramana Idury has done a successful port to DOS. He used the dgjpp compiler, which is a freely-available port of the gcc compiler. He makes no guarantees about what happens with any other compiler. Auxiliary programs for DOS are available through Jurg Ott. See README.DOS for more information. See README.djgpp for how to obtain, install, and use the djgpp compiler yourself. In 2006, I compiled new executables for Windows and these are posted in the pub/fastlink/windows subdirectory, which is equivalent to the URL: ftp://fastlink.nih.gov/pub/fastlink/windows |*| HP/UX -- the standard operating system for some Hewlett-Packard workstations. Tara Cox Matise reports that the main programs port fine. Auxiliary programs for HP/UX are available from the Utah FTP site through gopher 128.110.231.1 (maintained by Dean Flanders); look under publically available software. |*| IRIX --- the standard operating system for some SGI workstations. David Featherstone reports that the code in the main programs seems to port fine. Compilation requires some minor changes to the Makefile. Auxiliary programs are available from John Powell (jip@helix.nih.gov) or Jim Tomlin (jtomlin@helix.nih.gov) |*| Linux --- freely available version of UNIX for PC's Xiali Xie, Shriram Krishnamurthy, and Kurt Hornik report that the main programs port fine. Among the auxiliary programs, unknown and lsp port fine. The others require nontrivial changes. See README.Linux. |*| Mac OSX -- executables compiled by David Stockton are in the pub/fastlink/mac directory as one zip file. Equiavlently, you can retrive them with the URL: ftp://fastlink.nih.gov/pub/fastlink/mac/FASTLINK_executables.zip |*| OS/2 --- operating system for some IBM-compatible PC's Luc Krols reports that he was able to get an earlier version of FASTLINK to compile with a commercially available C compiler. I would appreciate if users with OS/2 machines could test more recent versions. Auxiliary programs for OS/2 are available from Jurg Ott. |*| Solaris 2.* --- operating system for newer Sun workstations. The code ports fine. Auxiliary programs for Solaris are available from the Utah FTP site through gopher 128.110.231.1 (maintained by Dean Flanders); look under publically available software. |*| SunOS --- operating system for older Sun workstations. The code ports fine. Auxiliary programs for SunOS are available from the Utah FTP site through gopher 128.110.231.1 (maintained by Dean Flanders); look under publically available software. |*| Ultrix --- operating system for some DEC workstations. The code ports fine. Auxiliary programs for Ultrix are available from the Utah FTP site through gopher 128.110.231.1 (maintained by Dean Flanders); look under publically available software. |*| VMS --- operating system for some DEC workstations. There are versions of VMS for VAXStations and Alphas. What I know is largely based on reports from Kimmo Kallio, who uses VMS on an Alpha, Steve Roberts who uses VMS on a VAXStation, Shriram Krishnamurthi who help me with the VAX port, and Don Plugge who helped me test FASTLINK 4.0P on AlphaVMS. The code can be ported after some changes to the filenames used in checkpointing and a few changes to code files. Auxiliary programs for VMS are available from the Utah FTP site through gopher 128.110.231.1 (maintained by Dean Flanders); look under publically available software. See README.VMS for more details. fastlink-4.1P-fix95/README.IRIX0000644000265600020320000000177606737457627015073 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod; October 6, 1996 FASTLINK Portability Information for IRIX IRIX is an implementation of UNIX for SGI workstations. The following portability information was reported by David Featherstone. Versions 2.1 and beyond of FASTLINK ports fine to IRIX, but some two minor changes to the Makefile may be necessary for compilation. Change 1. Use the cc compiler, instead of gcc. Change 2. You may need to pass the -cckr flag to the compiler depending on your system. You may do this by editing the line in the Makefile that reads: #SYSDEP = and changing it to: SYSDEP = -cckr It may be the case that gcc works on IRIX too, but David has not verified this. The changes beyond version 2.1 should not create any new problems. Versions of the LINKAGE auxiliary programs for IRIX are available from John Powell (jip@helix.nih.gov) or Jim Tomlin (jtomlin@helix.nih.gov) at NIH. To run parallel FASTLINK, refer to the README.p4 for IRIX-specific notes. fastlink-4.1P-fix95/paper4.ps0000644000265600020320000111453706506236526015164 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvips 5.528 Copyright 1986, 1994 Radical Eye Software %%Title: text.dvi %%CreationDate: Wed Nov 2 17:13:21 1994 %%Pages: 28 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips text.dvi -o %DVIPSParameters: dpi=300, comments removed %DVIPSSource: TeX output 1994.11.02:1712 %%BeginProcSet: tex.pro /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{ statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{ pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get} B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{cc 1 add D }B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail} B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{ 3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{ 3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginProcSet: special.pro TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{ /CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{ 10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{} N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{itransform lineto} }{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{ itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{ closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp {pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray} N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial {CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath }N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{ end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin} N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{ /SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (/a/santa-bb/dancer/schaffer/linkage/intpaper/text.dvi) @start /Fa 8 119 df<01FE0007FF001FFF803E0780380300700000700000E00000E000 00E00000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC001214 7D9318>99 D<001F80003F80001F8000038000038000038000038000038003E3800FFB80 1FFF803C1F80380F80700780700380E00380E00380E00380E00380E00380E00380700780 700780380F803C1F801FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F 00380780700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801 C03E03C01FFF8007FF0001FC0012147D9318>I<03800007C00007C00007C00003800000 0000000000000000000000FFC000FFC000FFC00001C00001C00001C00001C00001C00001 C00001C00001C00001C00001C00001C00001C00001C00001C000FFFF00FFFF80FFFF0011 1D7C9C18>105 D<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E 00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC17148093 18>110 D<7F87E0FF9FF07FBFF803F87803F03003E00003C00003C00003800003800003 80000380000380000380000380000380000380007FFE00FFFF007FFE0015147F9318> 114 D<07F7003FFF007FFF00780F00E00700E00700E007007C00007FE0001FFC0003FE00 001F00600780E00380E00380F00380F80F00FFFF00FFFC00E7F00011147D9318>I<7F8F F0FF8FF87F8FF01E03C00E03800E03800E0380070700070700070700038E00038E00038E 00038E0001DC0001DC0001DC0000F80000F80000700015147F9318>118 D E /Fb 3 16 df0 D<400004C0000C600018300030 1800600C00C006018003030001860000CC0000780000300000300000780000CC00018600 0303000601800C00C0180060300030600018C0000C40000416187A9623>2 D<03C00FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF80FF003 C010127D9317>15 D E /Fc 2 108 df<0300038003000000000000000000000000001C 002400460046008C000C0018001800180031003100320032001C0009177F960C>105 D<1F0006000600060006000C000C000C000C00181C1866188E190C32003C003F00318060 C060C460C460C8C0C8C0700F177E9612>107 D E /Fd 3 51 df<003000003000003000 003000003000003000003000003000003000003000003000FFFFFCFFFFFC003000003000 00300000300000300000300000300000300000300000300000300016187E931B>43 D<03000700FF000700070007000700070007000700070007000700070007000700070007 00070007007FF00C157E9412>49 D<0F8030E040708030C038E038403800380070007000 6000C00180030006000C08080810183FF07FF0FFF00D157E9412>I E /Fe 17 113 df<001E0000630000C38001C1800381800301C00701C00F01C00E01C01E 03C01C03C03C03C03C03C03C03C07807807FFF807FFF80780780F00F00F00F00F00F00F0 0E00F01E00E01C00E03C00E03800E0300060700060E00070C0003180001E000012207E9F 15>18 D<70F8F8F87005057C840D>58 D<70F8FCFC74040404080810102040060E7C840D >I<000001C00000078000001E00000078000001E00000078000000E00000038000000F0 000003C000000F0000003C000000F0000000F00000003C0000000F00000003C0000000F0 000000380000000E0000000780000001E0000000780000001E0000000780000001C01A1A 7C9723>I<000100030003000600060006000C000C000C00180018001800300030003000 600060006000C000C000C00180018001800300030003000600060006000C000C000C0018 0018001800300030003000600060006000C000C000C000102D7DA117>II<00FFFC 00000F8000000F0000000F0000000F0000001E0000001E0000001E0000001E0000003C00 00003C0000003C0000003C00000078000000780000007800000078000000F0000000F000 0000F0000000F0004001E0008001E0008001E0018001E0010003C0030003C0030003C006 0003C00E0007803C00FFFFFC001A1F7E9E1F>76 D<00FFFF80000F00F0000F0038000F00 1C000F001C001E001E001E001E001E001E001E001E003C003C003C003C003C0078003C00 F0007801C000780700007FFC0000780E0000F0070000F0078000F0038000F003C001E007 8001E0078001E0078001E0078003C00F0003C00F0103C00F0103C00F0207C00702FFFC03 8C000001F020207E9E23>82 D<00007C0000CE00019E00039E00030C0007000007000007 00000700000E00000E00000E0000FFF0000E00000E00001C00001C00001C00001C00001C 0000380000380000380000380000380000700000700000700000700000700000E00000E0 0000E00000E00000C00001C000318000798000F300006200003C000017297E9F16>102 D<001E3000713800E0F001C0700380700780700700E00F00E00F00E00F00E01E01C01E01 C01E01C01E01C01E03801E03800E07800E0B8006170001E700000700000700000E00000E 00300E00781C00F038006070003FC000151D809316>I<01E0000FE00001C00001C00001 C00001C000038000038000038000038000070000070000071F000761800E80C00F00C00E 00E00E00E01C01C01C01C01C01C01C01C0380380380380380380380704700708700E0870 0E10700610E006206003C016207E9F1A>I<00E001E001E000C000000000000000000000 000000000E00130023804380438043808700070007000E000E001C001C001C2038403840 3840388019000E000B1F7E9E10>I<0000C00001E00001E00001C0000000000000000000 000000000000000000000000001E00006300004380008380010380010380020700000700 000700000700000E00000E00000E00000E00001C00001C00001C00001C00003800003800 00380000380000700000700030700078E000F1C0006380003E00001328819E13>I<01E0 000FE00001C00001C00001C00001C0000380000380000380000380000700000700000701 E00706100E08700E10F00E20F00E40601C80001D00001E00001FC0003870003838003838 00381C20703840703840703840701880E01880600F0014207E9F18>I<03C01FC0038003 800380038007000700070007000E000E000E000E001C001C001C001C0038003800380038 007000700070007100E200E200E200E200640038000A207E9F0E>I<1E07802318C023A0 6043C0704380704380708700E00700E00700E00700E00E01C00E01C00E01C00E03821C03 841C07041C07081C03083803101801E017147E931B>110 D<03C1E004621804741C0878 1C08701E08701E10E01E00E01E00E01E00E01E01C03C01C03C01C03C01C0380380780380 700380E003C1C0072380071E000700000700000E00000E00000E00000E00001C00001C00 00FFC000171D819317>112 D E /Ff 46 122 df<7FF0FFE07FE00C037D8A10>45 D<70F8F8F0E005057B840E>I<000F800030E000E07001C0700380300380380700380F00 780F00780E00781E00781E00703C00F03C00F03C00F03C00F07801E07801E07801E07801 C07003C0F003C0F00380F00780F00700700700700E00701C003038001870000FC000151F 7C9D17>48 D<000200020006000E003C00DC031C001C0038003800380038007000700070 007000E000E000E000E001C001C001C001C003800380038003800780FFF80F1E7B9D17> I<001F000061800080E00100E00200700220700420700410700820F00820F00820F00840 E00881E00703C0000380000700000C000018000060000080000300000400000800401000 401000802001807E030047FF0041FE0080FC00807800141F7C9D17>I<0000600000E000 00E00000E00001C00001C00001C0000380000380000300000700000700000600000E0000 0C0000180000180000300000300000630000C700008700010700030700060E00040E0008 0E003F8E00607C00801FC0001C00001C0000380000380000380000380000700000700000 600013277E9D17>52 D<001F0000718000C0C00180C00380E00700E00F00E00F01E01E01 E01E01E01E01E01E01C01C03C01C03C01C03C01C07C01C0F800C0F8006378003C700000F 00000E00000E00001C00601C00F03800F07000E0600080C0004380003E0000131F7B9D17 >57 D<00000200000006000000060000000E0000001E0000001E0000003F0000002F0000 004F0000004F0000008F0000010F0000010F0000020F0000020F0000040F0000040F0000 080F0000100F0000100F0000200F80003FFF800040078000C00780008007800100078001 0007800200078002000780060007801E000F80FF807FF81D207E9F22>65 D<01FFFFC0001E00F0001E0078001E0038001E003C003C003C003C003C003C003C003C00 3C0078007800780078007800F0007801E000F0078000FFFE0000F00F8000F003C001E001 C001E001E001E001E001E001E003C001E003C001E003C001E003C001C0078003C0078007 8007800F0007801E000F007800FFFFE0001E1F7D9E20>I<0000FE0200078186001C004C 0038003C0060003C00C0001C01C0001803800018070000180F0000181E0000101E000010 3C0000003C00000078000000780000007800000078000000F0000000F0000000F0000000 F0000000F00000807000008070000080700001003800010038000200180004000C001800 060020000381C00000FE00001F217A9F21>I<01FFFFFE001E001C001E000C001E000400 1E0004003C0004003C0004003C0004003C00040078080800780800007808000078180000 F0300000FFF00000F0300000F0300001E0200001E0200001E0200001E0001003C0002003 C0002003C0004003C00040078000800780018007800100078007000F001F00FFFFFE001F 1F7D9E1F>69 D<01FFFFFC001E0038001E0018001E0008001E0008003C0008003C000800 3C0008003C00080078001000780800007808000078080000F0100000F0300000FFF00000 F0300001E0200001E0200001E0200001E0200003C0000003C0000003C0000003C0000007 8000000780000007800000078000000F800000FFF800001E1F7D9E1E>I<0000FC040007 030C001C00980030007800E0007801C000380380003003800030070000300E0000301E00 00201E0000203C0000003C00000078000000780000007800000078000000F0000000F000 FFF0F0000780F0000780F0000F0070000F0070000F0070000F0070001E0038001E001800 3E001C002E000E00CC000383040000FC00001E217A9F23>I<01FFF3FFE0001F003E0000 1E003C00001E003C00001E003C00003C007800003C007800003C007800003C0078000078 00F000007800F000007800F000007800F00000F001E00000FFFFE00000F001E00000F001 E00001E003C00001E003C00001E003C00001E003C00003C007800003C007800003C00780 0003C007800007800F000007800F000007800F000007800F00000F801F0000FFF1FFE000 231F7D9E22>I<01FFF0001F00001E00001E00001E00003C00003C00003C00003C000078 0000780000780000780000F00000F00000F00000F00001E00001E00001E00001E00003C0 0003C00003C00003C0000780000780000780000780000F8000FFF800141F7D9E12>I<00 1FFF0000F80000F00000F00000F00001E00001E00001E00001E00003C00003C00003C000 03C0000780000780000780000780000F00000F00000F00000F00001E00001E00301E0078 1E00F83C00F83C00F0780080700040E00021C0001F000018207D9E18>I<01FFF800001F 0000001E0000001E0000001E0000003C0000003C0000003C0000003C0000007800000078 0000007800000078000000F0000000F0000000F0000000F0000001E0000001E0000001E0 000001E0008003C0010003C0010003C0030003C00200078006000780060007800C000780 1C000F007800FFFFF800191F7D9E1D>76 D<01FE00007FC0001E0000FC00001E0000F800 00170001780000170001780000270002F00000270004F00000270004F00000270008F000 00470009E00000470011E00000470021E00000470021E00000870043C00000838043C000 00838083C00000838083C000010381078000010382078000010382078000010384078000 0203840F00000203880F00000203900F00000203900F00000401E01E00000401E01E0000 0401C01E00000C01801E00001C01803E0000FF8103FFC0002A1F7D9E29>I<01FF007FE0 001F000F00001F0004000017800400001780040000278008000023C008000023C0080000 23C008000041E010000041E010000041F010000040F010000080F0200000807820000080 782000008078200001003C400001003C400001003C400001001E400002001E800002001E 800002000F800002000F800004000F0000040007000004000700000C000700001C000200 00FF80020000231F7D9E22>I<01FFFF80001E00E0001E0070001E0038001E003C003C00 3C003C003C003C003C003C003C0078007800780078007800F0007800E000F003C000F00F 0000FFFC0000F0000001E0000001E0000001E0000001E0000003C0000003C0000003C000 0003C00000078000000780000007800000078000000F800000FFF000001E1F7D9E1F>80 D<01FFFF00001E03C0001E00E0001E0070001E0078003C0078003C0078003C0078003C00 78007800F0007800F0007801E0007801C000F0070000F01E0000FFF00000F0380001E01C 0001E01E0001E00E0001E00F0003C01E0003C01E0003C01E0003C01E0007803C0007803C 0807803C0807803C100F801C10FFF00C20000007C01D207D9E21>82 D<0007E040001C18C0003005800060038000C0038001C001800180010003800100038001 00038001000380000003C0000003C0000003F8000001FF800001FFE000007FF000001FF0 000001F80000007800000078000000380000003800200038002000380020003000600070 00600060006000E0007000C000E8038000C606000081F800001A217D9F1A>I<7FFC1FF8 07C003C00780010007800100078001000F0002000F0002000F0002000F0002001E000400 1E0004001E0004001E0004003C0008003C0008003C0008003C0008007800100078001000 7800100078001000F0002000F0002000F0002000F0004000F00040007000800070010000 30020000380400000C18000007E000001D20779E22>85 D87 D<00FFF07FE0000F801F00000F001C00000F8010000007803000000780 20000007C040000003C080000003C100000003E200000001E400000001EC00000001F800 000000F000000000F800000000F800000000F8000000017C000000023C000000063C0000 00043E000000081E000000101E000000201F000000400F000000800F000001800F800001 0007800007000780001F000FC000FFC07FF800231F7E9E22>I<00F1800389C00707800E 03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C40F0 1C40703C40705C40308C800F070013147C9317>97 D<07803F8007000700070007000E00 0E000E000E001C001C001CF01D0C3A0E3C0E380F380F700F700F700F700FE01EE01EE01E E01CE03CE038607060E031C01F0010207B9F15>I<007E0001C1000300800E07801E0780 1C07003C0000780000780000780000F00000F00000F00000F00000F00100700100700200 300C0018300007C00011147C9315>I<0000780003F80000700000700000700000700000 E00000E00000E00000E00001C00001C000F1C00389C00707800E03801C03803C03803807 00780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40308C 800F070015207C9F17>I<007C01C207010E011C013C013802780C7FF07800F000F000F0 00F000700170017002380C183007C010147C9315>I<00007800019C00033C00033C0007 18000700000700000E00000E00000E00000E00000E0001FFE0001C00001C00001C00001C 0000380000380000380000380000380000700000700000700000700000700000700000E0 0000E00000E00000E00000C00001C00001C0000180003180007B0000F300006600003C00 001629829F0E>I<003C6000E27001C1E00380E00700E00F00E00E01C01E01C01E01C01E 01C03C03803C03803C03803C03803C07003C07001C0F001C17000C2E0003CE00000E0000 0E00001C00001C00301C00783800F0700060E0003F8000141D7E9315>I<01E0000FE000 01C00001C00001C00001C000038000038000038000038000070000070000071E00076300 0E81800F01C00E01C00E01C01C03801C03801C03801C0380380700380700380700380E10 700E20700C20701C20700C40E00CC060070014207D9F17>I<00C001E001E001C0000000 00000000000000000000000E003300230043804300470087000E000E000E001C001C001C 003840388030807080310033001C000B1F7C9E0E>I<01E0000FE00001C00001C00001C0 0001C0000380000380000380000380000700000700000703C00704200E08E00E11E00E21 E00E40C01C80001D00001E00001FC00038E0003870003870003838407070807070807070 80703100E03100601E0013207D9F15>107 D<03C01FC003800380038003800700070007 0007000E000E000E000E001C001C001C001C0038003800380038007000700070007100E2 00E200E200E200640038000A207C9F0C>I<1C0F80F0002630C318004740640C00478068 0E004700700E004700700E008E00E01C000E00E01C000E00E01C000E00E01C001C01C038 001C01C038001C01C038001C01C0708038038071003803806100380380E1003803806200 7007006600300300380021147C9325>I<1C0F802630C04740604780604700704700708E 00E00E00E00E00E00E00E01C01C01C01C01C01C01C038438038838030838070838031070 03303001C016147C931A>I<007C0001C3000301800E01C01E01C01C01E03C01E07801E0 7801E07801E0F003C0F003C0F003C0F00780F00700700F00700E0030180018700007C000 13147C9317>I<01C1E002621804741C04781C04701E04701E08E01E00E01E00E01E00E0 1E01C03C01C03C01C03C01C0380380780380700380E003C1C0072380071E000700000700 000E00000E00000E00000E00001C00001C0000FFC000171D809317>I<1C1E0026610047 83804787804707804703008E00000E00000E00000E00001C00001C00001C00001C000038 000038000038000038000070000030000011147C9313>114 D<00FC030206010C030C07 0C060C000F800FF007F803FC003E000E700EF00CF00CE008401020601F8010147D9313> I<018001C0038003800380038007000700FFF007000E000E000E000E001C001C001C001C 003800380038003820704070407080708031001E000C1C7C9B0F>I<0E00C03300E02301 C04381C04301C04701C08703800E03800E03800E03801C07001C07001C07001C07101C0E 20180E20180E201C1E200C264007C38014147C9318>I<0E03803307802307C04383C043 01C04700C08700800E00800E00800E00801C01001C01001C01001C02001C02001C04001C 04001C08000E300003C00012147C9315>I<0E00C03300E02301C04381C04301C04701C0 8703800E03800E03800E03801C07001C07001C07001C07001C0E00180E00180E001C1E00 0C3C0007DC00001C00001C00003800F03800F07000E06000C0C0004380003E0000131D7C 9316>121 D E /Fg 45 122 df<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFFFE17277BA622>49 D<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE003FC0FF003FC0FF003F E0FF001FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F8000007F 000000FE000000FC000001F8000003F0000003E00000078000000F0000001E0000003C00 E0007000E000E000E001C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFF C0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC000F81FE00 1F00FF003F80FF003F807F803F807F803F807F801F807F800F007F800000FF000000FF00 0000FE000001FC000001F8000007F00000FFC00000FFF0000001FC0000007E0000007F00 00007F8000003FC000003FC000003FE000003FE03C003FE07E003FE0FF003FE0FF003FE0 FF003FC0FF007FC07E007F807C007F003F01FE001FFFFC0007FFF00000FF80001B277DA6 22>I<00000E0000001E0000003E0000007E000000FE000000FE000001FE000003FE0000 077E00000E7E00000E7E00001C7E0000387E0000707E0000E07E0000E07E0001C07E0003 807E0007007E000E007E000E007E001C007E0038007E0070007E00E0007E00FFFFFFF8FF FFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 00FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFFFE000FFF FC000FFFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E00 00000E0000000E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001F800000 1FC000001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE00 1FC0FC001FC078003F8078003F803C007F001F01FE000FFFF80003FFF00000FF80001B27 7DA622>I<0007F000003FFC0000FFFE0001FC0F0003F01F8007E03F800FC03F801FC03F 801F803F803F801F003F8000007F0000007F0000007F000000FF000000FF0FC000FF3FF8 00FF707C00FFC03E00FFC03F00FF801F80FF801FC0FF001FC0FF001FE0FF001FE0FF001F E07F001FE07F001FE07F001FE07F001FE03F001FE03F001FC01F801FC01F803F800FC03F 0007E07E0003FFFC0000FFF000003FC0001B277DA622>I<380000003E0000003FFFFFF0 3FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E0070000E0070001C00 E0003800E0007000E000E0000000E0000001C000000380000007800000078000000F0000 000F0000001F0000001F0000003F0000003E0000003E0000007E0000007E0000007E0000 007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 007C0000003800001C297CA822>I<003FC00001FFF00003FFFC0007C07E000F003F001E 001F001E000F803E000F803E000F803F000F803F000F803FC00F003FF01F001FFC1E001F FE3C000FFFF80007FFE00003FFF80001FFFC0001FFFE0007FFFF000F0FFF801E03FFC03C 01FFC07C007FE078001FE0F80007E0F80007E0F80003E0F80003E0F80003E0F80003C07C 0003C07C0007803F000F001FC03E000FFFFC0003FFF800007FC0001B277DA622>I<0000 03800000000007C00000000007C0000000000FE0000000000FE0000000000FE000000000 1FF0000000001FF0000000003FF8000000003FF8000000003FF80000000073FC00000000 73FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00000001C0FF00000003 C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E003FE000000E 001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF8000078 0007FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C0 0000FF0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 DI68 DI< 00007FE003000003FFFC0700001FFFFF0F00003FF00FFF0000FF8001FF0001FE0000FF00 03F800003F0007F000003F000FF000001F001FE000000F001FE000000F003FC000000F00 3FC0000007007FC0000007007F80000007007F8000000000FF8000000000FF8000000000 FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 FF8001FFFFF87F8001FFFFF87F8001FFFFF87FC00000FF003FC00000FF003FC00000FF00 1FE00000FF001FE00000FF000FF00000FF0007F00000FF0003F80000FF0001FE0000FF00 00FF8001FF00003FF007BF00001FFFFF1F000003FFFE0F0000007FF003002D297CA836> 71 D73 D75 DIII<0000FFE000000007FFFC0000003FC07F8000007F001FC00001FC00 07F00003F80003F80007F00001FC000FF00001FE001FE00000FF001FE00000FF003FC000 007F803FC000007F807FC000007FC07F8000003FC07F8000003FC07F8000003FC0FF8000 003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000 003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07FC000007FC07FC000 007FC03FC000007F803FC000007F801FE00000FF001FE00000FF000FF00001FE0007F000 01FC0003F80003F80001FC0007F00000FF001FE000003FC07F8000000FFFFE00000000FF E000002B297CA834>II82 D<007F806003FFF0E007FFF9E00F807FE01F001FE03E0007E07C0003E0 7C0001E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFE0000 7FFFE0003FFFFC001FFFFE000FFFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF0 00000FF8000007F8000003F8600001F8E00001F8E00001F8E00001F8F00001F0F00001F0 F80003F0FC0003E0FF0007C0FFE01F80F3FFFF00E0FFFE00C01FF0001D297CA826>I87 D<01FF800007FFF0000F81F8001FC07E001FC07E00 1FC03F000F803F8007003F8000003F8000003F8000003F80000FFF8000FFFF8007FC3F80 0FE03F803F803F803F003F807F003F80FE003F80FE003F80FE003F80FE003F807E007F80 7F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9A21>97 DI<001FF80000FFFE0003F01F 0007E03F800FC03F801F803F803F801F007F800E007F0000007F000000FF000000FF0000 00FF000000FF000000FF000000FF000000FF0000007F0000007F0000007F8000003F8001 C01F8001C00FC0038007E0070003F01E0000FFFC00001FE0001A1B7E9A1F>I<00003FF8 0000003FF80000003FF800000003F800000003F800000003F800000003F800000003F800 000003F800000003F800000003F800000003F800000003F800000003F800000003F80000 1FE3F80000FFFBF80003F03FF80007E00FF8000FC007F8001F8003F8003F8003F8007F00 03F8007F0003F8007F0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003 F800FF0003F800FF0003F8007F0003F8007F0003F8007F0003F8003F8003F8001F8003F8 000F8007F80007C00FF80003F03BFF8000FFF3FF80003FC3FF80212A7EA926>I<003FE0 0001FFF80003F07E0007C01F000F801F801F800F803F800FC07F000FC07F0007C07F0007 E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000FF000000FF0000007F0000007F0000 007F0000003F8000E01F8000E00FC001C007E0038003F81F0000FFFE00001FF0001B1B7E 9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F07F07F07F03E07F00007F00007F0 0007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F00007F0 0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 0007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7 F80FC1FE7C1F80FC7C1F007C383F007E107F007F007F007F007F007F007F007F007F007F 007F007F003F007E001F007C001F80FC000FC1F8001FFFE00018FF800038000000380000 003C0000003E0000003FFFF8001FFFFF001FFFFF800FFFFFC007FFFFE01FFFFFF03E0007 F07C0001F8F80000F8F80000F8F80000F8F80000F87C0001F03C0001E01F0007C00FC01F 8003FFFE00007FF0001E287E9A22>II<07000F801FC03FE03FE03FE01FC00F80070000 00000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00F E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14 >I107 DII< FFC07F0000FFC1FFC000FFC787E0000FCE03F0000FD803F0000FD803F8000FF003F8000F F003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0 03F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003 F8000FE003F8000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80211B7D9A26>I<003F E00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F0007F07F0007F07F00 07F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F00 07F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B 7E9A22>II114 D<03FE300FFFF01E03F03800F0700070F00070F00070F80070FC0000 FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003FC0000FC60007CE0003CF0003C F00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<0070000070000070000070 0000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007F0 0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 3807F03807F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B >II< FFFE03FF80FFFE03FF80FFFE03FF8007F000700007F000700007F800F00003F800E00003 FC01E00001FC01C00001FC01C00000FE03800000FE038000007F070000007F070000007F 8F0000003F8E0000003FDE0000001FDC0000001FDC0000000FF80000000FF80000000FF8 00000007F000000007F000000003E000000003E000000001C00000211B7F9A24>II121 D E /Fh 43 122 df<00FC7C0183C607078E0607040E07000E07 000E07000E07000E07000E0700FFFFF00E07000E07000E07000E07000E07000E07000E07 000E07000E07000E07000E07000E07000E07000E07007F0FF0171A809916>11 D<60F0F07010101020204080040B7D830B>44 D<60F0F06004047D830B>46 D<078018603030303060186018E01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE0 1C6018601870383030186007800E187E9713>48 D<03000700FF00070007000700070007 00070007000700070007000700070007000700070007000700070007000700FFF00C187D 9713>I<0F80106020304038803CC01CE01C401C003C003800380070006000C001800100 020004040804100430083FF87FF8FFF80E187E9713>I<0F8010E0207060787038203800 7800700070006000C00F8000E000700038003C003CE03CE03CC03C4038407030E00F800E 187E9713>I<00300030007000F000F001700370027004700C7008701070307020704070 C070FFFF00700070007000700070007007FF10187F9713>I<30183FF03FE03FC0200020 0020002000200027C03860203000380018001C001C401CE01CE01C80184038403030E00F 800E187E9713>I<07801860303070306018E018E018E01CE01CE01C601C603C303C185C 0F9C001C00180018003870307060604021801F000E187E9713>57 D<60F0F060000000000000000060F0F06004107D8F0B>I<60F0F0600000000000000000 60F0F0701010102020408004177D8F0B>I<007F00000180C00006003000080008001000 0400203E020020E1020041C0810043807100838070808700708087007080870070808700 70808700708087007080838070804380708041C0F10020E13100203E1E00100000000800 00000600038001803E00007FE000191A7E991E>64 D<000C0000000C0000000C0000001E 0000001E0000003F000000270000002700000043800000438000004380000081C0000081 C0000081C0000100E0000100E00001FFE000020070000200700006007800040038000400 380008001C0008001C001C001E00FF00FFC01A1A7F991D>I<003F0201C0C603002E0E00 1E1C000E1C0006380006780002700002700002F00000F00000F00000F00000F00000F000 007000027000027800023800041C00041C00080E000803003001C0C0003F00171A7E991C >67 D73 D76 DI80 D<0FC21836200E6006C006C002C002 C002E00070007E003FE01FF807FC003E000E00070003800380038003C002C006E004D818 87E0101A7E9915>83 D<7FFFFF00701C0700401C0100401C0100C01C0180801C0080801C 0080801C0080001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C 0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C 000003FFE000191A7F991C>I<3F8070C070E020700070007007F01C7030707070E070E0 71E071E0F171FB1E3C10107E8F13>97 DI<07F80C1C381C 30087000E000E000E000E000E000E0007000300438080C1807E00E107F8F11>I<007E00 000E00000E00000E00000E00000E00000E00000E00000E00000E0003CE000C3E00380E00 300E00700E00E00E00E00E00E00E00E00E00E00E00E00E00600E00700E00381E001C2E00 07CFC0121A7F9915>I<07C01C3030187018600CE00CFFFCE000E000E000E00060003004 38080C1807E00E107F8F11>I<01F0031807380E100E000E000E000E000E000E00FFC00E 000E000E000E000E000E000E000E000E000E000E000E000E000E007FE00D1A80990C>I< 0FCE187330307038703870387038303018602FC02000600070003FF03FFC1FFE600FC003 C003C003C0036006381C07E010187F8F13>II<18003C00 3C001800000000000000000000000000FC001C001C001C001C001C001C001C001C001C00 1C001C001C001C001C00FF80091A80990A>I107 DIII<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C1C38 07E010107F8F13>II<03C2000C2600381E00300E00700E00E00E00E00E00E00E 00E00E00E00E00E00E00700E00700E00381E001C2E0007CE00000E00000E00000E00000E 00000E00000E00007FC012177F8F14>II<1F2060E04020C020C020F0007F003FC0 1FE000F080708030C030C020F0408F800C107F8F0F>I<0400040004000C000C001C003C 00FFC01C001C001C001C001C001C001C001C001C201C201C201C201C200E4003800B177F 960F>II119 D121 D E /Fi 5 124 df<0C000C008C40EDC07F800C007F80EDC08C400C000C000A0B7D8B10> 3 D<3C62C3C3C040603866C2C3C343661C060203C3C3463C08167D900E>120 D<1818181818FFFF18181818181818181818181818181808167D900E>I<1818181818FF 18181818180018181818FFFF1818181808167D900E>I<1FFC3FFC7E30FE30FE30FE30FE 30FE30FE307E303E301E3006300630063006300630063006300630063006300E167D9013 >I E /Fj 86 128 df<001F83E000F06E3001C078780380F8780300F030070070000700 70000700700007007000070070000700700007007000FFFFFF8007007000070070000700 700007007000070070000700700007007000070070000700700007007000070070000700 70000700700007007000070070000700700007007000070070007FE3FF001D20809F1B> 11 D<003F0000E0C001C0C00381E00701E00701E0070000070000070000070000070000 070000FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0 0700E00700E00700E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<003F E000E0E001C1E00381E00700E00700E00700E00700E00700E00700E00700E00700E0FFFF E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 E00700E00700E00700E00700E00700E00700E07FE7FE1720809F19>I<001F81F80000F0 4F040001C07C06000380F80F000300F00F000700F00F0007007000000700700000070070 0000070070000007007000000700700000FFFFFFFF000700700700070070070007007007 000700700700070070070007007007000700700700070070070007007007000700700700 070070070007007007000700700700070070070007007007000700700700070070070007 007007007FE3FE3FF02420809F26>I<7038F87CFC7EFC7E743A04020402040208040804 10081008201040200F0E7E9F17>34 D<000300C0000300C0000300C0000300C000060180 00060180000601800006018000060180000C0300000C0300000C0300000C0300000C0300 001806007FFFFFFCFFFFFFFE00300C0000300C0000300C0000300C000060180000601800 0060180000601800FFFFFFFE7FFFFFFC00C0300001806000018060000180600001806000 018060000300C0000300C0000300C0000300C0000300C000060180000601800006018000 1F297D9F26>I<0F0000301880003030600060703001C0602C06C06013F980E0100300E0 100300E0100600E0100C00E0100C00E01018006010300060203000702060003040C00018 80C0000F018000000300E0000303100006060800060604000C0C0400180C0400181C0200 301C0200601C0200601C0200C01C0201801C0201801C0203000C0406000C04060006040C 00060818000310080000E01F257DA126>37 D<70F8FCFC74040404080810102040060E7C 9F0D>39 D<0020004000800100020006000C000C00180018003000300030007000600060 006000E000E000E000E000E000E000E000E000E000E000E000E000600060006000700030 0030003000180018000C000C000600020001000080004000200B2E7DA112>I<80004000 2000100008000C00060006000300030001800180018001C000C000C000C000E000E000E0 00E000E000E000E000E000E000E000E000E000C000C000C001C001800180018003000300 060006000C00080010002000400080000B2E7DA112>I<00060000000600000006000000 060000000600000006000000060000000600000006000000060000000600000006000000 0600000006000000060000FFFFFFF0FFFFFFF00006000000060000000600000006000000 060000000600000006000000060000000600000006000000060000000600000006000000 060000000600001C207D9A23>43 D<70F8FCFC74040404080810102040060E7C840D>I< FFC0FFC00A027F8A0F>I<70F8F8F87005057C840D>I<000100030003000600060006000C 000C000C00180018001800300030003000600060006000C000C000C00180018001800300 030003000600060006000C000C000C00180018001800300030003000600060006000C000 C000C000102D7DA117>I<03F0000E1C001C0E0018060038070070038070038070038070 0380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F0 03C0F003C07003807003807003807807803807001806001C0E000E1C0003F000121F7E9D 17>I<018003800F80F38003800380038003800380038003800380038003800380038003 800380038003800380038003800380038003800380038007C0FFFE0F1E7C9D17>I<03F0 000C1C00100E00200700400780800780F007C0F803C0F803C0F803C02007C00007C00007 80000780000F00000E00001C0000380000700000600000C0000180000300000600400C00 401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00100E00200F0078 0F80780780780780380F80000F80000F00000F00000E00001C0000380003F000003C0000 0E00000F000007800007800007C02007C0F807C0F807C0F807C0F00780400780400F0020 0E001C3C0003F000121F7E9D17>I<000600000600000E00000E00001E00002E00002E00 004E00008E00008E00010E00020E00020E00040E00080E00080E00100E00200E00200E00 400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E00000E0000FFE0141E7F 9D17>I<1803001FFE001FFC001FF8001FE0001000001000001000001000001000001000 0011F000161C00180E001007001007800003800003800003C00003C00003C07003C0F003 C0F003C0E00380400380400700200700100E000C380003E000121F7E9D17>I<007C0001 82000701000E03800C07801C0780380300380000780000700000700000F1F000F21C00F4 0600F80700F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003C070038038 03803807001807000C0E00061C0001F000121F7E9D17>I<4000007FFFC07FFF807FFF80 40010080020080020080040000080000080000100000200000200000400000400000C000 00C00001C000018000038000038000038000038000078000078000078000078000078000 078000078000030000121F7D9D17>I<03F0000C0C001006003003002001806001806001 806001807001807803003E03003F06001FC8000FF00003F80007FC000C7E00103F00300F 806003804001C0C001C0C000C0C000C0C000C0C000806001802001001002000C0C0003F0 00121F7E9D17>I<03F0000E18001C0C00380600380700700700700380F00380F00380F0 03C0F003C0F003C0F003C0F003C07007C07007C03807C0180BC00E13C003E3C000038000 0380000380000700300700780600780E00700C002018001070000FC000121F7E9D17>I< 70F8F8F8700000000000000000000070F8F8F87005147C930D>I<70F8F8F87000000000 00000000000070F0F8F878080808101010202040051D7C930D>I<7FFFFFE0FFFFFFF000 00000000000000000000000000000000000000000000000000000000000000FFFFFFF07F FFFFE01C0C7D9023>61 D<000100000003800000038000000380000007C0000007C00000 07C0000009E0000009E0000009E0000010F0000010F0000010F000002078000020780000 20780000403C0000403C0000403C0000801E0000801E0000FFFE0001000F0001000F0001 000F00020007800200078002000780040003C00E0003C01F0007E0FFC03FFE1F207F9F22 >65 DI<000FC040007030C001C0 09C0038005C0070003C00E0001C01E0000C01C0000C03C0000C07C0000407C0000407800 0040F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F800 0000780000007C0000407C0000403C0000401C0000401E0000800E000080070001000380 020001C0040000703800000FC0001A217D9F21>IIII<000FE0200078186000E004E0038002E00700 01E00F0000E01E0000601E0000603C0000603C0000207C00002078000020F8000000F800 0000F8000000F8000000F8000000F8000000F8000000F8007FFCF80003E0780001E07C00 01E03C0001E03C0001E01E0001E01E0001E00F0001E0070001E0038002E000E004600078 1820000FE0001E217D9F24>II< FFFC0FC00780078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800780078007800FC0FFFC0E1F7F9E10>I<0FFFC0 007C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00 003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00203C00F83C00 F83C00F83C00F0380040780040700030E0000F800012207E9E17>IIIII<001F800000F0F00001C0380007801E000F000F000E000700 1E0007803C0003C03C0003C07C0003E0780001E0780001E0F80001F0F80001F0F80001F0 F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0780001E07C0003E07C0003E0 3C0003C03C0003C01E0007800E0007000F000F0007801E0001C0380000F0F000001F8000 1C217D9F23>II<001F800000F0 F00001C0380007801E000F000F000E0007001E0007803C0003C03C0003C07C0003E07C00 03E0780001E0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F800 01F0F80001F0780001E0780001E07C0003E03C0003C03C0F03C01E1087800E20C7000F20 CF0007A0FE0001E0F80000F0F010001FF01000007010000078300000387000003FF00000 3FE000001FE000000FC0000007801C297D9F23>II<07E0800C1980100780300380600180600180E00180E00080 E00080E00080F00000F000007800007F00003FF0001FFC000FFE0003FF00001F80000780 0003C00003C00001C08001C08001C08001C08001C0C00180C00380E00300F00600CE0C00 81F80012217D9F19>I<7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030800F 0010800F0010800F0010800F0010000F0000000F0000000F0000000F0000000F0000000F 0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F 0000000F0000000F0000000F0000000F0000001F800007FFFE001C1F7E9E21>IIII<7FF8 3FF80FE00FC007C0070003C0020001E0040001F00C0000F0080000781000007C1000003C 2000003E4000001E4000000F8000000F8000000780000003C0000007E0000005E0000009 F0000018F8000010780000207C0000603C0000401E0000801F0001800F00010007800200 07C0070003C01F8007E0FFE01FFE1F1F7F9E22>II<7FFFF87C00F87000F06001E04001E0C003C0C003C0800780800F8080 0F00001E00001E00003C00003C0000780000F80000F00001E00001E00003C00403C00407 80040F80040F000C1E000C1E00083C00183C0018780038F801F8FFFFF8161F7D9E1C>I< FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0FEFE072D7CA10D>I<080410082010201040204020804080408040B85C FC7EFC7E7C3E381C0F0E7B9F17>II<1FE0003030 00781800781C00300E00000E00000E00000E0000FE000F8E001E0E00380E00780E00F00E 10F00E10F00E10F01E10781E103867200F83C014147E9317>97 D<0E0000FE00000E0000 0E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E000EC3800F01C0 0F00E00E00E00E00700E00700E00780E00780E00780E00780E00780E00780E00700E0070 0E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C1C1E381E380C70007000 F000F000F000F000F000F00070007000380138011C020E0C03F010147E9314>I<000380 003F8000038000038000038000038000038000038000038000038000038000038003E380 061B801C0780380380380380700380700380F00380F00380F00380F00380F00380F00380 7003807003803803803807801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E 00380700380700700380700380F00380FFFF80F00000F00000F00000F000007000007000 003800801800800C010007060001F80011147F9314>I<007C00C6018F038F0706070007 0007000700070007000700FFF00700070007000700070007000700070007000700070007 000700070007000700070007007FF01020809F0E>I<0000E003E3300E3C301C1C30380E 00780F00780F00780F00780F00780F00380E001C1C001E380033E0002000002000003000 003000003FFE001FFF800FFFC03001E0600070C00030C00030C00030C000306000603000 C01C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E00000E00000E00000E 00000E00000E00000E00000E00000E3E000E43000E81800F01C00F01C00E01C00E01C00E 01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FF E7FC16207F9F19>I<1C003E003E003E001C000000000000000000000000000E007E000E 000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A 1F809E0C>I<00E001F001F001F000E0000000000000000000000000007007F000F00070 007000700070007000700070007000700070007000700070007000700070007000700070 007000706070F060F0C061803F000C28829E0E>I<0E0000FE00000E00000E00000E0000 0E00000E00000E00000E00000E00000E00000E00000E0FF00E07C00E03000E02000E0400 0E08000E10000E30000E70000EF8000F38000E1C000E1E000E0E000E07000E07800E0380 0E03C00E03E0FFCFF815207F9F18>I<0E00FE000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E80C80C000F00F00E000F 00F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00 E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E0 0E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C00E 01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FF E7FC16147F9319>I<01F800070E001C03803801C03801C07000E07000E0F000F0F000F0 F000F0F000F0F000F0F000F07000E07000E03801C03801C01C0380070E0001F80014147F 9317>I<0E3E00FEC3800F01C00F00E00E00E00E00F00E00700E00780E00780E00780E00 780E00780E00780E00700E00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00 000E00000E00000E00000E00000E0000FFE000151D7F9319>I<03E0800619801C05803C 0780380380780380700380F00380F00380F00380F00380F00380F0038070038078038038 03803807801C0B800E138003E38000038000038000038000038000038000038000038000 0380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E000E000E000E000E000E000E00 0E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030704030C010C010C010E0 0078007F803FE00FF00070803880188018C018C018E030D0608F800D147E9312>I<0200 02000200060006000E000E003E00FFF80E000E000E000E000E000E000E000E000E000E00 0E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E01 C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 C00E03C00603C0030DC001F1FC16147F9319>III<7FC3FC0F01E0 0701C007018003810001C20000E40000EC00007800003800003C00007C00004E00008700 0107000303800201C00601E01E01E0FF07FE1714809318>II<3FFF380E200E201C40384078407000E001E001C00380078007 010E011E011C0338027006700EFFFE10147F9314>III<30307878F87C787830300E057C9E17>127 D E /Fk 15 116 df<387CFEFEFE7C38000000000000387CFEFEFE7C3807147C930F>58 D<0000E000000000E000000001F000000001F000000001F000000003F800000003F80000 0006FC00000006FC0000000EFE0000000C7E0000000C7E000000183F000000183F000000 303F800000301F800000701FC00000600FC00000600FC00000C007E00000FFFFE00001FF FFF000018003F000018003F000030001F800030001F800060001FC00060000FC000E0000 FE00FFE00FFFE0FFE00FFFE0231F7E9E28>65 D70 D80 D88 D<01FE0007FF801F0FC03E0FC03E0FC07C 0F807C0300FC0000FC0000FC0000FC0000FC0000FC00007C00007E00003E00603F00C01F 81C007FF0001FC0013147E9317>99 D<0007F80007F80000F80000F80000F80000F80000 F80000F80000F80000F80000F80000F801F8F80FFEF81F83F83E01F87E00F87C00F87C00 F8FC00F8FC00F8FC00F8FC00F8FC00F8FC00F87C00F87C00F87E00F83E01F81F07F80FFE FF03F8FF18207E9F1D>I<01FE0007FF800F83C01E01E03E00F07C00F07C00F8FC00F8FF FFF8FFFFF8FC0000FC0000FC00007C00007C00003E00181E00180F807007FFE000FF8015 147F9318>I<001F8000FFC001F3E003E7E003C7E007C7E007C3C007C00007C00007C000 07C00007C000FFFC00FFFC0007C00007C00007C00007C00007C00007C00007C00007C000 07C00007C00007C00007C00007C00007C00007C00007C0003FFC003FFC0013207F9F10> I104 D110 D<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC007EFC007EFC007EFC007EFC00 7EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017147F931A>II114 D<0FE63FFE701E600EE006E006F800FFC07FF83FFC1F FE03FE001FC007C007E007F006F81EFFFCC7F010147E9315>I E /Fl 21 122 df<0007E0100038183000E0063001C00170038000F0070000F00E0000701E 0000701C0000303C0000303C0000307C0000107800001078000010F8000000F8000000F8 000000F8000000F8000000F8000000F8000000F800000078000000780000107C0000103C 0000103C0000101C0000201E0000200E000040070000400380008001C0010000E0020000 381C000007E0001C247DA223>67 DI72 D82 D<03F0200C0C601802603001E07000E0600060E0 0060E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003 FF80003FC00007E00001E00000F00000F0000070800070800070800070800070C00060C0 0060E000C0F000C0C80180C6070081FC0014247DA21B>I85 D<0FE0001838003C0C003C0E0018070000070000070000070000FF0007C7001E07003C07 00780700700700F00708F00708F00708F00F087817083C23900FC1E015157E9418>97 D<01FE000703000C07801C0780380300780000700000F00000F00000F00000F00000F000 00F00000F000007000007800403800401C00800C010007060001F80012157E9416>99 D<01FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F00000F00000F000 00F00000F000007000007800203800201C00400E008007030000FC0013157F9416>101 D<003C00C6018F038F030F070007000700070007000700070007000700FFF80700070007 0007000700070007000700070007000700070007000700070007000700070007807FF810 2380A20F>I<1C003E003E003E001C00000000000000000000000000000000000E00FE00 1E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 FFC00A227FA10E>105 D<0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E0 0E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E 003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E00 3800E0FFE3FF8FFE27157F942A>109 D<0E1F80FE60C01E80E00F00700F00700E00700E 00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E 00700E0070FFE7FF18157F941B>I<01FC000707000C01801800C03800E0700070700070 F00078F00078F00078F00078F00078F00078F000787000707800F03800E01C01C00E0380 07070001FC0015157F9418>I<0E1F00FE61C00E80600F00700E00380E003C0E001C0E00 1E0E001E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F00700E80E00E41 C00E3F000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE000171F 7F941B>I<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E000E 000E000E000E000F00FFF010157F9413>114 D<0F8830786018C018C008C008E008F000 7F803FE00FF001F8003C801C800C800CC00CC008E018D0308FC00E157E9413>I<020002 00020002000600060006000E001E003E00FFF80E000E000E000E000E000E000E000E000E 000E000E000E040E040E040E040E040E040708030801F00E1F7F9E13>I<0E0070FE07F0 1E00F00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070 0E00700E00700E00F00E00F006017003827800FC7F18157F941B>II121 D E /Fm 5 124 df<020002000200C218F2 783AE00F800F803AE0F278C2180200020002000D0E7E8E12>3 D<1F0030806040C0C0C0 C0C000C000600030000C0033006080C0C0C060C060C060606020C019800600018000C000 6000606060606040C021801F000B1D7E9610>120 D<0600060006000600060006000600 0600FFF0FFF0060006000600060006000600060006000600060006000600060006000600 06000600060006000C1D7E9611>I<060006000600060006000600FFF0FFF00600060006 000600060006000000060006000600060006000600FFF0FFF00600060006000600060006 000C1D7E9611>I<03FFC00FFFC01FC6003FC6007FC6007FC600FFC600FFC600FFC600FF C6007FC6007FC6003FC6001FC6000FC60003C60000C60000C60000C60000C60000C60000 C60000C60000C60000C60000C60000C60000C60000C600121D7E9616>I E /Fn 31 128 df<0000FC1E000007026180000E07C38000180F878000380F8380007007 00000070070000007007000000E00E000000E00E000000E00E000000E00E000000E00E00 0000E00E00003FFFFFF00001C01C000001C01C000001C01C000001C01C000001C01C0000 038038000003803800000380380000038038000003803800000380380000070070000007 0070000007007000000700700000070070000007007000000E00E000000F00F00000FFC7 FF000021237FA21C>11 D<3078F8787005057C840E>46 D<000004000000000600000000 0E000000001E000000001E000000003E000000003F000000004F000000004F000000008F 000000008F000000010F0000000107800000020780000002078000000407800000040780 00000807C000000803C000001003C000001003C000002003C000003FFFE000004001E000 004001E000008001E000008001E000010001E000010000F000020000F000060000F00004 0000F0000C0000F0003E0001F800FF800FFF8021237EA225>65 D<0001FC02000F030600 3C008C0070005C00E0003C01C0003C0380001C0700001C0F0000181E0000181E0000083E 0000083C0000087C0000087C000000F8000000F8000000F8000000F8000000F8000000F0 000000F0000000F0000000F0000020F0000020F0000040F8000040780000407800008038 0001003C0001001C0002000E000C000700100001C0E000003F00001F247AA223>67 D<03FFFFC000003E00F000003C003C00003C001E00003C000E00003C000F00003C000780 0078000780007800078000780007C000780003C000780003C000780007C000F00007C000 F00007C000F00007C000F00007C000F00007C000F00007C001E0000F8001E0000F8001E0 000F8001E0000F0001E0001F0001E0001E0003C0001E0003C0003C0003C000780003C000 700003C000E00003C001C000078007800007C01E0000FFFFF8000022227EA125>I<0000 FE0100070183001C00460070002E00E0001E01C0001E0380000E0780000E0F00000C1E00 000C1E0000043E0000043C0000047C0000047C000000F8000000F8000000F8000000F800 0000F8000000F0000000F0003FFFF00001F0F00000F0F00000F0F00000F0F80001E07800 01E0780001E0380001E01C0001E00E0003E0060004C0038008C001E07040003F80002024 7AA226>71 D<03FFE00FF8003E0007E0003C000380003C000200003C000400003C000800 003C00100000780020000078008000007801000000780200000078040000007808000000 F018000000F038000000F07C000000F13C000000F23E000000F41E000001E81F000001F0 0F000001E00F000001E007800001E007800001E003C00003C003C00003C001E00003C001 E00003C000F00003C000F00003C000F800078000F80007C000FC00FFFC07FF8025227EA1 26>75 D<03FFF000003E0000003C0000003C0000003C0000003C0000003C000000780000 007800000078000000780000007800000078000000F0000000F0000000F0000000F00000 00F0000000F0000001E0000001E0000001E0000001E0002001E0002001E0004003C00040 03C0004003C000C003C0008003C0018003C003800780078007C01F00FFFFFF001B227EA1 1E>I<000FC0800030318000C00B0001800700038007000300030007000300070003000E 0002000E0002000F0002000F0000000F0000000F80000007E0000007FE000003FFC00001 FFE000007FF000000FF8000000F8000000780000003C0000003C0000003C0020003C0040 0038004000380040003800600030006000700060006000F000C000E8018000C607000081 FC000019247DA21B>83 D87 D<01FFFFF803F000F003C001E0038003C0030003C0060007 8004000F0004001E000C001E0008003C00080078000000F0000000F0000001E0000003C0 000007C00000078000000F0000001E0000003E0000003C00000078004000F0004001F000 4001E0008003C00080078000800F8001800F0001001E0003003C0007007C001F0078007E 00FFFFFE001D227DA11E>90 D<03FC000606000F03000F03800601800001C00003800003 80007F8003E3800F03801C0380380700780700F00708F00708F00F08F00F08F017107867 A01F83C015157D9418>97 D<00FF000381C00603C00C03C01C0180380000780000700000 F00000F00000F00000F00000F00000E00000F00000F000807001007001003806001C1800 07E00012157C9416>99 D<00001E0000FE00001C00001C00001C00001C00001C00001C00 003800003800003800003800003800003800FC700383700700F00C00F01C007038007078 00E07000E0F000E0F000E0F000E0F000E0E001C0E001C0E001C0E001C07003C07003C038 0F801C33C007C3F817237CA21B>I<00FE000383800701C00C00E01C00E03800E07800E0 7000E0FFFFE0F00000F00000F00000F00000E00000E00000F00040700080300080180300 0E0C0003F00013157D9416>I<00780003F8000070000070000070000070000070000070 0000E00000E00000E00000E00000E00000E00001C3F001CC1801D00C01E00E01E00E01C0 0E03C01C03801C03801C03801C03801C03801C0700380700380700380700380700380700 380E00700F0078FFE7FF18237FA21B>104 D<006000F001F001F000E000000000000000 00000000000000000001C00FC001C001C001C001C0038003800380038003800380070007 0007000700070007000E000F00FFE00C227FA10E>I<000300000780000F80000F800007 00000000000000000000000000000000000000000000000000000E0000FE00001E00000E 00000E00000E00001C00001C00001C00001C00001C00001C000038000038000038000038 0000380000380000700000700000700000700000700000700000E00000E00060E000F1C0 00F18000E300003E0000112C83A10F>I<0078000003F800000070000000700000007000 0000700000007000000070000000E0000000E0000000E0000000E0000000E0000000E000 0001C07FC001C03E0001C0380001C0300001C0400001C080000383000003840000038E00 0003BE000003CF00000387000007078000070380000701C0000701C0000700E0000700F0 000E00F0000F00F800FFE3FE001A237FA21A>I<007803F8007000700070007000700070 00E000E000E000E000E000E001C001C001C001C001C001C0038003800380038003800380 0700070007000700070007000E000F00FFE00D237FA20E>I<01C3F01FCC1801D00C01E0 0E01E00E01C00E03C01C03801C03801C03801C03801C03801C0700380700380700380700 380700380700380E00700F0078FFE7FF18157F941B>110 D<007E000383800600C00C00 E01C0070380070780078700078F00078F00078F00078F00078E000F0E000F0E000E0F001 E07001C07003803807001C1C0007F00015157D9418>I<00E1F8000FE60C0000E8060000 F0070000E0038000E0038001C003C001C003C001C003C001C003C001C003C001C003C003 800780038007800380070003800F0003801E0003801C00074038000730E000070F800007 00000007000000070000000E0000000E0000000E0000000E0000000E0000001E000000FF C000001A1F80941B>I<01C7C01FC8E001D1E001E1E001E0C001C00003C0000380000380 000380000380000380000700000700000700000700000700000700000E00000F0000FFF0 0013157F9413>114 D<01F906070C0318031801180118021C001FE00FF807FC007E000E 4006400640066006600CE008D83087C010157E9413>I<00800080008001800100030003 0007000F001F00FFF80E000E000E000E000E001C001C001C001C001C001C003810381038 1038103810382038201C4007800D1F7C9E13>I<0E0070FE07F00E00F00E00700E00700E 00701C00E01C00E01C00E01C00E01C00E01C00E03801C03801C03801C03801C03803C038 05C0380B801C13C007E3F815157C941B>I119 D<1FF83FC003E01E0001C01800 00E0100000E02000007040000078800000390000001E0000001C0000000E0000001F0000 003700000063800000C380000181C0000101E0000200E0000E00F0003E00F800FF03FF00 1A157F941A>I<0FFC0FE001E0078000E0030000E0020000E0040000E004000070080000 700800007010000070300000782000003840000038400000388000003C8000001D000000 1D0000001E0000001C0000000C0000000800000008000000100000001000000020000000 400000F0400000F0800000F1000000C20000003C0000001B1F80941A>I<30307878F8F8 F8F870700D0576A118>127 D E /Fo 19 123 df<000003000000000003000000000003 00000000000780000000000780000000000FC0000000000FC0000000000FC00000000017 E00000000013E00000000013E00000000023F00000000021F00000000021F00000000040 F80000000040F80000000040F800000000807C00000000807C00000001807E0000000100 3E00000001003E00000002003F00000002001F00000002001F00000004000F8000000400 0F80000004000F800000080007C00000080007C00000180007E000001FFFFFE000001FFF FFE00000200003F00000200001F00000200001F00000400001F80000400000F800004000 00F800008000007C00008000007C00008000007C00010000003E00010000003E00030000 003F00030000001F00070000001F001F8000003F80FFE00003FFFCFFE00003FFFC2E327E B132>65 D73 D76 D80 D<007F802001FFE02007C078600F001C601E00 06E03C0003E0380001E0780000E0700000E070000060F0000060F0000060F0000020F000 0020F0000020F8000020F80000007C0000007E0000003F0000003FC000001FF800000FFF 800007FFF80003FFFC0000FFFF00000FFF800000FFC000001FE0000007E0000003F00000 01F0000000F0000000F8000000F88000007880000078800000788000007880000078C000 0078C0000070E00000F0E00000E0F00000E0F80001C0EC000380C7000700C1F01E00807F FC00800FF0001D337CB125>83 D<00FE00000303C0000C00E00010007000100038003C00 3C003E001C003E001E003E001E0008001E0000001E0000001E0000001E00000FFE0000FC 1E0003E01E000F801E001F001E003E001E003C001E007C001E00F8001E04F8001E04F800 1E04F8003E04F8003E0478003E047C005E043E008F080F0307F003FC03E01E1F7D9E21> 97 D<003F800000E0E0000380380007003C000E001E001E001E001C000F003C000F007C 000F0078000F8078000780F8000780F8000780FFFFFF80F8000000F8000000F8000000F8 000000F8000000F8000000780000007C0000003C0000003C0000801E0000800E0001000F 0002000780020001C00C0000F03000001FC000191F7E9E1D>101 D<0007E0001C1000383800707C00E07C01E07C01C03803C00003C00003C00003C00003C0 0003C00003C00003C00003C00003C00003C00003C000FFFFC0FFFFC003C00003C00003C0 0003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C0 0003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00007E0 007FFF007FFF0016327FB114>I<000000F0007F030801C1C41C0380E81C070070080F00 78001E003C001E003C003E003E003E003E003E003E003E003E003E003E003E003E001E00 3C001E003C000F007800070070000780E00009C1C000087F000018000000180000001800 000018000000180000001C0000000E0000000FFFF80007FFFF0003FFFF800E000FC01800 01E0300000F070000070E0000038E0000038E0000038E0000038E0000038700000707000 0070380000E01C0001C00700070001C01C00003FE0001E2F7E9F21>I<0F001F801F801F 801F800F00000000000000000000000000000000000000000000000780FF80FF800F8007 800780078007800780078007800780078007800780078007800780078007800780078007 80078007800780078007800FC0FFF8FFF80D307EAF12>105 D<07800000FF800000FF80 00000F800000078000000780000007800000078000000780000007800000078000000780 00000780000007800000078000000780000007800000078000000780000007801FFC0780 1FFC078007E0078007800780060007800400078008000780100007806000078080000781 00000783800007878000078FC0000793C00007A1E00007C1F0000780F000078078000780 7C0007803C0007803E0007801F0007800F0007800F80078007C0078003C0078003E00FC0 07F8FFFC0FFFFFFC0FFF20327EB123>107 D<0780FF80FF800F80078007800780078007 800780078007800780078007800780078007800780078007800780078007800780078007 800780078007800780078007800780078007800780078007800780078007800780078007 80078007800FC0FFFCFFFC0E327EB112>I<0780FE0000FF83078000FF8C03C0000F9001 E00007A001E00007A000F00007C000F00007C000F000078000F000078000F000078000F0 00078000F000078000F000078000F000078000F000078000F000078000F000078000F000 078000F000078000F000078000F000078000F000078000F000078000F000078000F00007 8000F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1FFF80211F7E9E25> 110 D<001FC00000F0780001C01C00070007000F0007801E0003C01C0001C03C0001E03C 0001E0780000F0780000F0780000F0F80000F8F80000F8F80000F8F80000F8F80000F8F8 0000F8F80000F8F80000F8780000F07C0001F03C0001E03C0001E01E0003C01E0003C00F 00078007800F0001C01C0000F07800001FC0001D1F7E9E21>I<0783E0FF8C18FF907C0F 907C07A07C07C03807C00007C00007C00007800007800007800007800007800007800007 800007800007800007800007800007800007800007800007800007800007800007800007 80000FC000FFFE00FFFE00161F7E9E19>114 D<01FC100E03301800F0300070600030E0 0030E00010E00010E00010F00010F800007E00003FF0001FFF000FFFC003FFE0003FF000 01F80000F880003C80003C80001CC0001CC0001CE0001CE00018F00038F00030CC0060C3 01C080FE00161F7E9E1A>I<00400000400000400000400000400000C00000C00000C000 01C00001C00003C00007C0000FC0001FFFE0FFFFE003C00003C00003C00003C00003C000 03C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C010 03C01003C01003C01003C01003C01003C01003C01001C02001E02000E0400078C0001F00 142C7FAB19>I121 D<3FFFFF3E001E38001E3000 3C2000782000786000F04001E04001E04003C0400780000780000F00001E00001E00003C 0000780000780000F00101E00101E00103C0010780010780030F00021E00021E00063C00 0678000E78007EFFFFFE181F7E9E1D>I E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 150 377 a Fo(In)n(tegrating)21 b(P)n(arallelization)f (Strategies)h(for)g(Link)l(age)f(Analysis)361 562 y Fn(Sandeep)c(K.)g (Gupta)773 544 y Fm(\003)211 620 y Fl(Departmen)o(t)e(of)j(Computer)e (Science)403 678 y(Rice)g(Univ)o(ersit)o(y)478 736 y(Houston)1146 562 y Fn(Alejandro)g(A.)h(Sc)o(h\177)-24 b(a\013er)1621 544 y Fm(y)1027 620 y Fl(Departmen)o(t)15 b(of)i(Computer)e(Science) 1220 678 y(Rice)g(Univ)o(ersit)o(y)1294 737 y(Houston)427 878 y Fn(Alan)h(L.)h(Co)o(x)706 860 y Fm(z)211 936 y Fl(Departmen)o(t)d(of)j(Computer)e(Science)403 994 y(Rice)g(Univ)o (ersit)o(y)478 1052 y(Houston)1161 878 y Fn(Sandh)o(y)o(a)h(Dw)o(ark)m (adas)1606 860 y Fm(x)1027 936 y Fl(Departmen)o(t)f(of)i(Computer)e (Science)1220 994 y(Rice)g(Univ)o(ersit)o(y)1294 1052 y(Houston)777 1193 y Fn(Willy)f(Zw)o(aenep)q(o)q(el)1173 1175 y Fm({)619 1251 y Fl(Departmen)o(t)h(of)h(Computer)g(Science)811 1309 y(Rice)f(Univ)o(ersit)o(y)886 1367 y(Houston)150 2066 y Fk(Address)20 b(for)h(corresp)q(ondence:)26 b Fj(Alejandro)20 b(A.)e(Sc)o(h\177)-23 b(a\013er)18 b(Departmen)o(t)g (of)g(Computer)150 2123 y(Science,)f(MS132,)d(Rice)h(Univ)o(ersit)o(y)l (,)h(6100)e(Main,)h(Houston,)f(TX)i(77005-1892.)150 2179 y Fk(Phone:)k Fj(\(713\))13 b(527-8101)h(x3813)150 2236 y Fk(F)-6 b(AX:)14 b Fj(\(713\))f(285-5930)p 150 2278 660 2 v 201 2305 a Fi(\003)219 2320 y Fh(Presen)o(t)f(address:)17 b(Lab)q(oratory)c(for)e(Computer)h(Science,)g(Massac)o(h)o(usetts)h (Institute)g(of)e(T)m(ec)o(hnology)m(,)h(545)150 2366 y(T)m(ec)o(hnology)j(Square,)e(Cam)o(bridge,)h(MA)f(02139;)g(skgupta@p) q(dos.lcs.mi)q(t.edu)203 2397 y Fi(y)219 2413 y Fh(sc)o (ha\013er@cs.rice.edu)203 2444 y Fi(z)219 2460 y Fh(alc@cs.rice.edu)203 2491 y Fi(x)219 2507 y Fh(sandh)o(y)o(a@cs.rice.edu)198 2538 y Fi({)219 2554 y Fh(willy@cs.rice.edu)964 2678 y Fj(1)p eop %%Page: 2 2 2 1 bop 150 195 a Fg(Abstract)221 252 y Fj(W)l(e)17 b(describ)q(e)i(a)f (second)g(parallel)h(implemen)o(tation)g(of)e(the)g(ILINK)j(program)c (from)h(the)150 308 y(LINKA)o(GE)g(pac)o(k)m(age)f(that)g(impro)o(v)o (es)g(on)g(our)h(previous)g(implemen)o(tation)g([)p Ff(Human)g(Her)n(e) n(d-)150 364 y(ity)i Fj(44\(1994\),)f(pp.)32 b(127{141].)e(T)l(o)19 b(impro)o(v)o(e)g(running)h(time)g(w)o(e)f(in)o(tegrated)g(the)g (strategy)150 421 y(of)e(parallel)h(estimation)f(of)g(the)g(gradien)o (t)g(at)f(a)g(candidate)i(recom)o(bination)g(fraction)f(v)o(ector)150 477 y(with)g(a)g(previously)h(implemen)o(ted)g(strategy)e(for)g(ev)m (aluating)i(in)g(parallel)g(the)f(lik)o(eliho)q(o)q(d)j(at)150 534 y(one)e(v)o(ector.)27 b(W)l(e)18 b(also)g(in)o(tegrated)f(an)h (adaptiv)o(e)g(loadbalancing)i(strategy)c(in)j(conjunction)150 590 y(with)13 b(our)f(previous)h(static)f(loadbalancing)i(strategy)l(.) k(W)l(e)13 b(implemen)o(ted)h(a)e(strategy)f(for)h(par-)150 647 y(titioning)j(input)f(p)q(edigrees,)h(but)f(this)g(slo)o(w)o(ed)g (do)o(wn)f(the)h(program;)f(w)o(e)g(giv)o(e)h(some)f(evidence)150 703 y(for)j(what)f(the)i(problems)g(are.)23 b(T)l(o)16 b(b)q(est)g(exploit)i(parallelism)g(at)e(all)h(lev)o(els)h(of)e(the)g (program)150 760 y(and)e(to)f(tak)o(e)g(adv)m(an)o(tage)g(of)h(b)q(oth) g(coarse-grain)f(and)h(\014ne-grain)h(parallelism)g(it)f(is)h (necessary)150 816 y(to)g(com)o(bine)h(m)o(ultiple)h(algorithmic)f (strategies.)964 2678 y(2)p eop %%Page: 3 3 3 2 bop 150 195 a Fg(1)69 b(In)n(tro)r(duction)150 297 y Fj(Genetic)21 b(link)m(age)g(analysis)g(is)g(a)f(statistical)g(tec)o (hnique)h(used)g(to)e(map)h(h)o(uman)g(genes)h(and)150 353 y(lo)q(cate)16 b(disease)g(genes.)22 b(As)15 b(data)g(collection)j (metho)q(ds)d(ha)o(v)o(e)h(impro)o(v)o(ed,)f(the)h(size)g(and)g(com-) 150 409 y(plexit)o(y)c(of)f(link)m(age)h(analysis)g(problems)g(ha)o(v)o (e)f(gro)o(wn)f(m)o(uc)o(h)h(faster)f(than)h(the)g(sp)q(eed)h(of)f (readily)150 466 y(a)o(v)m(ailable)16 b(computers.)k(In)15 b(this)g(pap)q(er)g(w)o(e)g(rep)q(ort)f(on)g(a)h(m)o(ulti-lev)o(el)i (attempt)c(to)h(parallelize)150 522 y(the)h(ILINK)h(program)e(from)g (the)g(LINKA)o(GE)i(pac)o(k)m(age)e([15,)g(13)o(,)h(16)o(],)f(the)h (most)f(widely-used)150 579 y(soft)o(w)o(are)j(pac)o(k)m(age)i(for)f (link)m(age)i(analysis.)32 b(This)19 b(w)o(ork)f(represen)o(ts)h(a)f (con)o(tin)o(uation)h(of)g(the)150 635 y(F)-5 b(ASTLINK)18 b(pro)s(ject)d(in)j(whic)o(h)f(w)o(e)g(ha)o(v)o(e)f(signi\014can)o(tly) i(sp)q(eeded)g(up)f(the)g(main)g(sequen)o(tial)150 692 y(programs)d([3)o(,)h(21])f(in)i(LINKA)o(GE)g(and)g(parallelized)i(one) d(of)g(them)g(\(ILINK\))h([5)o(].)221 748 y(There)h(are)g(sev)o(eral)h (di\013eren)o(t)f(lev)o(els)i(at)e(whic)o(h)h(link)m(age)h (computations)e(ma)o(y)g(b)q(e)h(paral-)150 805 y(lelized.)k(In)13 b(practice,)g(link)m(age)h(analysis)f(computations)g(usually)g(consist) g(of)f(sev)o(eral)h(di\013eren)o(t)150 861 y(runs)k(corresp)q(onding)h (to)e(di\013eren)o(t)i(orders)e(of)h(p)q(ossible)h(genes)g(and/or)e (di\013eren)o(t)h(candidate)150 918 y(recom)o(bination)j(fraction)g(v)o (ectors.)33 b(Also,)20 b(an)o(y)g(giv)o(en)g(run)g(ma)o(y)f(in)o(v)o (olv)o(e)h(lik)o(eliho)q(o)q(d)j(com-)150 974 y(putations)17 b(for)g(m)o(ultiple)h(p)q(edigrees.)27 b(Our)18 b(w)o(ork)e(on)h (parallelizing)j(ILINK)e(has)f(fo)q(cused)h(on)150 1030 y(strategies)g(that)f(can)i(ac)o(hiev)o(e)g(parallel)h(sp)q(eedup)f(ev) o(en)g(when)g(there)f(is)h(only)g(one)f(p)q(edigree)150 1087 y(and)f(one)g(starting)g(candidate)h(recom)o(bination)g(fraction)f (v)o(ector.)24 b(W)l(e)17 b(feel)h(that)f(this)g(is)h(the)150 1143 y(limiting)e(case)f(for)e(parallelizi)q(ng)k(the)d(LINKA)o(GE)h (programs)e(and)i(that)f(an)o(y)g(comprehensiv)o(e)150 1200 y(parallel)j(implemen)o(tation)f(m)o(ust)f(try)f(to)h(do)g (something)h(ab)q(out)f(this)g(hard)g(case.)221 1256 y(The)21 b(principal)i(theme)e(of)g(this)g(pap)q(er)h(is)f(that)f(it)i (is)f(p)q(ossible)i(to)d(in)o(tegrate)h(di\013eren)o(t)150 1313 y(parallelization)h(strategies)d(in)h(ILINK)h(to)e(impro)o(v)o(e)g (the)g(parallel)i(sp)q(eedup.)35 b(All)20 b(previous)150 1369 y(attempts)d(at)h(parallelizing)j(link)m(age)f(computations)e(ha)o (v)o(e)g(tried)g(essen)o(tially)i(one)e(strategy)l(.)150 1426 y(Our)f(exp)q(erience)i(suggests)d(that)g(m)o(ultiple)i (strategies)e(are)g(needed)i(to)e(handle)i(di\013eren)o(t)f(in-)150 1482 y(puts)i(and)h(to)e(w)o(ork)h(on)g(di\013eren)o(t)g(hardw)o(are)g (platforms,)g(but)g(in)o(tegrating)h(parallelization)150 1539 y(strategies)15 b(is)g(a)g(di\016cult)i(programming)d(task.)221 1595 y(Our)j(\014rst)g(implemen)o(tation)i(parallelized)h(a)d(single)i (lik)o(eliho)q(o)q(d)h(function)e(ev)m(aluation)h(at)150 1651 y(a)c(fairly)i(lo)o(w)e(lev)o(el.)23 b(Exp)q(erimen)o(ts)16 b(with)g(our)f(\014rst)h(implemen)o(tation)h(sho)o(w)o(ed)e(that)g (this)h(w)o(as)150 1708 y(a)d(go)q(o)q(d)h(strategy)e(for)h(some)g (data)g(sets,)h(but)f(not)h(so)f(go)q(o)q(d)g(for)g(others.)19 b(One)14 b(of)g(the)f(problems)150 1764 y(w)o(as)21 b(a)h(lo)o(w-lev)o (el)h(loadbalancing)g(problem,)h(whic)o(h)f(w)o(e)f(ha)o(v)o(e)f(tried) i(to)e(address)h(with)g(an)150 1821 y(adaptiv)o(e)c(strategy)l(.)29 b(The)18 b(in)o(tro)q(duction)i(of)d(an)i(adaptiv)o(e)f(loadbalancing)i (strategy)d(is)i(also)150 1877 y(an)13 b(imp)q(ortan)o(t)g(step)h(to)o (w)o(ards)e(b)q(eing)i(able)h(to)d(run)i(parallel)h(lik)o(eliho)q(o)q (d)i(function)d(ev)m(aluations)150 1934 y(on)h(heterogeneous)g (parallel)i(computers.)221 1990 y(All)k(the)f(candidate)h(recom)o (bination)g(fraction)e(v)o(ectors)h(can)g(b)q(e)h(sp)q(eci\014ed)h(in)f (adv)m(ance,)150 2047 y(and)d(m)o(ultiple)i(lik)o(eliho)q(o)q(d)g(ev)m (aluations)f(can)f(b)q(e)h(done)f(in)g(parallel)i(in)e(the)g(LINKMAP)h (and)150 2103 y(MLINK)13 b(programs)d(of)h(the)h(LINKA)o(GE/F)-5 b(ASTLINK)13 b(pac)o(k)m(age.)19 b(The)12 b(ILINK)h(program)e(do)q(es) 150 2160 y(presen)o(t)g(a)g(limited)i(opp)q(ortunit)o(y)f(to)e(do)h (lik)o(eliho)q(o)q(d)j(ev)m(aluations)f(in)f(parallel,)h(during)f(the)f (esti-)150 2216 y(mation)h(of)g(the)g(gradien)o(t.)19 b(Doing)12 b(lik)o(eliho)q(o)q(d)j(ev)m(aluations)e(in)g(parallel)h (can)e(b)q(e)h(adv)m(an)o(tageous)150 2272 y(b)q(ecause)j(pro)q (cessors)f(w)o(orking)f(on)h(di\013eren)o(t)g(ev)m(aluations)i(do)e (not)f(need)i(to)e(share)h(data)g(with)150 2329 y(eac)o(h)k(other.)29 b(The)19 b(computation)g(pro)q(ceeds)g(more)f(quic)o(kly)i(b)q(ecause)g (sharing)f(data)f(causes)150 2385 y(signi\014can)o(t)c(comm)o (unication)f(o)o(v)o(erhead.)19 b(Our)13 b(new)g(parallel)h(implemen)o (tation)g(p)q(erforms)f(the)150 2442 y(lik)o(eliho)q(o)q(d)i(function)e (ev)m(aluations)g(for)f(gradien)o(t)g(estimation)g(in)h(parallel,)h (but)f(the)f(n)o(um)o(b)q(er)g(of)150 2498 y(pro)q(cessors)j(is)h (still)h(usually)g(larger)e(than)g(the)h(n)o(um)o(b)q(er)f(of)g(lik)o (eliho)q(o)q(d)k(ev)m(aluations)d(that)f(can)964 2678 y(3)p eop %%Page: 4 4 4 3 bop 150 195 a Fj(b)q(e)19 b(done)f(sim)o(ultaneously)l(.)31 b(Therefore,)18 b(w)o(e)g(in)o(tegrated)g(the)g(strategies)g(of)f (doing)i(m)o(ultiple)150 252 y(lik)o(eliho)q(o)q(d)d(ev)m(aluations)f (sim)o(ultaneously)f(and)g(ha)o(ving)g(man)o(y)e(pro)q(cessors)i(w)o (ork)e(on)h(one)h(lik)o(e-)150 308 y(liho)q(o)q(d)j(ev)m(aluation.)k (This)15 b(com)o(bined)h(strategy)e(is)h(also)g(lik)o(ely)i(to)d(b)q(e) i(useful)g(for)e(LINKMAP)150 364 y(and)f(MLINK)h(and)f(w)o(e)f(plan)i (to)e(adapt)g(our)h(parallel)h(co)q(de)g(to)e(those)g(programs)g(in)h (the)g(future.)221 421 y(W)l(e)f(implemen)o(ted)i(a)d(strategy)g(of)h (partitioning)h(the)f(input)h(p)q(edigrees)h(and)e(ha)o(ving)g (di\013er-)150 477 y(en)o(t)17 b(pro)q(cessors)f(w)o(ork)h(on)f (di\013eren)o(t)i(n)o(uclear)f(families.)27 b(Our)17 b(implemen)o(tation)i(w)o(as)d(similar)150 534 y(to)e(a)g(theoretical)h (prop)q(osal)g(of)f(Sc)o(hork)g([22)o(].)19 b(W)l(e)c(found)f(that)g (partitioning)h(the)g(input)g(p)q(edi-)150 590 y(grees)k(actually)g (slo)o(w)o(ed)g(the)f(program)g(do)o(wn)h(measurably;)h(therefore,)f(w) o(e)f(do)h(not)f(dev)o(ote)150 647 y(an)o(y)e(space)g(in)h(the)g(b)q(o) q(dy)f(of)g(the)g(pap)q(er)h(to)f(explaining)i(our)e(partitioning)h (implemen)o(tation,)150 703 y(but)e(w)o(e)g(brie\015y)i(explain)f(the)g (problems)f(w)o(e)g(encoun)o(tered)h(in)g(the)g(Discussion)g(at)f(the)g (end.)221 760 y(Both)g(of)g(our)g(parallel)i(implemen)o(tations)f(are)f (written)h(in)g(a)f(shared)g(memory)g(program-)150 816 y(ming)k(st)o(yle)g(using)g(the)g(T)l(readMarks)f(distributed)i(shared) f(memory)f(system)g([9)o(],)h(whic)o(h)g(is)150 873 y(under)13 b(dev)o(elopmen)o(t)g(at)e(Rice)i(Univ)o(ersit)o(y)l(.)19 b(T)l(readMarks)12 b(is)g(a)g(run)o(time)h(library)f(that)g(enables)150 929 y(a)j(shared)g(memory)g(program)f(to)g(run)h(on)g(a)g(net)o(w)o (ork)f(of)h(w)o(orkstations.)j(Net)o(w)o(orks)c(of)h(w)o(ork-)150 985 y(stations)j(are)h(quite)g(common)f(in)i(researc)o(h)e (institutions)i(and)f(are)f(more)g(readily)i(a)o(v)m(ailable)150 1042 y(than)14 b(shared-memory)g(m)o(ultipro)q(cessors.)20 b(Ho)o(w)o(ev)o(er,)13 b(after)g(simple)i(syn)o(tactic)f(c)o(hanges,)g (it)g(is)150 1098 y(also)j(p)q(ossible)h(to)e(run)h(our)g(parallel)h (implemen)o(tation)g(on)f(a)f(shared-memory)h(m)o(ultipro)q(ces-)150 1155 y(sor)f(computer.)23 b(The)17 b(shared-memory)f(programming)f(mo)q (del)j(supp)q(orted)f(b)o(y)f(T)l(readMarks)150 1211 y(is)g(easier)f(to)g(use)g(than)h(message)e(passing.)221 1268 y(W)l(e)f(tried)h(our)g(parallel)h(implemen)o(tation)g(on)f(5)f (data)g(sets,)g(3)h(of)f(whic)o(h)h(w)o(ere)g(used)g(in)g([5].)150 1324 y(W)l(e)f(used)h(an)f(8-pro)q(cessor)f(net)o(w)o(ork)g(with)h (either)h(a)f(100Mb/s)f(A)l(TM)g(\(Async)o(hronous)h(T)l(rans-)150 1381 y(fer)h(Mo)q(de\))h(switc)o(h,)f(or)g(10Mb/s)g(Ethernet.)20 b(Using)15 b(the)f(faster)g(A)l(TM)h(net)o(w)o(ork,)e(sp)q(eedup)j(on) 150 1437 y(the)g(3)f(common)h(data)f(sets)h(impro)o(v)o(ed)g(from)f (5.38,)f(3.15,)h(and)h(5.73)e(to)h(6.04,)g(3.91,)f(and)i(6.33)150 1494 y(resp)q(ectiv)o(ely)l(.)32 b(On)20 b(the)e(2)h(new)g(data)f(sets) g(sp)q(eedup)i(is)g(7.02)d(and)i(6.88.)29 b(Using)20 b(the)e(slo)o(w)o(er)150 1550 y(Ethernet,)c(the)g(sp)q(eedup)i(on)e (the)g(3)g(shared)g(data)f(sets)h(impro)o(v)o(ed)g(from)g(3.82,)e (1.86,)h(and)h(5.09)150 1606 y(to)g(4.86,)f(2.80,)g(and)h(5.71)f(resp)q (ectiv)o(ely)l(.)22 b(Sp)q(eedup)16 b(on)e(the)h(2)f(new)g(data)g(sets) g(using)h(Ethernet)150 1663 y(is)h(6.30)e(and)h(6.34.)221 1719 y(The)j(rest)f(of)g(this)h(pap)q(er)g(is)h(organized)f(as)f(follo) o(ws.)28 b(Section)18 b(2)g(describ)q(es)h(bac)o(kground)150 1776 y(information)14 b(on)h(LINKA)o(GE,)f(F)-5 b(ASTLINK,)15 b(and)g(ILINK.)g(Section)h(3)e(summarizes)g(our)g(\014rst)150 1832 y(parallel)k(implemen)o(tation)g(and)f(compares)f(our)g(w)o(ork)g (with)h(other)f(attempts)f(to)h(parallelize)150 1889 y(link)m(age)g(analysis)e(computations.)20 b(Section)14 b(4)g(describ)q(es)h(our)f(new)g(adaptiv)o(e)g(load)h(balancing)150 1945 y(strategy)l(.)25 b(Section)18 b(5)f(describ)q(es)i(our)e (strategy)e(for)i(parallelizing)j(the)e(gradien)o(t)f(estimation)150 2002 y(step.)33 b(Section)21 b(6)e(describ)q(es)j(the)e(computer)f (hardw)o(are)g(and)h(soft)o(w)o(are)e(w)o(e)i(used)g(for)f(mea-)150 2058 y(suremen)o(ts)14 b(and)g(a)f(few)h(other)g(lo)o(w-lev)o(el)h (algorithmic)g(impro)o(v)o(emen)o(ts)e(that)g(w)o(e)h(made)g(to)f(our) 150 2115 y(parallel)18 b(implemen)o(tation.)24 b(Section)17 b(7)e(ev)m(aluates)i(our)f(new)g(parallel)i(implemen)o(tation.)24 b(W)l(e)150 2171 y(conclude)17 b(with)e(a)g(short)g(Discussion.)150 2314 y Fg(2)69 b(Summary)23 b(of)g(LINKA)n(GE)150 2416 y Fj(The)c(basic)h(computational)f(goal)g(in)h(genetic)g(link)m(age)g (analysis)g(is)f(to)g(compute)g(the)g(prob-)150 2472 y(abilit)o(y)j(that)f(a)f(recom)o(bination)i(o)q(ccurs)f(b)q(et)o(w)o (een)h(t)o(w)o(o)d(lo)q(ci)k Fe(L)1289 2479 y Fd(1)1329 2472 y Fj(and)f Fe(L)1455 2479 y Fd(2)1474 2472 y Fj(.)37 b(A)22 b(lo)q(cus)f(is)h(an)150 2529 y(iden)o(ti\014able)f(lo)q(cation) f(on)e(the)h(c)o(hromosome)f(whose)g(inheritance)j(can)e(b)q(e)g (traced;)h(it)f(need)964 2678 y(4)p eop %%Page: 5 5 5 4 bop 150 195 a Fj(not)14 b(b)q(e)i(part)e(of)g(a)h(gene.)20 b(The)15 b(probabilit)o(y)h(of)e(recom)o(bination)i(is)f(called)h(the)f Ff(r)n(e)n(c)n(ombination)150 252 y(fr)n(action)k Fj(and)h(denoted)h(b) o(y)e Fe(\022)q Fj(.)34 b(Most)19 b(programs)f(in)j(common)e(usage)h (estimate)g Fe(\022)h Fj(using)f(a)150 308 y(maxim)o(um)15 b(lik)o(eliho)q(o)q(d)k(approac)o(h.)h(A)15 b(thorough)g(treatmen)o(t)f (of)h(maxim)o(um)g(lik)o(eliho)q(o)q(d)j(link-)150 364 y(age)f(analysis)g(is)h(giv)o(en)f(in)h(Ott's)e(b)q(o)q(ok)i([20)o(].) 24 b(In)18 b(this)g(section)f(w)o(e)g(highligh)o(t)h(a)f(few)g(asp)q (ects)150 421 y(of)k(the)g(LINKA)o(GE/F)-5 b(ASTLINK)23 b(soft)o(w)o(are)c(pac)o(k)m(age)i(that)g(are)g(relev)m(an)o(t)h(to)e (our)h(parallel)150 477 y(implemen)o(tation)16 b(of)f(ILINK.)221 534 y(The)h(recom)o(bination)h(fraction)f(can)h(b)q(e)g(generalized)h (to)d(more)h(than)g(t)o(w)o(o)f(lo)q(ci.)25 b(Supp)q(ose)150 590 y Fe(L)181 597 y Fd(1)201 590 y Fe(;)8 b(L)253 597 y Fd(2)272 590 y Fe(;)g(:)g(:)g(:)t(;)g(L)404 597 y Fc(k)q Fd(+1)481 590 y Fj(are)i(di\013eren)o(t)h(lo)q(ci,)i(conjectured)e(to)f (o)q(ccur)h(in)h(that)e(order.)18 b(Then)11 b(w)o(e)g(de\014ne)150 647 y Fe(\022)h Fj(to)d(b)q(e)i(a)f(v)o(ector)g(of)g(recom)o(bination)h (fractions,)f(\()p Fe(\022)1027 654 y Fd(1)1047 647 y Fe(;)e(:)g(:)g(:)d(;)j(\022)1170 654 y Fc(k)1191 647 y Fj(\),)i(where)h Fe(\022)1380 654 y Fc(i)1404 647 y Fj(is)g(the)f(recom)o(bination)150 703 y(fraction)17 b(b)q(et)o(w)o(een)h(lo)q(cus)g Fe(L)646 710 y Fc(i)677 703 y Fj(and)f(lo)q(cus)i Fe(L)916 710 y Fc(i)p Fd(+1)975 703 y Fj(.)26 b(The)17 b(task)g(of)f(estimating)i(the)f Fe(\022)i Fj(v)o(ector)e(for)150 760 y(more)e(than)g(t)o(w)o(o)f(lo)q (ci,)i(is)g(called)g Ff(multilo)n(cus)g(analysis)p Fj(.)221 816 y(A)h(ma)s(jor)e(adv)m(ance)j(of)f(the)g(LINKA)o(GE)g(pac)o(k)m (age)g(o)o(v)o(er)g(its)g(predecessor)g(LIPED)h([19)o(])e(is)150 873 y(that)d(LINKA)o(GE)h(supp)q(orts)g(m)o(ultilo)q(cus)h(analysis)g ([15)o(].)k(The)14 b(LINKA)o(GE)g(pac)o(k)m(age)g(con)o(tains)150 929 y(four)22 b(related)g(principal)j(programs,)d(LODSCORE,)g(ILINK,)h (LINKMAP)l(,)g(and)f(MLINK.)150 985 y(The)c(F)-5 b(ASTLINK)19 b(pac)o(k)m(age)f([3)o(,)g(21)o(])g(con)o(tains)g(signi\014can)o(tly)h (faster)e(sequen)o(tial)i(v)o(ersions)f(of)150 1042 y(these)c(four)g (programs.)k(F)-5 b(ASTLINK)16 b(do)q(es)e(not)g(include)i(the)f(man)o (y)e(auxiliary)j(programs)d(for)150 1098 y(prepro)q(cessing)19 b(the)f(data)f(and)h(p)q(ostpro)q(cessing)h(the)e(results)i(that)e (come)h(with)g(LINKA)o(GE.)150 1155 y(F)l(or)c(this)i(pap)q(er,)f (LODSCORE)g(can)h(b)q(e)f(view)o(ed)h(as)f(a)g(sp)q(ecial)i(v)o(ersion) e(of)g(ILINK,)h(tuned)g(to)150 1211 y(handle)g(2-lo)q(cus)g(problems,)g (and)f(MLINK)h(can)g(b)q(e)g(view)o(ed)g(as)e(a)h(v)m(arian)o(t)g(of)g (LINKMAP)l(.)221 1268 y(F)l(or)24 b(our)h(purp)q(oses)h(there)f(is)h (one)g(fundamen)o(tal)f(distinction)i(b)q(et)o(w)o(een)f(ILINK)h(and) 150 1324 y(LINKMAP)l(.)20 b(ILINK)i(starts)c(with)i(one)f(candidate)i Fe(\022)g Fj(v)o(ector)e(and)h(impro)o(v)o(es)f Fe(\022)i Fj(through)e(a)150 1381 y(n)o(umerical)f(optimization)f(algorithm)f (implemen)o(ted)i(in)f(the)f(GEMINI)h(pac)o(k)m(age)f([10)o(];)g(all)h (of)150 1437 y(the)c(comp)q(onen)o(ts)g(in)h(the)f(v)o(ector)f(can)h(c) o(hange)g(from)g(one)g(estimate)f(to)h(the)g(next.)19 b(LINKMAP)150 1494 y(tak)o(es)c(the)g(relativ)o(e)h(p)q(ositions)g(of)f (all)h(but)g(one)f(of)g(the)h(lo)q(ci)g(to)f(b)q(e)h(\014xed)g(and)g (the)f(p)q(osition)h(of)150 1550 y(one)i(lo)q(cus)g(can)g(b)q(e)g(v)m (aried,)g(either)g(at)f(the)h(end)g(or)f(in)h(a)f(gap)g(b)q(et)o(w)o (een)h(t)o(w)o(o)e(lo)q(ci.)28 b(In)18 b(either)150 1606 y(case,)c(LINKMAP)i(generates)e(a)g(\014xed,)h(and)g(computable)g(a)f (priori,)h(set)f(of)g(candidate)i Fe(\022)g Fj(v)o(ec-)150 1663 y(tors)f(and)i(computes)f(the)h(lik)o(eliho)q(o)q(d)i(for)c(eac)o (h.)23 b(The)17 b(routines)g(to)e(compute)i(the)f(lik)o(eliho)q(o)q(d) 150 1719 y(for)h(an)o(y)g(particular)h Fe(\022)h Fj(are)e(essen)o (tially)i(the)f(same)f(in)h(ILINK)h(and)f(LINKMAP)g(\(as)f(w)o(ell)h (as)150 1776 y(LODSCORE)d(and)h(MLINK\).)221 1832 y(As)k(in)i([5)o(],)g (w)o(e)e(fo)q(cus)i(on)e(parallelizin)q(g)j(ILINK)g(b)q(ecause)e(it)h (has)e(the)h(longest)g(t)o(ypical)150 1889 y(running)e(times)f(and)g (is)g(the)g(hardest)g(of)f(the)h(four)g(programs)e(to)h(parallelize.)31 b(Most)16 b(of)i(the)150 1945 y(routines)11 b(that)e(w)o(e)i(ha)o(v)o (e)f(mo)q(di\014ed)h(are)f(shared)h(b)q(et)o(w)o(een)g(all)g(four)f (programs)f(in)i(the)g(sequen)o(tial)150 2002 y(F)-5 b(ASTLINK)16 b(co)q(de.)221 2058 y(As)c(with)g(virtually)h(all)g(n)o (umerical)g(optimization)g(pro)q(cedures,)g(GEMINI)g(can)f(only)g (guar-)150 2115 y(an)o(tee)e(to)g(pro)q(duce)h(a)f(lo)q(cally)i(optim)o (um)f(solution.)19 b(The)10 b(GEMINI)h(pac)o(k)m(age)f(as)g(used)h(in)g (ILINK)150 2171 y(pro)q(ceeds)19 b(in)g(stages,)f(whic)o(h)h(the)f(co)q (de)h(calls)h Ff(iter)n(ations)p Fj(.)28 b(In)19 b(the)f(\014rst)g (iteration,)h(the)f(\014rst)150 2227 y(lik)o(eliho)q(o)q(d)i(function)e (ev)m(aluation)g(computes)g(the)f(lik)o(eliho)q(o)q(d)j(of)d(the)g (candidate)h Fe(\022)h Fj(supplied)150 2284 y(b)o(y)14 b(the)h(user)f(and)h(then)f(do)q(es)h Fe(k)g Fj(lik)o(eliho)q(o)q(d)i (function)e(ev)m(aluations,)h(one)e(for)g(eac)o(h)g(dimension)150 2340 y(of)h(the)g Fe(\022)i Fj(v)o(ector,)e(to)g(estimate)g(the)g (gradien)o(t)h(at)e(the)i(initial)h Fe(\022)q Fj(.)k(Eac)o(h)16 b(subsequen)o(t)g(iteration)150 2397 y(uses)21 b(the)f(b)q(est)h (previous)g Fe(\022)i Fj(and)d(the)h(gradien)o(t)f(estimate)h(to)f (searc)o(h)g(for)g(a)g(b)q(etter)h Fe(\022)q Fj(;)i(the)150 2453 y(n)o(um)o(b)q(er)13 b(of)g(candidate)h Fe(\022)h Fj(v)o(ectors)d(tried)i(v)m(aries)g(substan)o(tially)l(.)20 b(Once)14 b(GEMINI)g(has)f(found)g(a)150 2510 y(b)q(etter)i Fe(\022)h Fj(and)f(cannot)g(immediately)i(impro)o(v)o(e)e(it,)f(GEMINI) h(again)g(estimates)g(the)g(gradien)o(t)964 2678 y(5)p eop %%Page: 6 6 6 5 bop 150 195 a Fj(at)18 b(the)g(new)h Fe(\022)q Fj(.)30 b(When)19 b(no)f(b)q(etter)g Fe(\022)i Fj(can)f(b)q(e)g(found)g(in)g (the)f(direction)i(of)e(the)g(gradien)o(t,)h(a)150 252 y(lo)q(cal)d(optim)o(um)g(has)f(b)q(een)h(reac)o(hed)f(and)h(the)f (program)f(exits)i(shortly)f(thereafter.)221 308 y(Eac)o(h)k(ev)m (aluation)i(of)e(the)g(lik)o(eliho)q(o)q(d)k(function)d(is)g(done)g(b)o (y)g(tra)o(v)o(ersing)e(the)i(p)q(edigree,)150 364 y(ending)e(at)d(one) i(p)q(erson)g Fe(p)f Fj(called)i(the)e Ff(pr)n(ob)n(and)p Fj(.)24 b(The)16 b(goal)h(is)f(to)g(compute)h(for)f(eac)o(h)g(m)o (ulti-)150 421 y(lo)q(cus)f(genot)o(yp)q(e)g Fe(g)r Fj(,)e(the)i (conditional)h(probabilit)o(y)f(that)f Fe(p)g Fj(has)g(genot)o(yp)q(e)g Fe(g)r Fj(,)g(conditioned)i(on)150 477 y(the)c(observ)o(ed)g(phenot)o (yp)q(e)g(data)f(for)h(all)g(the)g(p)q(edigree)i(mem)o(b)q(ers)d(and)h (the)g(candidate)h Fe(\022)q Fj(.)19 b(This)150 534 y(is)f(done)g(b)o (y)f(visiting)i(the)f(n)o(uclear)g(families)h(one)f(at)f(a)g(time,)h (and)g(for)e(eac)o(h)i(n)o(uclear)g(family)150 590 y(up)q(dating)h(the) f(conditional)h(genot)o(yp)q(e)f(probabilities)i(for)e(that)f(family)h (mem)o(b)q(er)g(that)g(con-)150 647 y(nects)c(the)g(curren)o(t)g(n)o (uclear)h(family)g(to)e(the)h(as)g(y)o(et)f(un)o(tra)o(v)o(ersed)h (part)f(of)h(the)g(p)q(edigree.)21 b(The)150 703 y(curren)o(t)d(n)o (uclear)i(family)f(is)g(up)q(dated)g(conditionally)i(on)d(the)g(n)o (uclear)i(families)g(previously)150 760 y(visited,)c(its)f(observ)o(ed) h(data,)e(and)h Fe(\022)q Fj(.)221 816 y(Details)h(of)g(the)g (algorithm)g(that)g(LINKA)o(GE)h(uses)f(to)g(order)f(the)i(n)o(uclear)g (families)g(in)g(a)150 873 y(p)q(edigree)h(tra)o(v)o(ersal)e(and)i(to)e (handle)i(lo)q(ops)g(can)f(b)q(e)g(found)h(in)f(do)q(cumen)o(tation)h (that)e(comes)150 929 y(with)k(the)g(distribution)h(of)e(sequen)o(tial) i(F)-5 b(ASTLINK)20 b(\(ftp)f(to)g(softlib.cs.rice.edu,)j(login)e(as) 150 985 y(anon)o(ymous,)14 b(cd)i(pub/fastlink,)g(and)f(retriev)o(e)h (the)f(\014les)h(tra)o(v)o(erse.ps)e(and)h(lo)q(ops.ps\).)150 1129 y Fg(3)69 b(Previous)23 b(W)-6 b(ork)24 b(on)g(P)n(arallel)d(Link) l(age)i(Analysis)150 1230 y Fj(Link)m(age)14 b(analysis)f(seems)f(to)g (b)q(e)h(a)f(particularly)h(hard)g(problem)g(to)e(parallelize)k(in)e(a) f(w)o(a)o(y)g(that)150 1287 y(w)o(orks)g(on)g(all)i(v)m(arieties)g(of)f (t)o(ypical)g(data)f(sets.)19 b(In)13 b(this)h(section,)f(w)o(e)g (brie\015y)h(review)f(attempts)150 1343 y(b)o(y)j(other)f(researc)o(h)g (groups)g(to)g(parallelize)j(link)m(age)g(analysis)e(and)g(review)g(a)f (few)h(asp)q(ects)f(of)150 1400 y(our)g(\014rst)g(parallel)h(implemen)o (tation)h(needed)g(to)d(understand)i(the)f(subsequen)o(t)h(sections.) 221 1456 y(Miller,)j(et)e(al.)h([18)o(])f(did)i(a)f(parallel)h (implemen)o(tation)g(of)e(LINKMAP)i(using)f(the)g(Linda)150 1512 y(pac)o(k)m(age.)40 b(Their)22 b(parallelization)j(strategy)20 b(assumes)i(that)f(that)g(there)h(are)g(man)o(y)f(p)q(edi-)150 1569 y(grees)e(and/or)g(man)o(y)f(candidate)i Fe(\022)h Fj(v)o(ectors.)31 b(They)20 b(treat)e(the)h(ev)m(aluation)h(of)f(eac)o (h)g(lik)o(eli-)150 1625 y(ho)q(o)q(d)i(for)f(one)g(p)q(edigree)i(as)e (a)g(separate)g(task)g(that)g(can)g(b)q(e)h(assigned)g(to)f(one)h(pro)q (cessor.)150 1682 y(If)c(there)g(are)f(enough)i(tasks,)e(the)h(load)g (can)g(b)q(e)g(balanced)h(e\013ectiv)o(ely)g(using)f(a)g(w)o(ork-queue) 150 1738 y(approac)o(h.)37 b(Goradia,)22 b(et)e(al)i([6)o(])f(did)h(a)e (similar)j(parallelization)g(of)e(the)g(link)m(age)h(analysis)150 1795 y(program)14 b(MENDEL)h([11)o(,)g(12)o(].)221 1851 y(V)l(aughan)c([25)o(])f(did)i(a)e(parallel)j(implemen)o(tation)f(of)e (LINKMAP)i(using)f(the)g(ISIS)h(pac)o(k)m(age.)150 1908 y(Her)k(algorithm)g(do)q(es)g(parallelize)j(the)d(case)g(of)f(one)h(p)q (edigree)i(and)e(one)g(lik)o(eliho)q(o)q(d,)j(but)d(she)150 1964 y(did)23 b(not)f(presen)o(t)h(an)o(y)f(data)f(on)h(running)i (times.)41 b(She)23 b(w)o(as)f(primarily)h(concerned)h(with)150 2021 y(balancing)17 b(the)e(load)g(on)g(a)g(heterogeneous)h(net)o(w)o (ork.)221 2077 y(Sc)o(hork)11 b([22)o(])h(prop)q(osed)g(parallelizin)q (g)i(the)e(computation)g(of)g(one)g(lik)o(eliho)q(o)q(d)i(b)o(y)e (assigning)150 2133 y(the)17 b(probabilit)o(y)i(up)q(dates)f(of)f (di\013eren)o(t)g(n)o(uclear)i(families)f(to)f(di\013eren)o(t)h(sets)f (of)g(pro)q(cessors.)150 2190 y(His)g(pap)q(er)g(do)q(es)g(not)f (describ)q(e)i(an)o(y)f(implemen)o(tation.)25 b(W)l(e)17 b(exp)q(erimen)o(tally)h(implemen)o(ted)150 2246 y(an)c(algorithm)f (similar)i(to)e(Sc)o(hork's,)g(but)h(found)g(that)f(it)h(slo)o(w)o(ed)g (do)o(wn)f(ILINK)j(measurably)l(.)150 2303 y(Some)d(of)g(the)g (problems)h(w)o(e)f(encoun)o(tered)h(are)f(men)o(tioned)h(brie\015y)g (in)g(the)f(Discussion)h(at)f(the)150 2359 y(end)j(of)f(of)f(the)i(pap) q(er.)221 2416 y(Cham)o(b)q(erlain,)d(F)l(ranklin,)g(P)o(eterson,)f (and)g(Pro)o(vince)g([2)o(])g(parallelized)i(the)e(gradien)o(t)g(com-) 150 2472 y(putation)20 b(in)g(the)g(GEMINI)g(optimization)g(pac)o(k)m (age)g(using)g(PVM)g(in)g(the)g(con)o(text)f(of)g(t)o(w)o(o)150 2529 y(other)g(application)h(programs)e(in)i(genetics.)32 b(Ho)o(w)o(ev)o(er,)18 b(in)i(b)q(oth)f(of)g(those)g(programs,)f(the) 964 2678 y(6)p eop %%Page: 7 7 7 6 bop 150 195 a Fj(n)o(um)o(b)q(er)13 b(of)f(dimensions)i(in)f(the)f (optimization)h(problem)h(is)e(t)o(ypically)i(m)o(uc)o(h)e(higher)i (than)e(the)150 252 y(n)o(um)o(b)q(er)17 b(of)f(pro)q(cessors)h(a)o(v)m (ailable,)h(hence)f(it)g(is)h(p)q(ossible)g(to)e(assign)h(eac)o(h)f (function)i(ev)m(alua-)150 308 y(tion)13 b(to)f(one)h(pro)q(cessor)f (and)h(get)f(go)q(o)q(d)h(sp)q(eedup.)20 b(ILINK)15 b(optimization)e (problems)h(t)o(ypically)150 364 y(ha)o(v)o(e)g(dimension)j(only)e(2)g (or)f(3.)19 b(W)l(e)c(note)g(also)f(that)g([2])g(did)i(not)e (parallelize)k(those)c(function)150 421 y(ev)m(aluations)j(that)d(up)q (date)i(the)g(parameters,)e(whic)o(h)i(are)f(therefore)g(done)h(one)g (at)e(a)h(time)h(b)o(y)150 477 y(one)h(pro)q(cessor)g(eac)o(h.)25 b(They)18 b(men)o(tion)f(that)f(it)h(is)h(imp)q(ortan)o(t)f(to)f(in)o (tegrate)h(parallelization)150 534 y(strategies)e(for)g(individual)k (function)e(ev)m(aluations)g(with)f(a)f(strategy)f(to)i(parallelize)i (the)e(gra-)150 590 y(dien)o(t)e(estimation.)20 b(This)14 b(is)h(precisely)g(the)f(strategy)e(in)o(tegration)i(problem)g(that)f (w)o(e)h(address)150 647 y(in)i(our)f(w)o(ork.)221 703 y(Our)i(\014rst)g(parallel)h(implemen)o(tation)g(parallelized)i(the)d (up)q(date)h(of)e(one)i(n)o(uclear)f(family)150 760 y(at)j(a)f(time.)36 b(The)20 b(reason)g(for)f(this)i(is)g(that)e(in)i(some)f(p)q(edigrees)i (with)e(man)o(y)g(generations)150 816 y(and)13 b(man)o(y)f(un)o(t)o(yp) q(ed)h(\(except)g(for)f(a)h(disease)g(lo)q(cus\))h(individuals,)i(up)q (dating)d(the)g(conditional)150 873 y(probabilities)18 b(of)d(the)g(n)o(uclear)i(families)f(in)h(the)e(top)g(t)o(w)o(o)f (generations)i(tak)o(e)f(the)g(bulk)i(of)e(the)150 929 y(computing)h(time.)221 985 y(W)l(e)f(observ)o(ed)h(that)f(the)g(co)q (de)h(for)f(an)h(up)q(date)g(of)f(a)g(n)o(uclear)i(family)f(is)g(wrapp) q(ed)g(in)g(t)o(w)o(o)150 1042 y(outer)h(lo)q(ops)h(that)f(iterate)g(o) o(v)o(er)g(all)h(the)g(p)q(ossible)h(genot)o(yp)q(es)f(of)f(one)g (paren)o(t)g(and)h(then)g(all)150 1098 y(the)g(p)q(ossible)i(genot)o (yp)q(es)e(of)f(the)h(other)g(paren)o(t.)27 b(This)19 b(describ)q(es)g(a)f(rectangular)g(iteration)150 1155 y(matrix)12 b Fe(R)p Fj(.)19 b(The)13 b(probabilit)o(y)i(up)q(dates)e (corresp)q(onding)h(to)e(eac)o(h)h(p)q(ossible)h(pair)g(of)e(genot)o (yp)q(es)150 1211 y(\(i.e.)26 b(en)o(try)16 b(in)i Fe(R)p Fj(\))f(can)g(b)q(e)h(done)f(almost)g(en)o(tirely)h(in)g(parallel.)27 b(Ho)o(w)o(ev)o(er,)16 b(the)h(time)h(to)e(do)150 1268 y(the)g(up)q(dates)g(v)m(aries)h(widely)g(from)e(en)o(try)g(to)g(en)o (try)l(.)22 b(W)l(e)15 b(found)i(that)e(with)h(rare)f(exceptions)150 1324 y(the)i(up)q(date)h(times)f(for)f(consecutiv)o(e)i(ro)o(ws)e(of)h Fe(R)g Fj(are)f(similar)j(b)q(ecause)f(they)f(t)o(ypically)h(cor-)150 1381 y(resp)q(ond)j(to)e(genot)o(yp)q(es)h(that)f(ha)o(v)o(e)g(the)h (same)g(heterozygosit)o(y)f(pattern)g(\(i.e.,)i(whic)o(h)g(lo)q(ci)150 1437 y(are)f(homozygous)g(and)g(heterozygous\))g(and)h(similar)g (alleles.)38 b(Therefore,)21 b(a)f(round-robin)150 1494 y(strategy)14 b(that)g(assigns)i(consecutiv)o(e)g(ro)o(ws)e(of)h Fe(R)g Fj(to)f(consecutiv)o(e)i(pro)q(cessors)f(w)o(orks)g(w)o(ell.)221 1550 y(In)i(our)f(\014rst)g(implemen)o(tation,)h(all)h(the)e(pro)q (cessors)g(participate)h(in)h(a)e(function)h(ev)m(alua-)150 1606 y(tion,)e(but)g(one)h(of)e(them)h(\(whic)o(h)h(w)o(e)f(designate)h (pro)q(cessor)f(n)o(um)o(b)q(er)g(0\))g(pla)o(ys)g(a)g(sp)q(ecial)i (role)150 1663 y(of)c(con)o(trolling)h(whic)o(h)h(pro)q(cessors)e(get)g (whic)o(h)h(parts)f(of)g Fe(R)g Fj(and)h(of)f(collecting)i(all)f(the)g (results.)221 1719 y(The)20 b(next)g(section)h(explains)h(one)e(\015a)o (w)f(with)i(the)f(static)g(loadbalancing)i(strategy)d(for)150 1776 y(partitioning)j Fe(R)e Fj(that)g(o)q(ccurs)h(in)h(some)e(data)g (sets)h(and)f(our)h(new)g(attempt)f(to)g(mak)o(e)g(the)150 1832 y(loadbalancing)d(strategy)d(more)h(general.)150 1976 y Fg(4)69 b(Adaptiv)n(e)22 b(Load)j(Balancing)150 2077 y Fj(By)15 b Ff(adaptive)j(lo)n(ad)e(b)n(alancing)e Fj(w)o(e)h(mean)g(collecting)i(p)q(erformance)f(statistics)f(during)h (a)f(pro-)150 2133 y(gram)d(run)i(and)f(using)h(those)f(statistics)h (later)f(in)h(the)f(same)g(run)h(to)f(balance)h(the)f(load)h(among)150 2190 y(di\013eren)o(t)21 b(pro)q(cessors.)36 b(The)21 b(statistics)g(w)o(e)g(collect)h(are)e(running)i(times)f(for)f(small)i (pieces)150 2246 y(of)c(eac)o(h)g(n)o(uclear)h(family)g(up)q(date.)29 b(A)18 b(theoretical)h(examination)g(of)f(our)g(\014rst)g(parallel)h (im-)150 2303 y(plemen)o(tation)f(suggested)f(that)f(there)h(could)h(b) q(e)g(signi\014can)o(t)g(load)f(im)o(balance)h(when)f(man)o(y)150 2359 y(n)o(uclear)f(families)h(had)e(the)g(prop)q(ert)o(y)g(that)g(for) f(man)o(y)h(paren)o(tal)g(genot)o(yp)q(e)g(pairs)h(\()p Fe(i;)8 b(j)s Fj(\):)206 2453 y(1.)22 b(Genot)o(yp)q(e)15 b Fe(i)g Fj(for)f(the)h(\014rst)g(paren)o(t)g(is)h(consisten)o(t)f (with)h(sp)q(ouse)f(and)h(c)o(hildren,)g(and)206 2547 y(2.)22 b(Genot)o(yp)q(e)15 b Fe(j)i Fj(for)e(the)g(second)h(paren)o(t) f(is)g(consisten)o(t)h(with)f(sp)q(ouse)h(and)f(c)o(hildren,)i(but)964 2678 y(7)p eop %%Page: 8 8 8 7 bop 206 195 a Fj(3.)22 b(Genot)o(yp)q(es)15 b Fe(i;)8 b(j)16 b Fj(are)f(not)g(sim)o(ultaneously)h(consisten)o(t)g(with)f(the) g(c)o(hildren.)221 289 y(W)l(e)g(call)g(this)h(the)f(bad-pair)g(prop)q (ert)o(y)l(.)20 b(A)15 b(pair)g(of)f(paren)o(tal)h(genot)o(yp)q(es)g (that)f(is)i(feasible)150 345 y(and)f(consisten)o(t)f(with)h(the)f(c)o (hildren)j(is)e(called)h(a)e Ff(go)n(o)n(d)h(p)n(air)p Fj(.)20 b(A)15 b(simple)g(one-c)o(hild,)i(one-lo)q(cus)150 402 y(example)f(of)f(the)g(bad-pair)g(prop)q(ert)o(y)g(o)q(ccurs)h (when)f(a)g(c)o(hild)i(has)e(a)f(heterozygous)h(genot)o(yp)q(e)150 458 y(AB.)22 b(Eac)o(h)g(paren)o(t)g(ma)o(y)f(ha)o(v)o(e)h(the)g (homozygous)g(genot)o(yp)q(e)g(AA)g(or)g(BB,)g(but)g(it)h(is)f(not)150 515 y(sim)o(ultaneously)c(p)q(ossible)h(for)d(b)q(oth)g(paren)o(ts)h (to)f(ha)o(v)o(e)g(genot)o(yp)q(e)h(AA)f(or)h(for)f(b)q(oth)g(paren)o (ts)150 571 y(to)d(ha)o(v)o(e)g(genot)o(yp)q(e)h(BB.)g(In)g(this)g (case)g(the)g(ordered)g(pairs)g(\(AA,AA\))f(and)h(\(BB,BB\))f(are)h (bad)150 628 y(pairs.)221 684 y(The)20 b(static)g(load)h(balancing)g (strategy)e(w)o(e)h(used)h(previously)h(assumed)e(that)g(the)g(v)m(ast) 150 741 y(ma)s(jorit)o(y)11 b(of)i(genot)o(yp)q(e)g(pairs)g(are)g(not)f (bad,)h(whic)o(h)h(is)g(true)e(for)h(man)o(y)f(data)g(sets)h(and)g(c)o (hoices)150 797 y(of)20 b(lo)q(ci.)36 b(It)20 b(can)g(also)g(w)o(ork)g (w)o(ell)h(if)f(the)g(bad)h(pairs)f(are)g(distributed)i(close)e(to)g (uniformly)150 853 y(among)14 b(the)g(pro)q(cessors.)20 b(Since)c(the)e(order)g(of)g(visiting)i(n)o(uclear)f(families)h(in)g (eac)o(h)e(lik)o(eliho)q(o)q(d)150 910 y(function)i(ev)m(aluation)h(is) g(\014xed,)f(the)f(determination)i(of)e(bad)h(pairs)g(dep)q(ends)h (explicitly)h(only)150 966 y(on)d(the)g(p)q(ossible)i(genot)o(yp)q(es)e (of)g(paren)o(ts)g(and)g(c)o(hildren)i(\(and)e(implicitly)j(on)d(the)h (previously)150 1023 y(visited)e(n)o(uclear)f(families,)h(whic)o(h)f (are)f(alw)o(a)o(ys)g(the)h(same\).)18 b(Th)o(us)12 b(for)g(a)g (\014xed)h(n)o(uclear)g(family)l(,)150 1079 y(the)i(set)f(of)g(bad)h (pairs)g(is)g(alw)o(a)o(ys)f(the)h(same.)k(The)c(set)g(of)f(bad)h (pairs)g(gro)o(ws)e(as)h(the)h(square)f(of)150 1136 y(the)h(n)o(um)o(b) q(er)h(of)f(join)o(t)g(genot)o(yp)q(es)g(and)g(is)h(therefore,)e(to)q (o)h(large)g(to)g(store.)221 1192 y(Since)h(the)g(bad)g(pairs)f(are)g (not)g(consisten)o(t)h(with)g(Mendelian)h(inheritance,)g(they)e (require)150 1249 y(no)g(conditional)j(probabilit)o(y)f(up)q(dates.)k (Our)16 b(static)f(load)h(balancing)h(strategy)d(did)j(not)e(dis-)150 1305 y(tinguish)e(b)q(et)o(w)o(een)g(go)q(o)q(d)f(pairs)h(and)f(bad)g (pairs)h(in)g(distributing)h(genot)o(yp)q(e)e(pairs)g(to)g(di\013eren)o (t)150 1362 y(pro)q(cessors.)19 b(P)o(erformance)11 b(is)i(hamp)q(ered) g(when)f(a)g(disprop)q(ortionate)h(n)o(um)o(b)q(er)f(of)g(go)q(o)q(d)g (pairs)150 1418 y(is)k(distributed)g(to)f(one)g(of)g(the)g(pro)q (cessors.)221 1474 y(T)l(o)d(address)h(this)g(problem,)g(w)o(e)g (compute)f(timing)i(statistics)e(for)h(eac)o(h)f(n)o(uclear)i(family)f (on)150 1531 y(one)k(of)f(the)h(early)g(function)h(ev)m(aluations.)25 b(The)17 b(ro)o(ws)f(are)g(initially)k(p)q(erm)o(uted)d(in)o(to)g (round-)150 1587 y(robin)g(order)e(as)h(in)h(our)e(static)h (loadbalancing)i(strategy)l(.)j(F)l(or)15 b(eac)o(h)h(ro)o(w)f(in)i (the)f(\(p)q(erm)o(uted)150 1644 y(v)o(ersion)g(of)t(\))f(genot)o(yp)q (e)h(matrix)g Fe(R)f Fj(de\014ned)j(in)f(Section)g(3,)e(w)o(e)h (compute)g(ho)o(w)f(m)o(uc)o(h)h(time)h(it)150 1700 y(tak)o(es)h(to)g (do)h(all)g(the)g(computation)f(for)h(all)g(the)g(pairs)g(in)g(that)f (ro)o(w.)30 b(This)19 b(includes)i(b)q(oth)150 1757 y(the)14 b(time)h(to)e(distinguish)k(go)q(o)q(d)d(pairs)g(and)g(bad)h(pairs)f (and)h(the)f(time)g(to)g(do)g(the)g(conditional)150 1813 y(probabilit)o(y)i(up)q(dates)g(for)f(the)g(go)q(o)q(d)g(pairs.)221 1870 y(In)c(subsequen)o(t)h(iterations)f(w)o(e)g(use)g(a)g(greedy)g (strategy)f(to)g(partition)h(the)h(ro)o(ws)e(in)o(to)h(pieces)150 1926 y(that)h(will)i(tak)o(e)e(roughly)h(equal)h(time.)19 b(Since)14 b(the)f(n)o(um)o(b)q(er)g(of)g(ro)o(ws)e(is)j(generally)f(m) o(uc)o(h)g(larger)150 1983 y(than)j(the)h(n)o(um)o(b)q(er)f(of)g(pro)q (cessors,)g(w)o(e)g(can)h(generally)g(\014nd)g(consecutiv)o(e)g(sets)f (of)g(ro)o(ws)g(that)150 2039 y(tak)o(e)g(roughly)g(1/p)g(of)g(the)g (total)g(time)g(eac)o(h.)23 b(W)l(e)17 b(found)f(that)g(the)g(time)h (needed)g(to)f(do)g(the)150 2095 y(\014rst)i(ro)o(w)g(on)g(eac)o(h)h (pro)q(cessor,)g(except)g(the)g(master)e(pro)q(cessor,)i(can)g(b)q(e)g (large)g(due)g(to)f(the)150 2152 y(time)f(for)g(initial)i(transfer)d (of)g(shared)h(data)g(o)o(v)o(er)f(the)h(net)o(w)o(ork.)24 b(Therefore,)16 b(w)o(e)h(arti\014cially)150 2208 y(set)e(the)h(time)g (for)f(the)h(\014rst)f(ro)o(w)g(to)g(b)q(e)i(exactly)f(that)f(for)g (the)g(second)i(ro)o(w)d(when)j(doing)f(the)150 2265 y(adaptiv)o(e)h(ro)o(w)e(partitioning)j(to)e(b)q(e)h(used)h(in)f(later) g(function)g(ev)m(aluations.)26 b(The)17 b(amoun)o(t)e(of)150 2321 y(space)h(required)g(to)f(store)g(the)g(ro)o(w)g(times)g(is)h (linear)h(in)f(the)g(n)o(um)o(b)q(er)g(of)f(genot)o(yp)q(es;)g(if)h (space)150 2378 y(is)g(tigh)o(t,)e(w)o(e)h(can)g(get)g(rid)h(of)f(the)g (information)g(once)h(the)f(partitions)h(are)f(computed.)221 2434 y(When)23 b(b)q(oth)h(the)g(adaptiv)o(e)f(loadbalancing)j(and)d (the)h(parallel)h(gradien)o(t)f(estimation)150 2491 y(strategies)14 b(are)h(used,)g(one)g(cannot)g(collect)h(accurate)e(timing)i (measuremen)o(ts)e(un)o(til)i(the)f(\014rst)150 2547 y(function)i(ev)m(aluation)h(after)e(the)h(\014rst)f(gradien)o(t)h (estimation.)24 b(If)17 b(there)f(are)h Fe(k)g Fj(lo)q(ci,)h(this)f (will)964 2678 y(8)p eop %%Page: 9 9 9 8 bop 150 195 a Fj(b)q(e)22 b(the)f(\()p Fe(k)15 b Fj(+)g(1\))20 b(st)h(lik)o(eliho)q(o)q(d)k(function)d(ev)m(aluation.)39 b(The)22 b(reasons)e(are)h(that)g(w)o(e)g(w)o(an)o(t)150 252 y(to)16 b(do)g(measuremen)o(ts)g(when)g(all)i(pro)q(cessors)e(w)o (ork)f(together)g(on)i(the)f(function)h(ev)m(aluation,)150 308 y(but)h(a)f(few)g(sp)q(ecial)j(things)d(happ)q(en)i(on)f(the)f (\014rst)g(function)i(ev)m(aluation)f(whic)o(h)h(distort)e(the)150 364 y(timing;)22 b(also,)e(the)f(second)h(through)f(\()p Fe(k)14 b Fj(+)f(1\)st)18 b(ev)m(aluations)i(estimate)g(the)f(\014rst)g (gradien)o(t)150 421 y(and)e(ma)o(y)g(ha)o(v)o(e)g(only)h(a)f(subset)g (of)g(the)g(pro)q(cessors)g(w)o(orking)g(on)h(eac)o(h)f(lik)o(eliho)q (o)q(d)j(function)150 477 y(ev)m(aluation.)i(If)15 b Fe(k)i Fj(is)e(3)g(or)g(4,)g(the)g(t)o(ypical)h(n)o(um)o(b)q(er)g(of)f (function)h(ev)m(aluations)h(is)f(ab)q(out)f(30)f(or)150 534 y(40)k(resp)q(ectiv)o(ely)l(.)31 b(Roughly)18 b(1/10th)f(of)h(the)h (function)g(ev)m(aluations)g(m)o(ust)f(b)q(e)h(done)g(with)f(a)150 590 y(static)f(loadbalancing)i(strategy)l(.)25 b(Therefore,)18 b(it)f(is)h(still)h(necessary)e(to)g(ha)o(v)o(e)g(a)g(go)q(o)q(d)g (static)150 647 y(loadbalancing)g(strategy)d(and)h(in)o(tegrate)g(it)g (with)h(the)f(adaptiv)o(e)h(strategy)l(.)221 703 y(Due)i(to)g(the)h (need)h(to)e(transfer)g(data)g(o)o(v)o(er)g(the)h(net)o(w)o(ork,)f(the) g(extra)h(time)g(needed)h(for)150 760 y(the)15 b(\014rst)f(ro)o(w)g(ma) o(y)g(b)q(e)h(large)g(enough)g(that)f(it)g(is)i(b)q(etter)e(to)g(ha)o (v)o(e)h(only)g(the)g(master)e(w)o(ork)h(on)150 816 y(a)i(particular)g (n)o(uclear)h(family)l(.)23 b(W)l(e)17 b(use)f(a)g(user-sp)q(eci\014ed) i(threshold)f(of)e(\(\(20)10 b(+)h(10)p Fe(p)p Fj(\))p Fe(p=)p Fj(\()p Fe(p)e Fb(\000)150 873 y Fj(1\)\)msec)18 b(on)i(the)f(\\n)o(uclear)h(family)g(o)o(v)o(erhead")e(to)h(determine)h (whether)f(a)g(n)o(uclear)h(family)150 929 y(requires)11 b(enough)g(computation)g(to)f(justify)h(splitting)h(up)f(the)g(w)o (ork.)17 b(The)11 b(threshold)g(function)150 985 y(attempts)f(to)g (balance)h(t)o(w)o(o)e(considerations.)20 b(First,)10 b(the)h(comm)o(unication)g(time)g(to)f(share)h(data)150 1042 y(go)q(es)i(up)h(with)f(the)h(n)o(um)o(b)q(er)f(of)g(pro)q (cessors)g(|)f(this)i(accoun)o(ts)f(for)g(the)g(20)6 b(+)g(10)p Fe(p)12 b Fj(term,)h(whic)o(h)150 1098 y(increases)18 b(with)g Fe(p)p Fj(.)27 b(Second,)19 b(the)e(o)o(v)o(erhead)h(can)f(b)q (e)h(amortized)g(b)q(etter)g(as)f(the)g(n)o(um)o(b)q(er)h(of)150 1155 y(pro)q(cessors)e(increases)i(b)q(ecause)f(there)g(are)f(more)g (pro)q(cessors)h(to)f(share)g(the)h(computational)150 1211 y(w)o(ork)d(|)h(this)g(accoun)o(ts)g(for)g(the)g Fe(p=)p Fj(\()p Fe(p)9 b Fb(\000)i Fj(1\))j(term,)h(whic)o(h)h (decreases)f(with)h Fe(p)p Fj(.)150 1355 y Fg(5)69 b(P)n(arallel)21 b(Gradien)n(t)i(Estimation)150 1456 y Fj(Our)18 b(second)g(impro)o(v)o (emen)o(t)f(in)i(parallel)g(ILINK)g(is)f(to)f(p)q(erform)g(lik)o(eliho) q(o)q(d)j(function)f(ev)m(al-)150 1512 y(uations)i(in)h(parallel)h (during)f(estimation)f(of)g(the)g(gradien)o(t.)38 b(The)21 b(optimization)h(pac)o(k)m(age)150 1569 y(GEMINI)d(uses)g(t)o(w)o(o)e (di\013eren)o(t)i(metho)q(ds)f(to)g(estimate)h(the)f(gradien)o(t,)h (forw)o(ard)f(di\013erences)150 1625 y(and)j(cen)o(tral)f (di\013erences.)37 b(In)21 b(eac)o(h)f(case,)h(it)g(p)q(erturbs)g(the)f (comp)q(onen)o(ts)h(of)f(the)g(curren)o(t)150 1682 y(candidate)g Fe(\022)g Fj(one)f(dimension)h(at)e(a)h(time)g(b)o(y)g(a)f(small)i (amoun)o(t,)e Fe(h)1354 1689 y Fc(i)1387 1682 y Fj(for)g(dimension)j Fe(i)p Fj(,)e(and)150 1738 y(estimates)c(that)f(comp)q(onen)o(t,)g Fe(g)714 1745 y Fc(i)728 1738 y Fj(,)h(of)f(the)h(gradien)o(t)f(b)o(y)h (the)g(observ)o(ed)g(rate)f(of)g(c)o(hange)h(in)h(the)150 1795 y(lik)o(eliho)q(o)q(d)i(function.)i(In)c(forw)o(ard)d (di\013erences,)j Fe(g)1031 1802 y Fc(i)1060 1795 y Fj(is)f(computed)g (as)g(\()p Fe(f)5 b Fj(\()p Fe(\022)11 b Fj(+)e Fe(h)1535 1802 y Fc(i)1550 1795 y Fj(\))g Fb(\000)h Fe(f)5 b Fj(\()p Fe(\022)q Fj(\)\))p Fe(=h)1774 1802 y Fc(i)1787 1795 y Fj(,)150 1851 y(where)18 b Fe(\022)13 b Fj(+)f Fe(h)391 1858 y Fc(i)423 1851 y Fj(means)18 b(add)f Fe(h)681 1858 y Fc(i)713 1851 y Fj(to)g(only)h(the)g Fe(i)p Fj(th)f(comp)q(onen)o(t)h (of)f Fe(\022)q Fj(.)28 b(In)18 b(cen)o(tral)g(di\013erences)150 1908 y Fe(g)172 1915 y Fc(i)204 1908 y Fj(is)g(computed)g(as)f(\()p Fe(f)5 b Fj(\()p Fe(\022)13 b Fj(+)g Fe(h)693 1915 y Fc(i)707 1908 y Fj(\))e Fb(\000)i Fe(f)5 b Fj(\()p Fe(\022)13 b Fb(\000)f Fe(h)936 1915 y Fc(i)950 1908 y Fj(\)\))p Fe(=)p Fj(2)p Fe(h)1058 1915 y Fc(i)1071 1908 y Fj(.)28 b(Cen)o(tral)18 b(di\013erences)h(are)e(more)g(time-)150 1964 y(consuming)h(than)f(forw)o(ard)e(di\013erences)k(b)q(ecause)f (they)f(require)h(t)o(wice)f(as)g(man)o(y)f(lik)o(eliho)q(o)q(d)150 2021 y(function)h(ev)m(aluations.)24 b(The)17 b(merits)f(of)g(b)q(oth)h (metho)q(ds)f(in)h(LINKA)o(GE)g(are)f(discussed)i(and)150 2077 y(analyzed)k(exp)q(erimen)o(tally)h(in)e([14].)36 b(The)21 b(curren)o(tly)h(distributed)g(v)o(ersions)f(of)g(ILINK)h(in) 150 2133 y(b)q(oth)15 b(LINKA)o(GE)h(and)f(F)-5 b(ASTLINK)16 b(start)e(using)i(forw)o(ard)d(di\013erences)j(and)g(switc)o(h)f(to)f (cen-)150 2190 y(tral)h(di\013erences)h(if)g(successiv)o(e)g(v)m(alues) h(of)d Fe(\022)j Fj(app)q(ear)f(su\016cien)o(tly)g(similar.)221 2246 y(As)d(suggested)g(b)o(y)h(Miller)h(et)e(al.)h([18)o(])f(in)h(the) g(con)o(text)f(of)g(LINKMAP)l(,)h(p)q(erforming)g(lik)o(eli-)150 2303 y(ho)q(o)q(d)f(function)h(ev)m(aluations)g(in)g(parallel)g(is)f(a) g(go)q(o)q(d)g(strategy)l(.)18 b(Ho)o(w)o(ev)o(er,)12 b(in)h(their)h(tests)e(they)150 2359 y(had)19 b(enough)h(function)g(ev) m(aluations)h(to)d(assign)i(eac)o(h)f(ev)m(aluation)i(to)d(only)i(one)g (pro)q(cessor.)150 2416 y(Di\013eren)o(t)c(pro)q(cessors)f(w)o(orking)h (on)f(di\013eren)o(t)h(function)h(ev)m(aluations)g(do)f(not)f(ha)o(v)o (e)h(to)f(share)150 2472 y(data,)e(eliminating)k(signi\014can)o(t)e (amoun)o(ts)f(of)f(comm)o(unication.)21 b(F)l(or)13 b(t)o(w)o(o)g (di\013eren)o(t)i(v)m(alues)g(of)150 2529 y(the)h Fe(\022)i Fj(v)o(ector,)d Fe(\022)439 2536 y Fd(1)475 2529 y Fj(and)h Fe(\022)585 2536 y Fd(2)605 2529 y Fj(,)g(the)g(running)i(time)e(to)f (compute)i Fe(f)5 b Fj(\()p Fe(\022)1296 2536 y Fd(1)1316 2529 y Fj(\))15 b(and)i Fe(f)5 b Fj(\()p Fe(\022)1505 2536 y Fd(2)1524 2529 y Fj(\))16 b(on)g(the)g(same)964 2678 y(9)p eop %%Page: 10 10 10 9 bop 150 195 a Fj(p)q(edigree)18 b(should)f(b)q(e)f(roughly)h(the)f (same,)f(pro)o(vided)i(that)f(neither)h Fe(\022)1376 202 y Fd(1)1412 195 y Fj(nor)e Fe(\022)1514 202 y Fd(2)1550 195 y Fj(has)h(an)o(y)g(zero)150 252 y(comp)q(onen)o(ts.)k(The)15 b(structure)f(of)g(GEMINI)h(prohibits)g Fe(\022)h Fj(comp)q(onen)o(ts)f (from)f(going)h(to)e(zero,)150 308 y(so)h(w)o(e)f(can)h(get)g (reasonably)g(go)q(o)q(d)g(loadbalance)h(pro)o(vided)g(the)f(same)f(n)o (um)o(b)q(er)i(of)e(pro)q(cessors)150 364 y(w)o(ork)h(on)h(eac)o(h)h (lik)o(eliho)q(o)q(d)i(ev)m(aluation)e(going)f(on)g(in)i(parallel.)221 421 y(As)e(a)g(side)i(remark,)d(it)i(is)g(w)o(orth)f(con)o(trasting)g (the)g(opp)q(ortunit)o(y)h(for)f(parallel)i(lik)o(eliho)q(o)q(d)150 477 y(function)f(ev)m(aluations)g(in)h(ILINK)f(to)f(that)g(in)h (LINKMAP)l(.)g(In)f(ILINK)i(only)f(those)f(function)150 534 y(ev)m(aluations)23 b(used)f(for)e(gradien)o(t)i(estimation)g(can)f (b)q(e)h(done)g(in)g(parallel,)j(but)c(it)h(app)q(ears)150 590 y(safe)16 b(to)g(assume)g(that)g(those)g(that)f(can)i(b)q(e)g(done) g(in)g(parallel)h(will)g(tak)o(e)d(appro)o(ximately)i(the)150 647 y(same)e(amoun)o(t)g(of)g(time.)21 b(In)16 b(LINKMAP)l(,)g(all)g (the)g(lik)o(eliho)q(o)q(d)i(function)e(ev)m(aluations)h(can)e(b)q(e) 150 703 y(done)i(in)h(parallel,)g(but)f(virtually)h(ev)o(ery)e(run)h (of)g(LINKMAP)g(done)h(in)f(practice)g(con)o(tains)g(1)150 760 y(or)h(2)h(function)g(ev)m(aluations)h(with)f(at)f(least)h(one)g (zero)g(comp)q(onen)o(t.)30 b(Th)o(us,)20 b(as)e(w)o(e)h(lo)q(ok)g(to) 150 816 y(extend)h(our)e(parallel)j(ILINK)f(implemen)o(tation)h(to)d (LINKMAP)l(,)i(the)f(abilit)o(y)h(to)e(in)o(tegrate)150 873 y(doing)f(m)o(ultiple)g(ev)m(aluations)h(on)e(separate)f(pro)q (cessors)h(and)g(doing)h(a)e(single)j(ev)m(aluation)f(on)150 929 y(m)o(ultiple)g(pro)q(cessors)e(will)i(b)q(e)f(crucial.)221 985 y(T)o(ypical)h(ILINK)h(problems)f(ha)o(v)o(e)f(3)h(or)f(4)g(lo)q (ci)i(and)e(hence)i(2)e(or)g(3)g(dimensions)i(in)g(the)e Fe(\022)150 1042 y Fj(v)o(ector.)26 b(Larger)17 b(problems)h(are)f (generally)i(prohibitiv)o(e)g(in)f(time)g(\(ev)o(en)f(with)h(F)-5 b(ASTLINK\))150 1098 y(and)13 b(space.)20 b(It)13 b(is)g(not)g(un)o (usual)h(for)f(sequen)o(tial)h(ILINK)h(runs)e(to)f(tak)o(e)h(w)o(eeks;) g(b)q(ecause)h(of)f(the)150 1155 y(need)h(to)f(run)h(man)o(y)f (di\013eren)o(t)h(tests,)f(w)o(e)g(pic)o(k)o(ed)i(ILINK)g(instances)f (of)f(mo)q(derate)g(size)i(to)e(use)150 1211 y(in)f(our)f(timing)h(exp) q(erimen)o(ts.)19 b(Because)12 b(ILINK)h(problems)f(are)f(lo)o (w-dimensional)i(\(unlik)o(e)g(the)150 1268 y(applications)k(of)d (GEMINI)h(considered)h(in)g([2)o(]\),)e(w)o(e)h(often)g(ha)o(v)o(e)f (more)h(pro)q(cessors)f(a)o(v)m(ailable)150 1324 y(than)j(lik)o(eliho)q (o)q(d)i(ev)m(aluations)f(to)e(do.)24 b(T)l(o)17 b(balance)h(the)e (load,)h(w)o(e)g(w)o(an)o(t)e(the)i(same)g(n)o(um)o(b)q(er)150 1381 y(of)e(pro)q(cessors)g(to)f(w)o(ork)g(on)i(eac)o(h)f(lik)o(eliho)q (o)q(d)j(function)e(ev)m(aluation.)221 1437 y(T)l(o)d(assign)h(the)g (function)h(ev)m(aluations)g(to)e(pro)q(cessor)g(sets,)h(w)o(e)f(use)h (the)g(follo)o(wing)h(greedy)150 1494 y(algorithm.)34 b(Let)20 b Fe(n)g Fj(b)q(e)g(the)g(n)o(um)o(b)q(er)g(of)g(ev)m (aluations)h(needed)g(to)e(estimate)g(the)h(gradien)o(t.)150 1550 y(Let)e Fe(p)g Fj(b)q(e)h(the)f(n)o(um)o(b)q(er)g(of)g(pro)q (cessors.)28 b(Find)19 b(the)f(largest)g(in)o(teger,)g Fe(l)g(<)p Fj(=)h Fe(n)f Fj(that)f(divides)150 1606 y Fe(p)p Fj(.)34 b(Assign)21 b(the)f(\014rst)f Fe(l)i Fj(ev)m(aluations)g (to)e(disjoin)o(t)i(sets)f(of)f Fe(p=l)h Fj(pro)q(cessors.)34 b(If)21 b Fe(n)g(>)g(l)q Fj(,)f(the)150 1663 y(remaining)h Fe(n)14 b Fb(\000)f Fe(l)21 b Fj(function)f(ev)m(aluations)i(are)d (done)i(one)f(at)f(a)h(time,)h(with)f(all)h(pro)q(cessors)150 1719 y(participating.)34 b(This)21 b(algorithm)e(has)h(the)g(adv)m(an)o (tage)f(that)g(all)i(the)e(pro)q(cessors)h(are)f(k)o(ept)150 1776 y(busy)l(,)f(but)g(it)g(has)f(the)h(disadv)m(an)o(tage)f(that)g (if)h(the)g(n)o(um)o(b)q(er)f(of)h(pro)q(cessors)f(is)h(not)f (divisible)150 1832 y(b)o(y)e(2)g(or)g(3,)f(w)o(e)h(do)g(not)g(do)g(an) o(y)g(function)h(ev)m(aluations)g(in)g(parallel.)221 1889 y(As)i(a)g(simple)i(example,)g(supp)q(ose)f(w)o(e)f(w)o(an)o(t)g (to)f(p)q(erform)i(3)f(function)h(ev)m(aluations)h(and)150 1945 y(w)o(e)15 b(ha)o(v)o(e)f(8)h(pro)q(cessors.)20 b(W)l(e)15 b(do)g(the)g(\014rst)g(2)g(ev)m(aluations)h(in)g(parallel)g (on)f(4)g(pro)q(cessors)g(eac)o(h)150 2002 y(and)g(do)h(the)f(third)h (ev)m(aluation)g(on)f(all)h(8)f(pro)q(cessors.)221 2058 y(T)l(o)22 b(co)q(ordinate)h(the)g(function)g(ev)m(aluations,)i(w)o(e)e (designate)g(a)f Ff(master)h Fj(pro)q(cessor)g(for)150 2115 y(eac)o(h)15 b(ev)m(aluation)h(that)e(pla)o(ys)h(the)g(same)g (organizing)g(role)g(that)f(pro)q(cessor)h(0)g(pla)o(ys)g(when)g(all) 150 2171 y(pro)q(cessors)e(w)o(ork)g(together.)19 b(A)14 b(few)f(pieces)i(of)f(global)g(data,)f(suc)o(h)h(as)g(the)g(candidate)g Fe(\022)i Fj(m)o(ust)150 2227 y(b)q(e)j(di\013eren)o(t)f(for)g(the)g (di\013eren)o(t)g(ev)m(aluations)h(going)f(on)g(sim)o(ultaneously)l(.) 30 b(W)l(e)19 b(made)f(these)150 2284 y(data)c(in)o(to)h(arra)o(ys)e (\(or)h(if)h(they)g(w)o(ere)f(already)h(arra)o(ys,)e(increased)j(the)f (dimension)h(b)o(y)f(1\))f(that)150 2340 y(can)i(b)q(e)h(indexed)h(b)o (y)e(the)g(ev)m(aluation)h(n)o(um)o(b)q(er.)23 b(Eac)o(h)16 b(pro)q(cessor)g(kno)o(ws)g(whic)o(h)h(ev)m(aluation)150 2397 y(it)i(is)h(w)o(orking)f(on)g(and)g(whic)o(h)h(pro)q(cessor)e(is)i (its)f(master,)g(and)g(uses)h(these)f(t)o(w)o(o)f(indices)j(to)150 2453 y(kno)o(w)c(from)f(where)i(to)f(get)f(its)i(data)f(and)g(with)h (whic)o(h)g(pro)q(cessor)f(it)g(m)o(ust)g(sync)o(hronize)i(to)150 2510 y(share)c(data.)952 2678 y(10)p eop %%Page: 11 11 11 10 bop 221 195 a Fj(When)13 b(the)g(gradien)o(t)g(phase)g(is)g(o)o (v)o(er,)g(w)o(e)f(start)g(the)h(next)g(iteration)g(where)g(all)h(pro)q (cessors)150 252 y(w)o(ork)g(on)h(one)h(function)g(ev)m(aluation)g(at)f (a)g(time.)150 395 y Fg(6)69 b(Metho)r(ds)23 b(and)h(Other)e(Impro)n(v) n(emen)n(ts)150 496 y Fj(W)l(e)g(ev)m(aluated)h(the)e(p)q(erformance)h (of)g(our)f(new)h(implemen)o(tation)h(of)e(parallel)j(ILINK)f(on)150 553 y(a)e(net)o(w)o(ork)f(m)o(ulticomputer.)38 b(The)21 b(co)q(de)g(is)h(also)f(easily)h(p)q(ortable)f(to)g(a)f(shared-memory) 150 609 y(m)o(ultipro)q(cessor;)13 b(w)o(e)f(v)o(eri\014ed)h(this)g (claim)g(on)f(an)g(SGI)g(mac)o(hine.)20 b(A)12 b(net)o(w)o(ork)f(m)o (ulticomputer)150 666 y(is)g(simply)g(a)f(cluster)h(of)f(ordinary)h(w)o (orkstations)e(connected)i(b)o(y)f(a)g(general-purp)q(ose)i(lo)q(cal)g (area)150 722 y(net)o(w)o(ork,)j(suc)o(h)i(as)e(A)l(TM)h(\(whic)o(h)h (stands)f(for)f(Async)o(hronous)i(T)l(ransfer)f(Mo)q(de\),)f(Ethernet,) 150 779 y(or)e(FDDI)g(\(whic)o(h)i(stands)e(for)g(Fib)q(er)h (Distributed)h(Data)e(In)o(terface)g(and)h(is)g(a)g(100)e(Megabit/s)150 835 y(lo)q(cal)19 b(area)f(net)o(w)o(ork)f(in)j(whic)o(h)f(the)f (stations)g(are)g(connected)h(in)g(the)g(form)e(of)h(a)g(ring\).)29 b(In)150 891 y(con)o(trast,)21 b(a)g(shared-memory)g(m)o(ultipro)q (cessor)h(is)g(a)f(single)i(mac)o(hine)f(con)o(taining)g(sev)o(eral)150 948 y(pro)q(cessors)f(that)g(are)g(connected)h(b)o(y)g(a)f(sp)q (ecially-designed)k(bus)d(or)f(dedicated)h(net)o(w)o(ork.)150 1004 y(Some)17 b(tradeo\013s)f(b)q(et)o(w)o(een)h(these)g(t)o(w)o(o)f (t)o(yp)q(es)h(of)f(parallel)j(computers)e(are)g(discussed)h(in)g(the) 150 1061 y(Metho)q(ds)d(section)h(of)f([5)o(].)221 1117 y(In)g(a)f(net)o(w)o(ork)g(m)o(ulticomputer,)h(pro)q(cessors)f(comm)o (unicate)h(b)o(y)g(passing)g(messages)f(with)150 1174 y Fa(send)d Fj(and)i Fa(receive)e Fj(op)q(erations,)h(while)i(a)d (shared-memory)h(m)o(ultipro)q(cessor)h(supp)q(orts)f(com-)150 1230 y(m)o(unication)22 b(b)o(y)f(reading)h(and)g(writing)f(globally)i (accessible)g(memory)l(.)38 b(Most)20 b(sequen)o(tial)150 1287 y(programs,)e(including)j(ILINK,)f(are)e(more)g(easily)i (parallelized)h(b)o(y)e(writing)g(co)q(de)g(in)h(terms)150 1343 y(of)15 b(shared)h(memory)l(.)21 b(T)l(o)16 b(use)g(message)f (passing,)h(the)g(programmer)e(m)o(ust)i(write)g(additional)150 1400 y(co)q(de)h(to)f(cop)o(y)g(data)g(in)o(to)g(and)h(out)f(of)g (message)g(bu\013ers)h(and)f(p)q(erform)g Fa(send)g Fj(and)h Fa(receive)150 1456 y Fj(op)q(erations.)221 1512 y(T)l(o)d(enable)i (programmers)e(to)g(use)i(net)o(w)o(orks)d(of)i(computers)g(without)g (writing)g(message-)150 1569 y(passing)i(programs)e(w)o(e)i(ha)o(v)o(e) f(dev)o(elop)q(ed)i(a)e(soft)o(w)o(are)f Ff(distribute)n(d)j(shar)n(e)n (d)f(memory)k Fj(\(DSM\))150 1625 y(system)15 b(for)g(net)o(w)o(ork)f (m)o(ulticomputers)i(called)h(T)l(readMarks)e([9)o(].)20 b(In)c(essence,)g(T)l(readMarks)150 1682 y(pro)o(vides)22 b(a)g(shared)f(memory)h(abstraction)f(to)g(the)h(programmer,)g(and)g (implemen)o(ts)h(this)150 1738 y(abstraction)f(e\016cien)o(tly)i(using) g(the)e(underlying)j(message)d(passing)h(system)g([8)o(,)f(4].)42 b(The)150 1795 y(programmer)13 b(writes)i(the)f(parallel)i(program)d (as)h(if)h(it)g(w)o(ere)f(in)o(tended)h(for)f(a)g(shared-memory)150 1851 y(m)o(ultipro)q(cessor,)e(but)f(the)g(T)l(readMarks)f(system)g (enables)i(the)f(program)f(to)g(run)i(on)e(a)h(net)o(w)o(ork)150 1908 y(m)o(ulticomputer.)221 1964 y(Since)16 b(w)o(e)e(did)i(the)e(p)q (erformance)h(measuremen)o(ts)g(on)f(our)g(\014rst)h(parallel)h(ILINK,) g(T)l(read-)150 2021 y(Marks)e(has)h(b)q(een)h(impro)o(v)o(ed)f(in)g(v) m(arious)h(w)o(a)o(ys.)j(Some)14 b(of)h(the)g(impro)o(v)o(emen)o(ts)f (are)h(impro)o(v)o(e-)150 2077 y(men)o(ts)i(in)i(functionalit)o(y)g (whic)o(h)f(w)o(ere)g(necessitated)g(b)o(y)g(the)g(algorithms)f(used)h (in)h(the)f(new)150 2133 y(ILINK)c(as)d(w)o(ell)i(as)e(another)h (application)h(program.)18 b(Other)12 b(c)o(hanges)g(w)o(ere)g(impro)o (v)o(emen)o(ts)f(in)150 2190 y(the)16 b(basic)h(comm)o(unication)f (proto)q(cols)g(used)h(in)g(T)l(readMarks.)k(T)l(o)15 b(mak)o(e)h(the)g(comparisons)150 2246 y(fair)f(w)o(e)f(also)h(con)o (tin)o(ued)h(to)e(use)h(sequen)o(tial)i(co)q(de)e(based)g(on)g(v)o (ersion)g(1.0)f(of)g(F)-5 b(ASTLINK)16 b(as)150 2303 y(in)g(our)f(previous)h(parallel)h(implemen)o(tation.)221 2359 y(The)d(curren)o(t)f(v)o(ersion)h(of)f(T)l(readMarks)g(can)h(pro)o (vide)g(accurate)g(statistics)g(on)f(ho)o(w)g(man)o(y)150 2416 y(messages)j(are)g(sen)o(t)h(and)g(ho)o(w)f(man)o(y)g(b)o(ytes)g (they)h(con)o(tain.)24 b(It)17 b(also)g(comes)f(with)h(a)f(pro\014ler) 150 2472 y(to)q(ol)h(that)g(pro)o(vides)h(a)f(transcript)h(of)f(where)h (comm)o(unication)g(o)q(ccurs)g(to)f(sim)o(ulate)h(shared)150 2529 y(memory)d(o)o(v)o(er)f(the)h(net)o(w)o(ork.)952 2678 y(11)p eop %%Page: 12 12 12 11 bop 221 195 a Fj(W)l(e)17 b(used)h(the)g(output)g(of)f(the)g(T)l (readMarks)g(pro\014ler)h(to)f(guide)i(\014v)o(e)f(minor)g(c)o(hanges)f (in)150 252 y(the)22 b(ILINK)h(implemen)o(tation)g(to)d(reduce)j(the)f (amoun)o(t)e(of)h(comm)o(unication.)40 b(W)l(e)22 b(w)o(ould)150 308 y(exp)q(ect)f(that)f(on)h(an)o(y)f(system)g(suc)o(h)h(as)f(T)l (readMarks)g(some)g(minor)h(tuning)g(is)g(helpful)i(to)150 364 y(adjust)d(a)h(parallel)h(implemen)o(tation)g(to)e(the)h (parameters)f(and)h(implemen)o(tation)h(features)150 421 y(of)e(that)g(parallel)j(system.)36 b(The)21 b(c)o(hanges)f(w)o(e)h (made)f(to)g(tune)i(for)e(T)l(readMarks)f(come)i(in)150 477 y(t)o(w)o(o)f(forms.)39 b(Three)22 b(c)o(hanges)g(essen)o(tially)h (rearranged)e(the)h(initialization)j(of)c(some)h(data)150 534 y(structures,)e(so)f(that)f(they)i(are)f(computed)h(on)f(the)h(pro) q(cessor\(s\))e(that)h(need\(s\))g(the)h(data.)150 590 y(Tw)o(o)13 b(other)h(c)o(hanges)g(rearranged)g(the)g(declarations)h (of)f(certain)h(small)g(arra)o(ys,)e(so)g(that)h(they)150 647 y(are)g(forced)g(on)o(to)g(the)g(same)g(page)g(of)g(memory)l(.)20 b(The)14 b(memory)g(up)q(dates)h(in)g(T)l(readMarks)e(are)150 703 y(done)20 b(on)f(a)g(page-b)o(y-page)g(basis,)h(so)f(there)h(are)f (circumstances)h(where)f(ha)o(ving)h(t)o(w)o(o)e(data)150 760 y(structures)g(on)h(the)g(same)g(page)f(of)h(memory)f(enables)i(T)l (readMarks)e(to)g(comm)o(unicate)h(the)150 816 y(up)q(date)d(with)g(a)f (single)i(message,)e(instead)h(of)f(t)o(w)o(o)f(messages.)21 b(These)16 b(c)o(hanges)f(reduced)i(the)150 873 y(comm)o(unication)22 b(on)f(all)i(data)d(sets;)k(the)d(running)i(time)f(impro)o(v)o(emen)o (t)f(w)o(as)f(m)o(uc)o(h)h(more)150 929 y(signi\014can)o(t)h(on)g(the)f (BAD)h(data)f(set)g(\(describ)q(ed)i(in)g(next)e(section\))h(than)f(on) h(an)o(y)f(of)g(the)150 985 y(others.)30 b(W)l(e)18 b(used)i(the)e(new) h(co)q(de,)h(instrumen)o(ted)f(so)f(that)g(it)h(do)q(es)g(static)f (loadbalancing)150 1042 y(and)d(no)h(parallel)g(gradien)o(t)g(ev)m (aluations,)g(for)e(our)h(baseline)i(sp)q(eedup)g(measuremen)o(ts)e(in) h(the)150 1098 y(next)e(section.)20 b(This)15 b(is)f(b)q(ecause)h(our)f (primary)g(purp)q(ose)h(is)f(to)g(measure)g(the)g(e\013ectiv)o(eness)g (of)150 1155 y(our)h(t)o(w)o(o)f(ma)s(jor)f(algorithmic)k(impro)o(v)o (emen)o(ts.)221 1211 y(The)h(net)o(w)o(ork)f(m)o(ulticomputer)i(used)g (to)f(p)q(erform)g(our)g(ev)m(aluation)i(of)d(parallel)j(ILINK)150 1268 y(consists)d(of)f(8)g(DECStation-5000/240)d(w)o(orkstations,)i (eac)o(h)i(with)f(24)g(Mb)o(ytes)g(of)g(memory)l(,)150 1324 y(running)j(the)f(Ultrix)h(v)o(ersion)f(4.3)f(op)q(erating)i (system.)27 b(All)20 b(of)d(the)h(w)o(orkstations)f(are)h(con-)150 1381 y(nected)k(to)e(an)h(Ethernet)g(and)g(a)g(high-sp)q(eed)i(A)l(TM)d (net)o(w)o(ork.)37 b(T)l(readMarks)20 b(can)h(utilize)150 1437 y(either)c(the)f(Ethernet)g(or)f(the)h(A)l(TM)g(net)o(w)o(ork.)21 b(The)c(in)o(terface)f(for)f(Ethernet)h(is)h(a)e(standard)150 1494 y(comp)q(onen)o(t)d(of)g(the)g(w)o(orkstation.)17 b(An)c(imp)q(ortan)o(t)e(di\013erence)j(b)q(et)o(w)o(een)e(Ethernet)g (and)g(A)l(TM)150 1550 y(is)h(that)f(on)g(an)h(Ethernet)f(the)g(pac)o (k)o(ets)g(in)i(the)e(comm)o(unication)h(medium)h(are)e(a)o(v)m (ailable)i(to)e(all)150 1606 y(the)17 b(pro)q(cessors,)g(while)h(on)f (A)l(TM)g(the)g(comm)o(unication)g(is)h(p)q(oin)o(t-to-p)q(oin)o(t.)26 b(The)17 b(p)q(oin)o(t-to-)150 1663 y(p)q(oin)o(t)f(comm)o(unication)h (can)f(b)q(e)h(exploited)g(b)o(y)f(algorithms,)g(suc)o(h)g(as)g(our)f (parallel)j(gradien)o(t)150 1719 y(computation,)k(that)f(partition)g (the)g(net)o(w)o(ork)f(in)o(to)i(pieces)g(in)g(whic)o(h)g(no)f(comm)o (unication)150 1776 y(go)q(es)15 b(across)g(the)g(pieces.)22 b(The)16 b(in)o(terface)g(for)e(A)l(TM)h(is)h(a)f(F)l(ore)g(Systems)h (TCA-100)e(net)o(w)o(ork)150 1832 y(adapter)f(card)g(supp)q(orting)g (comm)o(unication)h(at)f(100)f(Megabit/s.)19 b(In)13 b(addition,)h(w)o(e)f(used)h(the)150 1889 y(same)h(compiler,)h(gcc)f (2.4.5)f(with)h(-g3)g(-O2)h(\015ag)e(for)h(optimization,)h(with)f(b)q (oth)h(net)o(w)o(orks.)221 1945 y(The)e(shared-memory)g(m)o(ultipro)q (cessor)h(used)f(to)g(c)o(hec)o(k)g(the)h(correctness)f(of)f(our)h (parallel)150 2002 y(ILINK)20 b(is)g(a)e(Silicon)j(Graphics)f(Iris)f (4D/380)e(memory)h(running)i(the)f(IRIX)g(Release)h(4.0.5)150 2058 y(System)d(V)f(op)q(erating)h(system.)24 b(This)17 b(mac)o(hine)h(has)e(8)g(pro)q(cessors)h(that)f(comm)o(unicate)h(via) 150 2115 y(a)f(dedicated)h(bus.)23 b(Unfortunately)l(,)17 b(the)f(pro)q(cessors)g(on)g(this)h(SGI)f(mac)o(hine)h(are)f(somewhat) 150 2171 y(slo)o(w)o(er)21 b(than)g(our)h(DECStation)f(pro)q(cessors)g (and)g(w)o(e)h(w)o(ere)f(not)g(able)h(to)f(get)g(single-user)150 2227 y(access)h(to)f(the)g(mac)o(hine)i(for)e(long)h(enough)g(p)q(erio) q(ds)h(of)e(time)h(to)f(do)g(meaningful)i(timing)150 2284 y(measuremen)o(ts.)221 2340 y(T)l(readMarks)e(is)j(still)g(under)f (dev)o(elopmen)o(t,)i(but)e(an)g(early)g(v)o(ersion)g(is)g(a)o(v)m (ailable)i(for)150 2397 y(license.)31 b(W)l(e)18 b(ha)o(v)o(e)g(tried)g (to)g(k)o(eep)g(the)g(cost)g(of)g(a)f(license)k(lo)o(w)d(for)f(univ)o (ersities)j(and)e(other)150 2453 y(nonpro\014t)e(institutions.)25 b(Con)o(tact)15 b(the)h(third)h(author)f(b)o(y)g(electronic)i(mail)f (for)f(information)150 2510 y(ab)q(out)f(T)l(readMarks.)952 2678 y(12)p eop %%Page: 13 13 13 12 bop 221 195 a Fj(W)l(e)14 b(ha)o(v)o(e)g(b)q(egun)h(the)f(tasks)f (of)h(mo)q(difying)h(our)f(parallel)i(ILINK)g(to)d(b)q(e)i(more)f (consisten)o(t)150 252 y(with)h(ILINK)h(from)e(the)g(latest)g(v)o (ersion)h(of)f(F)-5 b(ASTLINK)15 b(and)g(of)f(adapting)h(the)f(co)q(de) h(to)f(par-)150 308 y(allelize)k(LINKMAP)e(and)f(MLINK)h(as)f(w)o(ell.) 21 b(W)l(e)15 b(hop)q(e)h(to)f(b)q(e)g(ready)g(to)g(distribute)h (parallel)150 364 y(v)o(ersions)d(of)f(all)i(three)f(programs)f(in)i (1995.)k(Con)o(tact)11 b(the)i(second)h(author)e(b)o(y)h(electronic)h (mail)150 421 y(for)h(a)f(status)h(rep)q(ort)g(and)g(also)g(ab)q(out)g (obtaining)h(the)g(sequen)o(tial)g(F)-5 b(ASTLINK)16 b(programs.)150 564 y Fg(7)69 b(Results)150 666 y Fj(W)l(e)17 b(presen)o(t)g(sp)q(eedups)h(for)f(parallel)h(LINKA)o(GE)g(with)f(sev)o (eral)g(input)h(data)e(sets.)25 b(Unipro-)150 722 y(cessor)17 b(execution)h(times)f(are)g(giv)o(en)g(as)g(w)o(ell)h(so)e(that)h (execution)h(time)f(di\013erences)h(ma)o(y)e(b)q(e)150 779 y(inferred.)35 b(W)l(e)20 b(use)g(t)o(w)o(o)e(di\013eren)o(t)i(net) o(w)o(ork)f(t)o(yp)q(es)h(-)g(the)f(commonly)i(a)o(v)m(ailable)g (Ethernet)150 835 y(net)o(w)o(orks)14 b(and)h(the)h(emerging)f(A)l(TM)g (net)o(w)o(orks.)221 891 y(F)l(or)f(consistency)i(w)o(e)e(use)h (exactly)h(the)e(same)h(three)g(disease)h(data)e(sets)g(and)h(one)g (sample)150 948 y(run)i(eac)o(h)g(from)f([5)o(].)24 b(W)l(e)17 b(also)f(use)h(one)g(sample)h(run)e(eac)o(h)h(from)f(t)o(w)o(o)g(large) g(data)g(sets)h(that)150 1004 y(w)o(e)g(obtained)g(subsequen)o(t)h(to)e (the)h(publication)i(of)e([5)o(].)25 b(The)17 b(new)g(data)f(sets)h (app)q(ear)g(to)f(b)q(e)150 1061 y(more)g(represen)o(tativ)o(e)h(of)f (the)h(kinds)h(of)e(data)h(sets)f(that)g(cause)h(users)g(of)f(sequen)o (tial)i(ILINK)150 1117 y(to)d(w)o(an)o(t)f(faster)g(alternativ)o(es.) 218 1211 y Fb(\017)23 b Fj(RP01:)c(data)14 b(on)i(a)f(large)g(family)l (,)h(UCLA-RP01,)f(with)h(autosomal)e(dominan)o(t)i(retini-)264 1268 y(tis)k(pigmen)o(tosa)g(\(RP1\))f(from)h(the)g(lab)q(oratory)g(of) g(Dr.)f(Stephen)j(P)l(.)e(Daiger)g(at)g(the)264 1324 y(Univ)o(ersit)o(y)d(of)f(T)l(exas)h(Health)g(Science)h(Cen)o(ter)f(at) f(Houston.)24 b(As)16 b(sho)o(wn)g(in)i([1)o(],)f(this)264 1380 y(p)q(edigree)h(had)f(to)f(b)q(e)i(split)g(in)o(to)f(three)g (pieces)h(b)q(ecause)g(computation)f(on)f(the)h(whole)264 1437 y(family)f(together)f(w)o(as)g(prohibitiv)o(ely)i(long.)22 b(RP01-3)14 b(denotes)i(the)g(analysis)g(with)g(the)264 1493 y(family)g(split)g(in)g(three)f(pieces.)218 1587 y Fb(\017)23 b Fj(BAD:)11 b(data)f(on)i(a)f(p)q(ortion)g(of)g(the)h (Old)g(Order)g(Amish)g(p)q(edigree)h(110)e(\(OO)o(A)g(110\),)g(with)264 1644 y(bip)q(olar)i(a\013ectiv)o(e)e(disorder)h(\(BAD\))f(from)g(the)h (lab)q(oratory)f(of)g(Drs.)g(Da)o(vid)g(R.)g(Co)o(x)g(and)264 1700 y(Ric)o(hard)k(M.)f(My)o(ers)h(at)f(the)i(Univ)o(ersit)o(y)f(of)g (California)h(at)f(San)g(F)l(rancisco)h([17)o(].)218 1794 y Fb(\017)23 b Fj(CLP:)11 b(Data)f(on)i(12)e(families)j(with)f (autosomal)f(dominan)o(t)g(nonsyndromic)i(cleft)f(lip)h(and)264 1850 y(palate)f(\(CLP\))g(from)g(the)h(lab)q(oratory)e(of)h(Dr.)g (Jacqueline)j(T.)d(Hec)o(h)o(t)g(at)g(the)g(Univ)o(ersit)o(y)264 1907 y(of)i(T)l(exas)h(Health)h(Science)h(Cen)o(ter)e(at)g(Houston)f ([7].)218 2001 y Fb(\017)23 b Fj(ADNIV:)f(Data)f(on)h(1)g(large)h (family)g(with)f(autosomal)g(dominan)o(t)g(neo)o(v)m(ascular)h(in-)264 2057 y(\015ammatory)13 b(vitroretinopath)o(y)i(\(ADNIV\))g(pro)o(vided) h(b)o(y)f(Drs.)k(Ed)c(Stone)g(and)g(Brian)264 2114 y(Nic)o(hols)20 b(from)e(the)h(Univ)o(ersit)o(y)h(of)f(Io)o(w)o(a)f([24)o(].)31 b(The)19 b(family)h(has)f(93)g(individuals,)j(of)264 2170 y(whom)c(37)h(ha)o(v)o(e)f(unkno)o(wn)h(genot)o(yp)q(es)g(at)f (all)i(non-disease)g(lo)q(ci,)h(and)e(9)g(ha)o(v)o(e)f(some)264 2226 y(unkno)o(wn)d(genot)o(yp)q(es.)20 b(The)15 b(family)h(has)f(no)g (lo)q(ops.)218 2320 y Fb(\017)23 b Fj(LGMD:)16 b(Data)g(on)h(4)g (families)h(with)g(one)f(form)g(of)f(lim)o(b-girdle)k(m)o(uscular)d (dystroph)o(y)264 2377 y(\(LGMD\))h(pro)o(vided)j(b)o(y)e(Drs.)33 b(Marcy)19 b(Sp)q(eer)i(and)f(Margaret)e(P)o(ericak-V)l(ance)j(from)264 2433 y(Duk)o(e)g(Univ)o(ersit)o(y)h([23)o(].)37 b(Altogether)21 b(the)h(families)g(ha)o(v)o(e)f(416)g(individuals,)k(269)20 b(of)264 2490 y(whic)o(h)g(are)f(in)h(the)g(h)o(uge)g(family)g(n)o(um)o (b)q(er)g(39)f(\(discussed)h(at)f(length)h(in)h([23)o(]\).)32 b(The)264 2546 y(families)16 b(ha)o(v)o(e)f(no)g(lo)q(ops.)952 2678 y(13)p eop %%Page: 14 14 14 13 bop 525 155 901 2 v 524 212 2 57 v 533 212 V 558 195 a Fj(RP01-3)p 730 212 V 49 w(BAD)p 881 212 V 49 w(CLP)p 1023 212 V 50 w(ADNIV)p 1226 212 V 51 w(LGMD)p 1416 212 V 1425 212 V 525 213 901 2 v 524 270 2 57 v 533 270 V 615 253 a(4682)p 730 270 V 81 w(833)p 881 270 V 51 w(4085)p 1023 270 V 111 w(9570)p 1226 270 V 75 w(13011)p 1416 270 V 1425 270 V 525 271 901 2 v 208 351 a(T)l(able)16 b(1:)j(Unipro)q(cessor)d(execution)h(times)e(in)h(seconds)g(on)f(a)g (DECStation-5000/240)221 486 y(More)d(detailed)j(descriptions)g(of)e (the)h(\014rst)f(three)h(sets)f(of)g(p)q(edigrees)i(are)e(giv)o(en)h (in)g([5])f(and)150 542 y(diagrams)18 b(can)g(b)q(e)h(found)g(in)g(the) f(pap)q(ers)h(cited)g(for)f(eac)o(h)g(data)g(set.)29 b(The)18 b(lo)q(ci)i(c)o(hosen)f(for)150 599 y(the)g(RP01-3)e(data)h (set)h(ha)o(v)o(e)f(an)h(allele)i(pro)q(duct)e(of)f(2)12 b Fb(\002)h Fj(6)f Fb(\002)h Fj(9)18 b(=)h(108;)h(this)f(implies)i (that)150 655 y(the)14 b(n)o(um)o(b)q(er)h(of)f(genot)o(yp)q(es)g(is)h (108)7 b Fb(\002)i Fj(\(108)e(+)h(1\))p Fe(=)p Fj(2)k(=)h(5886)p Fe(:)g Fj(The)h(lo)q(ci)i(c)o(hosen)e(for)g(the)g(BAD,)150 711 y(CLP)l(,)g(ADNIV,)h(and)g(LGMD)e(data)h(sets)g(ha)o(v)o(e)h (allele)h(pro)q(ducts)f(of)f(2)8 b Fb(\002)h Fj(4)g Fb(\002)g Fj(4,)k(2)c Fb(\002)g Fj(4)f Fb(\002)h Fj(4)g Fb(\002)g Fj(4,)150 768 y(2)k Fb(\002)h Fj(3)e Fb(\002)i Fj(4)f Fb(\002)h Fj(4,)20 b(and)g(2)13 b Fb(\002)g Fj(10)g Fb(\002)h Fj(7)19 b(resp)q(ectiv)o(ely)l(.)36 b(In)21 b(all)f(cases,)h(the)f (2-allele)i(lo)q(cus)e(is)h(the)150 824 y(disease)c(lo)q(cus.)24 b(Of)16 b(all)i(these)e(data)g(sets,)g(the)g(ADNIV)g(data)g(set)g(is)h (most)e(ideally)j(suited)g(to)150 881 y(our)f(parallelization)i (strategy)d(since)i(it)g(has)f(only)h(one)f(family)h(and)f(the)g (complexit)o(y)h(of)f(the)150 937 y(analysis)f(is)g(not)e(caused)i(b)o (y)f(lo)q(ops.)221 994 y(Figures)i(1)g(through)f(10)h(sho)o(w)g(sp)q (eedup)h(p)q(erformance)g(for)e(the)h(\014v)o(e)h(data)e(sets)h(on)g (eac)o(h)150 1050 y(of)d(the)h(A)l(TM)g(net)o(w)o(ork)f(and)h(the)g (Ethernet)g(net)o(w)o(ork.)j(Eac)o(h)d(graph)f(compares)h(four)f (parallel)150 1107 y(v)o(ersions:)34 b(our)22 b(\014rst)g(parallel)i (implemen)o(tation)g(with)f(the)f(minor)h(c)o(hanges)f(describ)q(ed)i (in)150 1163 y(Section)13 b(6)e(\(base\),)h(a)f(v)o(ersion)h(with)g (only)g(adaptiv)o(e)g(loadbalancing)i(\(loadbalance\),)e(a)g(v)o (ersion)150 1220 y(with)21 b(only)g(parallel)h(gradien)o(t)f (estimation)g(\(parallel)h(thetas\),)f(and)g(a)f(v)o(ersion)h(with)g(b) q(oth)150 1276 y(adaptiv)o(e)15 b(load)h(balancing)g(and)g(parallel)h (gradien)o(t)e(estimation)g(\(in)o(tegrated\).)221 1332 y(Comparing)f(the)g(v)o(ersion)h(with)g(no)f(c)o(hanges)h(and)g(the)f (v)o(ersion)h(with)g(b)q(oth)f(c)o(hanges)h(on)f(8)150 1389 y(pro)q(cessors,)h(the)h(A)l(TM)f(net)o(w)o(ork)g(sp)q(eedups)i (impro)o(v)o(ed)f(from)f(\(5.52,3.43,5)o(.96)o(,6.)o(69,)o(6.45)o(\))e (to)150 1445 y(\(6.04,3.91,6)o(.33)o(,7.)o(02,)o(6.8)o(8\))c(on)i(the)h (\014v)o(e)g(data)g(sets)f(resp)q(ectiv)o(ely)l(,)j(The)e(sp)q(eedups)i (on)d(the)h(\014rst)150 1502 y(three)j(data)g(sets)g(for)f(our)h (\014rst)g(implemen)o(tation)i([5)o(])e(w)o(ere)g(\(5.38,3.15,)o(5.)o (73\))d(resp)q(ectiv)o(ely)l(.)221 1558 y(Comparing)i(the)g(v)o(ersion) h(with)g(no)f(c)o(hanges)h(and)g(the)f(v)o(ersion)h(with)g(b)q(oth)f(c) o(hanges)h(on)f(8)150 1615 y(pro)q(cessors)h(the)h(Ethernet)f(net)o(w)o (ork)g(sp)q(eedups)i(impro)o(v)o(ed)e(from)g(\(3.97,2.28,5)o(.32)o(,5.) o(09,5)o(.40)o(\))150 1671 y(to)g(\(4.86,2.80,5.)o(71,)o(6.3)o(0,6.)o (34\))o(.)20 b(The)c(sp)q(eedups)h(on)f(the)g(\014rst)g(three)g(data)f (sets)h(for)g(our)f(\014rst)150 1728 y(implemen)o(tation)f([5)o(])f(w)o (ere)f(\(3.82,)f(1.86,)h(and)h(5.09\))e(resp)q(ectiv)o(ely)l(.)21 b(The)13 b(amoun)o(t)f(of)g(impro)o(v)o(e-)150 1784 y(men)o(t)h(caused) g(b)o(y)g(adaptiv)o(e)g(loadbalancing)i(and)e(parallel)h(gradien)o(t)f (ev)m(aluation)i(v)m(ary)d(widely)150 1841 y(from)h(data)g(set)h(to)f (data)h(set.)19 b(The)14 b(impro)o(v)o(emen)o(ts)g(b)q(ecome)g(more)g (apparen)o(t)f(as)h(the)g(n)o(um)o(b)q(er)150 1897 y(of)k(pro)q (cessors)g(gro)o(ws,)g(whic)o(h)h(is)g(not)f(surprising)i(b)q(ecause)f (ha)o(ving)g(more)f(precise)i(loadbal-)150 1954 y(ancing)d(and)g (reducing)g(comm)o(unication)g(b)q(ecome)g(more)f(signi\014can)o(t)h (ob)s(jectiv)o(es)g(with)f(more)150 2010 y(pro)q(cessors.)21 b(In)16 b(fact)f(with)h(2)g(and)g(4)f(pro)q(cessors)g(there)h(are)g(a)f (few)g(anomalies)i(\(e.g.)j(RP01-3)150 2066 y(with)c(4)g(pro)q (cessors\))g(where)g(the)g(in)o(tegrated)g(v)o(ersion)g(is)h(aligh)o (tly)g(slo)o(w)o(er)e(than)h(at)g(least)g(one)150 2123 y(other)f(v)o(ersion,)g(but)g(these)h(disapp)q(ear)g(with)f(6)g(and)h (8)e(pro)q(cessors.)221 2179 y(The)g(sp)q(eedups)i(on)e(RP01-3,)e(CLP)l (,)j(ADNIV,)f(and)g(LGMD)g(are)f(quite)i(pleasing,)h(but)e(the)150 2236 y(BAD)i(data)f(set)h(remains)h(a)e(problem.)23 b(T)l(able)17 b(2)f(tries)g(to)f(assess)h(the)g(reasons)g(for)f(imp)q(erfect)150 2292 y(sp)q(eedup)21 b(in)f(BAD)f(and)g(the)g(other)g(data)g(sets.)31 b(W)l(e)20 b(iden)o(ti\014ed)h(four)e(distinct)h(reasons)f(for)150 2349 y(imp)q(erfect)d(sp)q(eedup:)206 2441 y(1.)22 b(Computations)16 b(done)h(outside)h(the)f(parallel)i(co)q(de,)e(whic)o(h)h(w)o(e)f(call) h(\\o)o(v)o(erhead".)24 b(Al-)264 2497 y(most)17 b(all)i(of)e(this)i (computation)f(is)g(to)g(initialize)j(the)d(genot)o(yp)q(e)g (probabilities)i(of)e(in-)264 2554 y(dividuals)f(in)f(the)g(\014rst)f (n)o(uclear)h(family)g(where)f(they)g(are)g(encoun)o(tered)h(in)h(a)d (p)q(edigree)952 2678 y(14)p eop %%Page: 15 15 15 14 bop 525 219 a 14208860 14919300 0 0 24536596 25786449 startTexFig 525 219 a %%BeginDocument: rp01-3.atm.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 790 725 992 DR FL 0.000 0.000 0.000 SC 699 790 725 992 DR SP FL 0.498 0.498 0.498 SC 913 615 938 992 DR FL 0.000 0.000 0.000 SC 913 615 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 459 1152 992 DR FL 0.000 0.000 0.000 SC 1126 459 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 333 1365 992 DR FL 0.000 0.000 0.000 SC 1340 333 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 786 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 786 682 992 DR SP FL 870 607 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 607 896 992 DR SP FL 1083 460 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 460 1109 992 DR SP FL 1297 348 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 348 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 784 640 992 DR FL 0.000 0.000 0.000 SC 614 784 640 992 DR SP FL 0.749 0.749 0.749 SC 827 605 853 992 DR FL 0.000 0.000 0.000 SC 827 605 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 464 1066 992 DR FL 0.000 0.000 0.000 SC 1041 464 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 355 1280 992 DR FL 0.000 0.000 0.000 SC 1254 355 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 786 597 992 DR FL 571 786 597 992 DR SP FL 785 611 810 992 DR FL 785 611 810 992 DR SP FL 998 487 1024 992 DR FL 998 487 1024 992 DR SP FL 1211 390 1237 992 DR FL 1211 390 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 477 1262 a Fj(Figure)16 b(1:)j(Sp)q(eedup)e(on)e(an)g(A)l(TM)g(Net)o (w)o(ork)f({)h(RP01-3)525 1436 y 14208860 14919300 0 0 24536596 25786449 startTexFig 525 1436 a %%BeginDocument: bad.atm.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 791 725 992 DR FL 0.000 0.000 0.000 SC 699 791 725 992 DR SP FL 0.498 0.498 0.498 SC 913 662 938 992 DR FL 0.000 0.000 0.000 SC 913 662 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 587 1152 992 DR FL 0.000 0.000 0.000 SC 1126 587 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 566 1365 992 DR FL 0.000 0.000 0.000 SC 1340 566 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 801 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 801 682 992 DR SP FL 870 686 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 686 896 992 DR SP FL 1083 621 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 621 1109 992 DR SP FL 1297 615 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 615 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 801 640 992 DR FL 0.000 0.000 0.000 SC 614 801 640 992 DR SP FL 0.749 0.749 0.749 SC 827 677 853 992 DR FL 0.000 0.000 0.000 SC 827 677 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 606 1066 992 DR FL 0.000 0.000 0.000 SC 1041 606 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 583 1280 992 DR FL 0.000 0.000 0.000 SC 1254 583 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 814 597 992 DR FL 571 814 597 992 DR SP FL 785 707 810 992 DR FL 785 707 810 992 DR SP FL 998 643 1024 992 DR FL 998 643 1024 992 DR SP FL 1211 618 1237 992 DR FL 1211 618 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 500 2479 a Fj(Figure)h(2:)j(Sp)q(eedup)f(on)d(an)g(A)l(TM)g(Net)o(w)o (ork)f({)h(BAD)952 2678 y(15)p eop %%Page: 16 16 16 15 bop 525 219 a 14208860 14919300 0 0 24536596 25786449 startTexFig 525 219 a %%BeginDocument: clp.atm.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 784 725 992 DR FL 0.000 0.000 0.000 SC 699 784 725 992 DR SP FL 0.498 0.498 0.498 SC 913 605 938 992 DR FL 0.000 0.000 0.000 SC 913 605 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 423 1152 992 DR FL 0.000 0.000 0.000 SC 1126 423 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 302 1365 992 DR FL 0.000 0.000 0.000 SC 1340 302 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 785 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 785 682 992 DR SP FL 870 617 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 617 896 992 DR SP FL 1083 435 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 435 1109 992 DR SP FL 1297 327 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 327 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 781 640 992 DR FL 0.000 0.000 0.000 SC 614 781 640 992 DR SP FL 0.749 0.749 0.749 SC 827 601 853 992 DR FL 0.000 0.000 0.000 SC 827 601 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 442 1066 992 DR FL 0.000 0.000 0.000 SC 1041 442 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 312 1280 992 DR FL 0.000 0.000 0.000 SC 1254 312 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 782 597 992 DR FL 571 782 597 992 DR SP FL 785 607 810 992 DR FL 785 607 810 992 DR SP FL 998 446 1024 992 DR FL 998 446 1024 992 DR SP FL 1211 342 1237 992 DR FL 1211 342 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 505 1262 a Fj(Figure)15 b(3:)20 b(Sp)q(eedup)d(on)e(an)g(A)l(TM)g(Net) o(w)o(ork)f({)h(CLP)525 1436 y 14208860 14919300 0 0 24536596 25786449 startTexFig 525 1436 a %%BeginDocument: adniv.atm.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 783 725 992 DR FL 0.000 0.000 0.000 SC 699 783 725 992 DR SP FL 0.498 0.498 0.498 SC 913 583 938 992 DR FL 0.000 0.000 0.000 SC 913 583 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 399 1152 992 DR FL 0.000 0.000 0.000 SC 1126 399 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 227 1365 992 DR FL 0.000 0.000 0.000 SC 1340 227 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 785 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 785 682 992 DR SP FL 870 587 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 587 896 992 DR SP FL 1083 405 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 405 1109 992 DR SP FL 1297 228 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 228 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 784 640 992 DR FL 0.000 0.000 0.000 SC 614 784 640 992 DR SP FL 0.749 0.749 0.749 SC 827 581 853 992 DR FL 0.000 0.000 0.000 SC 827 581 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 401 1066 992 DR FL 0.000 0.000 0.000 SC 1041 401 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 243 1280 992 DR FL 0.000 0.000 0.000 SC 1254 243 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 782 597 992 DR FL 571 782 597 992 DR SP FL 785 588 810 992 DR FL 785 588 810 992 DR SP FL 998 421 1024 992 DR FL 998 421 1024 992 DR SP FL 1211 262 1237 992 DR FL 1211 262 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 474 2479 a Fj(Figure)h(4:)j(Sp)q(eedup)e(on)e(an)h(A)l(TM)f(Net)o(w)o (ork)e({)i(ADNIV)952 2678 y(16)p eop %%Page: 17 17 17 16 bop 525 219 a 14208860 14919300 0 0 24536596 25786449 startTexFig 525 219 a %%BeginDocument: lgmd.atm.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 786 725 992 DR FL 0.000 0.000 0.000 SC 699 786 725 992 DR SP FL 0.498 0.498 0.498 SC 913 590 938 992 DR FL 0.000 0.000 0.000 SC 913 590 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 413 1152 992 DR FL 0.000 0.000 0.000 SC 1126 413 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 242 1365 992 DR FL 0.000 0.000 0.000 SC 1340 242 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 789 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 789 682 992 DR SP FL 870 605 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 605 896 992 DR SP FL 1083 433 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 433 1109 992 DR SP FL 1297 290 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 290 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 779 640 992 DR FL 0.000 0.000 0.000 SC 614 779 640 992 DR SP FL 0.749 0.749 0.749 SC 827 587 853 992 DR FL 0.000 0.000 0.000 SC 827 587 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 411 1066 992 DR FL 0.000 0.000 0.000 SC 1041 411 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 266 1280 992 DR FL 0.000 0.000 0.000 SC 1254 266 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 781 597 992 DR FL 571 781 597 992 DR SP FL 785 591 810 992 DR FL 785 591 810 992 DR SP FL 998 430 1024 992 DR FL 998 430 1024 992 DR SP FL 1211 289 1237 992 DR FL 1211 289 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 481 1262 a Fj(Figure)15 b(5:)20 b(Sp)q(eedup)d(on)e(an)g(A)l(TM)g(Net) o(w)o(ork)f({)h(LGMD)525 1436 y 14208860 14919300 0 0 24470814 25786449 startTexFig 525 1436 a %%BeginDocument: rp01-3.ether.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1490 1570 CR GS 0 0 1490 1570 CR GS 0 0 1490 1570 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1489 1569 DR FL 279 1303 1210 1521 DR FL 0.000 0.000 0.000 SC 279 1303 1210 1521 DR SP FL 400 1400 MT (base) SH 328 1352 376 1400 DR FL 328 1352 376 1400 DR SP FL 400 1472 MT (load balance) SH 0.749 0.749 0.749 SC 328 1424 376 1472 DR FL 0.000 0.000 0.000 SC 328 1424 376 1472 DR SP FL 841 1400 MT (parallel thetas) SH 769 1352 817 1400 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 769 1352 817 1400 DR SP FL 841 1472 MT (integrated) SH 0.498 0.498 0.498 SC 769 1424 817 1472 DR FL 0.000 0.000 0.000 SC 769 1424 817 1472 DR SP FL 1.000 1.000 1.000 SC 48 48 1441 1255 DR FL 328 120 1393 991 DR FL 712 1111 1008 1207 DR FL 0.000 0.000 0.000 SC 736 1183 MT (Processors) SH 328 991 MT 328 991 328 1027 DL FL 413 1063 MT (1 ) SH 541 991 MT 541 991 541 120 DL FL 541 991 MT 541 991 541 1027 DL FL 626 1063 MT (2 ) SH 754 991 MT 754 991 754 120 DL FL 754 991 MT 754 991 754 1027 DL FL 839 1063 MT (4 ) SH 967 991 MT 967 991 967 120 DL FL 967 991 MT 967 991 967 1027 DL FL 1052 1063 MT (6 ) SH 1180 991 MT 1180 991 1180 120 DL FL 1180 991 MT 1180 991 1180 1027 DL FL 1265 1063 MT (8 ) SH 1393 991 MT 1393 991 1393 1027 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 969 MT 328 969 310 969 DL FL 328 947 MT 328 947 310 947 DL FL 328 926 MT 328 926 310 926 DL FL 328 904 MT 328 904 310 904 DL FL 328 991 MT 328 991 292 991 DL FL 240 1015 MT (0) SH 328 860 MT 328 860 310 860 DL FL 328 839 MT 328 839 310 839 DL FL 328 817 MT 328 817 310 817 DL FL 328 795 MT 328 795 310 795 DL FL 328 882 MT 328 882 1393 882 DL FL 328 882 MT 328 882 292 882 DL FL 240 906 MT (1) SH 328 751 MT 328 751 310 751 DL FL 328 730 MT 328 730 310 730 DL FL 328 708 MT 328 708 310 708 DL FL 328 686 MT 328 686 310 686 DL FL 328 773 MT 328 773 1393 773 DL FL 328 773 MT 328 773 292 773 DL FL 240 797 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 599 MT 328 599 310 599 DL FL 328 577 MT 328 577 310 577 DL FL 328 664 MT 328 664 1393 664 DL FL 328 664 MT 328 664 292 664 DL FL 240 688 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 490 MT 328 490 310 490 DL FL 328 468 MT 328 468 310 468 DL FL 328 555 MT 328 555 1393 555 DL FL 328 555 MT 328 555 292 555 DL FL 240 579 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 381 MT 328 381 310 381 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1393 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 272 MT 328 272 310 272 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1393 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1393 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1394 992 CR 0.498 0.498 0.498 SC 486 882 511 991 DR FL 0.000 0.000 0.000 SC 486 882 511 991 DR SP FL 0.498 0.498 0.498 SC 699 786 724 991 DR FL 0.000 0.000 0.000 SC 699 786 724 991 DR SP FL 0.498 0.498 0.498 SC 912 622 937 991 DR FL 0.000 0.000 0.000 SC 912 622 937 991 DR SP FL 0.498 0.498 0.498 SC 1125 510 1150 991 DR FL 0.000 0.000 0.000 SC 1125 510 1150 991 DR SP FL 0.498 0.498 0.498 SC 1338 462 1363 991 DR FL 0.000 0.000 0.000 SC 1338 462 1363 991 DR SP FL 443 882 469 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 882 469 991 DR SP FL 656 786 682 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 656 786 682 991 DR SP FL 869 629 895 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 869 629 895 991 DR SP FL 1082 532 1108 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1082 532 1108 991 DR SP FL 1295 500 1321 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1295 500 1321 991 DR SP FL 0.749 0.749 0.749 SC 400 882 426 991 DR FL 0.000 0.000 0.000 SC 400 882 426 991 DR SP FL 0.749 0.749 0.749 SC 613 788 639 991 DR FL 0.000 0.000 0.000 SC 613 788 639 991 DR SP FL 0.749 0.749 0.749 SC 826 630 852 991 DR FL 0.000 0.000 0.000 SC 826 630 852 991 DR SP FL 0.749 0.749 0.749 SC 1039 544 1065 991 DR FL 0.000 0.000 0.000 SC 1039 544 1065 991 DR SP FL 0.749 0.749 0.749 SC 1252 516 1278 991 DR FL 0.000 0.000 0.000 SC 1252 516 1278 991 DR SP FL 358 882 383 991 DR FL 358 882 383 991 DR SP FL 571 790 596 991 DR FL 571 790 596 991 DR SP FL 784 639 809 991 DR FL 784 639 809 991 DR SP FL 997 568 1022 991 DR FL 997 568 1022 991 DR SP FL 1210 559 1235 991 DR FL 1210 559 1235 991 DR SP FL GR 1393 991 MT 1393 991 1393 120 DL FL 328 120 MT 328 120 1393 120 DL FL 328 991 MT 328 991 1393 991 DL FL 328 991 MT 328 991 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 442 2479 a Fj(Figure)g(6:)20 b(Sp)q(eedup)d(on)e(an)g(Ethernet)g(Net)o (w)o(ork)f({)h(RP01-3)952 2678 y(17)p eop %%Page: 18 18 18 17 bop 525 219 a 14208860 14919300 0 0 24470814 25786449 startTexFig 525 219 a %%BeginDocument: bad.ether.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1491 1570 CR GS 0 0 1491 1570 CR GS 0 0 1491 1570 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1490 1569 DR FL 280 1303 1210 1521 DR FL 0.000 0.000 0.000 SC 280 1303 1210 1521 DR SP FL 401 1400 MT (base) SH 329 1352 377 1400 DR FL 329 1352 377 1400 DR SP FL 401 1472 MT (load balance) SH 0.749 0.749 0.749 SC 329 1424 377 1472 DR FL 0.000 0.000 0.000 SC 329 1424 377 1472 DR SP FL 841 1400 MT (parallel thetas) SH 769 1352 817 1400 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 769 1352 817 1400 DR SP FL 841 1472 MT (integrated) SH 0.498 0.498 0.498 SC 769 1424 817 1472 DR FL 0.000 0.000 0.000 SC 769 1424 817 1472 DR SP FL 1.000 1.000 1.000 SC 48 48 1442 1255 DR FL 328 120 1394 991 DR FL 713 1111 1009 1207 DR FL 0.000 0.000 0.000 SC 737 1183 MT (Processors) SH 328 991 MT 328 991 328 1027 DL FL 413 1063 MT (1 ) SH 541 991 MT 541 991 541 120 DL FL 541 991 MT 541 991 541 1027 DL FL 626 1063 MT (2 ) SH 754 991 MT 754 991 754 120 DL FL 754 991 MT 754 991 754 1027 DL FL 839 1063 MT (4 ) SH 968 991 MT 968 991 968 120 DL FL 968 991 MT 968 991 968 1027 DL FL 1052 1063 MT (6 ) SH 1181 991 MT 1181 991 1181 120 DL FL 1181 991 MT 1181 991 1181 1027 DL FL 1265 1063 MT (8 ) SH 1394 991 MT 1394 991 1394 1027 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 969 MT 328 969 310 969 DL FL 328 947 MT 328 947 310 947 DL FL 328 926 MT 328 926 310 926 DL FL 328 904 MT 328 904 310 904 DL FL 328 991 MT 328 991 292 991 DL FL 240 1015 MT (0) SH 328 860 MT 328 860 310 860 DL FL 328 839 MT 328 839 310 839 DL FL 328 817 MT 328 817 310 817 DL FL 328 795 MT 328 795 310 795 DL FL 328 882 MT 328 882 1394 882 DL FL 328 882 MT 328 882 292 882 DL FL 240 906 MT (1) SH 328 751 MT 328 751 310 751 DL FL 328 730 MT 328 730 310 730 DL FL 328 708 MT 328 708 310 708 DL FL 328 686 MT 328 686 310 686 DL FL 328 773 MT 328 773 1394 773 DL FL 328 773 MT 328 773 292 773 DL FL 240 797 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 599 MT 328 599 310 599 DL FL 328 577 MT 328 577 310 577 DL FL 328 664 MT 328 664 1394 664 DL FL 328 664 MT 328 664 292 664 DL FL 240 688 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 490 MT 328 490 310 490 DL FL 328 468 MT 328 468 310 468 DL FL 328 555 MT 328 555 1394 555 DL FL 328 555 MT 328 555 292 555 DL FL 240 579 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 381 MT 328 381 310 381 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1394 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 272 MT 328 272 310 272 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1394 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1394 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1395 992 CR 0.498 0.498 0.498 SC 486 882 511 991 DR FL 0.000 0.000 0.000 SC 486 882 511 991 DR SP FL 0.498 0.498 0.498 SC 699 797 725 991 DR FL 0.000 0.000 0.000 SC 699 797 725 991 DR SP FL 0.498 0.498 0.498 SC 912 701 938 991 DR FL 0.000 0.000 0.000 SC 912 701 938 991 DR SP FL 0.498 0.498 0.498 SC 1125 671 1151 991 DR FL 0.000 0.000 0.000 SC 1125 671 1151 991 DR SP FL 0.498 0.498 0.498 SC 1339 686 1364 991 DR FL 0.000 0.000 0.000 SC 1339 686 1364 991 DR SP FL 443 882 469 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 882 469 991 DR SP FL 656 801 682 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 656 801 682 991 DR SP FL 870 708 895 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 708 895 991 DR SP FL 1083 688 1108 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 688 1108 991 DR SP FL 1296 698 1322 991 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1296 698 1322 991 DR SP FL 0.749 0.749 0.749 SC 400 882 426 991 DR FL 0.000 0.000 0.000 SC 400 882 426 991 DR SP FL 0.749 0.749 0.749 SC 614 805 639 991 DR FL 0.000 0.000 0.000 SC 614 805 639 991 DR SP FL 0.749 0.749 0.749 SC 827 723 852 991 DR FL 0.000 0.000 0.000 SC 827 723 852 991 DR SP FL 0.749 0.749 0.749 SC 1040 705 1066 991 DR FL 0.000 0.000 0.000 SC 1040 705 1066 991 DR SP FL 0.749 0.749 0.749 SC 1253 727 1279 991 DR FL 0.000 0.000 0.000 SC 1253 727 1279 991 DR SP FL 358 882 383 991 DR FL 358 882 383 991 DR SP FL 571 812 597 991 DR FL 571 812 597 991 DR SP FL 784 731 810 991 DR FL 784 731 810 991 DR SP FL 997 719 1023 991 DR FL 997 719 1023 991 DR SP FL 1211 743 1236 991 DR FL 1211 743 1236 991 DR SP FL GR 1394 991 MT 1394 991 1394 120 DL FL 328 120 MT 328 120 1394 120 DL FL 328 991 MT 328 991 1394 991 DL FL 328 991 MT 328 991 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 465 1262 a Fj(Figure)16 b(7:)j(Sp)q(eedup)e(on)f(an)f(Ethernet)g(Net)o (w)o(ork)f({)h(BAD)525 1436 y 14208860 14919300 0 0 24536596 25786449 startTexFig 525 1436 a %%BeginDocument: clp.ether.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 785 725 992 DR FL 0.000 0.000 0.000 SC 699 785 725 992 DR SP FL 0.498 0.498 0.498 SC 913 617 938 992 DR FL 0.000 0.000 0.000 SC 913 617 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 450 1152 992 DR FL 0.000 0.000 0.000 SC 1126 450 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 369 1365 992 DR FL 0.000 0.000 0.000 SC 1340 369 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 786 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 786 682 992 DR SP FL 870 621 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 621 896 992 DR SP FL 1083 446 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 446 1109 992 DR SP FL 1297 398 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 398 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 784 640 992 DR FL 0.000 0.000 0.000 SC 614 784 640 992 DR SP FL 0.749 0.749 0.749 SC 827 617 853 992 DR FL 0.000 0.000 0.000 SC 827 617 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 478 1066 992 DR FL 0.000 0.000 0.000 SC 1041 478 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 385 1280 992 DR FL 0.000 0.000 0.000 SC 1254 385 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 785 597 992 DR FL 571 785 597 992 DR SP FL 785 621 810 992 DR FL 785 621 810 992 DR SP FL 998 484 1024 992 DR FL 998 484 1024 992 DR SP FL 1211 411 1237 992 DR FL 1211 411 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 470 2479 a Fj(Figure)g(8:)20 b(Sp)q(eedup)d(on)e(an)g(Ethernet)g(Net)o (w)o(ork)f({)h(CLP)952 2678 y(18)p eop %%Page: 19 19 19 18 bop 525 219 a 14208860 14919300 0 0 24536596 25786449 startTexFig 525 219 a %%BeginDocument: adniv.ether.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 784 725 992 DR FL 0.000 0.000 0.000 SC 699 784 725 992 DR SP FL 0.498 0.498 0.498 SC 913 590 938 992 DR FL 0.000 0.000 0.000 SC 913 590 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 448 1152 992 DR FL 0.000 0.000 0.000 SC 1126 448 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 306 1365 992 DR FL 0.000 0.000 0.000 SC 1340 306 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 782 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 782 682 992 DR SP FL 870 589 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 589 896 992 DR SP FL 1083 442 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 442 1109 992 DR SP FL 1297 314 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 314 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 790 640 992 DR FL 0.000 0.000 0.000 SC 614 790 640 992 DR SP FL 0.749 0.749 0.749 SC 827 610 853 992 DR FL 0.000 0.000 0.000 SC 827 610 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 470 1066 992 DR FL 0.000 0.000 0.000 SC 1041 470 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 369 1280 992 DR FL 0.000 0.000 0.000 SC 1254 369 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 788 597 992 DR FL 571 788 597 992 DR SP FL 785 602 810 992 DR FL 785 602 810 992 DR SP FL 998 482 1024 992 DR FL 998 482 1024 992 DR SP FL 1211 437 1237 992 DR FL 1211 437 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 439 1262 a Fj(Figure)16 b(9:)j(Sp)q(eedup)e(on)e(an)g(Ethernet)h(Net)o (w)o(ork)e({)g(ADNIV)525 1436 y 14208860 14919300 0 0 24536596 25786449 startTexFig 525 1436 a %%BeginDocument: lgmd.ether.eps /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 4.000 4.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 0 392 TR [1 0 0 -1 0 0] CN 0.250 0.250 SL 1.0 LW GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR GS 0 0 1492 1571 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 48.000 SF 1.000 1.000 1.000 SC 0 0 1491 1570 DR FL 280 1304 1211 1522 DR FL 0.000 0.000 0.000 SC 280 1304 1211 1522 DR SP FL 401 1401 MT (base) SH 329 1353 377 1401 DR FL 329 1353 377 1401 DR SP FL 401 1473 MT (load balance) SH 0.749 0.749 0.749 SC 329 1425 377 1473 DR FL 0.000 0.000 0.000 SC 329 1425 377 1473 DR SP FL 842 1401 MT (parallel thetas) SH 770 1353 818 1401 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 770 1353 818 1401 DR SP FL 842 1473 MT (integrated) SH 0.498 0.498 0.498 SC 770 1425 818 1473 DR FL 0.000 0.000 0.000 SC 770 1425 818 1473 DR SP FL 1.000 1.000 1.000 SC 48 48 1443 1256 DR FL 328 120 1395 992 DR FL 713 1112 1009 1208 DR FL 0.000 0.000 0.000 SC 737 1184 MT (Processors) SH 328 992 MT 328 992 328 1028 DL FL 413 1064 MT (1 ) SH 541 992 MT 541 992 541 120 DL FL 541 992 MT 541 992 541 1028 DL FL 626 1064 MT (2 ) SH 755 992 MT 755 992 755 120 DL FL 755 992 MT 755 992 755 1028 DL FL 840 1064 MT (4 ) SH 968 992 MT 968 992 968 120 DL FL 968 992 MT 968 992 968 1028 DL FL 1053 1064 MT (6 ) SH 1182 992 MT 1182 992 1182 120 DL FL 1182 992 MT 1182 992 1182 1028 DL FL 1266 1064 MT (8 ) SH 1395 992 MT 1395 992 1395 1028 DL FL 1.000 1.000 1.000 SC 96 432 192 680 DR FL 0.000 0.000 0.000 SC GS 168 656 MT 270 RO (Speedup) SH GR 328 970 MT 328 970 310 970 DL FL 328 948 MT 328 948 310 948 DL FL 328 927 MT 328 927 310 927 DL FL 328 905 MT 328 905 310 905 DL FL 328 992 MT 328 992 292 992 DL FL 240 1016 MT (0) SH 328 861 MT 328 861 310 861 DL FL 328 839 MT 328 839 310 839 DL FL 328 818 MT 328 818 310 818 DL FL 328 796 MT 328 796 310 796 DL FL 328 883 MT 328 883 1395 883 DL FL 328 883 MT 328 883 292 883 DL FL 240 907 MT (1) SH 328 752 MT 328 752 310 752 DL FL 328 730 MT 328 730 310 730 DL FL 328 709 MT 328 709 310 709 DL FL 328 687 MT 328 687 310 687 DL FL 328 774 MT 328 774 1395 774 DL FL 328 774 MT 328 774 292 774 DL FL 240 798 MT (2) SH 328 643 MT 328 643 310 643 DL FL 328 621 MT 328 621 310 621 DL FL 328 600 MT 328 600 310 600 DL FL 328 578 MT 328 578 310 578 DL FL 328 665 MT 328 665 1395 665 DL FL 328 665 MT 328 665 292 665 DL FL 240 689 MT (3) SH 328 534 MT 328 534 310 534 DL FL 328 512 MT 328 512 310 512 DL FL 328 491 MT 328 491 310 491 DL FL 328 469 MT 328 469 310 469 DL FL 328 556 MT 328 556 1395 556 DL FL 328 556 MT 328 556 292 556 DL FL 240 580 MT (4) SH 328 425 MT 328 425 310 425 DL FL 328 403 MT 328 403 310 403 DL FL 328 382 MT 328 382 310 382 DL FL 328 360 MT 328 360 310 360 DL FL 328 447 MT 328 447 1395 447 DL FL 328 447 MT 328 447 292 447 DL FL 240 471 MT (5) SH 328 316 MT 328 316 310 316 DL FL 328 294 MT 328 294 310 294 DL FL 328 273 MT 328 273 310 273 DL FL 328 251 MT 328 251 310 251 DL FL 328 338 MT 328 338 1395 338 DL FL 328 338 MT 328 338 292 338 DL FL 240 362 MT (6) SH 328 207 MT 328 207 310 207 DL FL 328 185 MT 328 185 310 185 DL FL 328 164 MT 328 164 310 164 DL FL 328 142 MT 328 142 310 142 DL FL 328 229 MT 328 229 1395 229 DL FL 328 229 MT 328 229 292 229 DL FL 240 253 MT (7) SH 328 120 MT 328 120 292 120 DL FL 240 144 MT (8) SH GS 328 120 1396 993 CR 0.498 0.498 0.498 SC 486 883 512 992 DR FL 0.000 0.000 0.000 SC 486 883 512 992 DR SP FL 0.498 0.498 0.498 SC 699 782 725 992 DR FL 0.000 0.000 0.000 SC 699 782 725 992 DR SP FL 0.498 0.498 0.498 SC 913 595 938 992 DR FL 0.000 0.000 0.000 SC 913 595 938 992 DR SP FL 0.498 0.498 0.498 SC 1126 434 1152 992 DR FL 0.000 0.000 0.000 SC 1126 434 1152 992 DR SP FL 0.498 0.498 0.498 SC 1340 301 1365 992 DR FL 0.000 0.000 0.000 SC 1340 301 1365 992 DR SP FL 443 883 469 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 443 883 469 992 DR SP FL 657 783 682 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 657 783 682 992 DR SP FL 870 617 896 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 870 617 896 992 DR SP FL 1083 480 1109 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1083 480 1109 992 DR SP FL 1297 372 1322 992 DR 0.000 0.000 0.000 1.000 1.000 1.000 2 (CL) CF 0.000 0.000 0.000 SC 1297 372 1322 992 DR SP FL 0.749 0.749 0.749 SC 401 883 426 992 DR FL 0.000 0.000 0.000 SC 401 883 426 992 DR SP FL 0.749 0.749 0.749 SC 614 780 640 992 DR FL 0.000 0.000 0.000 SC 614 780 640 992 DR SP FL 0.749 0.749 0.749 SC 827 597 853 992 DR FL 0.000 0.000 0.000 SC 827 597 853 992 DR SP FL 0.749 0.749 0.749 SC 1041 451 1066 992 DR FL 0.000 0.000 0.000 SC 1041 451 1066 992 DR SP FL 0.749 0.749 0.749 SC 1254 410 1280 992 DR FL 0.000 0.000 0.000 SC 1254 410 1280 992 DR SP FL 358 883 383 992 DR FL 358 883 383 992 DR SP FL 571 786 597 992 DR FL 571 786 597 992 DR SP FL 785 608 810 992 DR FL 785 608 810 992 DR SP FL 998 487 1024 992 DR FL 998 487 1024 992 DR SP FL 1211 404 1237 992 DR FL 1211 404 1237 992 DR SP FL GR 1395 992 MT 1395 992 1395 120 DL FL 328 120 MT 328 120 1395 120 DL FL 328 992 MT 328 992 1395 992 DL FL 328 992 MT 328 992 328 120 DL FL GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF GR /Helvetica-Wingz 48.000 SF showpage restore %%EndDocument endTexFig 434 2479 a Fj(Figure)i(10:)j(Sp)q(eedup)e(on)e(an)g(Ethernet)g(Net)o (w)o(ork)f({)h(LGMD)952 2678 y(19)p eop %%Page: 20 20 20 19 bop 377 155 1197 2 v 376 212 2 57 v 385 212 V 680 212 V 706 195 a Fj(RP01-3)p 878 212 V 49 w(BAD)p 1029 212 V 49 w(CLP)p 1171 212 V 50 w(ADNIV)p 1374 212 V 51 w(LGMD)p 1564 212 V 1573 212 V 377 213 1197 2 v 376 270 2 57 v 385 270 V 410 253 a(1-pro)q(c.)20 b(time)p 680 270 V 107 w(4682)p 878 270 V 81 w(833)p 1029 270 V 51 w(4085)p 1171 270 V 111 w(9570)p 1374 270 V 75 w(13011)p 1564 270 V 1573 270 V 376 326 V 385 326 V 410 309 a(o)o(v)o(erhead)p 680 326 V 222 w(52)p 878 326 V 105 w(22)p 1029 326 V 96 w(47)p 1171 326 V 157 w(37)p 1374 326 V 122 w(122)p 1564 326 V 1573 326 V 376 383 V 385 383 V 410 366 a(seq.)g(families)p 680 383 V 154 w(29)p 878 383 V 105 w(18)p 1029 383 V 96 w(40)p 1171 383 V 157 w(20)p 1374 383 V 145 w(40)p 1564 383 V 1573 383 V 376 439 V 385 439 V 410 422 a(seq.)g(time)p 680 439 V 215 w(81)p 878 439 V 105 w(40)p 1029 439 V 96 w(87)p 1171 439 V 157 w(57)p 1374 439 V 122 w(162)p 1564 439 V 1573 439 V 376 496 V 385 496 V 410 479 a(8-pro)q(c.)g(time)p 680 496 V 130 w(775)p 878 496 V 81 w(213)p 1029 496 V 73 w(645)p 1171 496 V 112 w(1363)p 1374 496 V 98 w(1890)p 1564 496 V 1573 496 V 376 552 V 385 552 V 410 535 a(ideal)c(time)p 680 552 V 180 w(657)p 878 552 V 81 w(139)p 1029 552 V 73 w(587)p 1171 552 V 112 w(1246)p 1374 552 V 98 w(1768)p 1564 552 V 1573 552 V 376 609 V 385 609 V 410 592 a(ratio)p 680 609 V 269 w(1.18)p 878 609 V 69 w(1.53)p 1029 609 V 60 w(1.10)p 1171 609 V 121 w(1.09)p 1374 609 V 108 w(1.07)p 1564 609 V 1573 609 V 377 610 1197 2 v 158 687 a(T)l(able)g(2:)k(Assessmen)o(t)15 b(of)g(Reasons)f(for)g(Imp)q(erfect) i(Sp)q(eedup)h(on)f(8)e(pro)q(cessors)h(with)h(A)l(TM)264 821 y(tra)o(v)o(ersal.)39 b(This)22 b(computation)g(is)g(done)h(only)f (b)o(y)g(the)g(master)f(pro)q(cessor)h(for)f(the)264 877 y(lik)o(eliho)q(o)q(d)d(function)e(ev)m(aluation.)206 971 y(2.)22 b(Nuclear)12 b(families)i(whose)e(up)q(dates)g(are)g(done)g (sequen)o(tially)i(b)o(y)e(one)g(pro)q(cessor.)19 b(This)12 b(is)264 1028 y(called)i(\\sequen)o(tial)f(families")h(\(abbreviated)f (as)g(seq.)19 b(families)14 b(in)f(T)l(able)h(2\).)k(The)13 b(sum)264 1084 y(of)g(o)o(v)o(erhead)g(and)h(sequen)o(tial)h(families)g (is)f(called)h(\\sequen)o(tial)g(time")e(\(abbreviated)h(as)264 1140 y(seq.)20 b(time)15 b(in)h(T)l(able)g(2\).)206 1234 y(3.)22 b(Comm)o(unication)15 b(of)g(shared)g(data.)206 1328 y(4.)22 b(Load)15 b(Im)o(balance.)221 1422 y(T)l(o)k(assess)h(the) g(o)o(v)o(erhead)f(and)i(sequen)o(tial)g(time,)g(w)o(e)e(inserted)i (timers)f(in)o(to)g(the)g(co)q(de)150 1478 y(to)e(measure)g(the)h(time) g(sp)q(en)o(t)f(outside)h(the)g(parallel)h(co)q(de)f(and)g(the)f(time)h (sp)q(en)o(t)g(up)q(dating)150 1535 y(n)o(uclear)e(families)g(sequen)o (tially)l(.)24 b(It)16 b(should)h(b)q(e)g(noted)f(that)f(there)h(ma)o (y)f(b)q(e)i(a)e(sligh)o(t)i(\\prob)q(e)150 1591 y(e\013ect")e(in)h (the)f(\014gures.)221 1648 y(T)l(o)j(assess)g(the)h(com)o(bined)h(cost) e(of)h(comm)o(unication)g(and)g(imp)q(erfect)h(loadbalance,)g(w)o(e)150 1704 y(estimated)d(what)g(the)g(8-pro)q(cessor)g(running)i(time)e(w)o (ould)h(b)q(e)g(if)g(there)f(w)o(ere)g(no)g(comm)o(uni-)150 1761 y(cation)g(and)g(if)g(loadbalance)h(w)o(ere)e(p)q(erfect)h(for)f (the)h(n)o(uclear)h(families)g(up)q(dated)f(in)h(parallel.)150 1817 y(This)e(is)f(called)i(the)f(\\ideal)g(running)g(time")f(and)h(is) g(computed)f(as:)406 1886 y(\(1)f(pro)q(cessor)h(time)h({)f(sequen)o (tial)h(time\)/8)f(+)g(sequen)o(tial)h(time.)150 1955 y(The)c(di\013erence)h(b)q(et)o(w)o(een)e(the)h(actual)g(8)f(pro)q (cessor)g(running)i(time)f(and)g(the)f(ideal)i(8-pro)q(cessor)150 2011 y(running)k(time)g(is)g(our)f(estimate)g(of)g(the)g(cost)g(of)g (comm)o(unication)h(and)f(load)h(im)o(balance.)24 b(In)150 2068 y(T)l(able)11 b(2,)g(w)o(e)f(instead)h(sho)o(w)f(the)h(ratio)f(of) g(actual)h(8-pro)q(cessor)f(running)h(time)g(to)f(ideal)i(running)150 2124 y(time.)30 b(The)19 b(lo)o(w)o(est)f(ratio)g(w)o(e)g(could)h(hop)q (e)g(for)f(w)o(ould)h(b)q(e)g(1.0;)g(an)o(ything)g(ab)q(o)o(v)o(e)f (1.0)f(is)i(an)150 2181 y(indication)e(of)e(ine\016ciency)i(due)f(to)f (comm)o(unication)h(or)e(load)i(im)o(balance.)221 2237 y(W)l(e)e(tried)h(to)g(ev)m(aluate)g(the)g(p)q(erformance)g(of)f(the)h (adaptiv)o(e)f(loadbalancing)j(strategy)c(b)o(y)150 2294 y(itself,)19 b(using)f(one)g(of)f(the)g(runs)h(where)g(sp)q(eedup)h(is) f(not)f(as)g(go)q(o)q(d)h(as)f(on)g(some)g(others.)27 b(W)l(e)150 2350 y(sough)o(t)19 b(to)g(measure)h(ho)o(w)g(m)o(uc)o(h)g (v)m(ariation)g(there)g(is)g(in)h(the)f(w)o(ork)f(assigned)h(to)g (di\013eren)o(t)150 2407 y(pro)q(cessors,)e(when)g(a)f(n)o(uclear)i (family)f(is)g(up)q(dated)h(in)f(parallel)h(b)o(y)f(all)g(the)g(pro)q (cessors.)27 b(T)l(o)150 2463 y(measure)17 b(the)f(\015uctuation)i(w)o (e)e(did)i(the)f(RP01-3)e(run)i(rep)q(orted)g(later,)g(measuring)g(for) f(eac)o(h)150 2519 y(of)g(8)h(pro)q(cessors,)f(eac)o(h)h(function)g(ev) m(aluation,)h(and)f(eac)o(h)g(n)o(uclear)g(family)l(,)h(ho)o(w)e(m)o (uc)o(h)h(time)952 2678 y(20)p eop %%Page: 21 21 21 20 bop 237 405 1476 2 v 236 462 2 57 v 245 462 V 270 445 a Fj(#)15 b(F)l(amily)h(52)f(Max.)p 660 462 V 49 w(F)l(amily)g(52)g(Min.)p 1013 462 V 50 w(F)l(amily)h(37)f(Max)p 1363 462 V 49 w(F)l(amily)h(37)e(Min)p 1704 462 V 1713 462 V 237 463 1476 2 v 236 520 2 57 v 245 520 V 532 503 a(14.27)p 660 520 V 249 w(13.89)p 1013 520 V 267 w(1.13)p 1363 520 V 259 w(1.01)p 1704 520 V 1713 520 V 236 576 V 245 576 V 532 559 a(14.08)p 660 576 V 249 w(13.84)p 1013 576 V 267 w(1.08)p 1363 576 V 259 w(0.98)p 1704 576 V 1713 576 V 236 633 V 245 633 V 532 616 a(14.21)p 660 633 V 249 w(13.98)p 1013 633 V 267 w(1.07)p 1363 633 V 259 w(0.98)p 1704 633 V 1713 633 V 236 689 V 245 689 V 532 672 a(14.23)p 660 689 V 249 w(14.00)p 1013 689 V 267 w(1.09)p 1363 689 V 259 w(1.00)p 1704 689 V 1713 689 V 236 746 V 245 746 V 532 729 a(14.21)p 660 746 V 249 w(13.99)p 1013 746 V 267 w(1.13)p 1363 746 V 259 w(1.03)p 1704 746 V 1713 746 V 236 802 V 245 802 V 532 785 a(14.29)p 660 802 V 249 w(13.99)p 1013 802 V 267 w(1.07)p 1363 802 V 259 w(0.98)p 1704 802 V 1713 802 V 236 858 V 245 858 V 532 842 a(14.16)p 660 858 V 249 w(13.91)p 1013 858 V 267 w(1.07)p 1363 858 V 259 w(0.98)p 1704 858 V 1713 858 V 236 915 V 245 915 V 532 898 a(14.21)p 660 915 V 249 w(13.98)p 1013 915 V 267 w(1.09)p 1363 915 V 259 w(0.96)p 1704 915 V 1713 915 V 236 971 V 245 971 V 532 954 a(14.22)p 660 971 V 249 w(13.99)p 1013 971 V 267 w(1.08)p 1363 971 V 259 w(1.00)p 1704 971 V 1713 971 V 236 1028 V 245 1028 V 532 1011 a(14.21)p 660 1028 V 249 w(13.98)p 1013 1028 V 267 w(1.08)p 1363 1028 V 259 w(0.99)p 1704 1028 V 1713 1028 V 236 1084 V 245 1084 V 532 1067 a(14.23)p 660 1084 V 249 w(14.00)p 1013 1084 V 267 w(1.07)p 1363 1084 V 259 w(0.98)p 1704 1084 V 1713 1084 V 236 1141 V 245 1141 V 532 1124 a(14.16)p 660 1141 V 249 w(13.92)p 1013 1141 V 267 w(1.07)p 1363 1141 V 259 w(0.98)p 1704 1141 V 1713 1141 V 236 1197 V 245 1197 V 532 1180 a(14.21)p 660 1197 V 249 w(13.98)p 1013 1197 V 267 w(1.08)p 1363 1197 V 259 w(0.98)p 1704 1197 V 1713 1197 V 236 1254 V 245 1254 V 532 1237 a(14.20)p 660 1254 V 249 w(13.97)p 1013 1254 V 267 w(1.08)p 1363 1254 V 259 w(0.98)p 1704 1254 V 1713 1254 V 236 1310 V 245 1310 V 532 1293 a(14.21)p 660 1310 V 249 w(13.97)p 1013 1310 V 267 w(1.09)p 1363 1310 V 259 w(1.00)p 1704 1310 V 1713 1310 V 236 1367 V 245 1367 V 532 1350 a(14.14)p 660 1367 V 249 w(13.90)p 1013 1367 V 267 w(1.10)p 1363 1367 V 259 w(0.98)p 1704 1367 V 1713 1367 V 236 1423 V 245 1423 V 532 1406 a(14.16)p 660 1423 V 249 w(13.93)p 1013 1423 V 267 w(1.07)p 1363 1423 V 259 w(0.98)p 1704 1423 V 1713 1423 V 236 1479 V 245 1479 V 532 1463 a(14.23)p 660 1479 V 249 w(13.98)p 1013 1479 V 267 w(1.06)p 1363 1479 V 259 w(0.98)p 1704 1479 V 1713 1479 V 236 1536 V 245 1536 V 532 1519 a(14.21)p 660 1536 V 249 w(13.98)p 1013 1536 V 267 w(1.08)p 1363 1536 V 259 w(1.01)p 1704 1536 V 1713 1536 V 236 1592 V 245 1592 V 532 1575 a(14.22)p 660 1592 V 249 w(13.97)p 1013 1592 V 267 w(1.09)p 1363 1592 V 259 w(1.00)p 1704 1592 V 1713 1592 V 236 1649 V 245 1649 V 532 1632 a(14.23)p 660 1649 V 249 w(14.00)p 1013 1649 V 267 w(1.07)p 1363 1649 V 259 w(0.98)p 1704 1649 V 1713 1649 V 236 1705 V 245 1705 V 532 1688 a(14.14)p 660 1705 V 249 w(13.92)p 1013 1705 V 267 w(1.07)p 1363 1705 V 259 w(0.98)p 1704 1705 V 1713 1705 V 236 1762 V 245 1762 V 532 1745 a(14.22)p 660 1762 V 249 w(13.99)p 1013 1762 V 267 w(1.07)p 1363 1762 V 259 w(0.98)p 1704 1762 V 1713 1762 V 236 1818 V 245 1818 V 532 1801 a(14.22)p 660 1818 V 249 w(13.97)p 1013 1818 V 267 w(1.10)p 1363 1818 V 259 w(1.00)p 1704 1818 V 1713 1818 V 236 1875 V 245 1875 V 532 1858 a(14.22)p 660 1875 V 249 w(13.99)p 1013 1875 V 267 w(1.10)p 1363 1875 V 259 w(0.98)p 1704 1875 V 1713 1875 V 236 1931 V 245 1931 V 532 1914 a(14.23)p 660 1931 V 249 w(13.98)p 1013 1931 V 267 w(1.07)p 1363 1931 V 259 w(0.98)p 1704 1931 V 1713 1931 V 236 1988 V 245 1988 V 532 1971 a(14.14)p 660 1988 V 249 w(13.91)p 1013 1988 V 267 w(1.06)p 1363 1988 V 259 w(0.98)p 1704 1988 V 1713 1988 V 236 2044 V 245 2044 V 532 2027 a(14.15)p 660 2044 V 249 w(13.93)p 1013 2044 V 267 w(1.07)p 1363 2044 V 259 w(0.98)p 1704 2044 V 1713 2044 V 236 2100 V 245 2100 V 532 2084 a(14.25)p 660 2100 V 249 w(14.00)p 1013 2100 V 267 w(1.09)p 1363 2100 V 259 w(1.00)p 1704 2100 V 1713 2100 V 236 2157 V 245 2157 V 532 2140 a(14.23)p 660 2157 V 249 w(13.98)p 1013 2157 V 267 w(1.09)p 1363 2157 V 259 w(1.00)p 1704 2157 V 1713 2157 V 237 2159 1476 2 v 150 2238 a(T)l(able)21 b(3:)30 b(Maxim)o(um)21 b(and)f(minim)o(um)i(pro)q(cessor)e(times)h(\(in)g(seconds\))g(for)f (Tw)o(o)f(Nuclear)150 2295 y(F)l(amilies;)d(eac)o(h)g(ro)o(w)e(is)i(a)e (di\013eren)o(t)i(lik)o(eliho)q(o)q(d)i(function)e(ev)m(aluation)952 2678 y(21)p eop %%Page: 22 22 22 21 bop 150 195 a Fj(that)12 b(pro)q(cessor)h(sp)q(en)o(t)g(on)g (that)f(n)o(uclear)i(family)g(in)f(that)g(function)g(ev)m(aluation.)21 b(W)l(e)13 b(selected)150 252 y(t)o(w)o(o)k(of)g(the)h(families,)i (including)h(the)d(one)h(that)e(tak)o(es)g(the)h(most)f(time)i(b)o(y)f (far,)g(and)g(noted)150 308 y(for)c(eac)o(h)h(function)h(ev)m(aluation) g(the)g(largest)e(and)h(smallest)h(pro)q(cessor)f(times.)20 b(The)15 b(data)f(are)150 364 y(sho)o(w)h(in)h(T)l(able)g(3.)221 421 y(As)i(the)h(reader)f(can)h(see,)g(there)f(is)h(a)g(prett)o(y)e (consisten)o(t)i(di\013erence)h(of)e(ab)q(out)g(.24s)g(for)150 477 y(family)h(52)g(and)g(ab)q(out)f(.09s)g(for)g(family)i(37.)30 b(There)19 b(are)f(t)o(w)o(o)f(or)i(three)g(pro)q(cessors)f(whic)o(h) 150 534 y(consisten)o(tly)i(get)f(the)g(ligh)o(test)h(loads)f(and)h(t)o (w)o(o)e(or)h(three)g(pro)q(cessors)g(whic)o(h)h(consisten)o(tly)150 590 y(get)f(the)h(hea)o(viest)g(loads.)34 b(This)21 b(is)f(largely)g (due)h(to)e(the)h(e\013ects)f(of)h(discretization)h(on)f(the)150 647 y(partitioning)e(problem.)27 b(The)18 b(e\013ects)f(are)g(relativ)o (ely)i(larger)e(for)g(those)g(families)i(that)d(ha)o(v)o(e)150 703 y(few)o(er)f(p)q(ossible)i(genot)o(yp)q(es.)221 760 y(T)l(o)k(assess)h(the)g(relativ)o(e)h(imp)q(ortance)g(of)e(comm)o (unication)i(and)f(load)h(im)o(balance,)h(w)o(e)150 816 y(presen)o(t)18 b(four)g(pieces)i(of)e(evidence)i(that)d(all)i(suggest) f(that)g(the)g(cost)g(of)f(comm)o(unication)i(is)150 873 y(far)c(more)f(signi\014can)o(t)i(than)g(the)f(cost)g(of)f(load)i (im)o(balance.)221 929 y(First,)g(w)o(e)g(can)g(lo)q(ok)h(at)f(the)g (data)g(from)g(T)l(able)h(3.)24 b(W)l(e)16 b(assume)g(\(in)h(all)h (cases)e(trying)h(to)150 985 y(increase)f(the)f(e\013ect)g(of)f(load)i (im)o(balance\))f(that)g(family)g(37)g(is)g(roughly)h(represen)o(tativ) o(e)e(of)h(all)150 1042 y(the)j(other)f(n)o(uclear)h(families)h(up)q (dated)f(in)g(parallel,)i(that)c(load)i(im)o(balance)h(is)f(roughly)g (half)150 1098 y(the)g(di\013erence)h(b)q(et)o(w)o(een)f(maxim)o(um)f (and)h(minim)o(um)h(times,)f(and)g(that)f(there)h(is)g(no)f(prob)q(e) 150 1155 y(e\013ect.)j(With)15 b(these)g(assumptions,)g(the)g(data)g (in)h(T)l(able)f(3)g(w)o(ould)h(indicate)g(that)f(the)g(o)o(v)o(erall) 150 1211 y(load)f(im)o(balance)h(for)e(our)g(RP01-3)f(run)i(is)g(v)o (ery)f(roughly)h(20s.)19 b(Ev)o(en)13 b(if)h(this)g(w)o(ere)g(to)q(o)f (lo)o(w)g(b)o(y)150 1268 y(a)j(factor)e(of)i(2,)f(it)h(w)o(ould)g (still)i(b)q(e)e(less)h(than)f(half)g(of)f(the)h(gap)g(b)q(et)o(w)o (een)g(the)g(actual)g(running)150 1324 y(time)h(of)g(775s)f(and)h(the)g (ideal)h(running)g(time)f(of)g(657s.)24 b(Because)17 b(the)g(load)h(im)o(balance)g(that)150 1381 y(remains)e(o)q(ccurs)f(in) h(v)o(ery)f(small)h(quan)o(ta,)e(it)i(seems)f(to)f(b)q(e)i(a)f(v)o(ery) g(hard)g(problem)h(to)f(\014x.)221 1437 y(Second,)d(if)f(w)o(e)f (compare)g(the)h(baseline)h(sp)q(eedup)g(against)e(the)h(sp)q(eedup)h (with)f(just)f(parallel)150 1494 y(gradien)o(t)j(estimation)g(and)g (Ethernet)g(vs.)19 b(A)l(TM,)13 b(w)o(e)g(see)g(that)f(parallel)j (gradien)o(t)e(estimation)150 1550 y(has)e(a)h(m)o(uc)o(h)f(larger)h (e\013ect)f(on)g(Ethernet)h(than)f(on)h(A)l(TM.)f(An)h(imp)q(ortan)o(t) f(di\013erence)i(b)q(et)o(w)o(een)150 1606 y(Ethernet)f(and)g(A)l(TM)g (is)g(that)f(comm)o(unication)i(is)g(m)o(uc)o(h)f(faster)f(with)h(the)g (A)l(TM)g(switc)o(h.)19 b(The)150 1663 y(main)12 b(virtue)g(of)f (parallel)i(gradien)o(t)f(estimation)g(is)g(that)f(it)h(signi\014can)o (tly)h(reduces)f(the)g(amoun)o(t)150 1719 y(of)j(comm)o(unication)h (for)f(those)g(function)h(ev)m(aluations)h(where)f(it)g(is)f(applied)j (b)q(ecause)e(sets)f(of)150 1776 y(pro)q(cessor)k(w)o(orking)g(on)h (di\013eren)o(t)f(function)i(ev)m(aluations)f(do)g(not)f(need)h(to)f (comm)o(unicate.)150 1832 y(F)l(or)14 b(example,)h(on)g(the)f(RP01-3)g (run)g(using)i(A)l(TM)e(and)h(8)f(pro)q(cessors,)g(the)h(parallel)h (function)150 1889 y(ev)m(aluation)e(reduced)g(the)f(amoun)o(t)f(of)g (comm)o(unication)h(from)f(appro)o(ximately)h(359Mb)o(ytes)e(of)150 1945 y(data)16 b(shipp)q(ed)i(and)f(851K)f(messages)g(to)g(286Mb)o (ytes)f(and)i(620K)f(messages.)23 b(Ho)o(w)o(ev)o(er,)16 b(the)150 2002 y(function)d(ev)m(aluations)g(where)g Fe(\022)g Fj(is)g(b)q(eing)g(up)q(dated)g(cannot)f(b)q(e)h(done)f(in)h (parallel.)20 b(Therefore,)150 2058 y(it)14 b(stands)f(to)g(reason)g (that)g(comm)o(unication)h(is)h(still)g(a)e(ma)s(jor)f(b)q(ottlenec)o (k)i(on)g(those)f(function)150 2115 y(ev)m(aluations.)21 b(W)l(e)13 b(can)h(see)g(this)g(in)g(more)g(detail)g(with)g(data)f(for) g(the)h(RP01-3)e(run.)20 b(That)13 b(run)150 2171 y(has)i(a)f(total)h (of)f(33)g(function)i(ev)m(aluations,)g(of)e(whic)o(h)i(14)e(in)o(v)o (olv)o(e)i(estimating)f(gradien)o(ts)g(and)150 2227 y(19)c(in)o(v)o (olv)o(e)h(up)q(dating)h Fe(\022)q Fj(.)19 b(The)12 b(running)h(time)f (using)g(8)g(pro)q(cessors)f(and)h(A)l(TM)g(without)f(either)150 2284 y(strategy)17 b(is)i(848s.)28 b(The)18 b(running)i(time)e(with)h (just)f(parallel)i(gradien)o(t)e(estimation)g(is)h(793s.)150 2340 y(Therefore,)13 b(w)o(e)g(sa)o(v)o(ed)f(55s)g(essen)o(tially)j(b)o (y)d(reducing)j(comm)o(unication)e(on)g(those)g(14)f(function)150 2397 y(ev)m(aluations)h(where)e(the)h(gradien)o(t)f(is)h(b)q(eing)h (estimated.)19 b(If)12 b(w)o(e)f(extrap)q(olate)g(this)h(to)f(the)g (other)150 2453 y(19)k(function)i(ev)m(aluations,)g(the)e(extra)h(comm) o(unication)g(accoun)o(ts)f(for)h(\(19)p Fe(=)p Fj(14\))8 b Fb(\002)j Fj(55)i(=)h(75s,)150 2510 y(whic)o(h)19 b(is)f(the)g(ma)s (jorit)o(y)f(of)g(the)h(gap)g(b)q(et)o(w)o(een)g(the)g(8-pro)q(cessor)f (running)i(time)g(with)f(b)q(oth)952 2678 y(22)p eop %%Page: 23 23 23 22 bop 150 195 a Fj(strategies)15 b(of)f(775s)h(and)g(the)g(ideal)i (running)f(time)g(of)f(657s)f(in)i(T)l(able)g(2.)221 252 y(Third,)24 b(sev)o(eral)e(of)f(the)h(lo)o(w-lev)o(el)i(c)o(hanges) e(describ)q(ed)h(in)g(the)f(last)g(section)h(had)f(the)150 308 y(primary)17 b(e\013ect)g(of)f(reducing)i(the)f(n)o(um)o(b)q(er)h (of)e(messages)g(sen)o(t.)25 b(On)18 b(the)f(8-pro)q(cessor)f(A)l(TM) 150 364 y(run)h(of)g(the)h(BAD)f(data)f(set,)i(they)f(reduced)h (running)h(time)e(b)o(y)g(ab)q(out)g(15s)g(while)i(reducing)150 421 y(the)g(total)e(n)o(um)o(b)q(er)i(of)f(messages)g(from)g(ab)q(out)g (197K)g(to)g(ab)q(out)h(164K.)e(If)i(w)o(e)f(extrap)q(olate)150 477 y(these)h(\014gures,)h(w)o(e)e(see)h(that)f(the)h(remaining)h(164K) e(messages)h(probably)g(accoun)o(t)g(for)f(the)150 534 y(bulk)g(of)e(the)g(gap)h(b)q(et)o(w)o(een)f(the)h(actual)g(8-pro)q (cessor)f(running)i(time)e(of)h(213s)e(and)i(the)g(ideal)150 590 y(8-pro)q(cessor)e(running)h(time)g(of)e(139s.)221 647 y(F)l(ourth,)h(w)o(e)g(tried)h(to)g(impro)o(v)o(e)f(the)h(running)h (time)f(on)g(BAD)g(b)o(y)f(reparameterizing)i(the)150 703 y(loadbalancing)k(strategy)d(to)h(reduce)h(the)g(load)f(on)h(the)f (master)g(pro)q(cessor)g(whic)o(h)h(sets)f(up)150 760 y(eac)o(h)i(n)o(uclear)g(family)g(up)q(date.)36 b(W)l(e)21 b(assigned)g(the)f(w)o(ork)g(so)g(that)f(this)i(pro)q(cessor)g(w)o (ould)150 816 y(get)14 b(substan)o(tially)i(less)g(than)f(1)p Fe(=p)f Fj(of)g(the)h(w)o(ork)f(on)h(those)g(n)o(uclear)h(families)g (that)e(w)o(ere)h(split)150 873 y(among)h(all)h(the)f(pro)q(cessors.)23 b(Reducing)17 b(the)g(amoun)o(t)e(of)h(w)o(ork)g(for)f(the)i(\014rst)f (pro)q(cessor)g(did)150 929 y(not)f(impro)o(v)o(e)g(the)g(running)i (time)e(measurably)l(.)221 985 y(In)g(general,)g(the)g(sp)q(eedups)h (for)e(all)i(data)e(sets)h(except)g(BAD)g(are)g(quite)g(go)q(o)q(d.)20 b(F)l(rom)14 b(the)150 1042 y(data)e(in)h(T)l(able)g(2)f(and)g(the)h (ab)q(o)o(v)o(e)f(discussion,)i(w)o(e)e(see)h(that)e(three)i(reasons)f (con)o(tribute)g(to)g(the)150 1098 y(inferior)18 b(sp)q(eedup)g (obtained)g(for)e(BAD,)g(but)h(comm)o(unication)h(is)f(the)g(biggest)g (con)o(tributor.)150 1155 y(The)k(cost)g(of)g(comm)o(unication)h(is)g (roughly)f(74s)g(\(213{139\),)f(as)h(opp)q(osed)g(to)g(only)h(40s)e(of) 150 1211 y(sequen)o(tial)e(time.)27 b(It)17 b(seems)g(v)o(ery)g (di\016cult)i(and)e(somewhat)g(p)q(oin)o(tless)h(to)f(do)g(m)o(uc)o(h)g (ab)q(out)150 1268 y(the)12 b(sequen)o(tial)i(time.)19 b(T)l(able)13 b(2)g(sho)o(ws)e(clearly)j(that)d(the)i(sequen)o(tial)g (time)g(tends)g(to)e(decrease)150 1324 y(in)19 b(signi\014cance)g(as)f (the)g(runs)g(get)f(longer;)i(for)f(example)g(it)g(accoun)o(ts)g(for)f (5\045)h(of)f(the)h(BAD)150 1381 y(1-pro)q(cessor)d(time,)g(but)g(only) h(1\045)f(of)g(the)g(LGMD)g(1-pro)q(cessor)f(time.)221 1437 y(The)19 b(larger)f(amoun)o(t)g(of)h(comm)o(unication)g(p)q(er)g (unit)h(time)f(for)f(BAD)h(is)g(due)h(primarily)150 1494 y(to)f(the)h(lo)q(op)h(in)g(the)f(data)f(set.)34 b(Unfortunately)20 b(the)h(BAD)f(data)f(set)h(has)f(data)h(sp)q(eci\014ed)150 1550 y(for)e(only)h(3)g(lo)q(ci,)h(so)f(it)g(is)g(not)f(p)q(ossible)j (to)d(do)h(a)f(longer)h(4-lo)q(cus)h(run)f(to)f(understand)h(the)150 1606 y(asymptotic)e(b)q(eha)o(vior)h(b)q(etter.)28 b(When)18 b(p)q(edigrees)h(ha)o(v)o(e)e(lo)q(ops,)h(eac)o(h)g(function)h(ev)m (aluation)150 1663 y(do)q(es)14 b(m)o(ultiple)h(tra)o(v)o(ersals)d(of)g (the)i(p)q(edigree.)20 b(It)13 b(w)o(ould)h(b)q(e)g(natural)f(to)g(do)g (the)g(di\013eren)o(t)g(lo)q(op)150 1719 y(tra)o(v)o(ersals)f(in)h (parallel,)h(but)f(this)g(is)h(tric)o(ky)e(b)q(ecause)i(di\013eren)o(t) f(tra)o(v)o(ersals)e(will)k(tak)o(e)d(di\013eren)o(t)150 1776 y(amoun)o(ts)21 b(of)g(time.)41 b(F)l(urthermore,)22 b(Sc)o(h\177)-23 b(a\013er,)23 b(Gupta,)g(Shriram,)g(and)f(Cottingham)f ([21)o(])150 1832 y(made)g(a)h(substan)o(tial)g(impro)o(v)o(emen)o(t)f (in)h(the)g(lo)q(op)g(handling)h(strategy)d(in)i(v)o(ersion)g(2.0)e(of) 150 1889 y(F)-5 b(ASTLINK.)17 b(W)l(e)g(are)g(curren)o(tly)g(w)o (orking)g(on)g(other)f(fundamen)o(tal)h(impro)o(v)o(emen)o(ts)g(to)f (the)150 1945 y(sequen)o(tial)g(algorithms)e(for)g(handling)j(lo)q (ops.)j(T)l(o)14 b(parallelize)j(the)e(lo)q(op)g(tra)o(v)o(ersals)f(it) h(w)o(ould)150 2002 y(mak)o(e)e(sense)i(to)e(start)g(with)h(the)g (impro)o(v)o(ed)g(sequen)o(tial)i(algorithm,)d(but)h(this)h(w)o(ould)f (mak)o(e)g(it)150 2058 y(imp)q(ossible)g(to)e(prop)q(erly)h(compare)f (running)h(times)f(with)h(our)e(\014rst)h(parallel)i(implemen)o(tation) 150 2115 y(of)h(ILINK.)150 2258 y Fg(8)69 b(Discussion)150 2359 y Fj(The)19 b(sequen)o(tial)g(algorithmic)g(impro)o(v)o(emen)o(ts) f(in)i(F)-5 b(ASTLINK)19 b(ha)o(v)o(e)f(help)q(ed)i(man)o(y)e(users,) 150 2416 y(but)e(they)g(do)g(not)g(pro)o(vide)g(enough)h(sp)q(eedup)g (to)f(solv)o(e)g(man)o(y)g(problems)g(that)f(users)i(w)o(ould)150 2472 y(lik)o(e)i(to)e(solv)o(e.)29 b(In)18 b(resp)q(onse)h(to)e(a)h (questionnaire)h(w)o(e)f(sen)o(t)f(out)h(to)f(sev)o(eral)h(dozen)h (sequen-)150 2529 y(tial)e(F)-5 b(ASTLINK)18 b(users,)e(only)i(one)e (resp)q(onden)o(t)h(rep)q(orted)g(that)f(she)h(did)g(not)g(need)g (further)952 2678 y(23)p eop %%Page: 24 24 24 23 bop 150 195 a Fj(sp)q(eedup)13 b(b)q(ey)o(ond)f(that)f(in)h(our)f (sequen)o(tial)i(co)q(de.)19 b(An)12 b(e\013ectiv)o(e)f(and)h (comprehensiv)o(e)g(parallel)150 252 y(implemen)o(tation)j(of)e(F)-5 b(ASTLINK)15 b(is)f(clearly)h(called)h(for.)i(Previous)d(attempts)d(to) h(parallelize)150 308 y(LINKA)o(GE)j(ha)o(v)o(e)g(handled)h(only)g (some)e(t)o(yp)q(es)h(of)f(inputs)i(and)f(ha)o(v)o(e)f(not)h(b)q(een)h (used)f(b)o(y)g(the)150 364 y(LINKA)o(GE)g(user)f(comm)o(unit)o(y)l(.) 221 421 y(This)22 b(pap)q(er)g(describ)q(es)h(the)f(second)g(ma)s(jor)e (scien)o(ti\014c)j(step)f(to)o(w)o(ards)e(a)h(truly)h(usable)150 477 y(parallel)13 b(F)-5 b(ASTLINK.)13 b(W)l(e)e(ha)o(v)o(e)h (completely)h(in)o(tegrated)e(a)g(strategy)g(for)g(parallel)i(lik)o (eliho)q(o)q(d)150 534 y(ev)m(aluations)j(in)f(a)f(setting)h(where)f (it)h(is)g(applicable)i(only)e(during)g(parts)f(of)g(the)h(run,)f(whic) o(h)h(is)150 590 y(harder)f(than)h(if)f(it)h(w)o(ere)f(applicable)j (throughout)c(a)i(run.)k(These)c(mo)q(di\014cations)h(allo)o(w)e(us)h (to)150 647 y(exploit)g(parallelism)g(at)e(di\013eren)o(t)h(lev)o(els)h (of)e(the)h(computation,)g(where)g(p)q(ossible.)21 b(They)14 b(tak)o(e)150 703 y(adv)m(an)o(tage)h(of)h(the)g(fact)f(that)h(new)o (er)g(net)o(w)o(orks,)e(suc)o(h)j(as)e(A)l(TM)h(net)o(w)o(orks,)f(allo) o(w)h(p)q(oin)o(t-to-)150 760 y(p)q(oin)o(t)g(comm)o(unication.)221 816 y(W)l(e)k(in)o(tro)q(duced)i(a)e(lo)o(w-lev)o(el)i(adaptiv)o(e)f (loadbalancing)h(strategy)d(to)h(protect)g(against)150 873 y(certain)e(p)q(oten)o(tial)h(im)o(balance)g(problems)f(inheren)o (t)h(in)f(the)g(data.)27 b(Our)18 b(adaptiv)o(e)g(loadbal-)150 929 y(ancing)c(strategy)e(is)i(implemen)o(ted)i(for)c(a)i(homogeneous)f (net)o(w)o(ork)f(b)q(ecause)j(that)d(is)i(what)f(w)o(e)150 985 y(ha)o(v)o(e)18 b(a)o(v)m(ailable.)32 b(Ho)o(w)o(ev)o(er,)18 b(w)o(e)h(think)g(it)g(w)o(ould)g(not)f(b)q(e)h(hard)g(to)f(mo)q(dify)h (the)g(algorithm)150 1042 y(for)e(a)g(heterogeneous)h(net)o(w)o(ork)e (with)i(mac)o(hines)g(of)f(di\013eren)o(t)h(sp)q(eeds.)28 b(Since)19 b(w)o(e)e(compute)150 1098 y(running)g(times)f(for)f(small)i (pieces)g(of)e(eac)o(h)h(n)o(uclear)g(family)h(up)q(date,)f(w)o(e)f (could)i(balance)g(the)150 1155 y(load)f(on)g(a)g(heterogeneous)g(net)o (w)o(ork)f(b)o(y)h(w)o(eigh)o(ting)g(eac)o(h)g(ro)o(w)f(time)h(b)o(y)g (the)g(relativ)o(e)h(sp)q(eed)150 1211 y(of)e(the)g(pro)q(cessor)g (that)g(computes)g(that)f(ro)o(w.)221 1268 y(Eac)o(h)19 b(of)h(the)g(t)o(w)o(o)f(parallelization)j(strategies)e(impro)o(v)o(es) g(the)g(sp)q(eedup)h(b)o(y)f(a)g(fraction)150 1324 y(of)d(a)g(pro)q (cessor)h(on)f(most)g(runs)h(with)f(6)h(or)f(8)g(pro)q(cessors)g(using) h(either)h(Ethernet)e(or)g(A)l(TM)150 1381 y(net)o(w)o(orks.)h(The)13 b(impro)o(v)o(emen)o(ts)f(close)i(m)o(uc)o(h)f(of)f(the)h(gap)f(b)q(et) o(w)o(een)h(the)g(sp)q(eedup)h(of)f(our)f(\014rst)150 1437 y(parallel)j(implemen)o(tation)g(and)e(p)q(erfect)h(sp)q(eedup.)21 b(The)13 b(new)h(parallelization)h(strategies)e(are)150 1494 y(particularly)k(noticeable)g(as)f(the)g(n)o(um)o(b)q(er)g(of)f (pro)q(cessors)h(increases;)h(this)f(is)g(not)g(surprising)150 1550 y(b)q(ecause)h(the)g(sp)q(eedups)g(for)f(our)g(\014rst)g(implemen) o(tation)i(w)o(ere)e(v)o(ery)g(go)q(o)q(d)g(for)g(up)g(to)g(4)g(pro-) 150 1606 y(cessors,)e(lea)o(ving)i(little)g(ro)q(om)f(for)f(impro)o(v)o (emen)o(t)h(there.)20 b(The)15 b(sp)q(eedups)h(on)f(runs)g(that)g(tak)o (e)150 1663 y(o)o(v)o(er)f(1)g(hour)g(sequen)o(tially)i(are)e(quite)h (satisfactory)e(on)i(the)f(A)l(TM,)g(but)g(the)h(sp)q(eedup)h(on)e(the) 150 1719 y(one)19 b(shorter)f(run)h(\(less)g(than)f(15)h(min)o(utes)g (sequen)o(tially\))h(that)e(w)o(e)g(tried)i(is)f(still)h(not)e(v)o(ery) 150 1776 y(go)q(o)q(d.)24 b(Users)16 b(of)h(sequen)o(tial)g(LINKA)o(GE) h(and)e(F)-5 b(ASTLINK)18 b(often)e(w)o(ait)g(for)g(1{3)g(w)o(eeks)h (for)150 1832 y(a)e(sequen)o(tial)h(run,)f(so)g(it)h(is)f(the)h(sp)q (eedup)g(on)f(the)h(long)f(runs)h(that)e(matters,)g(in)i(practice.)221 1889 y(W)l(e)e(in)o(v)o(estigated)h(the)f(p)q(ossibilit)o(y)j(of)c (splitting)j(up)f(the)f(lik)o(eliho)q(o)q(d)k(function)d(ev)m(aluation) 150 1945 y(b)o(y)j(assigning)h(di\013eren)o(t)f(n)o(uclear)h(families)h (to)e(di\013eren)o(t)g(pro)q(cessors.)29 b(This)18 b(had)h(b)q(een)g (pro-)150 2002 y(p)q(osed)d(b)o(y)g(Sc)o(hork)f([22)o(])h(in)g(a)f (theoretical)i(pap)q(er.)k(W)l(e)16 b(ha)o(v)o(e)f(not)h(rep)q(orted)f (in)i(detail)g(on)e(our)150 2058 y(trial)20 b(implemen)o(tation)h(b)q (ecause)f(w)o(e)f(found)h(that)f(it)g(consisten)o(tly)i(increased)f (the)g(running)150 2115 y(time)c(measurably)l(.)221 2171 y(Qualitativ)o(e)11 b(observ)m(ations)g(of)g(our)f(implemen)o(tation)i (of)e(Sc)o(hork's)g(idea)i(in)f(ILINK)i(suggest)150 2227 y(the)i(follo)o(wing)h(di\016culties:)206 2321 y(1.)22 b(Most)15 b(of)i(the)g(n)o(uclear)g(families)h(that)e(tak)o(e)h(a)f (lot)h(of)f(time)h(to)f(up)q(date)i(are)e(at)g(the)h(top)264 2378 y(of)d(the)i(p)q(edigree,)g(where)f(the)h(n)o(um)o(b)q(er)f(of)g (n)o(uclear)h(families)g(whose)f(probabilities)j(can)264 2434 y(logically)e(b)q(e)f(up)q(dated)g(in)g(parallel)h(is)f(almost)f (certain)g(to)g(b)q(e)h(few)o(er)f(than)g(the)h(n)o(um)o(b)q(er)264 2491 y(of)f(pro)q(cessors.)952 2678 y(24)p eop %%Page: 25 25 25 24 bop 206 195 a Fj(2.)22 b(Because)17 b(of)f(problem)h(1,)f(the)g (only)h(w)o(a)o(y)e(to)h(get)g(go)q(o)q(d)g(sp)q(eedup)i(is)f(to)f (assign)g(n)o(uclear)264 252 y(families)23 b(to)e(subsets)g(of)g(pro)q (cessors)h(that)f(ha)o(v)o(e)g(more)g(than)g(1,)i(but)f(few)o(er)f (than)g Fe(p)264 308 y Fj(pro)q(cessors.)d(This)c(is)f(extremely)g (hard)g(to)f(implemen)o(t)i(correctly)e(let)i(alone)f(implemen)o(t)264 364 y(with)i(go)q(o)q(d)g(loadbalance.)206 451 y(3.)22 b(A)o(t)12 b(the)i(lo)o(w)o(er)f(lev)o(els)h(of)f(the)h(p)q(edigree,)g (the)g(n)o(uclear)g(families)h(are)e(up)q(dated)h(so)f(quic)o(kly)264 508 y(that)i(sending)j(the)f(data)e(o)o(v)o(er)h(the)h(net)o(w)o(ork)e (\(so)h(that)g(di\013eren)o(t)g(pro)q(cessors)g(w)o(ork)g(on)264 564 y(di\013eren)o(t)f(families)i(in)f(parallel\))g(slo)o(ws)f(do)o(wn) g(the)g(computation)g(signi\014can)o(tly)l(.)150 641 y(Nev)o(ertheless,)j(Sc)o(hork's)e(suggestion)h(is)g(theoretically)h (app)q(ealing)h(and)e(w)o(e)f(w)o(ould)h(b)q(e)h(most)150 698 y(in)o(terested)e(to)e(see)i(if)f(other)g(researc)o(hers)g(can)h (get)e(it)i(to)e(w)o(ork)h(e\013ectiv)o(ely)h(in)g(F)-5 b(ASTLINK.)221 754 y(Our)15 b(in)o(tegration)f(fo)h(m)o(ultiple)h (parallelization)h(strategies)d(in)i(ILINK)g(exploits)g(di\013eren)o(t) 150 811 y(opp)q(ortunities)f(for)e(parallelism.)21 b(It)14 b(is)g(suited)h(to)e(net)o(w)o(orks)f(with)i(p)q(oin)o(t-to-p)q(oin)o (t)g(comm)o(uni-)150 867 y(cation,)j(but)f(also)h(w)o(orks)e (reasonably)i(w)o(ell)g(on)f(Ethernet.)24 b(By)17 b(using)g(a)f (distributed)i(shared)150 923 y(memory)c(system)f(suc)o(h)i(as)f(T)l (readMarks)f(w)o(e)h(ha)o(v)o(e)g(tried)g(to)g(an)o(ticipate)h(what)e (hardw)o(are)h(p)q(o-)150 980 y(ten)o(tial)j(users)h(will)g(ha)o(v)o(e) f(a)o(v)m(ailable.)27 b(Our)17 b(implemen)o(tation)h(can)f(run)h (either)f(on)g(a)g(net)o(w)o(ork)150 1036 y(of)c(w)o(orkstations)f(or)g (on)h(a)g(shared-memory)g(m)o(ultipro)q(cessor.)20 b(Ho)o(w)o(ev)o(er,) 12 b(man)o(y)h(F)-5 b(ASTLINK)150 1093 y(users)20 b(do)g(not)f(ha)o(v)o (e)h(access)g(to)f(more)h(than)f(one)h(w)o(orkstation.)33 b(With)20 b(this)h(constrain)o(t)e(in)150 1149 y(mind,)14 b(sev)o(eral)f(F)-5 b(ASTLINK)15 b(users)e(ha)o(v)o(e)f(started)h(to)f (build)j(serv)o(ers,)e(where)g(link)m(age)i(analysis)150 1206 y(problems)g(can)g(b)q(e)h(submitted)f(b)o(y)g(electronic)h(mail)f (and)g(the)g(serv)o(er)f(returns)h(the)g(answ)o(er)f(b)o(y)150 1262 y(mail.)20 b(When)15 b(our)f(parallel)i(co)q(de)e(is)h(ready)f (for)g(general)h(usage)f(and)g(distribution)i(w)o(e)e(hop)q(e)h(it)150 1319 y(will)i(b)q(e)f(used)g(in)g(suc)o(h)f(link)m(age)i(serv)o(ers.) 150 1459 y Fg(Ac)n(kno)n(wledgmen)n(ts)150 1560 y Fj(W)l(e)j(thank)f (Dr.)33 b(Stephen)20 b(P)l(.)g(Daiger,)g(Dr.)32 b(Lori)21 b(A.)e(Sadler,)i(Mr.)32 b(Rob)q(ert)19 b(W.)g(Cotting-)150 1617 y(ham)g(Jr.,)g(Dr.)31 b(Da)o(vid)19 b(R.)e(Co)o(x,)i(Dr.)31 b(Ric)o(hard)19 b(M.)f(My)o(ers,)h(Dr.)30 b(Susan)20 b(H.)e(Blan)o(ton,)i(Dr.)150 1673 y(Jacqueline)j(T.)e(Hec)o(h)o(t,)g (Dr.)37 b(Ed)21 b(Stone,)h(Dr.)37 b(Brian)21 b(Nic)o(hols,)i(Dr.)37 b(Marcy)20 b(Sp)q(eer,)j(and)150 1729 y(Dr.)c(Margaret)11 b(P)o(ericak-V)l(ance)k(for)e(con)o(tributing)h(the)f(disease)i(family) f(data)f(for)f(our)i(exp)q(eri-)150 1786 y(men)o(ts.)19 b(Dev)o(elopmen)o(t)14 b(of)g(the)f(RP)h(data)f(set)h(w)o(as)f(supp)q (orted)h(b)o(y)g(gran)o(ts)e(from)i(the)g(National)150 1842 y(Retinitis)21 b(Pigmen)o(tosa)e(F)l(oundation)i(and)f(the)g (George)f(Gund)h(F)l(oundation.)35 b(The)20 b(Amish)150 1899 y(family)15 b(data)f(w)o(as)f(dev)o(elop)q(ed)j(with)f(the)g(supp) q(ort)f(of)g(a)g(gran)o(t)f(from)h(the)h(National)f(Institutes)150 1955 y(of)20 b(Health.)35 b(Dev)o(elopmen)o(t)20 b(of)g(the)g(CLP)h (data)e(set)h(w)o(as)g(supp)q(orted)g(b)o(y)g(gran)o(ts)f(from)h(the) 150 2012 y(National)g(Institutes)g(of)f(Health)i(and)e(Shriners)i (Hospital.)34 b(Dev)o(elopmen)o(t)20 b(of)f(the)h(LGMD)150 2068 y(data)c(set)g(w)o(as)g(supp)q(orted)h(b)o(y)g(gran)o(ts)e(from)h (the)h(National)g(Institutes)g(of)f(Health)h(and)g(from)150 2125 y(the)e(Muscular)h(Dystroph)o(y)e(Asso)q(ciation.)21 b(This)16 b(w)o(ork)f(w)o(as)f(supp)q(orted)i(b)o(y)f(gran)o(ts)f(from) h(the)150 2181 y(National)j(Science)h(F)l(oundation)f(and)f(the)h(T)l (exas)f(Adv)m(anced)i(T)l(ec)o(hnology)f(Program)e(and)h(a)150 2238 y(con)o(tract)d(from)h(IBM.)150 2396 y Fg(References)173 2497 y Fj([1])21 b(S.)11 b(H.)g(Blan)o(ton,)h(J.)f(R.)g(Hec)o(k)o (enliv)o(ely)l(,)j(A.)d(W.)f(Cottingham,)h(J.)g(F)l(riedman,)h(L.)g(A.) f(Sadler,)243 2554 y(M.)k(W)l(agner,)g(L.)h(H.)f(F)l(riedman,)h(and)f (S.)h(P)l(.)f(Daiger.)21 b(Link)m(age)16 b(mapping)h(of)e(autosomal)952 2678 y(25)p eop %%Page: 26 26 26 25 bop 243 195 a Fj(dominan)o(t)17 b(retinitis)g(pigmen)o(tosa)f (\(RP1\))f(to)g(the)i(p)q(ericen)o(tric)h(region)e(of)g(h)o(uman)g(c)o (hro-)243 252 y(mosome)f(8.)k Ff(Genomics)p Fj(,)c(11:857{869,)d(1991.) 173 345 y([2])21 b(Roger)11 b(D.)f(Cham)o(b)q(erlain,)j(Mark)e(A.)g(F)l (ranklin,)h(Gregory)f(D.)f(P)o(eterson,)h(and)h(Mic)o(hael)g(A.)243 402 y(Pro)o(vince.)k(Genetic)c(epidemiology)l(,)j(parallel)e (algorithms,)g(and)f(w)o(orkstation)e(net)o(w)o(orks.)243 458 y(T)l(ec)o(hnical)17 b(Rep)q(ort)e(WUCCR)o(C-94-14,)d(W)l (ashington)k(Univ)o(ersit)o(y)l(,)f(1994.)173 552 y([3])21 b(R.)g(W.)f(Cottingham)h(Jr.,)h(R.)e(M.)h(Idury)l(,)i(and)e(A.)g(A.)g (Sc)o(h\177)-23 b(a\013er.)37 b(F)l(aster)21 b(sequen)o(tial)243 609 y(genetic)d(link)m(age)g(computations.)23 b Ff(A)o(meric)n(an)17 b(Journal)g(of)h(Human)g(Genetics)p Fj(,)d(53:252{)243 665 y(263,)f(1993.)173 759 y([4])21 b(S.)13 b(Dw)o(ark)m(adas,)f(P)l(.) h(Keleher,)i(A.L.)d(Co)o(x,)h(and)g(W.)f(Zw)o(aenep)q(o)q(el.)18 b(Ev)m(aluation)c(of)e(release)243 815 y(consisten)o(t)19 b(soft)o(w)o(are)e(distributed)i(shared)g(memory)f(on)g(emerging)h(net) o(w)o(ork)e(tec)o(hnol-)243 872 y(ogy)l(.)i(In)c Ff(Pr)n(o)n(c)n(e)n(e) n(dings)e(of)j(the)g(20th)g(A)o(nnual)f(International)f(Symp)n(osium)i (on)f(Computer)243 928 y(A)o(r)n(chite)n(ctur)n(e)p Fj(,)g(pages)g (144{155,)d(1993.)173 1022 y([5])21 b(S.)12 b(Dw)o(ark)m(adas,)e(A.)h (A.)g(Sc)o(h\177)-23 b(a\013er,)11 b(R.)g(W.)f(Cottingham)h(Jr.,)g(A.)g (L.)h(Co)o(x,)e(P)l(.)h(Keleher,)j(and)243 1078 y(W.)j(Zw)o(aenep)q(o)q (el.)29 b(P)o(arallelization)19 b(of)e(general)h(link)m(age)i(analysis) e(problems.)28 b Ff(Human)243 1135 y(Her)n(e)n(dity)p Fj(,)15 b(44:127{141,)d(1994.)173 1229 y([6])21 b(T.)11 b(M.)f(Goradia,)i(K.)f(Lange,)h(P)l(.)f(L.)g(Miller,)i(and)e(P)l(.)g (M.)g(Nadk)m(arni.)j(F)l(ast)c(computation)h(of)243 1285 y(genetic)16 b(lik)o(eliho)q(o)q(ds)i(on)e(h)o(uman)f(p)q(edigree)i (data.)i Ff(Human)d(Her)n(e)n(dity)p Fj(,)e(42:42{62,)f(1992.)173 1379 y([7])21 b(J.)h(T.)f(Hec)o(h)o(t,)h(Y.)g(W)l(ang,)g(B.)f(Connor,)i (S.)e(H.)g(Blan)o(ton,)i(and)f(S.)f(P)l(.)g(Daiger.)39 b(Non-)243 1435 y(syndromic)21 b(cleft)g(lip)h(and)f(palate:)30 b(No)20 b(evidence)i(of)e(link)m(age)i(to)e(hla)h(or)f(factor)f(13a.) 243 1492 y Ff(A)o(meric)n(an)d(Journal)g(of)h(Human)f(Genetics)p Fj(,)e(52:1230{1233,)d(1993.)173 1586 y([8])21 b(P)l(.)11 b(Keleher,)h(A.)e(L.)h(Co)o(x,)f(and)h(W.)f(Zw)o(aenep)q(o)q(el.)j (Lazy)d(release)h(consistency)h(for)e(soft)o(w)o(are)243 1642 y(distributed)21 b(shared)e(memory)l(.)31 b(In)20 b Ff(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)i(the)g(19th)g(A)o(nnual)f (International)243 1699 y(Symp)n(osium)e(on)f(Computer)h(A)o(r)n(chite) n(ctur)n(e)p Fj(,)d(pages)h(13{21,)e(Ma)o(y)i(1992.)173 1792 y([9])21 b(P)l(.)g(Keleher,)j(S.)d(Dw)o(ark)m(adas,)g(A.)g(Co)o (x,)g(and)h(W.)e(Zw)o(aenep)q(o)q(el.)39 b(T)l(readmarks:)31 b(Dis-)243 1849 y(tributed)18 b(shared)g(memory)e(on)h(standard)g(w)o (orkstations)f(and)h(op)q(erating)g(systems.)25 b(In)243 1905 y Ff(Pr)n(o)n(c.)16 b(1994)h(Winter)g(USENIX)d(Confer)n(enc)n(e)p Fj(,)f(pages)i(115{131,)e(1994.)150 1999 y([10])21 b(J.)h(M.)g (Lalouel.)41 b(GEMINI)22 b(-)g(a)g(computer)g(program)f(for)g (optimization)i(of)e(general)243 2056 y(nonlinear)e(functions.)28 b(T)l(ec)o(hnical)19 b(Rep)q(ort)e(14,)g(Univ)o(ersit)o(y)h(of)f(Utah,) h(Departmen)o(t)e(of)243 2112 y(Medical)h(Bioph)o(ysics)g(and)e (Computing,)g(Salt)g(Lak)o(e)h(Cit)o(y)l(,)e(Utah,)h(1979.)150 2206 y([11])21 b(K.)27 b(Lange,)j(D.)c(W)l(eeks,)k(and)d(M.)f(Bo)q (ehnk)o(e.)56 b(Programs)25 b(for)h(p)q(edigree)j(analysis:)243 2262 y(MENDEL,)15 b(FISHER,)g(and)g(dGene.)20 b Ff(Genetic)c (Epidemiolo)n(gy)p Fj(,)f(5:471{473,)d(1988.)150 2356 y([12])21 b(K.)g(Lange)f(and)h(D.)e(E.)h(W)l(eeks.)35 b(E\016cien)o(t)21 b(computation)f(of)g(lo)q(d)h(scores)f({)g(genot)o (yp)q(e)243 2413 y(elimination,)c(genot)o(yp)q(e)d(rede\014nition,)i (and)e(h)o(ybrid)h(maxim)o(um)f(lik)o(eliho)q(o)q(d)j(algorithms.)243 2469 y Ff(A)o(nnals)f(of)h(Human)h(Genetics)p Fj(,)d(53:67{83,)e(1989.) 952 2678 y(26)p eop %%Page: 27 27 27 26 bop 150 195 a Fj([13])21 b(G.)16 b(M.)f(Lathrop)i(and)f(J.)g(M.)g (Lalouel.)24 b(Easy)16 b(calculations)i(of)e(lo)q(d)h(scores)f(and)g (genetic)243 252 y(risks)h(on)g(small)g(computers.)23 b Ff(A)o(meric)n(an)17 b(Journal)h(of)f(Human)h(Genetics)p Fj(,)d(36:460{465,)243 308 y(1984.)150 399 y([14])21 b(G.)14 b(M.)g(Lathrop)g(and)g(J.)h(M.)e(Lalouel.)20 b(E\016cien)o(t)15 b(computations)f(in)h(m)o(ultilo)q(cus)h(link)m(age) 243 456 y(analysis.)21 b Ff(A)o(meric)n(an)15 b(Journal)i(of)f(Human)h (Genetics)p Fj(,)c(42:498{505,)f(1988.)150 547 y([15])21 b(G.)16 b(M.)f(Lathrop,)h(J.)g(M.)g(Lalouel,)h(C.)f(Julier,)i(and)e(J.) g(Ott.)23 b(Strategies)16 b(for)f(m)o(ultilo)q(cus)243 603 y(link)m(age)i(analysis)f(in)g(h)o(umans.)k Ff(Pr)n(o)n(c.)c(Natl.) g(A)n(c)n(ad.)f(Sci.)h(USA)p Fj(,)e(81:3443{3446,)d(1984.)150 695 y([16])21 b(G.)12 b(M.)g(Lathrop,)h(J.)f(M.)g(Lalouel,)i(C.)e (Julier,)j(and)e(J.)f(Ott.)k(Multilo)q(cus)e(link)m(age)g(analysis)243 751 y(in)20 b(h)o(umans:)28 b(detection)20 b(of)f(link)m(age)i(and)e (estimation)h(of)e(recom)o(bination.)33 b Ff(A)o(meric)n(an)243 808 y(Journal)17 b(of)f(Human)h(Genetics)p Fj(,)c(37:482{498,)f(1985.) 150 899 y([17])21 b(A.)14 b(La)o(w,)f(C.)g(W.)h(Ric)o(hard)f(I)q(I)q (I,)i(R.)e(W.)g(Cottingham)g(Jr)h(.,)g(G.)f(M.)g(Lathrop,)g(D.)g(R.)g (Co)o(x,)243 955 y(and)18 b(R.)f(M.)g(My)o(ers.)26 b(Genetic)18 b(link)m(age)h(analysis)f(of)f(bip)q(olar)i(a\013ectiv)o(e)f(disorder)g (in)g(an)243 1012 y(old)e(order)f(amish)h(p)q(edigree.)21 b Ff(Human)16 b(Genetics)p Fj(,)e(88:562{568,)e(1992.)150 1103 y([18])21 b(P)l(.)h(L.)h(Miller,)i(P)l(.)d(Nadk)m(arni,)i(J.)f(E.) e(Gelern)o(ter,)j(N.)e(Carriero,)h(A.)f(J.)h(P)o(akstis,)g(and)243 1159 y(K.)18 b(K.)f(Kidd.)29 b(P)o(arallelizing)20 b(genetic)e(link)m (age)h(analysis:)26 b(A)17 b(case)h(study)g(for)f(applying)243 1216 y(parallel)c(computation)d(in)i(molecular)f(biology)l(.)i Ff(Computers)g(and)f(Biome)n(dic)n(al)f(R)n(ese)n(ar)n(ch)p Fj(,)243 1272 y(24:234{248,)h(1991.)150 1364 y([19])21 b(J.)15 b(Ott.)k(Estimation)c(of)f(the)h(recom)o(bination)h(fraction)f (in)g(h)o(uman)g(p)q(edigrees{)h(e\016cien)o(t)243 1420 y(computation)g(of)e(the)i(lik)o(eliho)q(o)q(d)i(for)c(h)o(uman)i(link) m(age)g(studies.)21 b Ff(A)o(meric)n(an)15 b(Journal)i(of)243 1476 y(Human)g(Genetics)p Fj(,)d(26:588{597,)e(1974.)150 1568 y([20])21 b(J.)e(Ott.)30 b Ff(A)o(nalysis)17 b(of)j(Human)f (Genetic)g(Linkage)p Fj(.)29 b(The)19 b(Johns)g(Hopkins)g(Univ)o(ersit) o(y)243 1624 y(Press,)c(Baltimore)h(and)f(London,)g(1991.)k(Revised)d (edition.)150 1715 y([21])21 b(A.)15 b(A.)g(Sc)o(h\177)-23 b(a\013er,)14 b(S.)h(K.)g(Gupta,)g(K.)g(Shriram,)g(and)g(R.)f(W.)h (Cottingham)f(Jr.)20 b(Av)o(oiding)243 1772 y(recomputation)c(in)g (link)m(age)g(analysis.)21 b Ff(Human)16 b(Her)n(e)n(dity)p Fj(,)f(44:225{237,)d(1994.)150 1863 y([22])21 b(N.)c(Sc)o(hork.)25 b(The)17 b(P)o(arallel)h(Computation)e(of)h(P)o(edigree)g(Lik)o(eliho)q (o)q(ds.)28 b(In)17 b Ff(Pr)n(o)n(c.)h(First)243 1919 y(International)g(Confer)n(enc)n(e)g(on)h(Intel)r(ligent)e(Systems)h (for)i(Mole)n(cular)f(Biolo)n(gy)p Fj(,)f(pages)243 1976 y(371{379,)13 b(1993.)150 2067 y([23])21 b(M.)13 b(C.)f(Sp)q(eer,)j(L.) e(H.)g(Y)l(amaok)m(a,)f(J.)i(H.)e(Gilc)o(hrist,)j(C.)d(P)l(.)h(Gask)o (ell,)h(J.)f(M.)g(Sta)s(jic)o(h,)g(J.)g(M.)243 2124 y(V)l(ance,)h(Z.)f (Kazan)o(tsev,)g(A.)f(Lastra,)h(C.)f(S.)h(Ha)o(ynes,)g(J.)h(S.)e(Bec)o (kmann,)i(D.)e(Cohen,)i(J.)f(L.)243 2180 y(W)l(eb)q(er,)h(A.)g(D.)e (Roses,)h(and)h(M.)e(A.)h(P)o(ericak-V)l(ance.)18 b(Con\014rmation)c (of)f(genetic)h(hetero-)243 2237 y(geneit)o(y)i(in)h(lim)o(b-girdle)h (m)o(uscular)e(dystroph)o(y:)k(Link)m(age)d(of)e(an)h(autosomal)f (dominan)o(t)243 2293 y(form)g(to)f(c)o(hromosome)h(5q.)k Ff(A)o(m.)d(J.)g(Hum.)h(Genet.)p Fj(,)d(50:1211{1217,)e(1992.)150 2384 y([24])21 b(E.)e(M.)f(Stone,)i(A.)e(E.)h(Kim)o(ura,)g(J.)g(C.)g(F) l(olk,)g(S.)g(R.)f(Bennett,)i(B.)f(E.)f(Nic)o(hols,)j(L.)e(M.)243 2441 y(Streb,)g(and)e(V.)h(C.)f(She\016eld.)29 b(Genetic)18 b(link)m(age)h(of)f(autosomal)f(dominan)o(t)g(neo)o(v)m(ascu-)243 2497 y(lar)i(in\015ammatory)f(vitreoretinopath)o(y)h(to)f(c)o (hromosome)f(11q13.)29 b Ff(Human)19 b(Mole)n(cular)243 2554 y(Genetics)p Fj(,)14 b(1:685{689,)f(1992.)952 2678 y(27)p eop %%Page: 28 28 28 27 bop 150 195 a Fj([25])21 b(M.)14 b(S.)h(V)l(aughan.)k(A)c (distributed)h(approac)o(h)e(to)g(h)o(uman)h(genetic)h(link)m(age)g (analysis.)k(M.)243 252 y(S.)15 b(Thesis,)h(Departmen)o(t)e(of)h (Computer)g(Science,)i(Duk)o(e)e(Univ)o(ersit)o(y)l(,)g(1991.)952 2678 y(28)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.DOS0000644000265600020320000001063610517441676014724 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last Mod: Sep. 30, 2006 FASTLINK for DOS This file describes FASTLINK for DOS, especially how it is related to FASTLINK for UNIX. Thanks to Ramana Idury and Roger Kou for figuring out how to convert the UNIX versions to DOS versions initially. Thanks to Aleksandr Morgulis for help in 2006 with making new compilations with Visual C++ for newer versions of Windows. Fundamental: We distribute 5 executables ilink.exe linkmap.exe lodscore.exe mlink.exe unknown.exe These can be plugged in directly instead of the similarly-named LINKAGE for DOS executables. An easy way to do this is to have separate directories for LINKAGE and FASTLINK. If you put the FASTLINK directory ahead of the LINKAGE directory in your default path, DOS will find the FASTLINK executables when appropriate, and will continue to use the LINKAGE executables for the auxiliary programs: lcp, lsp, lrp, makeped, preplink. Older executables are in the pub/fastlink/dos directory. Newer executables are in the pub/fastlink/windows directory. Some fundamental similarities and differences between UNIX versions and DOS versions should be noted: Similarities: 1. The old executables are essentially the same as FASTLINK 3.0P; while the new executables are essentially the same as FASTLINK 4.1P. 2. Most of the documentation still applies except the instructions for installation (we distribute executables for DOS, so no compilation is required) and portability (basically irrelevant to DOS). 3. We are distributing versions of LODSCORE, ILINK, LINKMAP, MLINK, UNKNOWN. Other auxiliary programs can be obtained from the FTP site at Rockefeller University. Differences: 1. We are distributing executable versions for DOS/Windows, rather than source as for UNIX FASTLINK. Details about how to get the executables are given below. 2. FASTLINK for DOS/Windows does not support crash recovery. 3. We are distributing only the "slow" versions of FASTLINK. These are still measurably faster than LINKAGE. Cautions: 1. FASTLINK is derived from LINKAGE 5.1 for UNIX and not from LINKAGE for DOS. We have tested FASTLINK on DOS, but we have not investigated to what extent LINKAGE for UNIX and LINKAGE for DOS are incompatible. 2. If FASTLINK and LINKAGE give different answers, you should not assume that FASTLINK is wrong. LINKAGE may be wrong. I have fixed 2 significant bugs in LINKAGE LODSCORE/ILINK and 1 significant bug in LINKAGE LINKMAP/MLINK. These bug fixes are described in README.updates. There is also an inconsistency in scaling in LINKAGE LINKMAP, which is fixed in FASTLINK LINKMAP (see README.scaling). 3. You must a have 386 or higher machine. The executables under the pub/fastlink/dos directory were tested on several different 486 machines. The executables under the pub/fastlink/windows directory were tested in 2006 on a PC running a fairly recent version fo Windows. 4. You should have a Math co-processor on the machine. Most recent 486 machines will have this. Like FASTLINK for UNIX and VMS, FASTLINK for DOS is distributed by FTP from a computer at NIH. Contact me by e-mail at schaffer@helix.nih.gov if you want the executables mailed to you on floppy disks. Here are the instructions for retrieving the code: ftp fastlink.nih.gov Login as anonymous and leave your full e-mail address as password. cd pub/fastlink [for new versions] binary In that directory and the windows subdirectory you will find various files. You may wish to retrieve all the files with the name README and all the files that end .ps. These are all relevant documentation files. The file README with no extension gives a roadmap to all FASTLINK documentation. [For those who receive FASTLINK for DOS on 3.5" diskettes, the documentation is on one of the diskettes and the sticky labels tell you which it is.] For those who retrieve the files via ftp. Having retrieved whatever documentation you want, you should retrieve: lodscore.exe ilink.exe linkmap.exe mlink.exe unknown.exe You should retrieve all 5 files. You must use the FASTLINK version of UNKNOWN with the FASTLINK main programs. Remember to use binary mode in FTP. Previous versions had a limit on the number of haplotypes; this limit has been eliminated in FASTLINK 3.0P. Note: The DOS/Windows executables are not currently included in fastlink.tar.Z, so you must retrieve them as individual files. fastlink-4.1P-fix95/README.updates0000644000265600020320000011470310761542471015740 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: February 28, 2008 FASTLINK, version 4.1P This file summarizes how FASTLINK has evolved from version 1.0 to version 4.1P, the current version. Look at the file README (without extensions) for a roadmap to all the FASTLINK documentation. One thing you may notice starting with version 2.1 is that most of the changes are user-driven. As described in the papers: R. W. Cottingham Jr., R. M. Idury, and A. A. Schaffer, Faster Sequential Genetic Linkage Computations, American Journal of Human Genetics, 53(1993), pp. 252-263. and A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Linkage Analysis, Human Heredity 44(1994), pp. 225-237. and A. A. Schaffer, Faster Linkage Analysis Computations for Pedigrees with Loops or Unused Alleles, Human Heredity 46(1996), pp. 226-235. and A. Becker, D. Geiger, and A. A. Schaffer, Automatic Selection of Loop Breakers for Genetic Linkage Analysis, Human Heredity 48(1998) 49--60. and A. Becker, R. Bar-Yehuda, D. Geiger, Random Algorithms for the Loop Cutset Problem, Proceedings of the fifteenth conference on Uncertainty in Artificial Intelligence, Sweden, July, 1999. this directory and its subdirectories contain version 4.1P of faster versions of the general pedigree programs of LINKAGE 5.1. Several of our users of earlier versions 1.0 and 1.1 have dubbed the new programs FASTLINK. A PostScript version of the papers can be found in the file paper1.ps, paper2.ps, paper5.ps, paper6.ps, and paper7.ps. Please cite the first two papers if you use these programs in a published experiment. paper1.ps describes the algorithmic changes introduced in version 1.0; paper2.ps describes the algorithmic changes introduced in version 2.0. paper5.ps describes the algorithmic changes introduced in version 3.0P. paper6.ps describes the algorithmic change introduced in version 4.0P. paper7.ps describes a new algorithm for selecting loop breakers in pedigrees with multiple marriages, and usage of this algorithm is one of the improvements in FASTLINK 4.1P over FASTLINK 4.0P. Papers describing the parallel implementation are paper3.ps and paper4.ps. There are several significant changes in each version from the user's perspective. |*| Changes Introduced in version 1.1 ----------------------------------------------------------------- 1. BUG FIX. A bug in our code that caused wrong answers on runs with autosomal data where the male theta and female theta were assumed to be different has been fixed. This occurs when the variable sexdif is equal to 1. 2. SEPARATE COMPILATION. All three programs have been split up into multiple definition and code files. The code is still similar but it is organized differently. The main advantages of separate compilation are: a.) Under some circumstances the programs can be recompiled much faster than before. b.) Some of the code that the programs share can be extracted into common files instead of being duplicated. This means that the total amount of source code is significantly reduced. c.) The new arrangement is much easier for us to maintain and work with. Duplicate code is well-known to be very prone to bugs (usually when only some copies are updated) and generally hard to maintain. d.) Instead of using compilation scripts, we are now using the make utility to compile. Most LINKAGE users have probably used this utility since it was the mechanism for compiling previous distributions of LINKAGE. Version 2.0 has the code split up even further (than 1.1) into separate files. |*| Changes Introduced in version 2.0 ----------------------------------------------------------------- 3. LINKAGE BUG FIX. A bug in the gemini code from the original LINKAGE 5.1 which resulted in non-optimal thetas being reported sometimes in LODSCORE and ILINK, has been fixed. This bug was fixed for the first time in version 2.0. 4. MLINK. Version 2.0 includes MLINK, while 1.0 and 1.1 did not. 5. CHECKPOINTING. If the computation of LODSCORE or ILINK crashes it can restarted. The checkpointing process is described in a separate README file called README.checkpoint. The granularity of checkpointing that we are doing (roughly every two likelihood function evaluations) is not applicable to LINKMAP or MLINK where all the likelihood function evaluations are essentially independent. Checkpointing is new with version 2.0. 6. BETTER HANDLING of LOOPS. On some looped pedigrees version 2.0 will be much faster than version 1.1. Read paper2.ps for details. |*| Changes Introduced in version 2.1 and while maintaining 2.0 ----------------------------------------------------------------- 7. BUG FIXES. Fixed two bugs in the code to do likelihood evaluations for sexlinked data. Bugs had been present in all versions. Bugs were fixed and posted to FTP server on February 9, 1994. Thanks to Micheala Aldred (Edinburgh) for the bug report. Fixed various compilation problems that impeded portability to different systems and compilers. Fixed a bug that arose when the first pedigree was not informative for the loci chosen. Bug was fixed and posted to the server on March 2, 1994. Thanks to Tim Magnus (U. Calgary) for the bug report. Fixed a bug in MLINK that caused it to give bad results when the number of pedigrees was greater than 127. Bug was fixed and posted to the the server on March 2, 1994. Thanks to Tim Magnus (U. Calgary) for the bug report. 8. Documentation. Wrote two documents, traverse.ps, and loops.ps, to explain how pedigree traversal is done in LINKAGE and FASTLINK. These documents are primarily intended for users who wish to actually modify the code or are generally annoyed that they do not know what is inside the LINKAGE/FASTLINK "black box". These documents tell you "Things I wish I had known when starting on FASTLINK development in 1992". Thanks to Dan Weeks (U. Pittsburgh), Brian Nichols (U. Iowa), Meg Gelder (Rice) and Sandeep Gupta (Rice) for asking me to help them look inside the code and understand what is going on. 9. Removed p2c. Earlier versions relied on the p2c library. Dependence on the p2c library was created when translating the LINKAGE programs from PASCAL to C originally. Various users have indicated that the need to get the p2c library and install it was a menace to easy installation of FASTLINK. The problem is now solved. 10. Sanity checks for constants. Cathryn Lewis (Utah) and Gerard Tromp (Thomas Jefferson U.) suggested that FASTLINK print, at the beginning of each run, a diagnostic message indicating in genetic terms what the characteristics of the run are, and whether the constants (see README.constants) have been set correctly. This is now done. The diagnostic message is printed on the screen and also appended to the file FASTLINK.err. If you wish to suppress this message, set DIAGNOSTIC to 0 in commondefs.h. 11. Dynamic memory allocation. Some of the big data structures are now allocated dynamically at runtime. This enables FASTLINK to be less conservative about their size. This makes it possible to do runs whose memory requirements are close to the virtual memory resources of your system. Thanks to Carol Haynes (Duke) for daring me to fix this. 12. More polite exits. FASTLINK should now exit more politely when you do not have enough memory to do the run you want to do and the error occurs at runtime. Thanks to Gerard Tromp (Thomas Jefferson U.) for suggesting this change. 13. Flushing output. LINKMAP and MLINK now flush their output to disk after each candidate theta vector. This is a crude form of checkpointing. Thanks to Luc Krols (U. Antwerp) and other users for suggesting this change. __________________________________________________________________________ |*| Changes Introduced in version 2.2 and while maintaining 2.1 14. BUG FIXES a. Fixed two bugs that occurred on some inputs with sexdif set to 1 (i.e, maletheta distinct from femaletheta). One bug caused nonsensical results to be reported in LODSCORE. This bug was inherited by FASTLINK from LINKAGE 5.1. It was fixed in LINKAGE 5.2. The same fix now appears in FASTLINK's LODSCORE. The other bug caused the wrong value to be printed to one output file for the ratio of thetas. There was no problem with the likelihood computations. Thanks to Jerry Halpern (Stanford) for the bug report. b. Fixed a bug in the scaling that occurred on some inputs with loops. This bug was introduced in FASTLINK 2.0 when the algorithm for loops was changed. Thanks to Ellen Wijsman (U. Washington) for the bug report. c. Fixed a bug in LINKMAP and MLINK that sometimes caused a component of the theta vector that should be 0.0 to be slightly greater than 0.0. This can significantly increase the computation time as well as giving wrong results. This bug was inherited from LINKAGE 5.1 and persists in the version of LINKAGE 5.2 that I got from Utah. There may be computer architectures on which this bug does not occur. The bug manifests itself as follows. At least one of the recombination fractions must be 0.0. Say that it is the one between loci a and b. The data must have a forced recombination between a and b. Because of the the likelihood should be -inifinity and FASTLINK 2.2 reports this correctly (as - a very big number). In LINKAGE and earlier versions of FASTLINK, the 0.0 might get misrepresented in the computer as a very small, but strictly positive number. This leads to a very negative, but far from infinite (and incorrect) likelihood. This bug is discussed at length, albeit in the context of CMAP rather than LINKMAP on page 122 of Handbook of Human Genetic Linkage by Joseph Douglas Terwilliger and Jurg Ott. d. Fixed a bug in ILINK (inherited from LINKAGE) that is related to the bug fixed in LODSCORE and ILINK between versions 1.1 and 2.0 (cf. item 3 above). The newly fixed bug occurs whenever two loci are sufficiently close that GEMINI freezes the recombination distance between them *and* the two loci are not the two rightmost in the left to right order. The symptoms are that GEMINI then generates the next candidate theta incorrectly by moving from a theta used to estimate last gradient rather than by moving from the current best theta. Since the thetas used to estimate the gradient do not differ much from the candidate thetas near the boundary, GEMINI will almost certainly recover from the mistake and converge to the same local optimum. However, I have seen one run where an intermediate value of -2*log(likelihood) differed in the 7th significant digit (what gets printed on the screen by default). If you print more significant digits, then you will see differences in -2*log(likelihood) on lots of runs. NB: If you compare LODSCORE or ILINK from LINKAGE to FASTLINK and get *different* answers in a case where one of the theta components is .001 *and* somewhere in outfile.dat you see the message: "A VARIABLE WAS SET TO A BOUND", then you have almost certainly hit either this bug in LINKAGE or the bug fixed in item 3. above, or both. Thanks to Sandeep Gupta for detecting this bug. e. Fixed some problematic code which could trigger a floating point exception on the DEC Alpha running OSF/1. Problem occurred when a very small number was added to a big number. This known to be a dangerous thing to do, although not formally a bug (because if one compiles with IEEE-compliant floating point, everything works correctly, though slowly). f. Fixed several bugs caused by a problem in the initial p2c translation process from which we obtained the initial C versions of the LINKAGE programs. The problem is that if the PASCAL program uses a boolean constant, the p2c translator tries to simplify expressions involving that constant in some (but not all!) situations. The problematic constants are: dostream (default value true) fitmodel (default value false) score (default value true) approximate (default value false) If you tried to use values opposite form the defaults, FASTLINK would behave incorrectly. Thanks to Martin Farrall (Wellcome Centre), Victoria Haghihi (Columbia), and Ken Morgan (McGill) who reported different instances of the problem. Unfortunately, it took me 3 bug reports to grasp that the problem occurred in the initial translation and not in the modifications that converted LINKAGE to FASTLINK. g. Changed some code file names, so that no two code files have the same first six letters. This is useful for moving files to a PC. Suggested by Luc Krols. 15. More dynamic memory allocation. Removed the need for the constants maxprobclass, maxclasssize, and maxneed. The constant maxhap remains. Adjusted the diagnostics (introduced in FASTLINK 2.1) and README.constants accordingly. Also, most of the constants can now be set at compile time, by just editing the Makefile. See README.constants for an explanation. 16. Diagnostics for more constants. a. maxloop diagnostic. Added a diagnostic test to see if maxloop is set lower than the number of loops in the input pedigree. If so, the program prints an error message and exits politely. b. maxchild diagnostic. Added a diagnostic test to see if maxchild is set lower than the number of siblings in some family. If so, the program prints an error message and exits politely. Note that for these purposes, half siblings count as well; i.e., maxchild needs to be at least as large as the number of half-siblings in any family. FASTLINK is distributed with maxloop set to 2 and maxchild set to 16. These may need to be raised for some inputs. There is little to be gained from lowering them. c. LODSCORES by family. I adopted a modification to MLINK suggested and used by Carol Haynes (Duke) where LODSCORES can be printed for each family. The LINKAGE code has a constant called byfamily, which if set to true, causes the log-likelihood to be printed for each family. Carol's change adds more information by comparing the log-likelihood against the log-likelihood for the case where the moving locus is unlinked. The LODSCOREs are printed for each family only if byfamily is true and another constant I added to mldefs.h, called lodbyfamily, is also true. To keep things consistent with LINKAGE, the code is distributed with byfamily set to true and lodbyfamily set to false, but you are encouraged to change lodbyfamily to true if the consequences suit your MLINK usage pattern. To keep the formatting nice, for this purpose only, LODSCORES of -infinity are printed as -999.999999. I did not adopt this useful convention in other places so as to preserve compatibility with LINKAGE. 17. More checkpointing. Added checkpointing to LINKMAP and MLINK. Now you can recover completely from a crash in those programs. If you have not used the checkpointing facility before (e.g, because you only use LINKMAP and MLINK) you are STRONGLY encouraged to read the file README.checkpoint. We have tried to make the checkpointing and crash-recovery process as transparent as possible, but there are some unavoidable subtleties of which the user ought to be aware. 18. Minor Makefile changes. For the clean target added the flag -f, so that user is *not* asked before any files are deleted (suggested by Shriram Krishnamurthi). Added targets installfast and installslow, which make all 4 programs at once in either "fast" or "slow" versions (suggested by Kimmo Kallio). Fixed problems with target unknown (suggested by Bob Cottingham). 19. Portability information. The file README.portability has information about running FASTLINK on the following operating systems: SunOS, Solaris, Ultrix, OSF/1, AIX, IRIX, Linux, VMS, and DOS. Until shown otherwise, I am very naively assuming that version number of the operating system does not matter. The good news is that FASTLINK is quite portable. The bad news is that: a) I have insufficient information about porting the LINKAGE auxiliary programs (e.g., lcp, lrp, lcp, preplink, makeped). b) For some systems, Makefile modifications are necessary. c) For DOS, you have to get a C compiler, and we have tried only one. It is a port to DOS of gcc, called dgjpp. The good news is that dgjpp is freely available by FTP. Special thanks to Ramana Idury for figuring out how to run FASTLINK on DOS. Thanks to Alan Cox, David Featherstone, Kimmo Kallio, Shriram Krishnamurthi Joe Terwilliger, Ellen Wijsman, and Xiaoli Xie for sending me portability information and trying things out on various systems. 20. Code clean-up. The four code files *modified.c have been significantly cleaned up and more comments have been added in them. 21. Better UNKNOWN. a. The version of UNKNOWN that was distributed with earlier versions of FASTLINK was badly out of date. Thanks to Joe Terwilliger for bringing this to my attention. Various problems with old versions of UNKNOWN are discussed in Handbook of Human Genetic Linkage by Terwilliger and Ott (see for example, page 185). The version of UNKNOWN distributed with FASTLINK 2.2 is a p2c translation of the OS/2 version of UNKNOWN (in PASCAL) from the Columbia FTP site; some minor changes have been made to remove the need for the dependency on the p2c library. The C version of UNKNOWN is distributed strictly as a courtesy to FASTLINK users who want to avoid the need for a PASCAL compiler. In particular, some of the algorithmic improvements in FASTLINK are applicable to UNKNOWN, but have not been implemented in UNKNOWN. b. Documentation for UNKNOWN. Version 2.2 includes a new document, unknown.ps entitled "The Mystery of (the) Unknown", which describes from my algorithmic perspective what the LINKAGE preprocessor program called unknown does. This document was requested by Jerry Halpern (Stanford). -------------------------------------------------------------------- |*| Changes introduced while maintaining 2.2 and in 2.3P 22. Added -DDOS flag such that adding -DDOS to CFLAGS in the Makefile eliminates checkpointing. Used this to produce DOS versions. See README.DOS for more details. 23. Made some changes in filename conventions and input/output format commands, so that FASTLINK could be ported to VAX/VMS using the VAX C compiler. Previously FASTLINK would run on VAX/VMS only with the DEC C compiler. See README.VAX for more details. 24. Fixed a bug caused by the fact that the bug fix reported above in item 3 was not done exactly correctly. In particular, if one was using ILINK or LODSCORE to estimate allele frequencies and the frequency of the highest numbered allele was very small, the incorrect values for all frequencies might get printed out. Thanks to Gerard Tromp (Thomas Jefferson U.) for the bug report. 25. Added README.djgpp to explain how to install the djgpp compiler for DOS and how to compile FASTLINK with djgpp. Users may find it preferable to compile FASTLINK for DOS themselves rather than use the distributed executables. One reason is that the distributed executables are the "slow" version, and it is possible to compile the "fast" version for many runs. 26. Fixed a performance bug in checkpointing. The fix increases the chances that if the crash occurred as the checkpoint file was being written, the presence of the file will be detected. This bug caused only wasted recomputation, not incorrect results. Thanks to Margaret Gelder Ehm (Rice) for the bug report. 27. a. Added README.mapfun to explain how mapping functions are used in LINKAGE/FASTLINK. Thanks to Carol Haynes (Duke) for the suggestion. b. Added README.ILINK to explain what the outputs of LODSCORE and ILINK mean. Thanks to Marcy Speer (Duke) for the suggestion. 28. Version 2.3P includes a new auxiliary program called OFM (Optimize for Maxhap) which computes the optimal value of maxhap for any given run and recompiles automatically. Refer to README.ofm for details. 29. Version 2.3P has a much more robust Makefile for use on UNIX and DOS. Added README.makefile to describe how the new Makefile is organized. 30. The major change in version 2.3P is that ILINK, LINKMAP, and MLINK can now be run on parallel computers for autosomal data. This explains the P is the new version number 2.3P. The parallel code can run either on shared-memory UNIX machines or on networks of UNIX workstations. See README.parallel, README.p4, and README.TreadMarks for more details. 31. In response to significant clamoring from users, we removed initial `.'s from the filenames of files used in checkpointing. See README.checkpoint for details. 32. Improved the UNKNOWN preprocessor program so that it pinpoints which nuclear family has the error when Mandelian rules are violated in the pedigree file. See README.unknown for details. Thanks to Carol Haynes (Duke) for the suggestion. 33. We modified LINKMAP to avoid some recomputation when multiple LINKMAP runs are done from the same lcp-produced script. This works only on unix for the moment. To turn off this feature, set MULTI_LINKMAP to 0 in lidefs.h. This feature is already de-activated for VMS and DOS. Thanks to Patricia Kramer (Oregon Health Sciences Institute) for this suggestion. 34. We have included a new diagnostic to report when the locus file lists more alleles for a locus than necessitated by the pedigree file. See README.allele for details. 35. Added README.time, a short essay on estimating the running time of sequential FASTLINK runs. Thanks to Frank Visser at the HGMP Centre in Hinxton, U.K. for suggesting this. 36. Added -i option (for info) for ILINK, MLINK, LINKMAP, and LODSCORE that summarizes how the various compilation options/variables are set for a given executable. For example, if you run: linkmap -i you get a description of how the program is configured, but nothing interesting is computed. Flagless runs now also print out "(slow)" with the version number if the given executable is a "slow" version. Thanks to Tara Cox Matise at Columbia University for the suggestion. -------------------------------------------------------------------- |*| Changes introduced while maintaining 2.3P 37. Modified UNKNOWN to detect unbroken loops in the pedigree file. This was suggested by Frank Visser in Hinxton, U.K. 38. Fixed several bugs regarding the printing of values in stream.out when running the parallel version of LINKMAP or MLINK. Thanks to Franz Rueschendorf in berlin and Lucien Bachner in Paris for bug reports. 39. Fixed a bug in ILINK and LODSCORE that would cause completely nonsensical estimates of theta and/or gene frequencies. The problem was due to an array being to small, and would be likely to arise only when using ILINK to estimate gene frequencies. Thanks to Reynir Arngrimsson in Glasgow. 40. Fixed a bug that occurred in some pedigrees that have both a loop and and multiple marriage. thanks to Rita Kruse in Bonn for reporting the bug. 41. Corrected a bug in the declarations for the checkrisk routine that that caused the program to crash when doing a risk calculation. Thanks to Lucien Bachner in Paris for the bug report. -------------------------------------------------------------------- |*| Changes Introduced in version 3.0P 42. Implemented faster algorithms for handling looped pedigrees. See paper5.ps and the updated versions of unknown.ps and loops.ps for details. As a result, it is now obligatory to use the UNKNOWN that comes with FASTLINK rather than LINKAGE's UNKNOWN. 43. Fixed incompatibility error checking in UNKNOWN, so that violations of Mendelian rules in looped pedigrees are reported. Thanks to Lucien Bachner in Paris for alerting me to the fact that all previous versions of UNKNOWN did no error checking for looped pedigrees. 44. Implemented allele amalgamation, which speeds up the computation when not all alleles at a locus are used in a pedigree. See paper5.ps and the updated unknown.ps for details. Caution: If you have a looped pedigree to which allele amalgamation applies, the printed values of -2 *ln(likelihood) may be different from previous versions of FASTLINK, but lod scores should be the same. 45. Wrote README.trouble, which is a troubleshooting guide for LINKAGE and FASTLINK. It explains almost all error messages. 46. Fixed the parallel implementation so that it could handle an arbitrary number of loops in the input pedigrees. 47. Eliminated the constant MAXWORKINGSET, which was used in the parallel code (see README.p4 and README.TreadMarks). 48. Corrected various problems that occurred when the number of alleles at numbered allele locus or binary factors locus was > 31. Now having more than 31 alleles at a binary factors locus is forbidden and caught by a proper error message. Now having more than 31 alleles at a numbered alleles locus works fine. Thanks to Jeff O'Connell in Pittsburgh and Joe Terwilliger in Oxford for bringing these problems to my attention and encouraging me to fix them. 49. Eliminated maxhap and maxfem. This makes ofm (cf. item 28) obsolete. All data structures whose sizes depend on the number of haplotypes are now allocated and freed dynamically during the run. Some consequences: -- recompilation is not needed any more, except when switching between fast and slow versions -- if you were using a higher-than-necessary value of maxhap, you will see substantial reduction in memory usage and some reduction in running time. -- if you were recompiling each time with the ideal maxhap, then you may see a small increase in running time for runs taking tens of minutes. The increase will depend on the type of machine, the operating system, the compiler, and the memory allocator used. -- the DOS executables are now called: ilink.exe, linkmap.exe, lodscore.exe, and mlink.exe, with no numbers in the names. 50. Improved the diagnostic (see item 37) to detect unbroken loops in UNKNOWN. Thanks to Ken Morgan (Montreal) for showing me a data set for which the previous implementation did not detect an unbroken loop that was there. 51. Added a diagnostic to detect if a person is assigned an allele that that is larger than the number of alleles specified for that locus. Thanks to David Stockton (Baylor College of Medicine) for the suggestion. -------------------------------------------------------------------- |*| Changes Introduced while maintaining version 3.0P 52. Fixed a bug in unknown.c, which was inferring genotypes incorrectly when a child was untyped and had both parents homozygous at a numbered allele locus. Thanks to Ken Morgan (Montreal) for the bug report. 53. Fixed a memory allocation error that occurred if ALLELE_SPEED was set to 0. Thanks to Ken Morgan (Montreal) for the bug report. 54. Added a diagnostic to warn about extremely low allele frequencies and fixed a problem inherited from LINKAGE UNKNOWN that occurred if the first allele frequency of a locus is 0.0. Thanks to Les Biesecker (Bethesda) and Jeff O'Connell (Pittsburgh) for useful guidance on how to handle this situation --- having a frequency of 0.0 is legitimate mathematically, but probably a typo in practice. 55. Fixed a problem with checkpointing. We were implcitly assuming that the files recoveryFoundText and recoveryNotFoundText were accessible from the directory where the run was being done. Thanks to Robert Williams (Tempe, Arizona) for reporting this problem. 56. Fixed a problem with the mutation model. It would require a substantial rewrite of unknown.c to make the improvements for loops that are done in unknown.c (item 42) compatible with the mutation model. Furthermore, FASTLINK confers no speed advantage over LINKAGE when using the mutation model. Therefore, I recoded so that if you try to use the mutation model with LOOPSPEED set to 1, UNKNOWN will now complain. In my experience, most users who use the mutation model don't intend to do so; thus this warning may save some users lots of time and may prevent them from getting unintended results. 57. Fixed some memory management problems specific to LODSCORE. Thanks to Mihales Polymeropoulos (Bethesda) for the bug report. 58. Fixed a bug in the way UNKNOWN was reporting incompatibility errors that caused it to omit some errors when there was at least one. The bug could not arise if there were 0 errors. Thanks to Sayuko Kobes for the bug report. 59. Modified UNKNOWN to make it almost backwards compatible (except for mutation model). This way the new UNKNOWN can be safely used with LINKAGE, FASTSLINK, GenoCheck, etc. Thanks to Ramana Idury for a suggestion on the easiest way to achieve backwards compatibility. 60. Significantly reduced the shared-memory usage in parallel FASTLINK for some runs of LINKMAP and MLINK. Changed the memory printing convention so that if you use -m with k processors, you find out how much memory would be needed for every number less than or equal to k. See README.p4 (shared-memory) or README.TreadMarks (network) depending on which library you use to make parallel FASTLINK. Thanks to John Powell for pointing out a memory-usage anomaly that led to improving the memory usage. 61. Fixed a bug in comlike.c that could arise on looped pedigrees. If you hit the bug, you would get a crash. Thanks to Tara Cox Matise (Columbia) for reporting the bug. 62. Fixed 3 problems with unknown.c. One was a bug that would unjustifiably cause UNKNOWN to complain about incompatibilities on a few sex-linked pedigrees. The second was a missing diagnostic for the disequilibrium model. The third was a compilation problem on SunOS using cc. Thanks to Ken Morgan and Lucien Bachner for reporting the problems. 63. Fixed 3 more problems with unknown.c. The first was an inefficiency on some pedigrees with many loops. The second was a problem with the backwards compatibility of unknown.c (see item 59) for sexlinked pedigrees. The third was a bug in unknown.c for some looped pedigrees that would cause a 0 likelihood and -infinity lodscore to be reported. Thanks to David Stockton and Suzanne Leal for reporting the problems. 64. Fixed a bug on some sex-linked looped pedigrees. The file that changed is comlike.c. The bug would show up with the message: Error in translate_loop_vector. Thanks to Carla Bock for reporting the problem. -------------------------------------------------------------------- |*| Changes Introduced in version 4.0P 65. In collaboration with Ann Becker and Dan Geiger of the Technion, implemented a new algorithm for selecting loop breakers in looped pedigrees. See paper6.ps. 66. Put some more error diagnostics in unknown.c -------------------------------------------------------------------- |*| Changes Introduced while maintaining version 4.0P 67. Fixed some #ifdefs that unintentionally prevented certain constants from being defined with -D in the Makefile. Thanks to Ingo Roeder for the problem report. 68. Fixed a bug in parallel FASTLINK that would occur on some data sets with multiple fast-to-compute pedigrees. Thanks to Eric Rouillard for the bug report. 69. Fixed a design flaw in unknown.c that prevented the new loop breaker selection from being used when ALLELE_SPEED was set to 0. Now they can be used together. Thanks to Dan Weeks for pointing out this flaw. 70. Fixed a performance bug in parallel FASTLINK that caused some large subcomputations to be done sequentially instead of in parallel. Thanks to Jim Tomlin and John Powell for the problem report. -------------------------------------------------------------------- |*| Changes Introduced in version 4.1P 71. Fixed a memory management bug in UNKNOWN that would sometimes cause a crash on data sets with many pedigrees. The bug had been introduced in version 3.0P. 72. Fixed a bug inherited from LINKAGE. In the routine gettheta, the values in the newly allocated vectors of thetas were not initialized. This could cause a subsequent crash in the procedure scramble. Thanks to Joe Terwilliger for the bug report. 73. Introduced the ability to use and estimate allele frequencies conditional on whether the disease allele is present/absent on the haplotype. This was requested by Ken Morgan who helped with testing and documentation. The new feature allows for a new way to test for linkage disequilibrium. See README.diseq for details on usage. 74. Better genotype inference for loop breakers of unknown genotype. Some of the procedures initially written for FASTLINK 3.0P were substantially rewritten to better take into account what genotypes are possible for a loop breaker of unknown genotype. As a result, computations on some looped pedigrees will run faster, and loopfile.dat will be smaller. 75. Better loop breaker selction for pedigrees with multiply married individuals. Ann Becker and Dan Geiger contributed an update to the code file loopbrk.c that now includes a randomized algorithm for loop breaker selection for pedigrees with multiply married individuals. The method previously introduced in FASTLINK 4.0P is optimal for the case of no multiple marriages. See paper7.ps for a description of the new method. 76. Introduced the ability to select loop breakers from scratch. It is no longer necessary to select loop breakers in the makeped preprocessor program. The user can now simply use the command: unknown -l to select loop breakers. See loops.ps and/or README.lselect for more details. 77. Fixed a bug in the case where makeped labels a loopbreaker copy as proband. Thanks to Hans Christian Hennies for the bug report. -------------------------------------------------------------------- |*| Changes Introduced while maintaining version 4.1P 78. I fixed a bug in comlike.c that would cause a crash on some looped pedigrees. This bug had been introduced in the initial release of 4.1P. 79. I made some changes in loopbrk.c and unknown.c to fix some compilation problems and one runtime problem that occurred on some versions of IRIX. Thanks to Yoshinori Miyamura (Nagoya University) and Pekka Uimari (Center for Scientific Computing, Espoo, Finland) for reporting the problems and helping to test the repairs. 80. I made some changes in loopbrk.c and unknown.c to fix a bug that occurs on some versions of Linux. Thanks to Bertram Muller-Myhsok (Bernhard Nocht Institute for Tropical Medicine, Hamburg) for reporting the problem. This bug consisted of trying to close the same file twice, was actaully introduced in FASTLINK 4.0P, and had nothing to do with the changes in 4.1P. 81. I fixed a memory management bug in unknown.c that could arise when ALLELE_SPEED is set to 0, and the pedigree file contains multiple pedigrees, of which at least one has a loop. If you hit the bug, you would get a crash. Thanks to Ken Morgan (McGill University) for reporting the bug. 82. Minor changes in output format, partly requested by Eric Rouillard. 83. I modified unknown.c to allow the input pedigree file for unknown to use non-consecutive integer identifiers within a pedigree. This was requested by Dan Weeks (U. Pittsburgh) to increase compatibility with his MEGA2 software. 84. Some code changes to prevent attempts to close the same file multiple times. This problem was reported by JC Loredo-Osti (McGill University) 85. I improved a diagnostic for when maxn in gemdefs.h is set too low. Thanks to Juan Pablo Lewinger (University of Toronto) for reporting the previously misleading diagnostic. 86. I modified unknown.c, so ungenotyped families are not set to all 1 in ipedfile.dat if ALLELE_SPEED is off. Thanks to Tero Hiekkalinna for the problem report. 87. I disallowed interference in mlink and linkmap, where it was never intended to be used and produced nonsensical results in LINKAGE. Thanks to Ma'ayan Fishelson (Technion) for reporting the problem. Thanks to Jurg Ott for advice on how to correct the problem, which was inherited from LINKAGE. 88. I fixed a bug in loopbrk.c that might arise when -- one uses unknown -l to select an initial set of loop breakers and the loop breakers are selected again in the regular run of unknown and -- every copy of the highest-numbered (in column 9) loop breaker is a parent Usually, one copy of each loop breaker is a child (and LINKAGE this was required). Thanks to Tara Matise for the bug report. 89. Starting with version 3.3 of gcc, use of varargs.h is no longer supported. Therefore. I removed #include statements for it from commondefs.h and unknown.h. I removed the procedure printErrMesg from iostuff.h, and replaced 6 usages of printErrMesg with fprintf to stderr. As a consequence the error file FASTLINK.err is no longer used to archive error messages. Thanks to Harald Goring for reporting the problem. 90. I fixed another bug in loopbrk.c that might arise when using unknown -l to select loop breakers. Thanks to Harald Goring for the bug report. 91. While working on item 90, I changed some comparisons between different loop breaker sets in loopbrk.c to avoid unnecessary computation and repair one printed diagnostic. 92. Made 3 small changes in check.c to avoid double calls to fclose on some checkpoint-related files. Thanks to Thomas Dyer for reporting that the double calls to fclose cause a crash on one implementation of Linux. 93. Made two changes in unknown.h and commondefs.h to fix compilation problems on Linux, especially in 64-bit mode. Thanks to Tara Cox Matise for a problem report. 94a. Compiled new Windows executables and posted them in the pub/fastlink/windows subdirectory equivalent to ftp://fastlink.nih.gov/pub/fastlink/windows 94b. Made various source code changes to eliminate Windows compiler warnings. Thanks to Aleksandr Morgulis for help with the new Windows port. 95. Changed loopbrk.c to avoid a double call of fclose(lpedfile) when unknown -l was used. Thanks to Mike Gertz for reporting this bug.fastlink-4.1P-fix95/README.Linux0000644000265600020320000000113606757005444015371 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: August 19, 1999 FASTLINK Portability information for Linux Linux is a freely available implementation of UNIX for PC's. Linux comes with the gcc compiler. According to Xaoli Xie, Shriram Krishnamurthy, and Kurt Hornik, the main programs in FASTLINK port fine to Linux. No change in the Makefile is needed. Source code and executables for the LINKAGE auxiliary programs lcp, lrp, lsp, and makeped is available on fastlink.nih.gov under pub/staff/schaffer/linux-aux. Please report any problems to me at schaffer@helix.nih.govfastlink-4.1P-fix95/linux/0000755000265600020320000000000010761025257014543 5ustar tilleaadminfastlink-4.1P-fix95/linux/hornik.txt0000644000265600020320000001773206506236605016613 0ustar tilleaadminFASTLINK user Kurt Hornik has succeeded in porting most of the LINKAGE auxiliary programs to Linux. He started with the Sun distribution of LINKAGE and made a few changes to the source code. Here is the file by file diff relative to the Sun distribution of LINKAGE from Utah (corona.med.utah.edu). ******* snip snip snip ******************************************** diff -rc linkage/uip.orig/lcp/src/unxh.c linkage/uip/lcp/src/unxh.c *** linkage/uip.orig/lcp/src/unxh.c Mon Jan 7 19:22:10 1991 --- linkage/uip/lcp/src/unxh.c Mon Jan 7 19:22:10 1991 *************** *** 2,24 **** /** ** ! ** unxh.c - UNIX (ULTRIX/BSD) host routines module. ** **/ #include #include ! #include #include #include "lnk.h" #include "lcp.h" ! struct sgttyb otty, ntty; ! struct tchars osch, nsch; ! struct ltchars olch, nlch; ! struct winsize window; typedef struct csidef scirec; --- 2,22 ---- /** ** ! ** unxh.c - UNIX (System V) host routines module. ** **/ #include #include ! #include #include #include "lnk.h" #include "lcp.h" ! struct termio otty, ntty; ! struct winsize window; typedef struct csidef scirec; *************** *** 86,129 **** /* p1 = getenv ("TERM");*/ ! if (ioctl (0,TIOCGETP,&otty) < 0) lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",1); ntty = otty; ! ntty.sg_flags &= ~ECHO; ! ntty.sg_flags |= CBREAK; ! if (ioctl (0,TIOCSETP,&ntty) < 0) lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",2); - - - if (ioctl (0,TIOCGETC,&osch) < 0) - lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",3); - - nsch = osch; - nsch.t_intrc = -1; - nsch.t_quitc = -1; - nsch.t_startc = -1; - nsch.t_stopc = -1; - nsch.t_eofc = -1; - nsch.t_brkc = -1; - - if (ioctl (0,TIOCSETC,&nsch) < 0) - lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",4); - - if (ioctl (0,TIOCGLTC,&olch) < 0) - lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",5); - - nlch = olch; - nlch.t_suspc = -1; - nlch.t_dsuspc = -1; - nlch.t_rprntc = -1; - nlch.t_flushc = -1; - nlch.t_werasc = -1; - nlch.t_lnextc = -1; - - if (ioctl (0,TIOCSLTC,&nlch) < 0) - lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",6); } --- 84,101 ---- /* p1 = getenv ("TERM");*/ ! if (ioctl (0, TCGETA, &otty) < 0) lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",1); ntty = otty; ! ntty.c_iflag &= ~(ICRNL|IXON|ISTRIP); ! /* ntty.c_oflag &= ~OPOST;*/ ! ntty.c_lflag &= ~(ISIG|ICANON|ECHO); ! ntty.c_cc [VMIN] = 1; ! ntty.c_cc [VTIME] = 0; ! if (ioctl (0,TCSETA,&ntty) < 0) lnk_error_ (LNK_FATAL,"Internal Error",prg,"osh_init",2); } *************** *** 257,265 **** (void) chmod (cmd_name,0755); } ! (void) ioctl (0,TIOCSETP,&otty); ! (void) ioctl (0,TIOCSETC,&osch); ! (void) ioctl (0,TIOCSLTC,&olch); } --- 229,235 ---- (void) chmod (cmd_name,0755); } ! (void) ioctl (0,TCSETA,&otty); } *************** *** 283,291 **** (void) unlink (cmd_name); } ! (void) ioctl (0,TIOCSETP,&otty); ! (void) ioctl (0,TIOCSETC,&osch); ! (void) ioctl (0,TIOCSLTC,&olch); } --- 253,259 ---- (void) unlink (cmd_name); } ! (void) ioctl (0,TCSETA,&otty); } *************** *** 319,327 **** (void) printf (string_exit); ! (void) ioctl (0,TIOCSETP,&otty); ! (void) ioctl (0,TIOCSETC,&osch); ! (void) ioctl (0,TIOCSLTC,&olch); (void) printf ("\nProgram Exception : Signal = %d.\n",sig); --- 287,293 ---- (void) printf (string_exit); ! (void) ioctl (0,TCSETA,&otty); (void) printf ("\nProgram Exception : Signal = %d.\n",sig); diff -rc linkage/uip.orig/ldp/src/makeped.c linkage/uip/ldp/src/makeped.c *** linkage/uip.orig/ldp/src/makeped.c Tue Jan 15 20:43:32 1991 --- linkage/uip/ldp/src/makeped.c Wed Aug 17 09:35:23 1994 *************** *** 38,44 **** #include #endif - #define FALSE 0 #define TRUE 1 --- 38,43 ---- *************** *** 2052,2055 **** --- 2051,2055 ---- fclose(pedfile); fclose(pedout); + exit(0); } diff -rc linkage/uip.orig/llb/lsm/src/unxh.c linkage/uip/llb/lsm/src/unxh.c *** linkage/uip.orig/llb/lsm/src/unxh.c Mon Jan 7 18:54:03 1991 --- linkage/uip/llb/lsm/src/unxh.c Wed Aug 17 08:39:16 1994 *************** *** 9,26 **** #include #include ! #include #include #include "lnk.h" #include "lsm.h" #include "gdef.h" - struct sgttyb otty, ntty; - struct tchars osch, nsch; - struct ltchars olch, nlch; - struct winsize window; - typedef struct csidef scirec; struct csidef --- 9,23 ---- #include #include ! #include #include #include "lnk.h" #include "lsm.h" #include "gdef.h" + struct termio otty, ntty; + struct winsize window; typedef struct csidef scirec; struct csidef *************** *** 87,131 **** /* p1 = getenv ("TERM");*/ ! if (ioctl (0,TIOCGETP,&otty) < 0) lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",1); ! ntty = otty; ! ntty.sg_flags &= ~ECHO; ! ntty.sg_flags |= CBREAK; ! if (ioctl (0,TIOCSETP,&ntty) < 0) lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",2); - - if (ioctl (0,TIOCGETC,&osch) < 0) - lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",3); - - nsch = osch; - nsch.t_intrc = -1; - nsch.t_quitc = -1; - nsch.t_startc = -1; - nsch.t_stopc = -1; - nsch.t_eofc = -1; - nsch.t_brkc = -1; - - if (ioctl (0,TIOCSETC,&nsch) < 0) - lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",4); - - - if (ioctl (0,TIOCGLTC,&olch) < 0) - lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",5); - - nlch = olch; - nlch.t_suspc = -1; - nlch.t_dsuspc = -1; - nlch.t_rprntc = -1; - nlch.t_flushc = -1; - nlch.t_werasc = -1; - nlch.t_lnextc = -1; - - if (ioctl (0,TIOCSLTC,&nlch) < 0) - lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",6); } --- 84,101 ---- /* p1 = getenv ("TERM");*/ ! if (ioctl (0, TCGETA, &otty) < 0) lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",1); ! ntty.c_iflag &= ~(ICRNL|IXON|ISTRIP); ! /* ntty.c_oflag &= ~OPOST;*/ ! ntty.c_lflag &= ~(ISIG|ICANON|ECHO); ! ntty.c_cc [VMIN] = 1; ! ntty.c_cc [VTIME] = 0; ! if (ioctl (0,TCSETA,&ntty) < 0) lnk_error_ (LNK_FATAL,"Internal error",lsm_program,"lsm_hini",2); } *************** *** 223,232 **** { extern int ioctl (); ! ! (void) ioctl (0,TIOCSETP,&otty); ! (void) ioctl (0,TIOCSETC,&osch); ! (void) ioctl (0,TIOCSLTC,&olch); } --- 193,199 ---- { extern int ioctl (); ! (void) ioctl (0,TCSETA,&otty); } *************** *** 236,245 **** { extern int ioctl (); ! ! (void) ioctl (0,TIOCSETP,&otty); ! (void) ioctl (0,TIOCSETC,&osch); ! (void) ioctl (0,TIOCSLTC,&olch); } --- 203,209 ---- { extern int ioctl (); ! (void) ioctl (0,TCSETA,&otty); } *************** *** 259,267 **** (void) printf (lsm_exit_str); ! (void) ioctl (0,TIOCSETP,&otty); ! (void) ioctl (0,TIOCSETC,&osch); ! (void) ioctl (0,TIOCSLTC,&olch); (void) printf ("\nProgram Exception : Signal = %d.\n",sig); --- 223,229 ---- (void) printf (lsm_exit_str); ! (void) ioctl (0,TCSETA,&otty); (void) printf ("\nProgram Exception : Signal = %d.\n",sig); ******** snip snip snip ******************************************** fastlink-4.1P-fix95/paper3.ps0000644000265600020320000075216406506236523015163 0ustar tilleaadmin%!PS-Adobe-2.0 %%Creator: dvips 5.495 Copyright 1986, 1992 Radical Eye Software %%Title: text.dvi %%CreationDate: Fri Feb 18 13:20:04 1994 %%Pages: 22 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips text.dvi -o %DVIPSSource: TeX output 1994.02.18:1319 %%BeginProcSet: tex.pro %! /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N} B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0] concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize -72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{ CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N} B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook} if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255 {IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{ pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{ gsave transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{ p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet %%BeginProcSet: special.pro %! TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X /rwiSeen true N}B /@rhi {10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{ }N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{ SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{ rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}N /@fedspecial{end}B /li{lineto}B /rl{ rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (/a/santa/dancer/schaffer/linkage/parpaper/revision/text.dvi) @start /Fa 6 107 df0 D<400004C0000C60001830003018 00600C00C006018003030001860000CC0000780000300000300000780000CC0001860003030006 01800C00C0180060300030600018C0000C40000416187A9623>2 D<03C00FF01FF83FFC7FFE7F FEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1FF80FF003C010127D9317>15 D<000F0038006000E001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C0 038007001E00F8001E000700038001C001C001C001C001C001C001C001C001C001C001C001C001 C001C001C000E000600038000F102D7DA117>102 DI106 D E /Fb 21 122 df<3803007C07807C0780EE0F80EE0F 00EE0F00EE1F00EE1E00EE1E00EE3E007C3C007C3C00387C0000780000780000F80000F00001F0 0001E00001E00003E00003C00003C00007C0000783800787C00F87C00F0EE00F0EE01F0EE01E0E E01E0EE03E0EE03C07C03C07C018038013247E9F18>37 D<000300000780000780000F80000F00 001F00001E00001E00003E00003C00007C0000780000780000F80000F00001F00001E00003E000 03C00003C00007C0000780000F80000F00000F00001F00001E00003E00003C00003C00007C0000 780000F80000F00000F0000060000011247D9F18>47 D91 D93 D<1FE0003FF8007FFC00781E00 300E0000070000070000FF0007FF001FFF007F0700780700E00700E00700E00700F00F00781F00 3FFFF01FFBF007E1F014147D9318>97 D<01FE0007FF001FFF803E0780380300700000700000E0 0000E00000E00000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012 147D9318>99 D<001F80003F80001F8000038000038000038000038000038003E3800FFB801FFF 803C1F80380F80700780700380E00380E00380E00380E00380E00380E00380700780700780380F 803C1F801FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F0038078070038070 0380E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E03C01FFF8007FF0001 FC0012147D9318>I<01E1F007FFF80FFFF81E1E301C0E00380700380700380700380700380700 1C0E001E1E001FFC001FF80039E0003800001C00001FFE001FFFC03FFFE07801F0700070E00038 E00038E00038E000387800F07E03F01FFFC00FFF8001FC00151F7F9318>103 D<03800007C00007C00007C000038000000000000000000000000000FFC000FFC000FFC00001C0 0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 00FFFF00FFFF80FFFF00111D7C9C18>105 D107 D<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C 1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F1F00FFBFBF807F 1F1F001914819318>109 D<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00E00E00E00E00E0 0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC1714809318> I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000E0E000E0E000E0E000E0F001 E07001C07803C03C07803E0F801FFF000FFE0001F00013147E9318>I<7F87E0FF9FF07FBFF803 F87803F03003E00003C00003C00003800003800003800003800003800003800003800003800003 80007FFE00FFFF007FFE0015147F9318>114 D<07F7003FFF007FFF00780F00E00700E00700E0 07007C00007FE0001FFC0003FE00001F00600780E00380E00380F00380F80F00FFFF00FFFC00E7 F00011147D9318>I<0180000380000380000380000380007FFFC0FFFFC0FFFFC0038000038000 0380000380000380000380000380000380000380000380400380E00380E00380E001C1C001FFC0 00FF80003E0013197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00E00E00 E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC1714809318 >I<7F8FF0FF8FF87F8FF01E03C00E03800E03800E0380070700070700070700038E00038E0003 8E00038E0001DC0001DC0001DC0000F80000F80000700015147F9318>II<7F8FF0FF8FF87F8FF00E01C00E03800E03800703 80070700070700038700038600038E0001CE0001CE0000CC0000CC0000DC000078000078000078 0000700000700000700000F00000E00079E0007BC0007F80003F00001E0000151E7F9318>121 D E /Fc 3 113 df<0300038003000000000000000000000000001C002400460046008C000C00 18001800180031003100320032001C0009177F960C>105 D<1F0006000600060006000C000C00 0C000C00181C1866188E190C32003C003F00318060C060C460C460C8C0C8C0700F177E9612> 107 D<1C3C22462382230346030603060306030C060C060C0C0C081A3019E01800180030003000 3000FC001014808D12>112 D E /Fd 5 117 df<00300000300000300000300000300000300000 3000003000003000003000003000FFFFFCFFFFFC00300000300000300000300000300000300000 300000300000300000300000300016187E931B>43 D<03000700FF000700070007000700070007 00070007000700070007000700070007000700070007007FF00C157E9412>49 D<0F8030E040708030C038E0384038003800700070006000C00180030006000C08080810183FF0 7FF0FFF00D157E9412>I104 D<080008000800180018003800FF803800380038003800380038003800 38403840384038401C800F000A147F930E>116 D E /Fe 16 115 df<001E0000630000C38001 C1800381800301C00701C00F01C00E01C01E03C01C03C03C03C03C03C03C03C07807807FFF807F FF80780780F00F00F00F00F00F00F00E00F01E00E01C00E03C00E03800E0300060700060E00070 C0003180001E000012207E9F15>18 D<70F8F8F87005057C840D>58 D<70F8FCFC740404040808 10102040060E7C840D>I<000001C00000078000001E00000078000001E00000078000000E0000 0038000000F0000003C000000F0000003C000000F0000000F00000003C0000000F00000003C000 0000F0000000380000000E0000000780000001E0000000780000001E0000000780000001C01A1A 7C9723>I<000100030003000600060006000C000C000C00180018001800300030003000600060 006000C000C000C00180018001800300030003000600060006000C000C000C0018001800180030 0030003000600060006000C000C000C000102D7DA117>I<000002000000060000000E0000000E 0000001E0000001F0000002F0000002F0000004F0000008F0000008F0000010F0000010F000002 0F0000040F0000040F0000080F8000080780001007800020078000200780007FFF800040078000 800780018007800100078002000780020007C0040003C00C0003C01E0007C0FF807FFC1E207E9F 22>65 D<00FFFFFF000F000E000F0006000F0002000F0002001E0002001E0002001E0002001E00 02003C0004003C0400003C0400003C04000078080000781800007FF8000078180000F0100000F0 100000F0100000F0100001E0000001E0000001E0000001E0000003C0000003C0000003C0000003 C0000007C00000FFFE0000201F7E9E1D>70 D<00007E0100038183000E00460038002E0070001E 00E0000E01C0000C0380000C0700000C0F00000C1E0000081E0000083C0000003C000000780000 00780000007800000078000000F0000000F0007FFCF00001E0F00001E0F00003C0700003C07000 03C0700003C038000780380007801C000F800C000B80060033000380C100007F000020217E9F24 >I<00FFF9FFF0000F801F00000F001E00000F001E00000F001E00001E003C00001E003C00001E 003C00001E003C00003C007800003C007800003C007800003C007800007800F000007FFFF00000 7800F000007800F00000F001E00000F001E00000F001E00000F001E00001E003C00001E003C000 01E003C00001E003C00003C007800003C007800003C007800003C007800007C00F8000FFF8FFF8 00241F7E9E26>I<00FFFF80000F00F0000F0038000F001C000F001C001E001E001E001E001E00 1E001E001E003C003C003C003C003C0078003C00F0007801C000780700007FFC0000780E0000F0 070000F0078000F0038000F003C001E0078001E0078001E0078001E0078003C00F0003C00F0103 C00F0103C00F0207C00702FFFC038C000001F020207E9E23>82 D<0007E0800018118000300B00 0060070000C0070001C0030001800200038002000380020003800200038000000380000003C000 0003F8000003FF800001FFC00000FFE000003FF0000003F0000000F00000007000000070000000 70002000700020007000200060006000E0006000C0006001C00070018000E8030000C60E000081 F8000019217D9F1C>I<00E001E001E000C000000000000000000000000000000E001300238043 80438043808700070007000E000E001C001C001C20384038403840388019000E000B1F7E9E10> 105 D<0000C00001E00001E00001C0000000000000000000000000000000000000000000001E00 006300004380008380010380010380020700000700000700000700000E00000E00000E00000E00 001C00001C00001C00001C0000380000380000380000380000700000700030700078E000F1C000 6380003E00001328819E13>I<03C1E004621804741C08781C08701E08701E10E01E00E01E00E0 1E00E01E01C03C01C03C01C03C01C0380380780380700380E003C1C0072380071E000700000700 000E00000E00000E00000E00001C00001C0000FFC000171D819317>112 D<00F0400388C00705800E03801C03803C0380380700780700780700780700F00E00F00E00F00E 00F00E00F01C00F01C00703C00705C0030B8000F38000038000038000070000070000070000070 0000E00000E0000FFE00121D7E9314>I<1E1E0023210023C38043C78043878043830087000007 00000700000700000E00000E00000E00000E00001C00001C00001C00001C000038000018000011 147E9315>I E /Ff 46 123 df<70F8F8F0E005057B840E>46 D<000F800030E000E07001C070 0380300380380700380F00780F00780E00781E00781E00703C00F03C00F03C00F03C00F07801E0 7801E07801E07801C07003C0F003C0F00380F00780F00700700700700E00701C00303800187000 0FC000151F7C9D17>48 D<000200020006000E003C00DC031C001C003800380038003800700070 0070007000E000E000E000E001C001C001C001C003800380038003800780FFF80F1E7B9D17>I< 001F000061800080E00100E00200700220700420700410700820F00820F00820F00840E00881E0 0703C0000380000700000C00001800006000008000030000040000080040100040100080200180 7E030047FF0041FE0080FC00807800141F7C9D17>I<0000600000E00000E00000E00001C00001 C00001C0000380000380000300000700000700000600000E00000C000018000018000030000030 0000630000C700008700010700030700060E00040E00080E003F8E00607C00801FC0001C00001C 0000380000380000380000380000700000700000600013277E9D17>52 D<001F0000718000C0C0 0180C00380E00700E00F00E00F01E01E01E01E01E01E01E01E01C01C03C01C03C01C03C01C07C0 1C0F800C0F8006378003C700000F00000E00000E00001C00601C00F03800F07000E0600080C000 4380003E0000131F7B9D17>57 D<00000200000006000000060000000E0000001E0000001E0000 003F0000002F0000004F0000004F0000008F0000010F0000010F0000020F0000020F0000040F00 00040F0000080F0000100F0000100F0000200F80003FFF800040078000C0078000800780010007 80010007800200078002000780060007801E000F80FF807FF81D207E9F22>65 D<01FFFFC0001E00F0001E0078001E0038001E003C003C003C003C003C003C003C003C003C0078 007800780078007800F0007801E000F0078000FFFE0000F00F8000F003C001E001C001E001E001 E001E001E001E003C001E003C001E003C001E003C001C0078003C00780078007800F0007801E00 0F007800FFFFE0001E1F7D9E20>I<0000FE0200078186001C004C0038003C0060003C00C0001C 01C0001803800018070000180F0000181E0000101E0000103C0000003C00000078000000780000 007800000078000000F0000000F0000000F0000000F0000000F000008070000080700000807000 01003800010038000200180004000C001800060020000381C00000FE00001F217A9F21>I<01FF FFFE001E001C001E000C001E0004001E0004003C0004003C0004003C0004003C00040078080800 780800007808000078180000F0300000FFF00000F0300000F0300001E0200001E0200001E02000 01E0001003C0002003C0002003C0004003C00040078000800780018007800100078007000F001F 00FFFFFE001F1F7D9E1F>69 D<0000FC040007030C001C00980030007800E0007801C000380380 003003800030070000300E0000301E0000201E0000203C0000003C000000780000007800000078 00000078000000F0000000F000FFF0F0000780F0000780F0000F0070000F0070000F0070000F00 70001E0038001E0018003E001C002E000E00CC000383040000FC00001E217A9F23>71 D<01FFF3FFE0001F003E00001E003C00001E003C00001E003C00003C007800003C007800003C00 7800003C007800007800F000007800F000007800F000007800F00000F001E00000FFFFE00000F0 01E00000F001E00001E003C00001E003C00001E003C00001E003C00003C007800003C007800003 C007800003C007800007800F000007800F000007800F000007800F00000F801F0000FFF1FFE000 231F7D9E22>I<01FFF0001F00001E00001E00001E00003C00003C00003C00003C000078000078 0000780000780000F00000F00000F00000F00001E00001E00001E00001E00003C00003C00003C0 0003C0000780000780000780000780000F8000FFF800141F7D9E12>I<001FFF0000F80000F000 00F00000F00001E00001E00001E00001E00003C00003C00003C00003C000078000078000078000 0780000F00000F00000F00000F00001E00001E00301E00781E00F83C00F83C00F0780080700040 E00021C0001F000018207D9E18>I<01FFF800001F0000001E0000001E0000001E0000003C0000 003C0000003C0000003C00000078000000780000007800000078000000F0000000F0000000F000 0000F0000001E0000001E0000001E0000001E0008003C0010003C0010003C0030003C002000780 06000780060007800C0007801C000F007800FFFFF800191F7D9E1D>76 D<01FF007FE0001F000F 00001F0004000017800400001780040000278008000023C008000023C008000023C008000041E0 10000041E010000041F010000040F010000080F020000080782000008078200000807820000100 3C400001003C400001003C400001001E400002001E800002001E800002000F800002000F800004 000F0000040007000004000700000C000700001C00020000FF80020000231F7D9E22>78 D<01FFFF80001E00E0001E0070001E0038001E003C003C003C003C003C003C003C003C003C0078 007800780078007800F0007800E000F003C000F00F0000FFFC0000F0000001E0000001E0000001 E0000001E0000003C0000003C0000003C0000003C0000007800000078000000780000007800000 0F800000FFF000001E1F7D9E1F>80 D<01FFFF00001E03C0001E00E0001E0070001E0078003C00 78003C0078003C0078003C0078007800F0007800F0007801E0007801C000F0070000F01E0000FF F00000F0380001E01C0001E01E0001E00E0001E00F0003C01E0003C01E0003C01E0003C01E0007 803C0007803C0807803C0807803C100F801C10FFF00C20000007C01D207D9E21>82 D<0007E040001C18C0003005800060038000C0038001C001800180010003800100038001000380 01000380000003C0000003C0000003F8000001FF800001FFE000007FF000001FF0000001F80000 00780000007800000038000000380020003800200038002000300060007000600060006000E000 7000C000E8038000C606000081F800001A217D9F1A>I<7FFC1FF807C003C00780010007800100 078001000F0002000F0002000F0002000F0002001E0004001E0004001E0004001E0004003C0008 003C0008003C0008003C00080078001000780010007800100078001000F0002000F0002000F000 2000F0004000F0004000700080007001000030020000380400000C18000007E000001D20779E22 >85 D87 D<00FFF07FE0000F801F00000F001C00000F8010000007803000000780200000 07C040000003C080000003C100000003E200000001E400000001EC00000001F800000000F00000 0000F800000000F800000000F8000000017C000000023C000000063C000000043E000000081E00 0000101E000000201F000000400F000000800F000001800F8000010007800007000780001F000F C000FFC07FF800231F7E9E22>I<00F1800389C00707800E03801C03803C038038070078070078 0700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40308C800F070013147C93 17>97 D<07803F8007000700070007000E000E000E000E001C001C001CF01D0C3A0E3C0E380F38 0F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031C01F0010207B9F15>I<007E00 01C1000300800E07801E07801C07003C0000780000780000780000F00000F00000F00000F00000 F00100700100700200300C0018300007C00011147C9315>I<0000780003F80000700000700000 700000700000E00000E00000E00000E00001C00001C000F1C00389C00707800E03801C03803C03 80380700780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40308C 800F070015207C9F17>I<007C01C207010E011C013C013802780C7FF07800F000F000F000F000 700170017002380C183007C010147C9315>I<00007800019C00033C00033C0007180007000007 00000E00000E00000E00000E00000E0001FFE0001C00001C00001C00001C000038000038000038 0000380000380000700000700000700000700000700000700000E00000E00000E00000E00000C0 0001C00001C0000180003180007B0000F300006600003C00001629829F0E>I<003C6000E27001 C1E00380E00700E00F00E00E01C01E01C01E01C01E01C03C03803C03803C03803C03803C07003C 07001C0F001C17000C2E0003CE00000E00000E00001C00001C00301C00783800F0700060E0003F 8000141D7E9315>I<01E0000FE00001C00001C00001C00001C000038000038000038000038000 070000070000071E000763000E81800F01C00E01C00E01C01C03801C03801C03801C0380380700 380700380700380E10700E20700C20701C20700C40E00CC060070014207D9F17>I<00C001E001 E001C000000000000000000000000000000E003300230043804300470087000E000E000E001C00 1C001C003840388030807080310033001C000B1F7C9E0E>I<01E0000FE00001C00001C00001C0 0001C0000380000380000380000380000700000700000703C00704200E08E00E11E00E21E00E40 C01C80001D00001E00001FC00038E000387000387000383840707080707080707080703100E031 00601E0013207D9F15>107 D<03C01FC0038003800380038007000700070007000E000E000E00 0E001C001C001C001C0038003800380038007000700070007100E200E200E200E200640038000A 207C9F0C>I<1C0F80F0002630C318004740640C004780680E004700700E004700700E008E00E0 1C000E00E01C000E00E01C000E00E01C001C01C038001C01C038001C01C038001C01C070803803 8071003803806100380380E10038038062007007006600300300380021147C9325>I<1C0F8026 30C04740604780604700704700708E00E00E00E00E00E00E00E01C01C01C01C01C01C01C038438 03883803083807083803107003303001C016147C931A>I<007C0001C3000301800E01C01E01C0 1C01E03C01E07801E07801E07801E0F003C0F003C0F003C0F00780F00700700F00700E00301800 18700007C00013147C9317>I<01C1E002621804741C04781C04701E04701E08E01E00E01E00E0 1E00E01E01C03C01C03C01C03C01C0380380780380700380E003C1C0072380071E000700000700 000E00000E00000E00000E00001C00001C0000FFC000171D809317>I<00F0400388C00705800E 03801C03803C0380380700780700780700780700F00E00F00E00F00E00F00E00F01C00F01C0070 3C00705C0030B8000F380000380000380000700000700000700000700000E00000E0000FFE0012 1D7C9315>I<1C1E002661004783804787804707804703008E00000E00000E00000E00001C0000 1C00001C00001C000038000038000038000038000070000030000011147C9313>I<00FC030206 010C030C070C060C000F800FF007F803FC003E000E700EF00CF00CE008401020601F8010147D93 13>I<018001C0038003800380038007000700FFF007000E000E000E000E001C001C001C001C00 3800380038003820704070407080708031001E000C1C7C9B0F>I<0E00C03300E02301C04381C0 4301C04701C08703800E03800E03800E03801C07001C07001C07001C07101C0E20180E20180E20 1C1E200C264007C38014147C9318>I<0E00C1C03300E3C02301C3E04381C1E04301C0E04701C0 60870380400E0380400E0380400E0380401C0700801C0700801C0700801C0701001C0701001C06 02001C0F02000C0F04000E13080003E1F0001B147C931E>119 D<0383800CC4401068E01071E0 2071E02070C040E00000E00000E00000E00001C00001C00001C00001C040638080F38080F38100 E5810084C60078780013147D9315>I<0E00C03300E02301C04381C04301C04701C08703800E03 800E03800E03801C07001C07001C07001C07001C0E00180E00180E001C1E000C3C0007DC00001C 00001C00003800F03800F07000E06000C0C0004380003E0000131D7C9316>I<01C04003E08007 F1800C1F0008020000040000080000100000200000400000800001000002000004010008020010 02003E0C0063FC0041F80080E00012147D9313>I E /Fg 41 122 df<000E00001E00007E0007 FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFFFE17277BA622>49 D<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE003FC0FF003FC0FF003FE0FF00 1FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F8000007F000000FE0000 00FC000001F8000003F0000003E00000078000000F0000001E0000003C00E0007000E000E000E0 01C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF 801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF003F80FF003F807F803F807F 803F807F801F807F800F007F800000FF000000FF000000FE000001FC000001F8000007F00000FF C00000FFF0000001FC0000007E0000007F0000007F8000003FC000003FC000003FE000003FE03C 003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F807C007F003F01FE001FFFFC00 07FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E000000FE000000FE00 0001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E0000707E0000E07E0000E07E 0001C07E0003807E0007007E000E007E000E007E001C007E0038007E0070007E00E0007E00FFFF FFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 00FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFFFE000FFFFC000F FFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E0000000E000000 0E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001F8000001FC000001FC000001F E000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001FC078003F807800 3F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA622>I<0007F000003FFC0000FF FE0001FC0F0003F01F8007E03F800FC03F801FC03F801F803F803F801F003F8000007F0000007F 0000007F000000FF000000FF0FC000FF3FF800FF707C00FFC03E00FFC03F00FF801F80FF801FC0 FF001FC0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F001FE07F001FE03F001FE03F001F C01F801FC01F803F800FC03F0007E07E0003FFFC0000FFF000003FC0001B277DA622>I<380000 003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E007000 0E0070001C00E0003800E0007000E000E0000000E0000001C00000038000000780000007800000 0F0000000F0000001F0000001F0000003F0000003E0000003E0000007E0000007E0000007E0000 007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007C00 00003800001C297CA822>I<000003800000000007C00000000007C0000000000FE0000000000F E0000000000FE0000000001FF0000000001FF0000000003FF8000000003FF8000000003FF80000 000073FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00000001C0 FF00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E003FE000 000E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF800007800 07FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C00000FF00 01C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 D68 DI<00 007FE003000003FFFC0700001FFFFF0F00003FF00FFF0000FF8001FF0001FE0000FF0003F80000 3F0007F000003F000FF000001F001FE000000F001FE000000F003FC000000F003FC0000007007F C0000007007F80000007007F8000000000FF8000000000FF8000000000FF8000000000FF800000 0000FF8000000000FF8000000000FF8000000000FF8000000000FF8001FFFFF87F8001FFFFF87F 8001FFFFF87FC00000FF003FC00000FF003FC00000FF001FE00000FF001FE00000FF000FF00000 FF0007F00000FF0003F80000FF0001FE0000FF0000FF8001FF00003FF007BF00001FFFFF1F0000 03FFFE0F0000007FF003002D297CA836>71 D73 D75 DIII80 D82 D<007F806003FFF0E007FFF9E00F807FE01F001FE03E0007E07C0003E07C0001E0FC0001E0FC00 01E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFE00007FFFE0003FFFFC001FFFFE000F FFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF000000FF8000007F8000003F8600001F8 E00001F8E00001F8E00001F8F00001F0F00001F0F80003F0FC0003E0FF0007C0FFE01F80F3FFFF 00E0FFFE00C01FF0001D297CA826>I<01FF800007FFF0000F81F8001FC07E001FC07E001FC03F 000F803F8007003F8000003F8000003F8000003F80000FFF8000FFFF8007FC3F800FE03F803F80 3F803F003F807F003F80FE003F80FE003F80FE003F80FE003F807E007F807F00DF803F839FFC0F FF0FFC01FC03FC1E1B7E9A21>97 DI<001F F80000FFFE0003F01F0007E03F800FC03F801F803F803F801F007F800E007F0000007F000000FF 000000FF000000FF000000FF000000FF000000FF000000FF0000007F0000007F0000007F800000 3F8001C01F8001C00FC0038007E0070003F01E0000FFFC00001FE0001A1B7E9A1F>I<00003FF8 0000003FF80000003FF800000003F800000003F800000003F800000003F800000003F800000003 F800000003F800000003F800000003F800000003F800000003F800000003F800001FE3F80000FF FBF80003F03FF80007E00FF8000FC007F8001F8003F8003F8003F8007F0003F8007F0003F8007F 0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800 7F0003F8007F0003F8007F0003F8003F8003F8001F8003F8000F8007F80007C00FF80003F03BFF 8000FFF3FF80003FC3FF80212A7EA926>I<003FE00001FFF80003F07E0007C01F000F801F801F 800F803F800FC07F000FC07F0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000 FF000000FF0000007F0000007F0000007F0000003F8000E01F8000E00FC001C007E0038003F81F 0000FFFE00001FF0001B1B7E9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F07F07F07F0 3E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F0 0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 0007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7 F80FC1FE7C1F80FC7C1F007C383F007E107F007F007F007F007F007F007F007F007F007F007F00 7F003F007E001F007C001F80FC000FC1F8001FFFE00018FF800038000000380000003C0000003E 0000003FFFF8001FFFFF001FFFFF800FFFFFC007FFFFE01FFFFFF03E0007F07C0001F8F80000F8 F80000F8F80000F8F80000F87C0001F03C0001E01F0007C00FC01F8003FFFE00007FF0001E287E 9A22>II<07000F801FC03FE03FE03FE01F C00F8007000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE0 0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14 >I107 DIII<003FE00001FFFC0003F07E000FC01F80 1F800FC03F800FE03F0007E07F0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007 F8FF0007F8FF0007F8FF0007F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC0 1F8007F07F0001FFFC00003FE0001D1B7E9A22>I<001FC0380000FFF0780003F838F80007E00D F8000FC007F8001FC007F8003F8003F8007F8003F8007F8003F8007F0003F800FF0003F800FF00 03F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F8007F0003F8007F0003F8007F 8003F8003F8003F8001F8007F8000FC007F80007E01FF80003F07BF80000FFF3F800003FC3F800 000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8 00000003F80000003FFF8000003FFF8000003FFF8021277E9A24>113 D I<03FE300FFFF01E03F03800F0700070F00070F00070F80070FC0000FFE0007FFE007FFF803FFF E01FFFF007FFF800FFF80003FC0000FC60007CE0003CF0003CF00038F80038FC0070FF01E0F7FF C0C1FF00161B7E9A1B>I<00700000700000700000700000F00000F00000F00001F00003F00003 F00007F0001FFFF0FFFFF0FFFFF007F00007F00007F00007F00007F00007F00007F00007F00007 F00007F00007F00007F00007F00007F03807F03807F03807F03807F03807F03803F03803F87001 F86000FFC0001F8015267FA51B>I III< FFFE03FF80FFFE03FF80FFFE03FF8007F000700007F000700007F800F00003F800E00003FC01E0 0001FC01C00001FC01C00000FE03800000FE038000007F070000007F070000007F8F0000003F8E 0000003FDE0000001FDC0000001FDC0000000FF80000000FF80000000FF800000007F000000007 F000000003E000000003E000000001C000000001C000000003800000000380000038078000007C 07000000FE0F000000FE0E000000FE1E000000FE3C0000007C780000003FE00000000FC0000000 21277F9A24>121 D E /Fh 20 122 df<00FC7C0183C607078E0607040E07000E07000E07000E 07000E07000E0700FFFFF00E07000E07000E07000E07000E07000E07000E07000E07000E07000E 07000E07000E07000E07000E07007F0FF0171A809916>11 D<60F0F06004047D830B>46 D<007F00000180C000060030000800080010000400203E020020E1020041C08100438071008380 7080870070808700708087007080870070808700708087007080838070804380708041C0F10020 E13100203E1E0010000000080000000600038001803E00007FE000191A7E991E>64 D<3F8070C070E020700070007007F01C7030707070E070E071E071E0F171FB1E3C10107E8F13> 97 DI<07F80C1C381C30087000E000E000E000E000E000E0007000300438080C 1807E00E107F8F11>I<007E00000E00000E00000E00000E00000E00000E00000E00000E00000E 0003CE000C3E00380E00300E00700E00E00E00E00E00E00E00E00E00E00E00E00E00600E00700E 00381E001C2E0007CFC0121A7F9915>I<07C01C3030187018600CE00CFFFCE000E000E000E000 6000300438080C1807E00E107F8F11>I104 D<18003C003C0018000000000000 00000000000000FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF80 091A80990A>I108 DII112 D 114 D<1F2060E04020C020C020F0007F003FC01FE000F080708030C030C020F0408F800C107F8F 0F>I<0400040004000C000C001C003C00FFC01C001C001C001C001C001C001C001C001C201C20 1C201C201C200E4003800B177F960F>II119 D121 D E /Fi 6 124 df<0C000C008C40EDC07F800C007F80EDC08C400C000C000A0B7D8B10>3 D<81C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C381081A7C9210>107 D<3C62C3C3C040603866C2C3C343661C060203C3C3463C08167D900E>120 D<1818181818FFFF18181818181818181818181818181808167D900E>I<1818181818FF181818 18180018181818FFFF1818181808167D900E>I<1FFC3FFC7E30FE30FE30FE30FE30FE30FE307E 303E301E3006300630063006300630063006300630063006300E167D9013>I E /Fj 84 128 df<001F83E000F06E3001C078780380F8780300F0300700700007007000070070 0007007000070070000700700007007000FFFFFF80070070000700700007007000070070000700 700007007000070070000700700007007000070070000700700007007000070070000700700007 0070000700700007007000070070007FE3FF001D20809F1B>11 D<003F0000E0C001C0C00381E0 0701E00701E0070000070000070000070000070000070000FFFFE00700E00700E00700E00700E0 0700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0 0700E07FC3FE1720809F19>I<003FE000E0E001C1E00381E00700E00700E00700E00700E00700 E00700E00700E00700E0FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700 E00700E00700E00700E00700E00700E00700E00700E00700E00700E07FE7FE1720809F19>I<00 1F81F80000F04F040001C07C06000380F80F000300F00F000700F00F0007007000000700700000 0700700000070070000007007000000700700000FFFFFFFF000700700700070070070007007007 000700700700070070070007007007000700700700070070070007007007000700700700070070 070007007007000700700700070070070007007007000700700700070070070007007007007FE3 FE3FF02420809F26>I<000300C0000300C0000300C0000300C000060180000601800006018000 06018000060180000C0300000C0300000C0300000C0300000C0300001806007FFFFFFCFFFFFFFE 00300C0000300C0000300C0000300C0000601800006018000060180000601800FFFFFFFE7FFFFF FC00C0300001806000018060000180600001806000018060000300C0000300C0000300C0000300 C0000300C0000601800006018000060180001F297D9F26>35 D<0F000030188000303060006070 3001C0602C06C06013F980E0100300E0100300E0100600E0100C00E0100C00E010180060103000 60203000702060003040C0001880C0000F018000000300E0000303100006060800060604000C0C 0400180C0400181C0200301C0200601C0200601C0200C01C0201801C0201801C0203000C040600 0C04060006040C00060818000310080000E01F257DA126>37 D<70F8FCFC740404040808101020 40060E7C9F0D>39 D<0020004000800100020006000C000C001800180030003000300070006000 60006000E000E000E000E000E000E000E000E000E000E000E000E0006000600060007000300030 003000180018000C000C000600020001000080004000200B2E7DA112>I<800040002000100008 000C00060006000300030001800180018001C000C000C000C000E000E000E000E000E000E000E0 00E000E000E000E000E000C000C000C001C001800180018003000300060006000C000800100020 00400080000B2E7DA112>I<70F8FCFC74040404080810102040060E7C840D>44 DI<70F8F8F87005057C840D>I<000100030003000600060006000C000C 000C00180018001800300030003000600060006000C000C000C001800180018003000300030006 00060006000C000C000C00180018001800300030003000600060006000C000C000C000102D7DA1 17>I<03F0000E1C001C0E00180600380700700380700380700380700380F003C0F003C0F003C0 F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0700380700380700380 7807803807001806001C0E000E1C0003F000121F7E9D17>I<018003800F80F380038003800380 038003800380038003800380038003800380038003800380038003800380038003800380038003 80038007C0FFFE0F1E7C9D17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F8 03C0F803C02007C00007C0000780000780000F00000E00001C0000380000700000600000C00001 80000300000600400C00401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00 100E00200F00780F80780780780780380F80000F80000F00000F00000E00001C0000380003F000 003C00000E00000F000007800007800007C02007C0F807C0F807C0F807C0F00780400780400F00 200E001C3C0003F000121F7E9D17>I<000600000600000E00000E00001E00002E00002E00004E 00008E00008E00010E00020E00020E00040E00080E00080E00100E00200E00200E00400E00C00E 00FFFFF0000E00000E00000E00000E00000E00000E00000E0000FFE0141E7F9D17>I<1803001F FE001FFC001FF8001FE00010000010000010000010000010000010000011F000161C00180E0010 07001007800003800003800003C00003C00003C07003C0F003C0F003C0E0038040038040070020 0700100E000C380003E000121F7E9D17>I<007C000182000701000E03800C07801C0780380300 380000780000700000700000F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0 F003C0F003C07003C07003C07003803803803807001807000C0E00061C0001F000121F7E9D17> I<4000007FFFC07FFF807FFF804001008002008002008004000008000008000010000020000020 0000400000400000C00000C00001C0000180000380000380000380000380000780000780000780 00078000078000078000078000030000121F7D9D17>I<03F0000C0C0010060030030020018060 01806001806001807001807803003E03003F06001FC8000FF00003F80007FC000C7E00103F0030 0F806003804001C0C001C0C000C0C000C0C000C0C000806001802001001002000C0C0003F00012 1F7E9D17>I<03F0000E18001C0C00380600380700700700700380F00380F00380F003C0F003C0 F003C0F003C0F003C07007C07007C03807C0180BC00E13C003E3C0000380000380000380000700 300700780600780E00700C002018001070000FC000121F7E9D17>I<70F8F8F870000000000000 0000000070F8F8F87005147C930D>I<70F8F8F8700000000000000000000070F0F8F878080808 101010202040051D7C930D>I<7FFFFFE0FFFFFFF0000000000000000000000000000000000000 0000000000000000000000000000FFFFFFF07FFFFFE01C0C7D9023>61 D<0FC0307040384038E0 3CF03CF03C603C0038007000E000C0018001800100030002000200020002000200020000000000 00000000000007000F800F800F8007000E207D9F15>63 D<000100000003800000038000000380 000007C0000007C0000007C0000009E0000009E0000009E0000010F0000010F0000010F0000020 7800002078000020780000403C0000403C0000403C0000801E0000801E0000FFFE0001000F0001 000F0001000F00020007800200078002000780040003C00E0003C01F0007E0FFC03FFE1F207F9F 22>65 DI<000FC040007030C001C009C0038005C0070003C00E 0001C01E0000C01C0000C03C0000C07C0000407C00004078000040F8000000F8000000F8000000 F8000000F8000000F8000000F8000000F8000000F8000000780000007C0000407C0000403C0000 401C0000401E0000800E000080070001000380020001C0040000703800000FC0001A217D9F21> IIII<000FE0200078186000E004E0038002E0070001E00F0000E01E0000601E0000603C0000 603C0000207C00002078000020F8000000F8000000F8000000F8000000F8000000F8000000F800 0000F8007FFCF80003E0780001E07C0001E03C0001E03C0001E01E0001E01E0001E00F0001E007 0001E0038002E000E0046000781820000FE0001E217D9F24>I II<0FFFC0007C00003C 00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C 00003C00003C00003C00003C00003C00003C00003C00203C00F83C00F83C00F83C00F038004078 0040700030E0000F800012207E9E17>IIIII<001F800000 F0F00001C0380007801E000F000F000E0007001E0007803C0003C03C0003C07C0003E0780001E0 780001E0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001 F0780001E07C0003E07C0003E03C0003C03C0003C01E0007800E0007000F000F0007801E0001C0 380000F0F000001F80001C217D9F23>II82 D<07E0800C1980100780300380600180600180E00180E00080E00080E0 0080F00000F000007800007F00003FF0001FFC000FFE0003FF00001F800007800003C00003C000 01C08001C08001C08001C08001C0C00180C00380E00300F00600CE0C0081F80012217D9F19>I< 7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030800F0010800F0010800F0010800F00 10000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F 0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 1F800007FFFE001C1F7E9E21>IIII<7FF83FF80FE00FC007C0070003C0020001E0040001F00C00 00F0080000781000007C1000003C2000003E4000001E4000000F8000000F8000000780000003C0 000007E0000005E0000009F0000018F8000010780000207C0000603C0000401E0000801F000180 0F0001000780020007C0070003C01F8007E0FFE01FFE1F1F7F9E22>II<7FFFF87C00F87000F06001E04001E0C003C0C003C0800780800F80800F00001E00001E 00003C00003C0000780000F80000F00001E00001E00003C00403C0040780040F80040F000C1E00 0C1E00083C00183C0018780038F801F8FFFFF8161F7D9E1C>II< FEFE06060606060606060606060606060606060606060606060606060606060606060606060606 06060606FEFE072D7FA10D>93 D<0C001E0033006180C0C080400A067A9E17>I<1FE000303000 781800781C00300E00000E00000E00000E0000FE000F8E001E0E00380E00780E00F00E10F00E10 F00E10F01E10781E103867200F83C014147E9317>97 D<0E0000FE00000E00000E00000E00000E 00000E00000E00000E00000E00000E00000E00000E3E000EC3800F01C00F00E00E00E00E00700E 00700E00780E00780E00780E00780E00780E00780E00700E00700E00E00F00E00D01C00CC30008 3E0015207F9F19>I<03F80E0C1C1E381E380C70007000F000F000F000F000F000F00070007000 380138011C020E0C03F010147E9314>I<000380003F8000038000038000038000038000038000 038000038000038000038000038003E380061B801C0780380380380380700380700380F00380F0 0380F00380F00380F00380F003807003807003803803803807801C07800E1B8003E3F815207E9F 19>I<03F0000E1C001C0E00380700380700700380700380F00380FFFF80F00000F00000F00000 F000007000007000003800801800800C010007060001F80011147F9314>I<007C00C6018F038F 07060700070007000700070007000700FFF0070007000700070007000700070007000700070007 0007000700070007000700070007007FF01020809F0E>I<0000E003E3300E3C301C1C30380E00 780F00780F00780F00780F00780F00380E001C1C001E380033E000200000200000300000300000 3FFE001FFF800FFFC03001E0600070C00030C00030C00030C000306000603000C01C038003FC00 141F7F9417>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00 000E00000E3E000E43000E81800F01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC16207F9F19>I<1C003E003E003E 001C000000000000000000000000000E007E000E000E000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E00FFC00A1F809E0C>I<00E001F001F001F000E0000000000000 000000000000007007F000F0007000700070007000700070007000700070007000700070007000 7000700070007000700070007000706070F060F0C061803F000C28829E0E>I<0E0000FE00000E 00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0FF00E07C00E03000E 02000E04000E08000E10000E30000E70000EF8000F38000E1C000E1E000E0E000E07000E07800E 03800E03C00E03E0FFCFF815207F9F18>I<0E00FE000E000E000E000E000E000E000E000E000E 000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E00FFE00B20809F0C>I<0E1F01F000FE618618000E80C80C000F00F00E000F00F00E000E00E0 0E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00 E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00FFE7FE7FE023147F9326> I<0E3E00FE43000E81800F01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC16147F9319>I<01F800070E001C038038 01C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0F000F07000E07000E03801C038 01C01C0380070E0001F80014147F9317>I<0E3E00FEC3800F01C00F00E00E00E00E00F00E0070 0E00780E00780E00780E00780E00780E00780E00700E00F00E00E00F01E00F01C00EC3000E3E00 0E00000E00000E00000E00000E00000E00000E00000E0000FFE000151D7F9319>I<03E0800619 801C05803C0780380380780380700380F00380F00380F00380F00380F00380F003807003807803 803803803807801C0B800E138003E3800003800003800003800003800003800003800003800003 80003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E000E000E000E000E000E000E000E000E00 0E000E000E000E000E00FFE00F147F9312>I<1F9030704030C010C010C010E00078007F803FE0 0FF00070803880188018C018C018E030D0608F800D147E9312>I<020002000200060006000E00 0E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E080E080E080E080E0806 10031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E03C00603C0030DC001F1FC16147F9319> III<7F C3FC0F01E00701C007018003810001C20000E40000EC00007800003800003C00007C00004E0000 87000107000303800201C00601E01E01E0FF07FE1714809318>II<3FFF380E200E201C40384078407000E001E001C00380078007010E011E011C03380270 06700EFFFE10147F9314>III<30307878F8 7C787830300E057C9E17>127 D E /Fk 11 116 df<387CFEFEFE7C38000000000000387CFEFE FE7C3807147C930F>58 D<0000E000000000E000000001F000000001F000000001F000000003F8 00000003F800000006FC00000006FC0000000EFE0000000C7E0000000C7E000000183F00000018 3F000000303F800000301F800000701FC00000600FC00000600FC00000C007E00000FFFFE00001 FFFFF000018003F000018003F000030001F800030001F800060001FC00060000FC000E0000FE00 FFE00FFFE0FFE00FFFE0231F7E9E28>65 D<01FE0007FF801F0FC03E0FC03E0FC07C0F807C0300 FC0000FC0000FC0000FC0000FC0000FC00007C00007E00003E00603F00C01F81C007FF0001FC00 13147E9317>99 D<0007F80007F80000F80000F80000F80000F80000F80000F80000F80000F800 00F80000F801F8F80FFEF81F83F83E01F87E00F87C00F87C00F8FC00F8FC00F8FC00F8FC00F8FC 00F8FC00F87C00F87C00F87E00F83E01F81F07F80FFEFF03F8FF18207E9F1D>I<01FE0007FF80 0F83C01E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C0000 3E00181E00180F807007FFE000FF8015147F9318>I<001F8000FFC001F3E003E7E003C7E007C7 E007C3C007C00007C00007C00007C00007C000FFFC00FFFC0007C00007C00007C00007C00007C0 0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0003FFC003FFC 0013207F9F10>I110 D<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC007EFC007EFC007EFC007EFC007EFC00 7E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017147F931A>II114 D<0FE63FFE701E600EE006E006F800FFC07FF83FFC1FFE03FE001FC007C007E007F006F81EFFFC C7F010147E9315>I E /Fl 26 122 df66 D<0007E0100038183000E0063001C00170038000F0070000F00E0000701E0000701C00 00303C0000303C0000307C0000107800001078000010F8000000F8000000F8000000F8000000F8 000000F8000000F8000000F800000078000000780000107C0000103C0000103C0000101C000020 1E0000200E000040070000400380008001C0010000E0020000381C000007E0001C247DA223>I< FFFFF0000F801E0007800700078003C0078001C0078000E0078000F00780007807800078078000 7C0780003C0780003C0780003C0780003E0780003E0780003E0780003E0780003E0780003E0780 003E0780003E0780003E0780003C0780003C0780007C0780007807800078078000F0078000E007 8001E0078003C0078007000F801E00FFFFF8001F227EA125>I72 D77 D82 D<03F0200C0C601802603001 E07000E0600060E00060E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE 000FFF0003FF80003FC00007E00001E00000F00000F0000070800070800070800070800070C000 60C00060E000C0F000C0C80180C6070081FC0014247DA21B>I85 D<0FE0001838003C0C003C0E00180700000700000700 00070000FF0007C7001E07003C0700780700700700F00708F00708F00708F00F087817083C2390 0FC1E015157E9418>97 D<01FE000703000C07801C0780380300780000700000F00000F00000F0 0000F00000F00000F00000F000007000007800403800401C00800C010007060001F80012157E94 16>99 D<0000E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000 E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F000E0F000E0F000E0F000 E0F000E0F000E0F000E07000E07800E03800E01801E00C02E0070CF001F0FE17237EA21B>I<01 FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F00000F00000F00000F00000F0 00007000007800203800201C00400E008007030000FC0013157F9416>I<003C00C6018F038F03 0F070007000700070007000700070007000700FFF8070007000700070007000700070007000700 07000700070007000700070007000700070007807FF8102380A20F>I<00007001F198071E180E 0E181C07001C07003C07803C07803C07803C07801C07001C07000E0E000F1C0019F00010000010 00001800001800001FFE000FFFC00FFFE03800F0600030400018C00018C00018C0001860003060 00303800E00E038003FE0015217F9518>I<1C003E003E003E001C000000000000000000000000 00000000000E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 0E000E000E00FFC00A227FA10E>105 D<0E00FE001E000E000E000E000E000E000E000E000E00 0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E 000E000E000E00FFE00B237FA20E>108 D<0E1FC07F00FE60E183801E807201C00F003C00E00F 003C00E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E0 0E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800 E0FFE3FF8FFE27157F942A>I<0E1F80FE60C01E80E00F00700F00700E00700E00700E00700E00 700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF1815 7F941B>I<01FC000707000C01801800C03800E0700070700070F00078F00078F00078F00078F0 0078F00078F000787000707800F03800E01C01C00E038007070001FC0015157F9418>I<0E1F00 FE61C00E80600F00700E00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E 0E003C0E003C0E00380F00700E80E00E41C00E3F000E00000E00000E00000E00000E00000E0000 0E00000E00000E0000FFE000171F7F941B>I<0E3CFE461E8F0F0F0F060F000E000E000E000E00 0E000E000E000E000E000E000E000E000E000F00FFF010157F9413>114 D<0F8830786018C018C008C008E008F0007F803FE00FF001F8003C801C800C800CC00CC008E018 D0308FC00E157E9413>I<02000200020002000600060006000E001E003E00FFF80E000E000E00 0E000E000E000E000E000E000E000E000E040E040E040E040E040E040708030801F00E1F7F9E13 >I<0E0070FE07F01E00F00E00700E00700E00700E00700E00700E00700E00700E00700E00700E 00700E00700E00700E00700E00F00E00F006017003827800FC7F18157F941B>II121 D E /Fm 8 124 df0 D<020002000200C218F2783AE00F800F803AE0F278C2180200020002000D0E7E8E12>3 D<060F0F0E1E1E1C3C383830707060E0C04008117F910A>48 D<4040C060C060C060C060C060C0 60C060C060C060C060C060C060C060C060C060C060C060C060C060C060C060C060C060C060C060 C060C060C060C060C060C060C06040400B227D9812>107 D<1F0030806040C0C0C0C0C000C000 600030000C0033006080C0C0C060C060C060606020C019800600018000C0006000606060606040 C021801F000B1D7E9610>120 D<06000600060006000600060006000600FFF0FFF00600060006 0006000600060006000600060006000600060006000600060006000600060006000C1D7E9611> I<060006000600060006000600FFF0FFF006000600060006000600060000000600060006000600 06000600FFF0FFF00600060006000600060006000C1D7E9611>I<03FFC00FFFC01FC6003FC600 7FC6007FC600FFC600FFC600FFC600FFC6007FC6007FC6003FC6001FC6000FC60003C60000C600 00C60000C60000C60000C60000C60000C60000C60000C60000C60000C60000C60000C600121D7E 9616>I E /Fn 35 128 df<0000FC1E000007026180000E07C38000180F878000380F83800070 0700000070070000007007000000E00E000000E00E000000E00E000000E00E000000E00E000000 E00E00003FFFFFF00001C01C000001C01C000001C01C000001C01C000001C01C00000380380000 038038000003803800000380380000038038000003803800000700700000070070000007007000 000700700000070070000007007000000E00E000000F00F00000FFC7FF000021237FA21C>11 D<3078F8787005057C840E>46 D<0000040000000006000000000E000000001E000000001E0000 00003E000000003F000000004F000000004F000000008F000000008F000000010F000000010780 000002078000000207800000040780000004078000000807C000000803C000001003C000001003 C000002003C000003FFFE000004001E000004001E000008001E000008001E000010001E0000100 00F000020000F000060000F000040000F0000C0000F0003E0001F800FF800FFF8021237EA225> 65 D<0001FC02000F0306003C008C0070005C00E0003C01C0003C0380001C0700001C0F000018 1E0000181E0000083E0000083C0000087C0000087C000000F8000000F8000000F8000000F80000 00F8000000F0000000F0000000F0000000F0000020F0000020F0000040F8000040780000407800 0080380001003C0001001C0002000E000C000700100001C0E000003F00001F247AA223>67 D<03FFFFC000003E00F000003C003C00003C001E00003C000E00003C000F00003C000780007800 0780007800078000780007C000780003C000780003C000780007C000F00007C000F00007C000F0 0007C000F00007C000F00007C000F00007C001E0000F8001E0000F8001E0000F8001E0000F0001 E0001F0001E0001E0003C0001E0003C0003C0003C000780003C000700003C000E00003C001C000 078007800007C01E0000FFFFF8000022227EA125>I<003FFF0000F80000F00000F00000F00000 F00000F00001E00001E00001E00001E00001E00001E00003C00003C00003C00003C00003C00003 C0000780000780000780000780000780000780000F00700F00F80F00F80F00F01E00E01E00803C 0040380030E0000F800018237DA119>74 D<03FFE00FF8003E0007E0003C000380003C00020000 3C000400003C000800003C00100000780020000078008000007801000000780200000078040000 007808000000F018000000F038000000F07C000000F13C000000F23E000000F41E000001E81F00 0001F00F000001E00F000001E007800001E007800001E003C00003C003C00003C001E00003C001 E00003C000F00003C000F00003C000F800078000F80007C000FC00FFFC07FF8025227EA126>I< 03FFF000003E0000003C0000003C0000003C0000003C0000003C00000078000000780000007800 0000780000007800000078000000F0000000F0000000F0000000F0000000F0000000F0000001E0 000001E0000001E0000001E0002001E0002001E0004003C0004003C0004003C000C003C0008003 C0018003C003800780078007C01F00FFFFFF001B227EA11E>I<03FFFFC0003E00F0003C007800 3C003C003C003E003C001E003C003E0078003E0078003E0078003E0078003E0078003C0078007C 00F0007800F000F000F001E000F0078000FFFE0000F0000001E0000001E0000001E0000001E000 0001E0000001E0000003C0000003C0000003C0000003C0000003C0000003C000000780000007C0 0000FFFC00001F227EA121>80 D<03FFFF0000003E01E000003C007800003C003C00003C003C00 003C003E00003C003E000078003E000078003E000078003E000078003E000078007C0000780078 0000F000F00000F001E00000F007800000FFFC000000F00C000000F007000001E007000001E003 800001E003800001E003C00001E003C00001E003C00003C007C00003C007C00003C007C00003C0 07C00003C007C04003C007C080078007C08007C003E100FFFC01E3000000007C0022237EA124> 82 D<000FC0800030318000C00B0001800700038007000300030007000300070003000E000200 0E0002000F0002000F0000000F0000000F80000007E0000007FE000003FFC00001FFE000007FF0 00000FF8000000F8000000780000003C0000003C0000003C0020003C0040003800400038004000 3800600030006000700060006000F000C000E8018000C607000081FC000019247DA21B>I87 D<01FFFFF803F000F003C001E0038003C00300 03C00600078004000F0004001E000C001E0008003C00080078000000F0000000F0000001E00000 03C0000007C00000078000000F0000001E0000003E0000003C00000078004000F0004001F00040 01E0008003C00080078000800F8001800F0001001E0003003C0007007C001F0078007E00FFFFFE 001D227DA11E>90 D<03FC000606000F03000F03800601800001C0000380000380007F8003E380 0F03801C0380380700780700F00708F00708F00F08F00F08F017107867A01F83C015157D9418> 97 D<0780003F80000700000700000700000700000700000700000E00000E00000E00000E0000 0E00000E00001C3F001CC1801D00C01E00601C00701C0070380078380078380078380078380078 3800787000F07000F07000E07001E07001C0700380E80700C61C0081F00015237BA21B>I<00FF 000381C00603C00C03C01C0180380000780000700000F00000F00000F00000F00000F00000E000 00F00000F000807001007001003806001C180007E00012157C9416>I<00001E0000FE00001C00 001C00001C00001C00001C00001C00003800003800003800003800003800003800FC7003837007 00F00C00F01C00703800707800E07000E0F000E0F000E0F000E0F000E0E001C0E001C0E001C0E0 01C07003C07003C0380F801C33C007C3F817237CA21B>I<00FE000383800701C00C00E01C00E0 3800E07800E07000E0FFFFE0F00000F00000F00000F00000E00000E00000F00040700080300080 1803000E0C0003F00013157D9416>I<00000780001F88800070D18000E0E18001C0700003C070 0003C070000780F0000780F0000780F0000780E0000381E0000181C00002C30000027E00000400 000004000000040000000600000007FF800007FFE00007FFF0001C007800300018006000180060 001800C0001800C0001800C0003000600060003000C0001C07800003FC00001921809518>103 D<00780003F80000700000700000700000700000700000700000E00000E00000E00000E00000E0 0000E00001C3F001CC1801D00C01E00E01E00E01C00E03C01C03801C03801C03801C03801C0380 1C0700380700380700380700380700380700380E00700F0078FFE7FF18237FA21B>I<006000F0 01F001F000E00000000000000000000000000000000001C00FC001C001C001C001C00380038003 800380038003800700070007000700070007000E000F00FFE00C227FA10E>I<00030000078000 0F80000F80000700000000000000000000000000000000000000000000000000000E0000FE0000 1E00000E00000E00000E00001C00001C00001C00001C00001C00001C0000380000380000380000 380000380000380000700000700000700000700000700000700000E00000E00060E000F1C000F1 8000E300003E0000112C83A10F>I<0078000003F8000000700000007000000070000000700000 007000000070000000E0000000E0000000E0000000E0000000E0000000E0000001C07FC001C03E 0001C0380001C0300001C0400001C080000383000003840000038E000003BE000003CF00000387 000007078000070380000701C0000701C0000700E0000700F0000E00F0000F00F800FFE3FE001A 237FA21A>I<007803F800700070007000700070007000E000E000E000E000E000E001C001C001 C001C001C001C00380038003800380038003800700070007000700070007000E000F00FFE00D23 7FA20E>I<01C1F807E01FC60C183001D80E603801E007801C01E007801C01C007001C03C00F00 3803800E003803800E003803800E003803800E003803800E003807001C007007001C007007001C 007007001C007007001C007007001C00700E003800E00F003C00F0FFE3FF8FFE27157F942A>I< 01C3F01FCC1801D00C01E00E01E00E01C00E03C01C03801C03801C03801C03801C03801C070038 0700380700380700380700380700380E00700F0078FFE7FF18157F941B>I<007E000383800600 C00C00E01C0070380070780078700078F00078F00078F00078F00078E000F0E000F0E000E0F001 E07001C07003803807001C1C0007F00015157D9418>I<00E1F8000FE60C0000E8060000F00700 00E0038000E0038001C003C001C003C001C003C001C003C001C003C001C003C003800780038007 800380070003800F0003801E0003801C00074038000730E000070F800007000000070000000700 00000E0000000E0000000E0000000E0000000E0000001E000000FFC000001A1F80941B>I<01C7 C01FC8E001D1E001E1E001E0C001C00003C0000380000380000380000380000380000700000700 000700000700000700000700000E00000F0000FFF00013157F9413>114 D<01F906070C0318031801180118021C001FE00FF807FC007E000E4006400640066006600CE008 D83087C010157E9413>I<008000800080018001000300030007000F001F00FFF80E000E000E00 0E000E001C001C001C001C001C001C0038103810381038103810382038201C4007800D1F7C9E13 >I119 D<1FF83FC003E01E0001C0180000E0100000E02000007040000078800000390000001E0000001C 0000000E0000001F0000003700000063800000C380000181C0000101E0000200E0000E00F0003E 00F800FF03FF001A157F941A>I<0FFC0FE001E0078000E0030000E0020000E0040000E0040000 70080000700800007010000070300000782000003840000038400000388000003C8000001D0000 001D0000001E0000001C0000000C00000008000000080000001000000010000000200000004000 00F0400000F0800000F1000000C20000003C0000001B1F80941A>I<30307878F8F8F8F870700D 0576A118>127 D E /Fo 20 123 df<0000030000000000030000000000030000000000078000 0000000780000000000FC0000000000FC0000000000FC00000000017E00000000013E000000000 13E00000000023F00000000021F00000000021F00000000040F80000000040F80000000040F800 000000807C00000000807C00000001807E00000001003E00000001003E00000002003F00000002 001F00000002001F00000004000F80000004000F80000004000F800000080007C00000080007C0 0000180007E000001FFFFFE000001FFFFFE00000200003F00000200001F00000200001F0000040 0001F80000400000F80000400000F800008000007C00008000007C00008000007C00010000003E 00010000003E00030000003F00030000001F00070000001F001F8000003F80FFE00003FFFCFFE0 0003FFFC2E327EB132>65 D<00001FE000800000FFFC01800007F00F0180000F80018380003E00 00C38000780000278000F00000178001E000000F8003C000000F80078000000780078000000380 0F00000003801F00000001801E00000001803E00000001803C00000001803C00000000807C0000 0000807C0000000080780000000000F80000000000F80000000000F80000000000F80000000000 F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000 0FFFFC7800000FFFFC7C0000001FC07C0000000F803C0000000F803C0000000F803E0000000F80 1E0000000F801F0000000F800F0000000F80078000000F8007C000000F8003C000000F8001E000 000F8000F000001780007C00001780003E00006380000F8000C3800007F00781800000FFFE0080 00001FF000002E337CB134>71 D76 D80 D<00FE00000303C0000C00E00010007000100038 003C003C003E001C003E001E003E001E0008001E0000001E0000001E0000001E00000FFE0000FC 1E0003E01E000F801E001F001E003E001E003C001E007C001E00F8001E04F8001E04F8001E04F8 003E04F8003E0478003E047C005E043E008F080F0307F003FC03E01E1F7D9E21>97 D<07800000FF800000FF8000000F80000007800000078000000780000007800000078000000780 000007800000078000000780000007800000078000000780000007800000078000000780000007 81FC0007860700078801C0079000E007A0007007C00078078000380780003C0780003C0780001E 0780001E0780001F0780001F0780001F0780001F0780001F0780001F0780001F0780001F078000 1F0780001E0780003E0780003C0780003C0780007807C00070072000F0072001E0061803800606 0F000401F80020327EB125>I<003F800000E0E0000380380007003C000E001E001E001E001C00 0F003C000F007C000F0078000F8078000780F8000780F8000780FFFFFF80F8000000F8000000F8 000000F8000000F8000000F8000000780000007C0000003C0000003C0000801E0000800E000100 0F0002000780020001C00C0000F03000001FC000191F7E9E1D>101 D<0007E0001C1000383800 707C00E07C01E07C01C03803C00003C00003C00003C00003C00003C00003C00003C00003C00003 C00003C00003C000FFFFC0FFFFC003C00003C00003C00003C00003C00003C00003C00003C00003 C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003 C00003C00003C00003C00003C00007E0007FFF007FFF0016327FB114>I<000000F0007F030801 C1C41C0380E81C070070080F0078001E003C001E003C003E003E003E003E003E003E003E003E00 3E003E003E003E001E003C001E003C000F007800070070000780E00009C1C000087F0000180000 00180000001800000018000000180000001C0000000E0000000FFFF80007FFFF0003FFFF800E00 0FC0180001E0300000F070000070E0000038E0000038E0000038E0000038E00000387000007070 000070380000E01C0001C00700070001C01C00003FE0001E2F7E9F21>I<0F001F801F801F801F 800F00000000000000000000000000000000000000000000000780FF80FF800F80078007800780 078007800780078007800780078007800780078007800780078007800780078007800780078007 8007800FC0FFF8FFF80D307EAF12>105 D<07800000FF800000FF8000000F8000000780000007 800000078000000780000007800000078000000780000007800000078000000780000007800000 0780000007800000078000000780000007801FFC07801FFC078007E00780078007800600078004 0007800800078010000780600007808000078100000783800007878000078FC0000793C00007A1 E00007C1F0000780F0000780780007807C0007803C0007803E0007801F0007800F0007800F8007 8007C0078003C0078003E00FC007F8FFFC0FFFFFFC0FFF20327EB123>107 D<0780FF80FF800F80078007800780078007800780078007800780078007800780078007800780 078007800780078007800780078007800780078007800780078007800780078007800780078007 80078007800780078007800780078007800FC0FFFCFFFC0E327EB112>I<0780FE001FC000FF83 078060F000FF8C03C18078000F9001E2003C0007A001E4003C0007A000F4001E0007C000F8001E 0007C000F8001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000 F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00 078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0 001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E000FC001F8003F00FF FC1FFF83FFF0FFFC1FFF83FFF0341F7E9E38>I<0780FE0000FF83078000FF8C03C0000F9001E0 0007A001E00007A000F00007C000F00007C000F000078000F000078000F000078000F000078000 F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 00F000078000F000078000F000078000F000078000F000078000F000078000F000078000F00007 8000F0000FC001F800FFFC1FFF80FFFC1FFF80211F7E9E25>I<001FC00000F0780001C01C0007 0007000F0007801E0003C01C0001C03C0001E03C0001E0780000F0780000F0780000F0F80000F8 F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8780000F07C0001F03C0001 E03C0001E01E0003C01E0003C00F00078007800F0001C01C0000F07800001FC0001D1F7E9E21> I<0783E0FF8C18FF907C0F907C07A07C07C03807C00007C00007C0000780000780000780000780 000780000780000780000780000780000780000780000780000780000780000780000780000780 000780000780000FC000FFFE00FFFE00161F7E9E19>114 D<01FC100E03301800F03000706000 30E00030E00010E00010E00010F00010F800007E00003FF0001FFF000FFFC003FFE0003FF00001 F80000F880003C80003C80001CC0001CC0001CE0001CE00018F00038F00030CC0060C301C080FE 00161F7E9E1A>I<00400000400000400000400000400000C00000C00000C00001C00001C00003 C00007C0000FC0001FFFE0FFFFE003C00003C00003C00003C00003C00003C00003C00003C00003 C00003C00003C00003C00003C00003C00003C00003C00003C01003C01003C01003C01003C01003 C01003C01003C01001C02001E02000E0400078C0001F00142C7FAB19>I121 D<3FFFFF3E001E38001E 30003C2000782000786000F04001E04001E04003C0400780000780000F00001E00001E00003C00 00780000780000F00101E00101E00103C0010780010780030F00021E00021E00063C000678000E 78007EFFFFFE181F7E9E1D>I E end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 212 377 a Fo(P)n(arallelization)22 b(of)f(General)h(Link)l(age)g (Analysis)e(Problems)344 562 y Fn(Sandh)o(y)o(a)c(Dw)o(ark)m(adas)789 544 y Fm(\003)211 620 y Fl(Departmen)o(t)e(of)j(Computer)e(Science)403 678 y(Rice)g(Univ)o(ersit)o(y)478 736 y(Houston)1146 562 y Fn(Alejandro)g(A.)h(Sc)o(h\177)-24 b(a\013er)1621 544 y Fm(y)1027 620 y Fl(Departmen)o(t)15 b(of)i(Computer)e(Science)1220 678 y(Rice)g(Univ)o(ersit)o(y)1294 737 y(Houston)265 878 y Fn(Rob)q(ert)h(W.)g (Cottingham)g(Jr.)859 860 y Fm(z)268 936 y Fl(Departmen)o(t)f(of)h(Cell)g (Biology)275 994 y(Ba)o(ylor)g(College)f(of)i(Medicine)473 1052 y(Houston)1190 878 y Fn(Alan)f(L.)g(Co)o(x)1469 860 y Fm(x)973 936 y Fl(Departmen)o(t)f(of)i(Computer)e(Science)1166 994 y(Rice)g(Univ)o(ersit)o(y)1240 1052 y(Houston)413 1193 y Fn(P)o(eter)g(Keleher)721 1175 y Fm({)211 1251 y Fl(Departmen)o(t)f(of)j (Computer)e(Science)403 1309 y(Rice)g(Univ)o(ersit)o(y)478 1367 y(Houston)1185 1195 y Fn(Willy)g(Zw)o(aenep)q(o)q(el)1582 1177 y Fm(k)1027 1253 y Fl(Departmen)o(t)g(of)i(Computer)e(Science)1220 1311 y(Rice)g(Univ)o(ersit)o(y)1294 1369 y(Houston)150 2179 y Fk(Address)20 b(for)h(corresp)q(ondence:)26 b Fj(Rob)q(ert)18 b(W.)g(Cottingham)g(Jr.)31 b(Departmen)o(t)17 b(of)i(Cell)150 2236 y(Biology)l(,)d(Ba)o(ylor)f(College)h(of)e(Medicine,)j(One)f(Ba)o(ylor)f (Plaza,)g(Houston,)g(TX)g(77030.)p 150 2275 660 2 v 201 2302 a Fi(\003)219 2318 y Fh(sandh)o(y)o(a@cs.rice.edu)203 2349 y Fi(y)219 2365 y Fh(sc)o(ha\013er@cs.rice.edu)203 2396 y Fi(z)219 2412 y Fh(b)o(w)o(c@b)q(cm.tmc.edu)203 2443 y Fi(x)219 2458 y Fh(alc@cs.rice.edu)198 2489 y Fi({)219 2505 y Fh(p)q(ete@cs.rice.edu)201 2538 y Fi(k)219 2554 y Fh(willy@cs.rice.edu)p eop %%Page: 2 2 2 1 bop 150 195 a Fg(Abstract)221 308 y Fj(W)l(e)22 b(describ)q(e)h(a)f (parallel)h(implemen)o(tation)g(of)f(a)f(genetic)i(link)m(age)g(analysis)g (program)150 364 y(that)16 b(ac)o(hiev)o(es)i(go)q(o)q(d)e(sp)q(eed)i(impro)o (v)o(emen)o(t,)f(ev)o(en)g(for)g(analyses)g(on)g(a)f(single)i(p)q(edigree)h (and)150 421 y(with)f(a)g(single)h(starting)e(recom)o(bination)h(fraction)g (v)o(ector.)27 b(Our)18 b(parallel)i(implemen)o(tation)150 477 y(has)g(b)q(een)h(run)f(on)g(three)g(di\013eren)o(t)g(platforms:)29 b(an)20 b(Ethernet)f(net)o(w)o(ork)g(of)h(w)o(orkstations,)150 534 y(a)15 b(higher-bandwidth)j(Async)o(hronous)e(T)l(ransfer)f(Mo)q(de)h (\(A)l(TM\))f(net)o(w)o(ork)f(of)i(w)o(orkstations,)150 590 y(and)d(a)f(shared-memory)h(m)o(ultipro)q(cessor.)19 b(The)13 b(same)g(program,)e(written)i(in)h(a)e(shared)h(mem-)150 647 y(ory)21 b(programming)g(st)o(yle,)i(is)f(used)g(on)f(all)i(platforms.)38 b(On)22 b(the)f(w)o(orkstation)f(net)o(w)o(orks,)150 703 y(the)e(hardw)o(are) e(do)q(es)i(not)f(pro)o(vide)h(shared)g(memory)l(,)f(so)g(the)h(program)e (executes)i(on)g(a)f(dis-)150 760 y(tributed)c(shared)g(memory)f(system)h (that)f(implemen)o(ts)i(shared)f(memory)f(in)h(soft)o(w)o(are.)18 b(These)150 816 y(three)d(platforms)f(represen)o(t)h(di\013eren)o(t)g(p)q (oin)o(ts)g(on)f(the)h(price/p)q(erformance)h(scale.)k(Ethernet)150 873 y(net)o(w)o(orks)e(are)h(c)o(heap)g(and)h(omnipresen)o(t,)g(A)l(TM)f(net) o(w)o(orks)f(are)h(an)g(emerging)h(tec)o(hnology)150 929 y(that)h(o\013ers)g (higher)h(bandwidth,)i(and)e(shared-memory)f(m)o(ultipro)q(cessors)h(o\013er) f(the)h(b)q(est)150 985 y(p)q(erformance)e(b)q(ecause)g(comm)o(unication)h (is)f(implemen)o(ted)h(en)o(tirely)f(b)o(y)g(hardw)o(are.)32 b(On)20 b(8)150 1042 y(pro)q(cessors)d(and)g(for)f(the)i(longer)f(runs,)g(w)o (e)g(ac)o(hiev)o(e)h(sp)q(eedups)g(b)q(et)o(w)o(een)g(3.5)e(and)h(5)g(on)g (the)150 1098 y(Ethernet)j(net)o(w)o(ork)f(and)h(b)q(et)o(w)o(een)h(4.8)e (and)h(6)g(on)g(the)g(A)l(TM)g(net)o(w)o(ork.)33 b(On)21 b(the)f(shared-)150 1155 y(memory)15 b(m)o(ultipro)q(cessor,)g(w)o(e)g(ac)o(hiev)o(e)h(sp)q (eedups)g(in)h(the)e(5.5)f(to)h(6.5)f(range)h(for)f(all)i(runs.)964 2678 y(2)p eop %%Page: 3 3 3 2 bop 150 195 a Fg(1)69 b(In)n(tro)r(duction)150 297 y Fj(Genetic)14 b(link)m(age)h(analysis)g(is)f(a)f(statistical)h(tec)o(hnique)g(that)f(uses)h (family)g(p)q(edigree)h(informa-)150 353 y(tion)i(to)g(map)g(h)o(uman)g (genes)g(and)h(lo)q(cate)f(disease)h(genes)g(in)f(the)h(h)o(uman)f(genome.)25 b(Sev)o(eral)150 409 y(computer)15 b(pac)o(k)m(ages)f(ha)o(v)o(e)g(b)q(een)i (written)f(for)f(link)m(age)i(computations)f(and)g(most)e(published)150 466 y(link)m(age)j(studies)g(use)f(one)h(of)e(these)h(programs)f([20)o(,)g (21,)g(16,)g(15,)g(17,)g(11,)g(10,)g(13,)g(14].)19 b(As)c(the)150 522 y(abilit)o(y)i(to)e(collect)i(large)f(family)g(p)q(edigrees)h(with)f (more)g(informativ)o(e)g(genes)g(has)f(impro)o(v)o(ed,)150 579 y(the)i(magnitude)g(of)f(link)m(age)i(computations)e(that)g(geneticists)i (w)o(an)o(t)d(to)h(run)h(has)f(increased.)150 635 y(It)h(is)g(not)g(un)o (usual)h(for)e(these)h(runs)g(to)f(tak)o(e)g(hours)h(or)g(da)o(ys,)f(and)h (man)o(y)f(of)h(the)g(cases)g(that)150 692 y(geneticists)i(w)o(ould)f(lik)o (e)i(to)d(analyze)i(are)f(practically)h(in)o(tractable)g(on)f(curren)o(t)f (computers.)150 748 y(W)l(e)e(see)h(t)o(w)o(o)d(complemen)o(tary)j(approac)o (hes)f(that)f(should)i(b)q(e)g(pursued)g(to)f(sp)q(eed)h(up)f(link)m(age)150 805 y(computations:)20 b(b)q(etter)15 b(algorithms)g(and)g(parallel)i (computers.)221 861 y(In)11 b(this)h(pap)q(er)g(w)o(e)e(rep)q(ort)h(on)g(a)g (parallel)i(implemen)o(tation)f(of)f(programs)f(from)g(the)i(LINK-)150 918 y(A)o(GE)18 b([16)o(,)h(15)o(,)g(17)o(])f(pac)o(k)m(age,)i(whic)o(h)g(is) f(a)f(v)o(ery)h(p)q(opular)h(general)f(purp)q(ose)g(set)g(of)f(link)m(age)150 974 y(analysis)i(programs.)30 b(This)20 b(pap)q(er)f(complemen)o(ts)h (researc)o(h)f(conducted)h(b)o(y)f(t)o(w)o(o)f(of)g(us)h(to-)150 1030 y(gether)14 b(with)g(R.)f(M.)g(Idury)i(in)f(whic)o(h)h(w)o(e)f (signi\014can)o(tly)h(sp)q(ed)g(up)f(the)g Ff(se)n(quential)f Fj(algorithms)150 1087 y(in)j(LINKA)o(GE)g([2)o(].)221 1143 y(W)l(e)j(fo)q(cus)g(on)g(parallelizing)j(the)d(computation)h(for)e(a)h (single)h(recom)o(bination)g(fraction)150 1200 y(v)o(ector)c(and)h(for)f(a)g (small)h(n)o(um)o(b)q(er)g(of)g(p)q(edigrees.)25 b(This)17 b(approac)o(h)g(distinguishes)i(our)d(w)o(ork)150 1256 y(from)h(a)h(previous) h(parallel)h(implemen)o(tation)f(of)f(LINKMAP)h(from)e(the)h(LINKA)o(GE)h (pac)o(k-)150 1313 y(age)c([19)o(],)f(in)i(whic)o(h)g(lik)o(eliho)q(o)q(d)j (computations)c(on)g(di\013eren)o(t)g(p)q(edigrees)i(and)e(with)h(di\013eren) o(t)150 1369 y(recom)o(bination)i(fraction)f(v)o(ectors)f(are)h(distributed)i (on)e(di\013eren)o(t)h(pro)q(cessors.)25 b(This)18 b(distri-)150 1426 y(bution)g(is)f(not)f(appropriate)h(for)f(the)h(most)f(CPU-in)o(tensiv)o (e)i(of)e(the)h(LINKA)o(GE)h(programs,)150 1482 y(called)i(ILINK,)f(partly)f (b)q(ecause)i(ILINK)g(has)e(only)g(one)h(starting)e(recom)o(bination)i (fraction)150 1539 y(v)o(ector.)h(F)l(urthermore,)14 b(in)j(man)o(y)e (disease-lo)q(cation)i(applications)g(the)e(input)i(con)o(tains)e(only)150 1595 y(a)f(small)h(n)o(um)o(b)q(er)g(of)f(p)q(edigrees.)21 b(There)14 b(has)g(also)h(b)q(een)g(a)f(similar)i(parallel)g(implemen)o (tation)150 1651 y(of)g(the)g(MENDEL)g([13,)g(14)o(])g(program)f([5].)23 b(In)17 b(her)f(Master's)f(thesis,)i(V)l(aughan)f(parallelizes)150 1708 y(LINKMAP)f(for)f(a)h(single)g(recom)o(bination)g(fraction)g(v)o(ector,) e(but)i(her)g(w)o(ork)e(fo)q(cuses)i(on)g(load)150 1764 y(balancing)i(issues) g(in)g(a)f(heterogeneous)g(computing)h(en)o(vironmen)o(t)f(and)g(in)h(the)f (presence)h(of)150 1821 y(other)e(w)o(orkloads)f([23)o(].)221 1877 y(Unlik)o(e)22 b(b)q(oth)g(previous)g(parallel)h(LINKA)o(GE)f(implemen)o (tations,)h(w)o(e)e(start)f(from)h(the)150 1934 y(faster)16 b(sequen)o(tial)i(LINKA)o(GE)f(algorithms)g([2])f(instead)h(of)g(the)g (algorithms)f(that)h(had)g(pre-)150 1990 y(viously)i(b)q(een)g(distributed)g (in)f(the)g(LINKA)o(GE)g(pac)o(k)m(age.)28 b(It)17 b(is)i(imp)q(ortan)o(t)e (to)g(in)o(v)o(estigate)150 2047 y(whether)g(the)g(new)g(LINKA)o(GE)h (algorithms)f(are)f(also)h(amenable)h(to)e(parallel)j(implemen)o(ta-)150 2103 y(tion,)j(so)e(that)g(the)h(adv)m(an)o(tages)f(of)g(b)q(etter)h (algorithms)f(and)h(parallel)h(computers)f(can)f(b)q(e)150 2160 y(com)o(bined.)221 2216 y(Our)15 b(parallel)i(implemen)o(tation)f(is)g (written)f(in)h(a)f(shared-memory)g(programming)f(st)o(yle.)150 2272 y(W)l(e)i(ev)m(aluated)h(our)e(implemen)o(tation)i(on)f(t)o(w)o(o)e (di\013eren)o(t)i(arc)o(hitectures:)21 b(a)15 b(shared-memory)150 2329 y(m)o(ultipro)q(cessor)i(and)g(a)f(net)o(w)o(ork)f(of)h(w)o (orkstations.)22 b(On)17 b(the)f(net)o(w)o(ork)f(of)h(w)o(orkstations)f(w)o (e)150 2385 y(used)i(T)l(readMarks,)e(an)g(exp)q(erimen)o(tal)j Ff(distribute)n(d)f(shar)n(e)n(d)g(memory)k Fj(system)15 b(under)i(dev)o(el-) 150 2442 y(opmen)o(t)i(at)f(Rice)i(Univ)o(ersit)o(y)g([7)o(].)31 b(Distributed)20 b(shared)f(memory)g(is)g(a)g(soft)o(w)o(are)f(run)o(time)150 2498 y(system)i(that)f(enables)i(pro)q(cesses)f(executing)h(on)f(di\013eren)o (t)g(w)o(orkstations)f(to)g(share)h(mem-)964 2678 y(3)p eop %%Page: 4 4 4 3 bop 150 195 a Fj(ory)l(,)17 b(ev)o(en)g(though)f(the)h(hardw)o(are)f (connecting)i(the)f(w)o(orkstations)f(only)h(pro)o(vides)g(message)150 252 y(passing.)k(W)l(e)16 b(exp)q(erimen)o(ted)h(with)f(t)o(w)o(o)e (di\013eren)o(t)h(tec)o(hnologies)i(for)e(connecting)h(the)g(w)o(ork-)150 308 y(stations:)i(a)11 b(standard)h(Ethernet)g(and)g(an)g(A)l(TM)f(\(Async)o (hronous)h(T)l(ransfer)g(Mo)q(de\))f(net)o(w)o(ork,)150 364 y(whic)o(h)16 b(is)g(rapidly)g(gaining)g(p)q(opularit)o(y)g(b)q(ecause)h(of)d (its)i(increased)g(bandwidth.)221 421 y(W)l(e)f(seek)g(to)g(address)g(three)g (in)o(terdiscipli)q(nary)j(questions:)206 511 y(1.)k(Is)e(it)h(p)q(ossible)h (to)e(parallelize)i(link)m(age)g(computations)f(that)e(ha)o(v)o(e)h(as)g (input)h(only)g(a)264 567 y(small)16 b(n)o(um)o(b)q(er)f(of)g(p)q(edigrees)h (and)g(a)f(small)h(n)o(um)o(b)q(er)f(of)g(initial)i(parameter)e(v)o(ectors?) 206 660 y(2.)22 b(Can)15 b(the)g(new)g(sequen)o(tial)i(algorithms)e([2)o(])g (b)q(e)h(e\013ectiv)o(ely)g(parallelized?)206 752 y(3.)22 b(Can)16 b(reasonable)h(sp)q(eedup)h(b)q(e)f(ac)o(hiev)o(ed)g(for)f(long)h(link)m(age) h(computations)e(on)h(a)f(net-)264 808 y(w)o(ork)i(of)g(w)o(orkstations,)g (whic)o(h)i(is)g(m)o(uc)o(h)f(c)o(heap)q(er)g(and)g(more)g(commonly)g(a)o(v)m (ailable)264 865 y(than)c(a)g(shared-memory)g(m)o(ultipro)q(cessor?)221 955 y(This)f(pap)q(er)h(is)f(organized)h(as)e(follo)o(ws.)20 b(In)14 b(Section)h(2,)f(w)o(e)f(explain)j(the)e(basics)h(of)e(link)m(age)150 1011 y(analysis)18 b(and)f(the)g(LINKA)o(GE)h(programs.)25 b(In)17 b(Section)h(3)f(w)o(e)g(giv)o(e)g(a)g(short)g(outline)h(of)f(the)150 1068 y(sequen)o(tial)k(algorithm)e(for)g(computing)h(the)g(lik)o(eliho)q(o)q (d.)36 b(In)20 b(Section)h(4,)f(w)o(e)f(describ)q(e)i(our)150 1124 y(new)14 b(parallel)g(algorithm.)20 b(In)14 b(Section)g(5,)f(w)o(e)g (describ)q(e)i(the)e(parallel)i(computing)f(systems)f(on)150 1181 y(whic)o(h)j(w)o(e)e(tried)h(our)g(implemen)o(tation.)21 b(In)15 b(Section)g(6,)g(w)o(e)f(rep)q(ort)g(the)h(p)q(erformance)g(of)f(our) 150 1237 y(implemen)o(tation)i(on)g(some)f(sample)g(data.)k(W)l(e)d(conclude) h(with)e(a)g(discussion)i(section.)150 1379 y Fg(2)69 b(Summary)23 b(of)g(LINKA)n(GE)150 1481 y Fj(The)12 b(fundamen)o(tal)g(goal)g(in)g(link)m (age)h(analysis)g(is)f(to)f(compute)h(the)g(probabilit)o(y)h(that)e(a)g (recom-)150 1537 y(bination)j(o)q(ccurs)g(b)q(et)o(w)o(een)f(t)o(w)o(o)f (genes)h Fe(G)878 1544 y Fd(1)910 1537 y Fj(and)h Fe(G)1033 1544 y Fd(2)1052 1537 y Fj(.)19 b(The)13 b(closer)h(the)f(genes)g(are,)g(the) g(smaller)150 1594 y(the)j(probabilit)o(y)h(will)h(b)q(e.)k(A)16 b(v)m(ariet)o(y)g(of)g(theories)g(connect)g(this)g(probabilit)o(y)i(to)d(the) h(actual)150 1650 y(distance)e(b)q(et)o(w)o(een)f(the)g(t)o(w)o(o)e(genes)j (on)e(the)h(c)o(hromosome.)18 b(Tw)o(o)12 b(genes)h(are)g(said)g(to)g(b)q(e)g Ff(linke)n(d)150 1707 y Fj(if)18 b(the)g(recom)o(bination)g(probabilit)o(y)h (b)q(et)o(w)o(een)e(them)h(is)g(less)g(than)f(.5.)27 b(The)17 b(recom)o(bination)150 1763 y(probabilit)o(y)k(is)g(denoted)f(b)o(y)g Fe(\022)q Fj(.)35 b(A)20 b(thorough)f(treatmen)o(t)g(of)g(genetic)i(link)m (age)h(analysis)e(is)150 1820 y(giv)o(en)d(in)h(Ott's)e(monograph)g([22)o(].) 25 b(W)l(e)17 b(review)g(a)g(few)g(particulars,)g(esp)q(ecially)j(concerning) 150 1876 y(the)15 b(LINKA)o(GE)h(programs,)e(that)g(are)h(relev)m(an)o(t)h (to)f(our)f(parallel)j(implemen)o(tation.)221 1933 y(The)i(LINKA)o(GE)i(pac)o (k)m(age)e(con)o(tains)h(four)g(related)g(programs)e(LODSCORE,)i(ILINK,)150 1989 y(LINKMAP)l(,)d(and)f(MLINK;)h(w)o(e)f(shall)h(discuss)g(the)f(\014rst)g (three.)23 b(The)16 b(impro)o(v)o(ed)h(sequen)o(tial)150 2045 y(algorithms)e(in)h([2])e(are)h(applicable)j(to)c(all)j(the)e(programs.)221 2102 y(The)g(LODSCORE)g(program)e(searc)o(hes)i(for)f(a)g(maxim)o(um)h(lik)o (eliho)q(o)q(d)j(estimate)1652 2090 y(^)1648 2102 y Fe(\022)f Fj(of)d(the)150 2158 y(recom)o(bination)20 b(probabilit)o(y)l(.)34 b(The)20 b(lik)o(eliho)q(o)q(d)j(is)d(computed)g(with)f(resp)q(ect)h(to)f (the)h(input)150 2215 y(p)q(edigree\(s\).)k(Giv)o(en)16 b(a)g(set)g(of)g(lo)q (ci,)i(LODSCORE)e(estimates)g Fe(\022)i Fj(for)e(eac)o(h)g(pair)g(of)g(lo)q (ci,)i(but)150 2271 y(LODSCORE)d(do)q(es)h(not)f(analyze)h(more)e(than)i(t)o (w)o(o)d(lo)q(ci)k(sim)o(ultaneously)l(.)221 2328 y(The)d(notion)h(of)e (recom)o(bination)i(can)g(b)q(e)f(generalized)j(to)c(more)h(than)g(t)o(w)o(o) f(lo)q(ci.)21 b(Supp)q(ose)150 2384 y Fe(G)186 2391 y Fd(1)205 2384 y Fe(;)8 b(G)262 2391 y Fd(2)281 2384 y Fe(;)g(:)g(:)g(:)d(;)j(G)419 2391 y Fc(k)451 2384 y Fj(are)k(m)o(ultiple)h(lo)q(ci)g(o)q(ccurring)g(in)g (that)e(order.)18 b(Then)13 b(w)o(e)e(can)h(de\014ne)h(a)f(v)o(ector)150 2441 y(\()p Fe(\022)189 2448 y Fd(1)209 2441 y Fe(;)c(\022)251 2448 y Fd(2)270 2441 y Fe(;)g(:)g(:)g(:)d(;)j(\022)393 2448 y Fc(k)q Fm(\000)p Fd(1)459 2441 y Fj(\),)15 b(where)g Fe(\022)657 2448 y Fc(i)687 2441 y Fj(is)h(the)g(recom)o(bination)g(fraction)g(b)q(et)o (w)o(een)f(lo)q(ci)i Fe(G)1574 2448 y Fc(i)1604 2441 y Fj(and)e Fe(G)1728 2448 y Fc(i)p Fd(+1)1787 2441 y Fj(.)150 2497 y(The)h(ILINK)i (program)d(searc)o(hes)h(for)f(a)h(maxim)o(um)g(lik)o(eliho)q(o)q(d)j (estimate)d(of)f(the)h(m)o(ultilo)q(cus)150 2554 y Fe(\022)j Fj(v)o(ector.)25 b(Both)17 b(LODSCORE)h(and)f(ILINK)i(start)d(from)g(a)h (single)i(initial)g(estimate)e(of)g(the)964 2678 y(4)p eop %%Page: 5 5 5 4 bop 150 195 a Fj(recom)o(bination)19 b(fraction,)g(and)g(use)g(an)f (iterativ)o(e)h(pro)q(cedure)h(called)g(GEMINI)f([9)o(])f(to)g(\014nd)150 252 y(the)f(maxim)o(um)g(lik)o(eliho)q(o)q(d)k(estimate)841 240 y(^)838 252 y Fe(\022)q Fj(.)26 b(Lik)o(e)18 b(most)f(iterativ)o(e)g(pro) q(cedures,)h(GEMINI)g(can)150 308 y(only)e(guaran)o(tee)e(to)h(\014nd)h(a)f (lo)q(cal)h(optim)o(um)f(and)g(not)g(a)g(global)h(optim)o(um.)221 364 y(In)g(con)o(trast,)f(LINKMAP)i(tak)o(es)e(m)o(ultiple)j(v)m(alues)f(of)f (the)g Fe(\022)h Fj(v)o(ector)f(and)g(computes)g(the)150 421 y(lik)o(eliho)q(o)q(d)j(for)d(eac)o(h)h(one.)23 b(The)17 b(computation)f(of)g (the)h(lik)o(eliho)q(o)q(d)i(for)d(eac)o(h)g Fe(\022)i Fj(and)f(for)f(eac)o (h)150 477 y(p)q(edigree)23 b(are)f(essen)o(tially)h(indep)q(enden)o(t)i (except)d(for)f(some)h(shared)g(input/output.)41 b(The)150 534 y(parallel)17 b(implemen)o(tation)g(of)e(LINKMAP)i([19)o(])e(tak)o(es)g (adv)m(an)o(tage)g(of)g(this)h(observ)m(ation)g(and)150 590 y(distributes)e(lik)o(eliho)q(o)q(d)i(computations)d(for)g(separate)f(p)q (edigrees)j(and)e Fe(\022)h Fj(v)o(ectors)f(on)g(di\013eren)o(t)150 647 y(pro)q(cessors.)18 b(The)11 b(main)h(c)o(hallenge)g(is)g(to)e(balance)i (the)f(load)g(among)f(the)h(di\013eren)o(t)h(pro)q(cessors,)150 703 y(so)j(that)f(eac)o(h)i(pro)q(cessor)f(is)g(w)o(orking)g(most)f(of)h(the) h(time.)221 760 y(Since)k(LODSCORE)f(and)f(ILINK)j(start)c(with)i(only)g(one) g Fe(\022)h Fj(v)o(ector)e(it)h(is)g(not)g(straigh)o(t-)150 816 y(forw)o(ard)i(to)h(do)h(sub)q(computations)g(for)f(di\013eren)o(t)h(v)o (ectors)f(on)h(di\013eren)o(t)f(pro)q(cessors.)42 b(In)150 873 y(applications)17 b(where)f(the)g(goal)g(is)g(to)f(lo)q(cate)h(a)g (disease)g(gene)g(it)g(is)g(our)g(exp)q(erience)i(that)d(the)150 929 y(n)o(um)o(b)q(er)i(of)e(di\013eren)o(t)i(p)q(edigrees)g(tends)g(to)f(b)q (e)g(small)h(and)g(most)e(of)h(the)g(computation)h(time)150 985 y(is)f(sp)q(en)o(t)g(on)f(just)g(one)g(or)g(t)o(w)o(o)f(p)q(edigrees.)22 b(Therefore,)15 b(w)o(e)g(need)h(a)g(parallelization)h(strategy)150 1042 y(that)e(distributes)i(the)f(lik)o(eliho)q(o)q(d)i(computation)e(for)f (a)g(single)i(p)q(edigree)g(and)f(a)g(single)h(v)m(alue)150 1098 y(of)e(the)g Fe(\022)i Fj(v)o(ector.)221 1155 y(W)l(e)k(fo)q(cus)h(on)f (ILINK)i(b)q(ecause)f(that)f(is)h(the)f(program)f(where)i(the)f(runs)h(tend)g (to)e(b)q(e)150 1211 y(longest)h(and)g(th)o(us)g(where)g(parallel)h(sp)q (eedup)h(is)e(most)f(needed,)j(but)e(our)g(tec)o(hniques)h(are)150 1268 y(applicable)17 b(to)c(the)h(other)g(programs)f(as)h(w)o(ell.)20 b(Almost)14 b(all)h(the)f(co)q(de)h(w)o(e)f(mo)q(di\014ed)h(is)g(shared)150 1324 y(b)o(y)g(all)h(the)g(LINKA)o(GE)f(programs.)150 1467 y Fg(3)69 b(Review)21 b(of)i(Sequen)n(tial)e(Lik)n(eliho)r(o)r(d)g(Algorithm) 150 1569 y Fj(The)15 b(basic)g(structure)f(of)g(the)h(lik)o(eliho)q(o)q(d)i (computation)e(as)f(done)h(in)g(LINKA)o(GE)g(is)g(outlined)150 1625 y(in)23 b(the)f(section)h(on)f(Numerical)h(and)g(Computerized)g(Metho)q (ds)f(in)h([22)o(].)40 b(The)22 b(follo)o(wing)150 1682 y(summary)15 b(describ)q(es)h(LINKA)o(GE)g(5.1)f([16)o(])f(and)i(its)f(faster)g(v)o (ersion)g([2)o(].)221 1738 y(Giv)o(en)f(a)g(\014xed)g(v)m(alue)i(of)d Fe(\022)q Fj(,)i(the)f(outer)f(lo)q(op)i(of)f(the)g(lik)o(eliho)q(o)q(d)j(ev) m(aluation)e(iterates)f(o)o(v)o(er)150 1795 y(all)21 b(the)g(p)q(edigrees)g (calculating)h(the)e(lik)o(eliho)q(o)q(d)k(for)19 b(eac)o(h)i(one.)35 b(Within)21 b(a)f(p)q(edigree,)j(the)150 1851 y(program)16 b(visits)i(eac)o(h)f(n)o(uclear)h(family)g(and)f(up)q(dates)h(the)f (probabilities)i(of)e(eac)o(h)g(genot)o(yp)q(e)150 1908 y(for)f(eac)o(h)g (individual.)26 b(Asso)q(ciated)17 b(with)f(eac)o(h)h(individual)i(is)e(an)f (arra)o(y)f Fb(genarray)g Fj(indexed)150 1964 y(b)o(y)h(genot)o(yp)q(e)h(n)o (um)o(b)q(ers.)23 b(The)17 b(en)o(try)f Fb(genarray[)p Fe(j)s Fb(])e Fj(initially)19 b(stores)d(the)g(probabilit)o(y)i(that)150 2021 y(the)f(individual)i(has)e(the)g(phenot)o(yp)q(e)g(asso)q(ciated)g(with) g(genot)o(yp)q(e)f Fe(j)j Fj(giv)o(en)e(the)g(genot)o(yp)q(e)g Fe(j)150 2077 y Fj(\(normally)h(this)h(will)h(b)q(e)f(1)e(or)h(0,)g(except)h (in)g(cases)f(of)f(v)m(ariable)j(p)q(enetrance\).)29 b(There)19 b(ma)o(y)150 2133 y(b)q(e)c(sev)o(eral)f(p)q(ossible)h(phenot)o(yp)q(es)g(if) f(the)g(individual's)j(phenot)o(yp)q(e)d(is)h(incomplete)g(in)g(the)f(in-)150 2190 y(put.)19 b(After)12 b(tra)o(v)o(ersing)f(the)i(part)e(of)h(the)g(p)q (edigree)i(including)h(the)d(individual)q(,)j Fb(genarray[)p Fe(j)s Fb(])150 2246 y Fj(stores)g(the)h(probabilit)o(y)h(that)e(the)h (individual)j(has)c(genot)o(yp)q(e)h Fe(j)i Fj(and)e(its)g(asso)q(ciated)g (pheno-)150 2303 y(t)o(yp)q(e,)i(conditioned)h(on)f(the)f(recom)o(bination)i (fraction)e(and)h(on)f(the)h(genot)o(yp)q(es)f(of)g(relativ)o(es)150 2359 y(already)e(visited)i(in)f(the)f(tra)o(v)o(ersal.)221 2416 y(Eac)o(h)g(up)q(date)i(of)e(a)h(n)o(uclear)g(family)h(up)q(dates)f(the) g(probabilities)i(for)e(either)g(one)g(paren)o(t)150 2472 y(conditioned)e(on) e(the)g(sp)q(ouse)h(and)f(all)h(c)o(hildren,)i(or)c(up)q(dates)i(one)f(c)o (hild)i(conditioned)g(on)e(b)q(oth)150 2529 y(paren)o(ts)j(and)g(all)h(the)f (other)f(siblings.)22 b(In)16 b(b)q(oth)f(of)g(these)g(up)q(date)g (situations)h(the)f(algorithm)964 2678 y(5)p eop %%Page: 6 6 6 5 bop 150 195 a Fj(starts)12 b(with)h(a)g(double)i(nested)f(lo)q(op)f(that) g(iterates)g(o)o(v)o(er)f(the)i(genot)o(yp)q(es)f(of)g(the)g(t)o(w)o(o)f (paren)o(ts,)150 252 y(one)i(lo)q(op)h(p)q(er)g(paren)o(t.)k(One)c(of)f(the)g (impro)o(v)o(emen)o(ts)g(made)g(in)h([2)o(])f(is)h(that)e(in)i(the)g(case)f (where)150 308 y(there)k(is)h(only)g(one)g(c)o(hild,)h(the)e(bulk)i(of)e(the) g(computation)g(can)h(b)q(e)g(transformed)e(in)o(to)h(t)o(w)o(o)150 364 y(disjoin)o(t)c(lo)q(ops,)g(one)g(on)f(eac)o(h)g(paren)o(t,)g(instead)i (of)e(a)g(double)h(nested)g(lo)q(op.)20 b(A)14 b(separate)f Fb(gene)150 421 y Fj(arra)o(y)g(is)i(used)g(to)f(accum)o(ulate)h(the)f(con)o (tributions)h(from)f(eac)o(h)g(pair)h(of)f(paren)o(tal)g(genot)o(yp)q(es.)150 477 y(The)g(only)g(arithmetic)g(op)q(erations)g(done)g(in)h(accum)o(ulating)f Fb(gene)f Fj(are)h(additions)g(and)g(m)o(ulti-)150 534 y(plications)j(of)f (non-negativ)o(e)g(n)o(um)o(b)q(ers,)g(and)f(the)h(con)o(tributions)h(for)e (eac)o(h)h(pair)g(of)f(paren)o(tal)150 590 y(genot)o(yp)q(es)g(are)f Ff(adde)n(d)h Fj(together.)k(A)o(t)c(the)f(end)i(of)e(the)h(lo)q(op,)g(the)g (new)g(v)m(alue)h(of)e Fb(genarray)p Fj([)p Fe(i)p Fj(])150 647 y(is)k(set)g(to)g(the)g(old)g(v)m(alue)h(m)o(ultiplied)i(b)o(y)d Fb(gene)p Fj([)p Fe(i)p Fj(])e(for)i(all)h(genot)o(yp)q(es)f Fe(i)p Fj(.)27 b(This)19 b(is,)g(in)g(e\013ect,)150 703 y(an)c(application)h (of)f(Ba)o(y)o(es')f(Theorem)h(that)f(con)o(v)o(erts)g(the)h(original)h (unconditioned)h(v)m(alue)f(of)150 760 y Fb(genarray)p Fj([)p Fe(i)p Fj(])h(in)o(to)h(a)h(v)m(alue)h(that)e(is)i(conditioned)g(on)f(the)g (part)f(of)h(the)g(p)q(edigree)h(that)e(has)150 816 y(already)d(b)q(een)i (visited.)221 873 y(It)e(will)h(help)g(to)f(think)g(of)g(the)g(double)h(lo)q (op)f(iteration)h(space)f(as)f(a)h(square)g Fe(S)i Fj(whose)e(side)150 929 y(length)f(is)g(the)g(n)o(um)o(b)q(er)g(of)f(genot)o(yp)q(es.)19 b(The)14 b(p)q(oin)o(t)g(\()p Fe(i;)8 b(j)s Fj(\))j(in)k(the)f(square)f (corresp)q(onds)h(to)f(the)150 985 y(\014rst)i(paren)o(t)g(ha)o(ving)g(genot) o(yp)q(e)g Fe(i)g Fj(and)g(the)h(second)f(ha)o(ving)h(genot)o(yp)q(e)f Fe(j)s Fj(.)221 1042 y(There)k(are)g(t)o(w)o(o)f(biological)k(facts)c(ab)q (out)i(the)f Fb(genarray)p Fj(s)f(that)h(are)g(relev)m(an)o(t)h(b)q(oth)g(to) 150 1098 y(the)e(impro)o(v)o(ed)h(sequen)o(tial)h(algorithms)e(and)g(to)g (our)g(parallelization)j(strategy)l(.)28 b(First,)19 b(the)150 1155 y Fb(genarray)p Fj(s)d(tend)i(to)f(b)q(e)h(sparse)g(b)q(ecause)g(most)f (of)g(the)g(p)q(ossible)j(genot)o(yp)q(es)d(can)h(b)q(e)g(ruled)150 1211 y(out)g(based)g(on)g(the)g(observ)o(ed)g(phenot)o(yp)q(e)g(data.)28 b(One)18 b(w)o(a)o(y)f(in)i(whic)o(h)g(sparsit)o(y)e(is)i(used)f(in)150 1268 y(the)i(impro)o(v)o(ed)g(sequen)o(tial)h(algorithms)e(is)h(to)g (precompute)g(whic)o(h)g(ro)o(ws)f(and)h(columns)g(of)150 1324 y Fe(S)k Fj(corresp)q(ond)d(to)f(p)q(ossible)j(genot)o(yp)q(es)e(of)g(eac)o (h)g(paren)o(t,)h(lea)o(ving)g(a)f(m)o(uc)o(h)g(smaller)h(iter-)150 1381 y(ation)f(rectangle)g Fe(R)p Fj(.)36 b(Ignoring)22 b(pro)q(cedure)f(b)q (oundaries,)j(w)o(e)c(can)h(think)h(of)e(the)h(lo)q(ops)g(in)150 1437 y(the)c(sequen)o(tial)i(lik)o(eliho)q(o)q(d)h(calculation)e(as)f(follo)o (ws.)26 b(More)16 b(inden)o(tation)i(indicates)h(deep)q(er)150 1494 y(nesting.)311 1575 y(F)l(or)c(eac)o(h)g(p)q(edigree)402 1631 y(F)l(or)g(eac)o(h)g(n)o(uclear)h(family)493 1688 y(F)l(or)f(double)h (lo)q(op)g(o)o(v)o(er)e(ro)o(ws)h(and)g(columns)h(of)f Fe(R)584 1744 y Fj(Do)g(up)q(dates)h(to)e Fb(genarray)221 1801 y Fj(As)k(a)f(result,)i (most)e(of)h(the)g(computation)g(time)g(is)h(sp)q(en)o(t)f(on)g(probabilit)o (y)h(up)q(dates)g(for)150 1857 y(individuals)24 b(whose)c Fb(genarray)p Fj(s)f(are)h(not)g(sparse.)35 b(Suc)o(h)21 b(individual)q(s)i(are)d(referred) h(to)e(as)150 1914 y Ff(unknowns)11 b Fj(b)q(ecause)h(w)o(e)g(do)f(not)g(kno) o(w)g(their)i(phenot)o(yp)q(e)f(at)f(some)g(of)h(the)f(lo)q(ci)i(b)q(eing)g (studied.)221 1970 y(The)k(second)h(useful)h(biological)g(fact)e(is)h(that)e (the)i(genot)o(yp)q(es)f(can)h(b)q(e)g(partitioned)g(in)o(to)150 2027 y(equiv)m(alence)h(classes)e(b)o(y)f(a)g(relation)h(w)o(e)f(call)h(the)g Ff(isozygote)g(r)n(elation)32 b Fj([2)o(].)23 b(Tw)o(o)15 b(genot)o(yp)q(es) 150 2083 y(are)h Ff(isozygotes)f Fj(if)h(at)g Ff(e)n(ach)f Fj(lo)q(cus)i(they)f(ha)o(v)o(e)g(the)g(same)g(allele\(s\).)23 b(Isozygotes)16 b(di\013er)g(in)h(the)150 2139 y(placemen)o(t)f(of)e(the)h (alleles)h(on)f(eac)o(h)g(haplot)o(yp)q(e;)g(i.e.,)g(one)g(isozygote)f(could) i(ha)o(v)o(e)f Fe(A)1640 2146 y Fd(1)1674 2139 y Fj(on)g(the)150 2196 y(\014rst)h(haplot)o(yp)q(e)i(and)e Fe(A)581 2203 y Fd(2)618 2196 y Fj(on)g(the)h(second,)g(while)h(another)f(has)f Fe(A)1328 2203 y Fd(2)1365 2196 y Fj(on)g(the)h(\014rst)f(haplot)o(yp)q(e)150 2252 y(and)c Fe(A)269 2259 y Fd(1)301 2252 y Fj(on)g(the)g(second.)19 b(Among)12 b(other)g(things,)g(the)g(computations)g(for)g(di\013eren)o(t)g (isozygous)150 2309 y(genot)o(yp)q(es)18 b(are)g(v)o(ery)h(similar,)h(and)e (some)g(parts)g(of)g(the)h(computation)f(can)h(b)q(e)g(p)q(erformed)150 2365 y(once)d(for)e(all)i(genot)o(yp)q(es)f(in)h(the)g(same)f(isozygote)g (class.)964 2678 y(6)p eop %%Page: 7 7 7 6 bop 150 195 a Fg(4)69 b(P)n(arallel)21 b(Algorithm)150 297 y Fj(In)16 b(this)g(section)g(w)o(e)f(describ)q(e)i(our)e(strategy)f(for) h(parallelizing)j(ILINK.)f(The)e(same)g(strategy)150 353 y(can)i(b)q(e)g (applied)h(to)e(LODSCORE)h(and)g(LINKMAP)l(.)g(The)g(main)g(theme)g(is)g (that)f(some)g(un-)150 409 y(derstanding)d(of)f(the)g(underlying)j(biology)l (,)e(in)g(particular,)h(the)e(ideas)h(of)f(sparsit)o(y)g(and)h(similar)150 466 y(patterns)i(of)f(heterozygosit)o(y)l(,)h(are)g(essen)o(tial)h(to)e (designing)j(a)e(go)q(o)q(d)g(strategy)l(.)221 522 y(Recall)j(that)f(ILINK)i (tak)o(es)e(only)i(one)e(starting)h Fe(\022)h Fj(v)o(ector)e(and)h(ILINK)h (ma)o(y)e(ha)o(v)o(e)g(only)150 579 y(one)f(input)i(p)q(edigree.)24 b(Although)17 b(t)o(w)o(o)e(of)h(the)g(data)f(sets)h(w)o(e)g(use)h(in)g(the)f (next)h(section)f(ha)o(v)o(e)150 635 y(more)11 b(than)g(one)h(p)q(edigree,)h (the)f(computation)f(time)h(is)g(dominated)g(b)o(y)f(one)h(or)f(t)o(w)o(o)f (p)q(edigrees.)150 692 y(Therefore,)h(w)o(e)f(cannot)g(parallelize)j(b)o(y)d (doing)h(di\013eren)o(t)f(lik)o(eliho)q(o)q(d)k(calculations)d(on)g (di\013eren)o(t)150 748 y(mac)o(hines,)16 b(but)g(m)o(ust)g(parallelize)i (within)f(the)f(calculation)h(of)f(the)g(lik)o(eliho)q(o)q(d)i(at)e(a)f(sp)q (eci\014c)150 805 y Fe(\022)i Fj(and)e(a)g(sp)q(eci\014c)i(p)q(edigree.)221 861 y(The)d(genot)o(yp)q(e)g(probabilit)o(y)h(up)q(dates)g(for)e(di\013eren)o (t)h(individual)q(s)j(are)c(naturally)i(sequen-)150 918 y(tial)k(b)q(ecause)g (the)f(up)q(dated)h(probabilities)h(for)e(the)g Fe(i)1100 901 y Fd(th)1153 918 y Fj(individual)j(are)d(dep)q(enden)o(t)i(on)e(the)150 974 y(up)q(dates)h(for)e(all)j(the)e(previous)h(individuals)j(visited.)30 b(Therefore,)19 b(w)o(e)f(w)o(an)o(t)f(to)g(parallelize)150 1030 y(eac)o(h)e(individual)q('s)i(probabilit)o(y)g(up)q(date.)221 1087 y(W)l(e)11 b(men)o(tion)h(as)g(an)f(aside)i(that)e(the)h(strict)f (sequen)o(tial)i(nature)f(of)f(the)h(up)q(dates)g(is)g(sp)q(eci\014c)150 1143 y(to)h(the)g(probabilit)o(y)h(up)q(date)g(algorithms)f(used)h(in)g (LINKA)o(GE,)g(but)f(only)h(partially)g(inheren)o(t)150 1200 y(in)22 b(the)f(original)h(up)q(date)f(algorithm)g(of)f(Elston)h(and)g(Stew)o (art)f([4].)36 b(Elston)21 b(and)g(Stew)o(art)150 1256 y(prop)q(osed)g(an)g (up)q(date)g(order)g(that)f(w)o(as)g(strictly)h(b)q(ottom-up,)h(whic)o(h)f(w) o(ould)g(allo)o(w)g(some)150 1313 y(up)q(dates)g(to)e(b)q(e)i(done)f(in)h (parallel.)36 b(Because)20 b(of)g(space)g(limitations)h(and)g(other)e (practical)150 1369 y(implemen)o(tation)f(concerns,)e(LINKA)o(GE)i(uses)e(an) g(up)q(date)h(order)g(with)f(the)h(in)o(v)m(arian)o(t)g(that)150 1426 y(the)f(n)o(uclear)h(families)h(whose)e(up)q(dates)h(ha)o(v)o(e)f(b)q (een)i(completed)f(alw)o(a)o(ys)e(form)h(a)g(con)o(tiguous)150 1482 y(subtree)h(of)f(the)h(p)q(edigree.)25 b(If)17 b(w)o(e)f(w)o(an)o(t)g (to)g(k)o(eep)h(this)g(order,)f(then)h(w)o(e)f(cannot)h(up)q(date)g(the)150 1539 y(probabilities)g(in)g(nonadjacen)o(t)e(parts)f(of)h(the)g(p)q(edigree)i (in)f(parallel.)221 1595 y(The)10 b(algorithm)h(is)g(parallelized)j(b)o(y)c (splitting)i(up)f(the)g(iteration)g(space)g(o)o(v)o(er)f(the)h(rectangle)150 1651 y Fe(R)20 b Fj(among)g(the)g(a)o(v)m(ailable)i(pro)q(cessors.)35 b(The)21 b(single)g Fb(gene)f Fj(arra)o(y)f(used)i(in)g(the)g(sequen)o(tial) 150 1708 y(algorithm)e(is)h(replaced)h(b)o(y)e(a)g(n)o(um)o(b)q(er)g(of)g Fb(gene)g Fj(arra)o(ys,)g(eac)o(h)g(one)g(lo)q(cal)i(to)d(a)h(particular)150 1764 y(pro)q(cessor.)g(Eac)o(h)13 b(pro)q(cessor)h(then)g(accum)o(ulates)g (in)g(its)g(lo)q(cal)g Fb(gene)f Fj(arra)o(y)g(its)g(con)o(tributions)150 1821 y(to)j(the)i(up)q(dated)g Fb(genarray)p Fj(.)24 b(When)18 b(a)e(pro)q(cessor)h(\014nishes)i(computing)e(its)h(con)o(tributions,)150 1877 y(it)j(w)o(aits)f(un)o(til)i(all)f(the)g(pro)q(cessors)f(ha)o(v)o(e)g (completed)i(their)f(w)o(ork.)35 b(Then)21 b(one)g(pro)q(cessor)150 1934 y(obtains)f(the)g(con)o(tributions)g(to)f Fb(gene)g Fj(from)g(eac)o(h)h (pro)q(cessor,)h(sums)e(them)h(together,)g(and)150 1990 y(uses)h(the)g (resulting)h(v)m(alue)g(of)e Fb(gene)h Fj(to)f(up)q(date)h Fb(genarray)f Fj(in)i(the)e(same)h(w)o(a)o(y)f(as)g(in)i(the)150 2047 y(sequen)o(tial)e(algorithm.)32 b(Since)21 b(the)e(con)o(tributions)h (for)e(eac)o(h)i(pair)f(of)g(paren)o(tal)g(genot)o(yp)q(es)150 2103 y(are)d(simply)i Ff(adde)n(d)j Fj(together,)16 b(they)h(can)f(b)q(e)h (accum)o(ulated)g Ff(lo)n(c)n(al)r(ly)j Fj(b)o(y)c(eac)o(h)h(pro)q(cessor)f (and)150 2160 y(summed)h(together)f(at)f(the)i(end.)24 b(By)17 b(using)g(a)f(lo)q(cal)i(arra)o(y)d(to)h(compute)h(the)f(con)o(tributions)150 2216 y(and)21 b(summing)g(them)f(at)g(the)h(end,)h(w)o(e)e(a)o(v)o(oid)g (comm)o(unication)h(and)g(sync)o(hronization)h(at)150 2272 y(eac)o(h)15 b(up)q(date.)221 2329 y(In)21 b(order)g(to)f(ac)o(hiev)o(e)h(go) q(o)q(d)g(sp)q(eedups,)i Fe(R)e Fj(needs)g(to)g(b)q(e)g(partitioned)h(in)f(a) g(w)o(a)o(y)f(that)150 2385 y(balances)15 b(the)f(load)h(among)e(the)h (di\013eren)o(t)g(pro)q(cessors.)20 b(Di\013eren)o(t)13 b(p)q(oin)o(ts)i(in)g Fe(R)f Fj(ma)o(y)f(require)150 2442 y(di\013eren)o(t)21 b(amoun)o(ts)e(of)h (computation.)36 b(F)l(or)20 b(simplicit)o(y)l(,)k(supp)q(ose)d(that)f(w)o(e) g(decide)i(whic)o(h)150 2498 y(pro)q(cessor)d(gets)f(the)i(p)q(oin)o(t)f(\()p Fe(G)709 2505 y Fd(1)728 2498 y Fe(;)8 b(G)785 2505 y Fd(2)804 2498 y Fj(\))19 b(in)g Fe(R)g Fj(based)h(only)f(on)g(the)g(\014rst)g(paren)o (t's)f(genot)o(yp)q(e,)964 2678 y(7)p eop %%Page: 8 8 8 7 bop 150 195 a Fj(leading)17 b(to)d(the)h(follo)o(wing)h(lo)q(op)g (structure:)311 273 y(F)l(or)f(eac)o(h)g(p)q(edigree)402 330 y(F)l(or)g(eac)o(h)g(n)o(uclear)h(family)493 386 y(Split)h(up)f(ro)o(ws)e(of) g Fe(R)h Fj(in)o(to)h Fe(p)f Fj(sets)493 443 y(F)l(or)g(eac)o(h)g(pro)q (cessor)584 499 y(Do)g(up)q(dates)h(to)e Fb(gene)h Fj(for)f(assigned)i(ro)o (ws)493 556 y(Sync)o(hronize)h(pro)q(cessors)e(to)f(sum)i(up)q(date)f (together)221 634 y(W)l(e)c(use)h(a)g(fact)f(relating)h(the)g(computation)g (time)g(to)f(the)h(underlying)h(biology)g(in)f(order)g(to)150 691 y(distribute)i(the)e(p)q(oin)o(ts)h(in)g Fe(R)g Fj(among)e(the)i(pro)q (cessors)f(with)h(a)f(go)q(o)q(d)h(load)f(balance.)20 b(If)13 b Fe(G)1695 698 y Fd(1)1727 691 y Fj(and)150 747 y Fe(G)186 731 y Fm(0)186 759 y Fd(1)218 747 y Fj(ha)o(v)o(e)f(the)g(same)g(pattern)g (of)f(heterozygosit)o(y)h(and)h Fe(G)1132 754 y Fd(2)1163 747 y Fj(and)g Fe(G)1285 731 y Fm(0)1285 759 y Fd(2)1316 747 y Fj(ha)o(v)o(e)f(the)h(same)f(pattern)f(of)150 803 y(heterozygosit)o(y)l(,)g (then)h(the)f(sequence)h(of)f(arithmetic)g(op)q(erations)h(for)e(the)h(up)q (date)h(at)f(\()p Fe(G)1688 810 y Fd(1)1707 803 y Fe(;)d(G)1764 810 y Fd(2)1782 803 y Fj(\))150 860 y(is)19 b(similar)g(to)e(that)g(for)h(\() p Fe(G)637 843 y Fm(0)637 871 y Fd(1)656 860 y Fe(;)8 b(G)713 843 y Fm(0)713 871 y Fd(2)732 860 y Fj(\).)27 b(Therefore,)19 b(w)o(e)e(distribute)j(the)e(genot)o(yp)q(es)g(among)f(the)150 916 y(pro)q(cessors,)c(so)f(that)g(for)g(eac)o(h)h(heterozygosit)o(y)f (pattern,)g(the)h(p)q(ossible)h(genot)o(yp)q(es)f(with)g(that)150 973 y(pattern)j(are)g(distributed)i(ev)o(enly)f(among)f(the)g(pro)q(cessors.) 23 b(F)l(or)16 b(reasons)g(unrelated)h(to)f(our)150 1029 y(parallel)e (implemen)o(tation,)g(the)e(genot)o(yp)q(es)g(are)h(already)f(ordered)h(so)f (that)f(all)j(the)e(genot)o(yp)q(es)150 1086 y(with)k(the)f(same)g (heterozygosit)o(y)f(pattern)h(are)g(consecutiv)o(e.)221 1142 y(Supp)q(ose)i(that)f Fe(H)538 1149 y Fd(1)557 1142 y Fe(;)8 b(H)616 1149 y Fd(2)635 1142 y Fe(;)g(:)g(:)g(:)13 b Fj(are)j(the)h(p)q (ossible)h(genot)o(yp)q(es)e(of)g(the)g(\014rst)g(paren)o(t.)23 b(T)l(o)16 b(bal-)150 1199 y(ance)21 b(the)g(load)g(w)o(e)f(assign)h(the)g (genot)o(yp)q(es)g(to)f(pro)q(cessors)g(in)i(a)e(round-robin)i(or)e(strip)q (ed)150 1255 y(fashion:)j Fe(H)364 1262 y Fd(1)399 1255 y Fj(go)q(es)17 b(to)e(pro)q(cessor)h(1,)g Fe(H)847 1262 y Fd(2)883 1255 y Fj(to)g(pro)q(cessor)g(2,)p Fe(:)8 b(:)g(:)m Fj(,)17 b Fe(H)1296 1262 y Fc(p)1332 1255 y Fj(to)e(pro)q(cessor)h Fe(p)p Fj(,)h Fe(H)1679 1262 y Fc(p)p Fd(+1)1760 1255 y Fj(to)150 1312 y(pro)q(cessor)h(1,) h Fe(H)445 1319 y Fc(p)p Fd(+2)528 1312 y Fj(to)f(pro)q(cessor)g(2,)h Fe(:)8 b(:)g(:)n Fj(,)19 b Fe(H)967 1319 y Fd(2)p Fc(p)1023 1312 y Fj(to)f(pro)q(cessor)g Fe(p)h Fj(and)f(so)g(on.)30 b(If)19 b(the)g(n)o(um-)150 1368 y(b)q(er)d(of)g(p)q(ossible)i(genot)o(yp)q(es)d(is)i (large,)f(then)g(most)f(of)g(the)h(consecutiv)o(e)h(sets)f(of)f Fe(p)h Fj(items)g(will)150 1424 y(ha)o(v)o(e)c(the)h(same)f(heterozygosit)o (y)g(pattern,)g(resulting)i(in)f(go)q(o)q(d)g(load)g(balancing.)20 b(When)13 b(there)150 1481 y(is)19 b(a)g(double)h(lo)q(op,)g(w)o(e)e(do)h(a)f (strip)q(ed)i(assignmen)o(t)f(for)f(the)h(paren)o(t)f(corresp)q(onding)i(to)e (the)150 1537 y(outer)f(lo)q(op)g(and)g(the)h(ro)o(ws)e(in)h Fe(R)p Fj(;)h(within)g(eac)o(h)f(ro)o(w,)f(all)i(the)f(genot)o(yp)q(e)g (pairs)h(in)g(that)e(ro)o(w)150 1594 y(corresp)q(onding)j(to)f(di\013eren)o (t)h(columns)g(get)f(assigned)h(to)f(the)g(same)g(pro)q(cessor.)29 b(When)19 b(w)o(e)150 1650 y(ha)o(v)o(e)c(t)o(w)o(o)e(separate)i(lo)q(ops)g (in)h(the)f(one-c)o(hild)i(case,)e(w)o(e)f(get)h(t)o(w)o(o)e(one-dimensional) 18 b(iteration)150 1707 y(spaces,)d(and)g(w)o(e)g(do)g(a)g(strip)q(ed)h (assignmen)o(t)g(for)e(eac)o(h)h(paren)o(t)g(separately)l(.)221 1763 y(There)j(are)f(a)h(few)f(p)q(oin)o(ts)i(in)f(the)g(computation)g(where) g(all)h(the)f(pro)q(cessors)f(m)o(ust)h(syn-)150 1820 y(c)o(hronize)k(and)f (share)g(their)h(data.)37 b(One)22 b(is)g(at)e(the)h(distribution)i(of)e(p)q (oin)o(ts)g(in)h Fe(R)f Fj(or)g(the)150 1876 y(one-dimensional)16 b(spaces)e(to)f(all)h(the)g(pro)q(cessors,)f(and)h(another)f(o)q(ccurs)h (just)f(b)q(efore)h(w)o(e)f(sum)150 1933 y(the)k(con)o(tributions)g(to)e Fb(gene)h Fj(from)g(eac)o(h)h(pro)q(cessor.)23 b(In)17 b(the)g(case)f(where)h (w)o(e)f(are)g(up)q(dating)150 1989 y(a)f(paren)o(t)h(based)g(on)g(its)g(sp)q (ouse)g(and)g(c)o(hildren,)h(there)f(is)g(one)g(more)g(sync)o(hronization)g (p)q(oin)o(t)150 2045 y(needed)h(so)e(that)g(an)h(in)o(termediate)h(table)f (can)g(b)q(e)g(propagated)f(to)g(all)i(pro)q(cessors.)k(This)16 b(ta-)150 2102 y(ble)f(stores)e(for)g(eac)o(h)h(haplot)o(yp)q(e,)g(the)g (probabilit)o(y)h(that)e(the)g(second)i(paren)o(t)e(\(the)g(one)h(in)h(the) 150 2158 y(inner)h(lo)q(op\))f(passes)g(that)f(haplot)o(yp)q(e)i(on)f(to)f(a) h(c)o(hild.)22 b(This)15 b(table)h(w)o(as)e(in)o(tro)q(duced)i(in)g([2)o(])f (to)150 2215 y(sp)q(eed)h(up)g(the)f(sequen)o(tial)i(computation.)221 2271 y(W)l(e)e(applied)j(the)e(idea)g(of)f(sparsit)o(y)h(one)g(more)f(time)h (to)f(further)h(impro)o(v)o(e)f(p)q(erformance.)150 2328 y(Recall)f(from)e (the)g(section)i(discussing)g(the)f(sequen)o(tial)h(algorithm)f(that)f(most)g (of)g(the)h(running)150 2384 y(time)18 b(in)g(the)f(lik)o(eliho)q(o)q(d)j (calculation)f(is)f(sp)q(en)o(t)g(on)f(those)g(n)o(uclear)h(families)h(where) e(at)g(least)150 2441 y(one)j(paren)o(t's)g Fb(genarray)f Fj(is)h(not)g (sparse.)34 b(This)21 b(means)f(that)g Fe(R)f Fj(will)j(ha)o(v)o(e)e(a)g (large)g(area.)150 2497 y(W)l(e)f(found)h(that)e(when)i Fe(R)f Fj(is)g(su\016cien)o(tly)i(small,)f(it)f(is)h(actually)g(detrimen)o(tal)g(to) e(p)q(erform)150 2554 y(the)h(up)q(dates)g(in)g(parallel)i(b)q(ecause)e(of)f (the)h(o)o(v)o(erhead)f(in)o(v)o(olv)o(ed)i(in)f(data)f(distribution)j(and) 964 2678 y(8)p eop %%Page: 9 9 9 8 bop 150 195 a Fj(sync)o(hronization.)21 b(Therefore,)15 b(for)f(the)i(runs)f(on)g(a)g(net)o(w)o(ork)f(of)h(w)o(orkstations)f(w)o(e)h (de\014ned)h(a)150 252 y(threshold)g(for)e(the)h(size)h(of)e Fe(R)p Fj(;)h(if)g Fe(R)g Fj(is)g(smaller)h(than)e(the)h(threshold,)h(w)o(e)e (do)h(the)g(up)q(date)h(for)150 308 y(that)f(n)o(uclear)i(family)g(using)g (only)g(one)f(pro)q(cessor.)23 b(F)l(or)15 b(the)h(exp)q(erimen)o(ts)i(w)o(e) d(rep)q(ort)h(later,)150 364 y(w)o(e)i(set)g(the)h(threshold)g(to)e(b)q(e)i (the)g(sum)f(of)g(the)g(t)o(w)o(o)f(sides)j(of)d Fe(R)h(<)g Fj(100)g(for)g(the)g(one-c)o(hild)150 421 y(case,)e(or)g(the)g(pro)q(duct)h (of)f(the)g(t)o(w)o(o)f(sides)i(of)f Fe(R)e(<)h Fj(3000)g(for)h(the)g(man)o (y-c)o(hild)i(case.)23 b(W)l(e)16 b(did)150 477 y(not)i(exp)q(erimen)o(t)h (extensiv)o(ely)h(with)f(di\013eren)o(t)g(thresholds.)30 b(There)18 b(w)o(ere)g(a)g(small)i(n)o(um)o(b)q(er)150 534 y(of)c(n)o(uclear)i(families) g(where)f(the)g(size)h(of)f Fe(R)f Fj(w)o(as)g(at)h(or)f(near)h(the)g (threshold.)25 b(In)18 b(almost)e(all)150 590 y(cases)g(the)f(size)i(of)e Fe(R)g Fj(is)h(m)o(uc)o(h)g(smaller)g(or)f(m)o(uc)o(h)h(larger)f(than)h(the)f (threshold.)22 b(Th)o(us)16 b(minor)150 647 y(v)m(ariations)c(in)g(the)f (threshold)h(do)f(not)g(result)h(in)g(noticeable)h(c)o(hanges)e(in)h(p)q (erformance.)19 b(When)150 703 y(running)14 b(on)e(a)g(shared-memory)g(m)o (ultipro)q(cessor,)i(the)e(cost)g(of)g(sync)o(hronization)i(is)f(minimal,)150 760 y(and)i(hence)i(the)e(threshold)h(w)o(as)e(set)h(to)g(0.)150 903 y Fg(5)69 b(Metho)r(ds)150 1004 y Fj(W)l(e)12 b(ev)m(aluated)i(parallel)f (ILINK)h(on)e(t)o(w)o(o)f(di\013eren)o(t)h(t)o(yp)q(es)h(of)e(parallel)j (computers:)k(a)12 b(net)o(w)o(ork)150 1061 y(m)o(ulticomputer)17 b(and)g(a)g(shared-memory)f(m)o(ultipro)q(cessor.)25 b(A)17 b(net)o(w)o(ork)f(m)o(ulticomputer)h(is)150 1117 y(simply)e(a)f(cluster)h(of) e(ordinary)i(w)o(orkstations)d(connected)j(b)o(y)f(a)g(general-purp)q(ose)h (lo)q(cal)h(area)150 1174 y(net)o(w)o(ork,)22 b(suc)o(h)g(as)g(A)l(TM,)f (Ethernet,)i(or)e(FDDI)g(\(whic)o(h)i(stands)e(for)g(Fib)q(er)i(Distributed) 150 1230 y(Data)14 b(In)o(terface)i(and)f(is)h(a)g(100)e(Megabit/s)h(lo)q (cal)i(area)e(net)o(w)o(ork)f(in)i(whic)o(h)h(the)e(stations)g(are)150 1287 y(connected)k(in)g(the)f(form)g(of)g(a)g(ring\).)29 b(In)18 b(con)o(trast,)g(a)g(shared-memory)g(m)o(ultipro)q(cessor)g(is)150 1343 y(a)h(single)i(mac)o(hine)g(con)o(taining)f(sev)o(eral)g(pro)q(cessors)f (that)g(are)g(connected)i(b)o(y)e(a)g(sp)q(ecially-)150 1400 y(designed)e(bus)e(or)g(dedicated)h(net)o(w)o(ork.)221 1456 y(These)i(t)o(w)o(o)f(t)o(yp)q(es)h(of)g(parallel)i(computers)e(presen)o(t)g (di\013eren)o(t)h(tradeo\013s)e(b)q(et)o(w)o(een)h(cost)150 1512 y(and)g(p)q(erformance.)28 b(On)19 b(one)f(hand,)h(net)o(w)o(ork)e(m)o (ulticomputers)h(are)g(c)o(heap)q(er.)29 b(In)18 b(fact,)g(in)150 1569 y(man)o(y)g(lab)q(oratories,)g(the)h(required)g(hardw)o(are)e(for)h(a)g (net)o(w)o(ork)f(m)o(ulticomputer)i(is)g(already)150 1625 y(presen)o(t.)g(On) 11 b(the)h(other)e(hand,)i(shared-memory)f(m)o(ultipro)q(cessors)h(are)f (faster,)g(b)q(ecause)h(they)150 1682 y(implemen)o(t)17 b(comm)o(unication)g (and)f(sync)o(hronization)g(en)o(tirely)h(b)o(y)f(hardw)o(are.)21 b(On)16 b(w)o(orksta-)150 1738 y(tions,)h(a)g(large)g(soft)o(w)o(are)e(o)o(v) o(erhead)i(is)h(asso)q(ciated)f(with)g(sending)i(and)e(receiving)h(messages) 150 1795 y(o)o(v)o(er)10 b(the)h(net)o(w)o(ork.)17 b(F)l(or)10 b(parallel)j(computations)e(where)g(the)g(individual)j(pro)q(cessors)c(comm)o (u-)150 1851 y(nicate)16 b(with)f(eac)o(h)g(other)f(frequen)o(tly)l(,)i (shared-memory)f(m)o(ultipro)q(cessors)g(t)o(ypically)h(ac)o(hiev)o(e)150 1908 y(b)q(etter)21 b(p)q(erformance.)39 b(The)22 b(adv)o(en)o(t)f(of)g (faster)f(general-purp)q(ose)j(net)o(w)o(orks)d(is,)j(ho)o(w)o(ev)o(er,)150 1964 y(narro)o(wing)15 b(the)h(p)q(erformance)g(gap)f(b)q(et)o(w)o(een)h(w)o (orkstation)f(net)o(w)o(orks)f(and)i(shared-memory)150 2021 y(m)o(ultipro)q(cessors.)221 2077 y(Besides)d(di\013erences)g(in)f(cost)g (and)g(p)q(erformance,)g(shared-memory)f(m)o(ultipro)q(cessors)i(and)150 2133 y(w)o(orkstations)18 b(also)h(t)o(ypically)h(presen)o(t)f(di\013eren)o (t)g(comm)o(unications)h(in)o(terfaces.)31 b(In)20 b(a)f(net-)150 2190 y(w)o(ork)e(m)o(ulticomputer,)h(pro)q(cessors)g(comm)o(unicate)g(b)o(y)f (passing)h(messages)g(with)g Fb(send)f Fj(and)150 2246 y Fb(receive)e Fj(op)q(erations.)21 b(A)16 b(shared-memory)g(m)o(ultipro)q(cessor)g(supp)q (orts)g(comm)o(unication)g(b)o(y)150 2303 y(reading)21 b(and)f(writing)h (shared)f(memory)l(.)35 b(F)l(undamen)o(tally)l(,)22 b(neither)g(mec)o (hanism)f(is)f(more)150 2359 y(p)q(o)o(w)o(erful)j(than)f(the)h(other.)42 b(Either)23 b(mec)o(hanism)g(can)g(b)q(e)g(used)g(to)f(sim)o(ulate)i(the)e (other)150 2416 y(through)17 b(soft)o(w)o(are.)23 b(Ho)o(w)o(ev)o(er,)16 b(most)g(sequen)o(tial)i(programs,)e(including)k(ILINK,)e(are)e(more)150 2472 y(easily)d(parallelized)i(in)e(terms)f(of)g(shared)g(memory)l(.)19 b(T)l(o)12 b(use)g(message)g(passing,)h(the)f(program-)150 2529 y(mer)18 b(m)o(ust)f(write)h(additional)h(co)q(de)f(to)f(cop)o(y)h(data) f(in)o(to)h(and)g(out)f(of)h(message)f(bu\013ers)h(and)964 2678 y(9)p eop %%Page: 10 10 10 9 bop 150 195 a Fj(p)q(erform)15 b Fb(send)g Fj(and)g Fb(receive)f Fj(op)q(erations.)221 252 y(Motiv)m(ated)g(b)o(y)g(the)g(di\016cult)o(y)h(of) f(writing)g(message)g(passing)h(programs,)d(w)o(e)i(ha)o(v)o(e)g(dev)o(el-) 150 308 y(op)q(ed)20 b(a)e(soft)o(w)o(are)f Ff(distribute)n(d)j(shar)n(e)n(d) f(memory)24 b Fj(\(DSM\))18 b(system)g(for)g(net)o(w)o(ork)g(m)o(ulticom-)150 364 y(puters)h(called)h(T)l(readMarks)e([7)o(].)31 b(In)19 b(essence,)h(T)l(readMarks)e(pro)o(vides)h(a)g(shared)g(memory)150 421 y(abstraction)g(to)h(the)g(programmer,)f(and)h(implemen)o(ts)h(this)g (abstraction)e(e\016cien)o(tly)i(using)150 477 y(the)14 b(underlying)i (message)d(passing)h(system)g([8)o(,)f(3].)19 b(Th)o(us)14 b(the)g(programmer)e(writes)i(the)g(pro-)150 534 y(gram)d(as)g(if)g(it)h(w)o (ere)f(in)o(tended)i(for)e(a)g(shared-memory)g(m)o(ultipro)q(cessor,)i(but)e (the)h(T)l(readMarks)150 590 y(system)j(enables)h(the)f(program)f(to)h(run)g (on)h(a)e(net)o(w)o(ork)h(m)o(ulticomputer.)221 647 y(A)o(t)f(the)g(presen)o (t)h(time,)f(T)l(readMarks)g(is)h(still)h(under)f(dev)o(elopmen)o(t.)21 b(W)l(e)14 b(exp)q(ect)i(it)e(to)g(b)q(e)150 703 y(ready)g(for)f (distribution)i(some)e(time)h(in)h(1994.)j(T)l(readMarks)13 b(will)i(b)q(e)f(made)g(a)o(v)m(ailable)h(at)e(lo)o(w)150 760 y(cost)g(to)g(univ)o(ersities)j(and)e(nonpro\014t)g(institutions.)20 b(A)o(t)13 b(that)g(time,)h(w)o(e)g(in)o(tend)h(to)e(distribute)150 816 y(the)i(parallel)i(LINKA)o(GE)f(co)q(de)g(that)e(runs)i(on)f(top)f(of)h (T)l(readMarks.)221 873 y(The)j(net)o(w)o(ork)f(m)o(ulticomputer)i(used)g(to) f(p)q(erform)g(our)g(ev)m(aluation)i(of)d(parallel)j(ILINK)150 929 y(consists)d(of)g(8)g(DECstation-5000/240)d(w)o(orkstations,)i(eac)o(h)h (with)g(16)g(Mb)o(ytes)f(of)h(memory)l(,)150 985 y(running)i(the)f(Ultrix)h (v)o(ersion)f(4.3)f(op)q(erating)i(system.)27 b(All)20 b(of)d(the)h(w)o (orkstations)f(are)h(con-)150 1042 y(nected)k(to)e(an)h(Ethernet)g(and)g(a)g (high-sp)q(eed)i(A)l(TM)d(net)o(w)o(ork.)37 b(T)l(readMarks)20 b(can)h(utilize)150 1098 y(either)c(the)f(Ethernet)g(or)f(the)h(A)l(TM)g(net) o(w)o(ork.)21 b(The)c(in)o(terface)f(for)f(Ethernet)h(is)h(a)e(standard)150 1155 y(comp)q(onen)o(t)h(of)g(the)g(w)o(orkstation.)k(The)c(in)o(terface)h (for)e(A)l(TM)h(is)g(a)g(F)l(ore)f(Systems)h(TCA-100)150 1211 y(net)o(w)o(ork)e(adapter)h(card)g(supp)q(orting)h(comm)o(unication)g(at)e (100)h(Megabit/s.)221 1268 y(The)k(shared-memory)f(m)o(ultipro)q(cessor)i (used)f(to)g(p)q(erform)f(our)h(ev)m(aluation)h(of)e(parallel)150 1324 y(ILINK)h(is)f(a)g(Silicon)h(Graphics)f(Iris)h(4D/480)c(with)j(128)f(Mb) o(ytes)g(of)g(memory)g(running)i(the)150 1381 y(IRIX)14 b(Release)g(4.0.1)e (System)i(V)g(op)q(erating)f(system.)19 b(This)c(mac)o(hine)f(has)g(8)f(pro)q (cessors)h(that)150 1437 y(comm)o(unicate)i(via)f(a)g(dedicated)h(bus.)221 1494 y(An)21 b(imp)q(ortan)o(t)f(asp)q(ect)h(of)f(our)h(ev)m(aluation)h(is)f (that)f(the)h(DECstation-5000/240)d(and)150 1550 y(the)e(SGI)g(Iris)h(4D/480) d(use)i(the)g(same)f(t)o(yp)q(e)h(of)f(pro)q(cessor)h(running)h(at)e(the)h (same)g(sp)q(eed.)22 b(In)150 1606 y(addition,)13 b(w)o(e)f(used)g(the)g (same)f(compiler,)i(gcc)f(2.3.3)e(with)i(-O)h(\015ag)e(for)g(optimization,)i (on)f(b)q(oth)150 1663 y(mac)o(hines.)20 b(The)15 b(only)g(signi\014can)o(t)h (di\013erence)g(b)q(et)o(w)o(een)e(the)h(t)o(w)o(o)e(parallel)j(computers)f (is)g(the)150 1719 y(metho)q(d)j(for)f(implemen)o(ting)j(shared)e(memory:)25 b(dedicated)19 b(hardw)o(are)e(v)o(ersus)h(soft)o(w)o(are)e(on)150 1776 y(message-passing)f(hardw)o(are.)150 1917 y Fg(6)69 b(Results)150 2019 y Fj(W)l(e)17 b(presen)o(t)g(sp)q(eedups)h(for)f(parallel)h(LINKA)o(GE)g (with)f(sev)o(eral)g(input)h(data)e(sets.)25 b(Unipro-)150 2075 y(cessor)17 b(execution)h(times)f(are)g(giv)o(en)g(as)g(w)o(ell)h(so)e (that)h(execution)h(time)f(di\013erences)h(ma)o(y)e(b)q(e)150 2131 y(inferred.)k(W)l(e)12 b(use)h(t)o(w)o(o)e(di\013eren)o(t)h(net)o(w)o (ork)f(t)o(yp)q(es)h(-)h(the)f(commonly)h(a)o(v)m(ailable)h(Ethernet)e(net-) 150 2188 y(w)o(orks)17 b(and)g(the)h(emerging)g(A)l(TM)f(net)o(w)o(orks.)26 b(The)18 b(p)q(erformance)g(obtained)g(on)g(a)f(net)o(w)o(ork)150 2244 y(of)e(w)o(orkstations)e(is)j(then)f(compared)g(to)f(the)i(p)q (erformance)f(on)g(a)f(shared-memory)h(mac)o(hine)150 2301 y(with)h(iden)o(tical)h(pro)q(cessor)e(p)q(o)o(w)o(er.)221 2357 y(W)l(e)g(use)g(t)o(w)o(o)f(disease)i(data)f(sets)g(from)f([2)o(])h(and) h(a)f(new)g(data)g(set:)218 2441 y Fa(\017)23 b Fj(RP01:)c(data)14 b(on)i(a)f(large)g(family)l(,)h(UCLA-RP01,)f(with)h(autosomal)e(dominan)o(t)i (retini-)264 2497 y(tis)k(pigmen)o(tosa)g(\(RP1\))f(from)h(the)g(lab)q (oratory)g(of)g(Dr.)f(Stephen)j(P)l(.)e(Daiger)g(at)g(the)264 2554 y(Univ)o(ersit)o(y)f(of)e(T)l(exas)h(Health)h(Science)h(Cen)o(ter)e(at)g (Houston.)29 b(This)18 b(p)q(edigree)i(has)e(7)952 2678 y(10)p eop %%Page: 11 11 11 10 bop 264 195 a Fj(generations)13 b(with)g(189)f(individual)q(s)k(con)o (taining)d(2)g(marriage)g(lo)q(ops)g([1].)18 b(There)c(are)f(86)264 252 y(individuals)k(that)c(are)h(unkno)o(wn)h(at)e(some)h(lo)q(ci.)21 b(As)14 b(sho)o(wn)g(in)h([1],)e(this)i(p)q(edigree)h(had)264 308 y(to)c(b)q(e)h(split)h(in)o(to)f(three)g(pieces)h(b)q(ecause)g (computation)e(on)h(the)g(whole)g(family)h(together)264 364 y(w)o(as)i(prohibitiv)o(ely)k(long.)27 b(RP01-3)16 b(denotes)i(the)g (analysis)g(with)g(the)f(family)i(split)f(in)264 421 y(three)d(pieces.)218 515 y Fa(\017)23 b Fj(BAD:)11 b(data)f(on)i(a)f(p)q(ortion)g(of)g(the)h(Old)g (Order)g(Amish)g(p)q(edigree)h(110)e(\(OO)o(A)g(110\),)g(with)264 571 y(bip)q(olar)i(a\013ectiv)o(e)e(disorder)h(\(BAD\))f(from)g(the)h(lab)q (oratory)f(of)g(Drs.)g(Da)o(vid)g(R.)g(Co)o(x)g(and)264 628 y(Ric)o(hard)i(M.)g(My)o(ers)f(at)h(the)g(Univ)o(ersit)o(y)h(of)f(California) h(at)f(San)h(F)l(rancisco.)19 b(This)14 b(p)q(edi-)264 684 y(gree)e(spans)g(5)g(generations)h(with)f(96)g(individuals)j(and)e(con)o (tains)f(1)g(marriage)g(lo)q(op)h([18)o(].)264 741 y(Data)i(is)i(a)o(v)m (ailable)h(for)d(three)i(lo)q(ci,)g(the)g(disease)g(lo)q(cus)g(\(n)o(um)o(b)q (er)g(1\))e(and)i(t)o(w)o(o)e(others.)264 797 y(15)20 b(individuals)j(are)e (unkno)o(wn)f(at)g(lo)q(cus)i(2)e(and)h(those)f(same)g(15)g(plus)i(3)e(more)g (are)264 853 y(unkno)o(wn)15 b(at)g(lo)q(cus)h(3.)218 947 y Fa(\017)23 b Fj(CLP:)11 b(Data)f(on)i(12)e(families)j(with)f(autosomal)f (dominan)o(t)g(nonsyndromic)i(cleft)f(lip)h(and)264 1004 y(palate)f(\(CLP\))g (from)g(the)h(lab)q(oratory)e(of)h(Dr.)g(Jacqueline)j(T.)d(Hec)o(h)o(t)g(at)g (the)g(Univ)o(ersit)o(y)264 1060 y(of)e(T)l(exas)g(Health)h(Science)i(Cen)o (ter)d(at)g(Houston.)18 b(Diagrams)10 b(of)g(the)h(families)h(are)e(sho)o(wn) 264 1117 y(in)j([6].)18 b(Subsequen)o(t)c(to)e(that)g(pap)q(er)i(data)e(w)o (as)g(collected)i(on)f(9)g(more)f(individuals)k(aug-)264 1173 y(men)o(ting)g(4)f(of)g(the)h(families.)22 b(The)16 b(families)h(include)h (110)c(individual)q(s)k(in)f(all.)k(W)l(e)16 b(list)264 1230 y(for)c(eac)o(h)h(family)l(,)h(the)f(iden)o(tifying)i(n)o(um)o(b)q(er)f(giv)o (en)f(in)h([6)o(],)f(the)g(n)o(um)o(b)q(er)h(of)e(individuals,)264 1286 y(the)g(n)o(um)o(b)q(er)g(of)g(generations,)g(and)h(the)f(n)o(um)o(b)q (er)g(of)g(individuals)j(that)c(are)h(unkno)o(wn)h(at)264 1342 y(at)g(least)i(one)f(of)g(the)h(lo)q(ci)h(w)o(e)e(used:)20 b([\(100,9,2,1)o(\))11 b(\(300,4,2,0\))g(\(500,6,2,0\))g(\(600,7,3,0\))264 1399 y(\(700,9,3,1\))20 b(\(800,7,3,1\))h(\(900,8,3,1\))f(\(1000,17,3,3\))g (\(1100,22,3,12)o(\))h(\(1200,11,2,2)o(\))264 1455 y(\(1400,6,2,3)o(\))15 b(\(1500,4,2,0\)])o(.)27 b(The)18 b(computation)h(time)f(is)h(dominated)g(b)o (y)g(p)q(edigrees)264 1512 y(1000)12 b(and)h(1100)f(b)q(ecause)i(of)f(the)g (larger)g(size)h(and)g(the)f(unkno)o(wns,)g(although)g(p)q(edigree)264 1568 y(1200)h(has)h(a)g(marriage)f(lo)q(op.)221 1662 y(The)e(lo)q(ci)h(c)o (hosen)g(for)e(the)h(RP01-3)f(data)g(set)h(ha)o(v)o(e)g(an)g(allele)i(pro)q (duct)e(of)g(2)t Fa(\002)t Fj(6)t Fa(\002)t Fj(9.)18 b(Those)150 1719 y(for)c(the)g(BAD)g(and)h(CLP)f(data)g(sets)g(ha)o(v)o(e)g(allele)i(pro) q(ducts)f(of)f(2)8 b Fa(\002)g Fj(4)g Fa(\002)h Fj(4,)14 b(and)g(2)8 b Fa(\002)h Fj(4)f Fa(\002)h Fj(4)f Fa(\002)h Fj(4,)150 1775 y(resp)q(ectiv)o(ely)l(.)41 b(In)22 b(all)h(cases,)f(the)g(2-allele)i(lo)q (cus)e(is)g(the)g(disease)g(lo)q(cus,)i(and)e(these)g(runs)150 1831 y(represen)o(t)15 b(real)h(runs)f(one)g(migh)o(t)g(w)o(an)o(t)g(to)f (execute)i(in)g(lo)q(cating)g(the)f(disease)h(gene.)221 1888 y(In)e(addition,)g(w)o(e)g(also)f(compare)h(the)f(program)g(on)g(di\013eren)o (t)h(sets)g(of)f(lo)q(ci)i(from)e(the)g(same)150 1944 y(p)q(edigree)k(set.)i (In)d(particular,)f(w)o(e)g(use)g(three)g(di\013eren)o(t)h(sets)e(of)h(lo)q (ci)h(from)f(the)g(RP01-3)f(data)150 2001 y(set,)d(with)f(allele)i(pro)q (ducts)f(2)p Fa(\002)p Fj(6)p Fa(\002)p Fj(6,)g(3)p Fa(\002)p Fj(5)p Fa(\002)p Fj(2)p Fa(\002)p Fj(3,)g(and)f(2)p Fa(\002)p Fj(6)p Fa(\002)p Fj(9.)19 b(This)11 b(comparison)f(sho)o(ws)f(ho)o(w)150 2057 y(the)17 b(running)h(time)f(c)o(hanges)f(as)g(the)h(allele)i(pro)q(duct) e(c)o(hanges,)g(but)f(other)h(factors)e(sta)o(y)h(the)150 2114 y(same.)22 b(This)17 b(is)g(motiv)m(ated)f(b)o(y)g(a)g(common)g(usage)f (pattern)h(for)g(the)g(LINKA)o(GE)h(programs.)150 2170 y(Once)i(a)e(set)g(of) h(p)q(edigree)h(information)e(is)i(collected,)g(it)f(is)g(common)f(for)g (geneticists)i(to)e(do)150 2227 y(man)o(y)e(link)m(age)i(analysis)e(runs)h (on)f(it,)g(c)o(hanging)h(the)f(set)g(of)g(lo)q(ci)h(eac)o(h)g(time.)221 2283 y(The)i(sp)q(eedup)i(\014gures)f(are)f(based)g(on)h(one-pro)q(cessor)f (execution)i(times)f(for)e(the)i(faster)150 2340 y(v)o(ersion)e(of)f(ILINK)i (used)f(in)g(the)g(tests)e(for)h([2],)g(but)g(run)h(on)f(a)g (DECstation-5000.)22 b(T)l(able)17 b(1)150 2396 y(presen)o(ts)k(the)g(unipro) q(cessor)h(execution)h(times)e(on)g(the)g(DECstation-5000)f(w)o(orkstations.) 150 2452 y(All)f(execution)f(times)g(are)f(rep)q(orted)h(in)g(seconds.)27 b(In)18 b(all)g(the)g(sp)q(eedup)h(graphs)e(\(Figures)g(1)150 2509 y(to)f(6\))h(the)g(horizon)o(tal)g(axis)g(represen)o(ts)g(the)g(n)o(um)o (b)q(er)g(of)g(pro)q(cessors)f(and)h(the)g(v)o(ertical)h(axis)952 2678 y(11)p eop %%Page: 12 12 12 11 bop 473 155 1004 2 v 472 212 2 57 v 481 212 V 507 195 a Fj(RP01-3)p 678 212 V 63 w(RP01-3)p 891 212 V 49 w(RP01-3)p 1089 212 V 64 w(BAD)p 1255 212 V 120 w(CLP)p 1467 212 V 1476 212 V 472 268 V 481 268 V 538 251 a(2x6x6)p 678 268 V 49 w(3x5x2x3)p 891 268 V 80 w(2x6x9)p 1089 268 V 49 w(2x4x4)p 1255 268 V 49 w(2x4x4x4)p 1467 268 V 1476 268 V 473 270 1004 2 v 472 326 2 57 v 481 326 V 586 309 a(901)p 678 326 V 98 w(10005)p 891 326 V 106 w(4805)p 1089 326 V 96 w(848)p 1255 326 V 121 w(6388)p 1467 326 V 1476 326 V 473 328 1004 2 v 175 406 a(T)l(able)16 b(1:)j(Unipro)q(cessor)d(Execution)g(Times)g(in)g(Seconds)g(on)f(the)g (DECstation-5000/240)525 467 y 14208860 13782590 3552215 20623568 30812571 47297085 startTexFig 525 467 a %%BeginDocument: newetherfig1.ps %!PS-Adobe-2.0 EPSF-2.0 %%Creator: Informix Wingz Version 1.1b %%CreationDate: Tue Nov 2 14:18:19 1993 %%For: Sandhya Dwarkadas (sandhya) %%BoundingBox: 54.0 313.515 468.406 719.0 %%Pages: (atend) %%EndComments %%BeginProlog /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 1.000 1.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def %%EndProlog %%Page: 1 1 save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 54 719 TR [1 0 0 -1 0 0] CN 1.000 1.000 SL 1.0 LW GS 0 0 414 399 CR 1.000 1.000 1.000 SC 0 0 413 398 DR FL GS 0 0 414 399 CR GS 40 16 413 398 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 12.000 SF 39 7 414 407 DR FL 0.000 0.000 0.000 SC 39 7 414 407 DR SP FL 1.000 1.000 1.000 SC 107 356 346 394 DR FL 0.000 0.000 0.000 SC 107 356 346 394 DR SP FL 138 381 MT (BAD) SH 121 375 MT 121 375 132 375 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 124 373 MT 0.000 0.000 0.000 SC 124 373 128 377 DL FL 124 377 MT 124 377 128 373 DL FL 224 381 MT (RP01-3) SH 206 375 MT 206 375 217 375 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 212 372 MT 0.000 0.000 0.000 SC 212 372 210 376 DL FL 210 376 214 376 DL FL 214 376 212 372 DL FL 309 381 MT (CLP) SH 292 375 MT 292 375 303 375 DL FL GS NP 297 375 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 1.000 1.000 1.000 SC 52 20 401 344 DR FL 0.000 0.000 0.000 SC 52 20 401 344 DR SP FL 1.000 1.000 1.000 SC 125 39 385 266 DR FL 217 305 293 331 DR FL 0.000 0.000 0.000 SC 217 305 293 331 DR SP FL 224 324 MT (Processors) SH 125 266 MT 125 266 125 275 DL FL 122 293 MT (1) SH 162 266 MT 162 266 162 39 DL FL 162 266 MT 162 266 162 275 DL FL 159 293 MT (2) SH 199 266 MT 199 266 199 39 DL FL 199 266 MT 199 266 199 275 DL FL 196 293 MT (3) SH 236 266 MT 236 266 236 39 DL FL 236 266 MT 236 266 236 275 DL FL 233 293 MT (4) SH 273 266 MT 273 266 273 39 DL FL 273 266 MT 273 266 273 275 DL FL 270 293 MT (5) SH 310 266 MT 310 266 310 39 DL FL 310 266 MT 310 266 310 275 DL FL 307 293 MT (6) SH 347 266 MT 347 266 347 39 DL FL 347 266 MT 347 266 347 275 DL FL 344 293 MT (7) SH 385 266 MT 385 266 385 275 DL FL 382 293 MT (8) SH 1.000 1.000 1.000 SC 65 120 91 184 DR FL 0.000 0.000 0.000 SC 65 120 91 184 DR SP FL GS 84 177 MT 270 RO (Speedup) SH GR 125 258 MT 125 258 121 258 DL FL 125 251 MT 125 251 121 251 DL FL 125 243 MT 125 243 121 243 DL FL 125 236 MT 125 236 121 236 DL FL 125 266 MT 125 266 116 266 DL FL 103 272 MT (1) SH 125 221 MT 125 221 121 221 DL FL 125 213 MT 125 213 121 213 DL FL 125 205 MT 125 205 121 205 DL FL 125 198 MT 125 198 121 198 DL FL 125 228 MT 125 228 385 228 DL FL 125 228 MT 125 228 116 228 DL FL 103 234 MT (2) SH 125 183 MT 125 183 121 183 DL FL 125 175 MT 125 175 121 175 DL FL 125 168 MT 125 168 121 168 DL FL 125 160 MT 125 160 121 160 DL FL 125 190 MT 125 190 385 190 DL FL 125 190 MT 125 190 116 190 DL FL 103 196 MT (3) SH 125 145 MT 125 145 121 145 DL FL 125 137 MT 125 137 121 137 DL FL 125 130 MT 125 130 121 130 DL FL 125 122 MT 125 122 121 122 DL FL 125 152 MT 125 152 385 152 DL FL 125 152 MT 125 152 116 152 DL FL 103 158 MT (4) SH 125 107 MT 125 107 121 107 DL FL 125 100 MT 125 100 121 100 DL FL 125 92 MT 125 92 121 92 DL FL 125 84 MT 125 84 121 84 DL FL 125 115 MT 125 115 385 115 DL FL 125 115 MT 125 115 116 115 DL FL 103 121 MT (5) SH 125 69 MT 125 69 121 69 DL FL 125 62 MT 125 62 121 62 DL FL 125 54 MT 125 54 121 54 DL FL 125 47 MT 125 47 121 47 DL FL 125 77 MT 125 77 385 77 DL FL 125 77 MT 125 77 116 77 DL FL 103 83 MT (6) SH 125 39 MT 125 39 116 39 DL FL 103 45 MT (7) SH GS 125 39 386 267 CR 125 266 MT 125 266 162 232 DL FL 162 232 MT 162 232 199 201 DL FL 199 201 MT 199 201 236 176 DL FL 236 176 MT 236 176 273 161 DL FL 273 161 MT 273 161 310 135 DL FL 310 135 MT 310 135 347 112 DL FL 347 112 MT 347 112 385 111 DL FL 385 111 MT 385 111 MT GS NP 125 266 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 162 232 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 199 201 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 236 176 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 273 161 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 310 135 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 347 112 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 385 111 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 125 266 MT 125 266 162 234 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 162 234 MT 162 234 199 206 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 199 206 MT 199 206 236 184 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 236 184 MT 236 184 273 168 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 273 168 MT 273 168 310 160 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 310 160 MT 310 160 347 157 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 347 157 MT 347 157 385 159 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 385 159 MT 385 159 MT 125 263 MT 0.000 0.000 0.000 SC 125 263 123 267 DL FL 123 267 127 267 DL FL 127 267 125 263 DL FL 162 231 MT 162 231 160 235 DL FL 160 235 164 235 DL FL 164 235 162 231 DL FL 199 203 MT 199 203 197 207 DL FL 197 207 201 207 DL FL 201 207 199 203 DL FL 236 181 MT 236 181 234 185 DL FL 234 185 238 185 DL FL 238 185 236 181 DL FL 273 165 MT 273 165 271 169 DL FL 271 169 275 169 DL FL 275 169 273 165 DL FL 310 157 MT 310 157 308 161 DL FL 308 161 312 161 DL FL 312 161 310 157 DL FL 347 154 MT 347 154 345 158 DL FL 345 158 349 158 DL FL 349 158 347 154 DL FL 385 156 MT 385 156 383 160 DL FL 383 160 387 160 DL FL 387 160 385 156 DL FL 125 266 MT 125 266 162 246 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 162 246 MT 162 246 199 235 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 199 235 MT 199 235 236 230 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 236 230 MT 236 230 273 222 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 273 222 MT 273 222 310 228 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 310 228 MT 310 228 347 233 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 347 233 MT 347 233 385 233 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 385 233 MT 385 233 MT 123 264 MT 0.000 0.000 0.000 SC 123 264 127 268 DL FL 123 268 MT 123 268 127 264 DL FL 160 244 MT 160 244 164 248 DL FL 160 248 MT 160 248 164 244 DL FL 197 233 MT 197 233 201 237 DL FL 197 237 MT 197 237 201 233 DL FL 234 228 MT 234 228 238 232 DL FL 234 232 MT 234 232 238 228 DL FL 271 220 MT 271 220 275 224 DL FL 271 224 MT 271 224 275 220 DL FL 308 226 MT 308 226 312 230 DL FL 308 230 MT 308 230 312 226 DL FL 345 231 MT 345 231 349 235 DL FL 345 235 MT 345 235 349 231 DL FL 383 231 MT 383 231 387 235 DL FL 383 235 MT 383 235 387 231 DL FL GR 385 266 MT 385 266 385 39 DL FL 125 39 MT 125 39 385 39 DL FL 125 266 MT 125 266 385 266 DL FL 125 266 MT 125 266 125 39 DL FL GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF showpage restore %%Trailer %%Pages: 1 %%EndDocument endTexFig 333 1438 a Fj(Figure)h(1:)j(Sp)q(eedup)f(on)d(an)g(Ethernet)g(Net)o(w)o(ork) f(-)h(Di\013eren)o(t)g(p)q(edigrees)150 1572 y(represen)o(ts)h(the)g(sp)q (eedup.)24 b(The)17 b(parallel)g(v)o(ersion)f(describ)q(ed)i(here)f(\(with)f (the)g(co)q(de)h(reorga-)150 1628 y(nization)h(for)f(load)h(balancing)h(and)e (extra)g(T)l(readMarks)f(co)q(de\))i(ran)f(in)h(appro)o(ximately)g(the)150 1684 y(same)g(time)h(on)g(one)g(pro)q(cessor)f(as)g(the)h(sequen)o(tial)h(v)o (ersion)f(of)f(the)h(co)q(de.)31 b(The)19 b(di\013erence)150 1741 y(in)h(running)g(time)f(w)o(as)f(alw)o(a)o(ys)h(a)f(few)h(seconds)h (compared)f(to)f(the)h(thousands)g(of)g(seconds)150 1797 y(of)d(total)f (execution)i(time.)23 b(Th)o(us)16 b(the)g(use)g(of)g(T)l(readMarks)f(co)q (de)i(do)q(es)f Ff(not)k Fj(slo)o(w)c(do)o(wn)g(the)150 1854 y(execution)g(for)f(one)g(pro)q(cessor.)221 1910 y(Figure)f(1)g(sho)o(ws)g (sp)q(eedups)h(for)f(a)g(run)g(from)g(eac)o(h)g(of)g(the)g(three)g(data)g (sets)g(describ)q(ed)i(on)150 1967 y(an)i(Ethernet)h(net)o(w)o(ork.)28 b(In)19 b(Figure)f(2)g(w)o(e)h(plot)f(the)h(sp)q(eedups)g(obtained)g(on)g(an) f(Ethernet)150 2023 y(net)o(w)o(ork)c(using)i(the)f(three)h(di\013eren)o(t)f (sets)g(of)g(lo)q(ci)h(from)f(the)g(RP01-3)f(data)g(set.)221 2080 y(Figures)e(3)f(and)h(4)g(presen)o(t)f(sp)q(eedups)j(using)e(an)g(A)l (TM)g(net)o(w)o(ork)e(in)j(place)g(of)e(the)h(Ethernet)150 2136 y(net)o(w)o(ork)17 b(with)h(the)g(same)g(runs)g(as)g(in)h(the)f (previous)g(\014gures.)29 b(While)19 b(the)f(p)q(erformance)g(of)150 2193 y(the)h(program)f(on)h(an)g(Ethernet)g(net)o(w)o(ork)f(is)h(reasonable,) h(b)q(etter)f(sp)q(eedups)i(are)d(obtained)150 2249 y(with)i(the)g(A)l(TM)g (net)o(w)o(ork.)33 b(The)20 b(faster)f(net)o(w)o(ork)g(remo)o(v)o(es)g(part)h (of)f(the)h(comm)o(unication)150 2305 y(b)q(ottlenec)o(k,)c(closing)g(the)f (gap)g(in)h(p)q(erformance)f(b)q(et)o(w)o(een)h(di\013eren)o(t)f(data)g(sets) g(and)g(lo)q(ci.)221 2362 y(T)l(o)g(determine)h(the)g(di\013erence)h(b)q(et)o (w)o(een)e(the)h(p)q(erformance)g(obtained)g(using)g(a)f(net)o(w)o(ork)150 2418 y(of)e(w)o(orkstations)g(and)h(the)g(p)q(erformance)g(that)f(is)i(p)q (ossible)h(on)d(a)h(hardw)o(are)f(shared-memory)150 2475 y(system,)g(w)o(e)g (presen)o(t)h(results)g(for)f(the)g(same)g(program)g(running)h(on)g(an)f(SGI) h(shared-memory)150 2531 y(m)o(ultipro)q(cessor.)20 b(Figures)14 b(5)f(and)h(6)f(sho)o(w)g(that)g(the)g(sp)q(eedups)i(ac)o(hiev)o(ed)g(are)e (sligh)o(tly)i(b)q(etter)952 2678 y(12)p eop %%Page: 13 13 13 12 bop 525 253 a 14208860 13924678 3552215 20562194 30812571 47297085 startTexFig 525 253 a %%BeginDocument: newetherfig2.ps %!PS-Adobe-2.0 EPSF-2.0 %%Creator: Informix Wingz Version 1.1b %%CreationDate: Tue Nov 2 15:04:32 1993 %%For: Sandhya Dwarkadas (sandhya) %%BoundingBox: 54.0 312.582 468.406 719.0 %%Pages: (atend) %%EndComments %%BeginProlog /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 1.000 1.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def %%EndProlog %%Page: 1 1 save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 54 719 TR [1 0 0 -1 0 0] CN 1.000 1.000 SL 1.0 LW GS 0 0 414 399 CR 1.000 1.000 1.000 SC 0 0 413 398 DR FL GS 0 0 414 399 CR GS 40 16 413 398 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 12.000 SF 39 6 414 406 DR FL 0.000 0.000 0.000 SC 39 6 414 406 DR SP FL 1.000 1.000 1.000 SC 106 355 348 393 DR FL 0.000 0.000 0.000 SC 106 355 348 393 DR SP FL 137 380 MT (2x6x6) SH 119 374 MT 119 374 130 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 123 372 MT 0.000 0.000 0.000 SC 123 372 127 376 DL FL 123 376 MT 123 376 127 372 DL FL 219 380 MT (3x5x2x3) SH 202 374 MT 202 374 213 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 207 371 MT 0.000 0.000 0.000 SC 207 371 205 375 DL FL 205 375 209 375 DL FL 209 375 207 371 DL FL 302 380 MT (2x6x9) SH 284 374 MT 284 374 295 374 DL FL GS NP 290 374 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 1.000 1.000 1.000 SC 52 19 401 343 DR FL 0.000 0.000 0.000 SC 52 19 401 343 DR SP FL 1.000 1.000 1.000 SC 125 38 385 265 DR FL 217 304 293 330 DR FL 0.000 0.000 0.000 SC 217 304 293 330 DR SP FL 224 323 MT (Processors) SH 125 265 MT 125 265 125 274 DL FL 122 292 MT (1) SH 162 265 MT 0.000 0.000 1.000 SC 162 265 162 38 DL FL 162 265 MT 0.000 0.000 0.000 SC 162 265 162 274 DL FL 159 292 MT (2) SH 199 265 MT 0.000 0.000 1.000 SC 199 265 199 38 DL FL 199 265 MT 0.000 0.000 0.000 SC 199 265 199 274 DL FL 196 292 MT (3) SH 236 265 MT 0.000 0.000 1.000 SC 236 265 236 38 DL FL 236 265 MT 0.000 0.000 0.000 SC 236 265 236 274 DL FL 233 292 MT (4) SH 273 265 MT 0.000 0.000 1.000 SC 273 265 273 38 DL FL 273 265 MT 0.000 0.000 0.000 SC 273 265 273 274 DL FL 270 292 MT (5) SH 310 265 MT 0.000 0.000 1.000 SC 310 265 310 38 DL FL 310 265 MT 0.000 0.000 0.000 SC 310 265 310 274 DL FL 307 292 MT (6) SH 347 265 MT 0.000 0.000 1.000 SC 347 265 347 38 DL FL 347 265 MT 0.000 0.000 0.000 SC 347 265 347 274 DL FL 344 292 MT (7) SH 385 265 MT 385 265 385 274 DL FL 382 292 MT (8) SH 1.000 1.000 1.000 SC 65 119 91 183 DR FL 0.000 0.000 0.000 SC 65 119 91 183 DR SP FL GS 84 176 MT 270 RO (Speedup) SH GR 125 257 MT 125 257 121 257 DL FL 125 250 MT 125 250 121 250 DL FL 125 242 MT 125 242 121 242 DL FL 125 235 MT 125 235 121 235 DL FL 125 265 MT 125 265 116 265 DL FL 103 271 MT (1) SH 125 220 MT 125 220 121 220 DL FL 125 212 MT 125 212 121 212 DL FL 125 204 MT 125 204 121 204 DL FL 125 197 MT 125 197 121 197 DL FL 125 227 MT 0.000 0.000 1.000 SC 125 227 385 227 DL FL 125 227 MT 0.000 0.000 0.000 SC 125 227 116 227 DL FL 103 233 MT (2) SH 125 182 MT 125 182 121 182 DL FL 125 174 MT 125 174 121 174 DL FL 125 167 MT 125 167 121 167 DL FL 125 159 MT 125 159 121 159 DL FL 125 189 MT 0.000 0.000 1.000 SC 125 189 385 189 DL FL 125 189 MT 0.000 0.000 0.000 SC 125 189 116 189 DL FL 103 195 MT (3) SH 125 144 MT 125 144 121 144 DL FL 125 136 MT 125 136 121 136 DL FL 125 129 MT 125 129 121 129 DL FL 125 121 MT 125 121 121 121 DL FL 125 151 MT 0.000 0.000 1.000 SC 125 151 385 151 DL FL 125 151 MT 0.000 0.000 0.000 SC 125 151 116 151 DL FL 103 157 MT (4) SH 125 106 MT 125 106 121 106 DL FL 125 99 MT 125 99 121 99 DL FL 125 91 MT 125 91 121 91 DL FL 125 83 MT 125 83 121 83 DL FL 125 114 MT 0.000 0.000 1.000 SC 125 114 385 114 DL FL 125 114 MT 0.000 0.000 0.000 SC 125 114 116 114 DL FL 103 120 MT (5) SH 125 68 MT 125 68 121 68 DL FL 125 61 MT 125 61 121 61 DL FL 125 53 MT 125 53 121 53 DL FL 125 46 MT 125 46 121 46 DL FL 125 76 MT 0.000 0.000 1.000 SC 125 76 385 76 DL FL 125 76 MT 0.000 0.000 0.000 SC 125 76 116 76 DL FL 103 82 MT (6) SH 125 38 MT 125 38 116 38 DL FL 103 44 MT (7) SH GS 125 38 386 266 CR 125 265 MT 125 265 162 233 DL FL 162 233 MT 162 233 199 205 DL FL 199 205 MT 199 205 236 183 DL FL 236 183 MT 236 183 273 167 DL FL 273 167 MT 273 167 310 159 DL FL 310 159 MT 310 159 347 156 DL FL 347 156 MT 347 156 385 158 DL FL 385 158 MT 385 158 MT GS NP 125 265 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 162 233 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 199 205 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 236 183 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 273 167 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 310 159 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 347 156 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 385 158 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 125 265 MT 125 265 162 234 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 162 234 MT 162 234 199 211 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 199 211 MT 199 211 236 189 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 236 189 MT 236 189 273 177 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 273 177 MT 273 177 310 173 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 310 173 MT 310 173 347 170 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 347 170 MT 347 170 385 170 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 385 170 MT 385 170 MT 125 262 MT 0.000 0.000 0.000 SC 125 262 123 266 DL FL 123 266 127 266 DL FL 127 266 125 262 DL FL 162 231 MT 162 231 160 235 DL FL 160 235 164 235 DL FL 164 235 162 231 DL FL 199 208 MT 199 208 197 212 DL FL 197 212 201 212 DL FL 201 212 199 208 DL FL 236 186 MT 236 186 234 190 DL FL 234 190 238 190 DL FL 238 190 236 186 DL FL 273 174 MT 273 174 271 178 DL FL 271 178 275 178 DL FL 275 178 273 174 DL FL 310 170 MT 310 170 308 174 DL FL 308 174 312 174 DL FL 312 174 310 170 DL FL 347 167 MT 347 167 345 171 DL FL 345 171 349 171 DL FL 349 171 347 167 DL FL 385 167 MT 385 167 383 171 DL FL 383 171 387 171 DL FL 387 171 385 167 DL FL 125 265 MT 125 265 162 247 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 162 247 MT 162 247 199 231 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 199 231 MT 199 231 236 221 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 236 221 MT 236 221 273 217 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 273 217 MT 273 217 310 217 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 310 217 MT 310 217 347 218 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 347 218 MT 347 218 385 221 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 385 221 MT 385 221 MT 123 263 MT 0.000 0.000 0.000 SC 123 263 127 267 DL FL 123 267 MT 123 267 127 263 DL FL 160 245 MT 160 245 164 249 DL FL 160 249 MT 160 249 164 245 DL FL 197 229 MT 197 229 201 233 DL FL 197 233 MT 197 233 201 229 DL FL 234 219 MT 234 219 238 223 DL FL 234 223 MT 234 223 238 219 DL FL 271 215 MT 271 215 275 219 DL FL 271 219 MT 271 219 275 215 DL FL 308 215 MT 308 215 312 219 DL FL 308 219 MT 308 219 312 215 DL FL 345 216 MT 345 216 349 220 DL FL 345 220 MT 345 220 349 216 DL FL 383 219 MT 383 219 387 223 DL FL 383 223 MT 383 223 387 219 DL FL GR 385 265 MT 385 265 385 38 DL FL 125 38 MT 125 38 385 38 DL FL 125 265 MT 125 265 385 265 DL FL 125 265 MT 125 265 125 38 DL FL GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF showpage restore %%Trailer %%Pages: 1 %%EndDocument endTexFig 217 1233 a Fj(Figure)16 b(2:)j(Sp)q(eedup)e(on)e(an)g(Ethernet)h(Net)o(w)o (ork)e(-)h(RP01-3)f(p)q(edigree,)i(di\013eren)o(t)f(lo)q(ci)525 1474 y 14208860 13782590 3552215 20623568 30812571 47297085 startTexFig 525 1474 a %%BeginDocument: newatmfig3.ps %!PS-Adobe-2.0 EPSF-2.0 %%Creator: Informix Wingz Version 1.1b %%CreationDate: Tue Nov 2 14:38:49 1993 %%For: Sandhya Dwarkadas (sandhya) %%BoundingBox: 54.0 313.515 468.406 719.0 %%Pages: (atend) %%EndComments %%BeginProlog /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 1.000 1.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def %%EndProlog %%Page: 1 1 save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 54 719 TR [1 0 0 -1 0 0] CN 1.000 1.000 SL 1.0 LW GS 0 0 414 399 CR 1.000 1.000 1.000 SC 0 0 413 398 DR FL GS 0 0 414 399 CR GS 40 16 413 398 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 12.000 SF 39 6 414 406 DR FL 0.000 0.000 0.000 SC 39 6 414 406 DR SP FL 1.000 1.000 1.000 SC 107 355 346 393 DR FL 0.000 0.000 0.000 SC 107 355 346 393 DR SP FL 138 380 MT (BAD) SH 121 374 MT 121 374 132 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 124 372 MT 0.000 0.000 0.000 SC 124 372 128 376 DL FL 124 376 MT 124 376 128 372 DL FL 224 380 MT (RP01-3) SH 206 374 MT 206 374 217 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 212 371 MT 0.000 0.000 0.000 SC 212 371 210 375 DL FL 210 375 214 375 DL FL 214 375 212 371 DL FL 309 380 MT (CLP) SH 292 374 MT 292 374 303 374 DL FL GS NP 297 374 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 1.000 1.000 1.000 SC 52 19 401 343 DR FL 0.000 0.000 0.000 SC 52 19 401 343 DR SP FL 1.000 1.000 1.000 SC 125 38 385 265 DR FL 217 304 293 330 DR FL 0.000 0.000 0.000 SC 217 304 293 330 DR SP FL 224 323 MT (Processors) SH 125 265 MT 125 265 125 274 DL FL 122 292 MT (1) SH 162 265 MT 162 265 162 38 DL FL 162 265 MT 162 265 162 274 DL FL 159 292 MT (2) SH 199 265 MT 199 265 199 38 DL FL 199 265 MT 199 265 199 274 DL FL 196 292 MT (3) SH 236 265 MT 236 265 236 38 DL FL 236 265 MT 236 265 236 274 DL FL 233 292 MT (4) SH 273 265 MT 273 265 273 38 DL FL 273 265 MT 273 265 273 274 DL FL 270 292 MT (5) SH 310 265 MT 310 265 310 38 DL FL 310 265 MT 310 265 310 274 DL FL 307 292 MT (6) SH 347 265 MT 347 265 347 38 DL FL 347 265 MT 347 265 347 274 DL FL 344 292 MT (7) SH 385 265 MT 385 265 385 274 DL FL 382 292 MT (8) SH 1.000 1.000 1.000 SC 65 119 91 183 DR FL 0.000 0.000 0.000 SC 65 119 91 183 DR SP FL GS 84 176 MT 270 RO (Speedup) SH GR 125 257 MT 125 257 121 257 DL FL 125 250 MT 125 250 121 250 DL FL 125 242 MT 125 242 121 242 DL FL 125 235 MT 125 235 121 235 DL FL 125 265 MT 125 265 116 265 DL FL 103 271 MT (1) SH 125 220 MT 125 220 121 220 DL FL 125 212 MT 125 212 121 212 DL FL 125 204 MT 125 204 121 204 DL FL 125 197 MT 125 197 121 197 DL FL 125 227 MT 125 227 385 227 DL FL 125 227 MT 125 227 116 227 DL FL 103 233 MT (2) SH 125 182 MT 125 182 121 182 DL FL 125 174 MT 125 174 121 174 DL FL 125 167 MT 125 167 121 167 DL FL 125 159 MT 125 159 121 159 DL FL 125 189 MT 125 189 385 189 DL FL 125 189 MT 125 189 116 189 DL FL 103 195 MT (3) SH 125 144 MT 125 144 121 144 DL FL 125 136 MT 125 136 121 136 DL FL 125 129 MT 125 129 121 129 DL FL 125 121 MT 125 121 121 121 DL FL 125 151 MT 125 151 385 151 DL FL 125 151 MT 125 151 116 151 DL FL 103 157 MT (4) SH 125 106 MT 125 106 121 106 DL FL 125 99 MT 125 99 121 99 DL FL 125 91 MT 125 91 121 91 DL FL 125 83 MT 125 83 121 83 DL FL 125 114 MT 125 114 385 114 DL FL 125 114 MT 125 114 116 114 DL FL 103 120 MT (5) SH 125 68 MT 125 68 121 68 DL FL 125 61 MT 125 61 121 61 DL FL 125 53 MT 125 53 121 53 DL FL 125 46 MT 125 46 121 46 DL FL 125 76 MT 125 76 385 76 DL FL 125 76 MT 125 76 116 76 DL FL 103 82 MT (6) SH 125 38 MT 125 38 116 38 DL FL 103 44 MT (7) SH GS 125 38 386 266 CR 125 265 MT 125 265 162 231 DL FL 162 231 MT 162 231 199 197 DL FL 199 197 MT 199 197 236 170 DL FL 236 170 MT 236 170 273 155 DL FL 273 155 MT 273 155 310 122 DL FL 310 122 MT 310 122 347 91 DL FL 347 91 MT 347 91 385 86 DL FL 385 86 MT 385 86 MT GS NP 125 265 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 162 231 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 199 197 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 236 170 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 273 155 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 310 122 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 347 91 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 385 86 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 125 265 MT 125 265 162 231 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 162 231 MT 162 231 199 200 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 199 200 MT 199 200 236 169 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 236 169 MT 236 169 273 145 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 273 145 MT 273 145 310 128 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 310 128 MT 310 128 347 109 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 347 109 MT 347 109 385 99 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 385 99 MT 385 99 MT 125 262 MT 0.000 0.000 0.000 SC 125 262 123 266 DL FL 123 266 127 266 DL FL 127 266 125 262 DL FL 162 228 MT 162 228 160 232 DL FL 160 232 164 232 DL FL 164 232 162 228 DL FL 199 197 MT 199 197 197 201 DL FL 197 201 201 201 DL FL 201 201 199 197 DL FL 236 166 MT 236 166 234 170 DL FL 234 170 238 170 DL FL 238 170 236 166 DL FL 273 142 MT 273 142 271 146 DL FL 271 146 275 146 DL FL 275 146 273 142 DL FL 310 125 MT 310 125 308 129 DL FL 308 129 312 129 DL FL 312 129 310 125 DL FL 347 106 MT 347 106 345 110 DL FL 345 110 349 110 DL FL 349 110 347 106 DL FL 385 96 MT 385 96 383 100 DL FL 383 100 387 100 DL FL 387 100 385 96 DL FL 125 265 MT 125 265 162 241 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 162 241 MT 162 241 199 219 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 199 219 MT 199 219 236 206 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 236 206 MT 236 206 273 192 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 273 192 MT 273 192 310 191 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 310 191 MT 310 191 347 189 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 347 189 MT 347 189 385 184 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 385 184 MT 385 184 MT 123 263 MT 0.000 0.000 0.000 SC 123 263 127 267 DL FL 123 267 MT 123 267 127 263 DL FL 160 239 MT 160 239 164 243 DL FL 160 243 MT 160 243 164 239 DL FL 197 217 MT 197 217 201 221 DL FL 197 221 MT 197 221 201 217 DL FL 234 204 MT 234 204 238 208 DL FL 234 208 MT 234 208 238 204 DL FL 271 190 MT 271 190 275 194 DL FL 271 194 MT 271 194 275 190 DL FL 308 189 MT 308 189 312 193 DL FL 308 193 MT 308 193 312 189 DL FL 345 187 MT 345 187 349 191 DL FL 345 191 MT 345 191 349 187 DL FL 383 182 MT 383 182 387 186 DL FL 383 186 MT 383 186 387 182 DL FL GR 385 265 MT 385 265 385 38 DL FL 125 38 MT 125 38 385 38 DL FL 125 265 MT 125 265 385 265 DL FL 125 265 MT 125 265 125 38 DL FL GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF showpage restore %%Trailer %%Pages: 1 %%EndDocument endTexFig 369 2445 a Fj(Figure)g(3:)20 b(Sp)q(eedup)d(on)e(an)g(A)l(TM)g(Net)o(w)o (ork)f(-)h(Di\013eren)o(t)g(p)q(edigrees)952 2678 y(13)p eop %%Page: 14 14 14 13 bop 525 154 a 14208860 13782590 3552215 20623568 30812571 47297085 startTexFig 525 154 a %%BeginDocument: newatmfig4.ps %!PS-Adobe-2.0 EPSF-2.0 %%Creator: Informix Wingz Version 1.1b %%CreationDate: Tue Nov 2 14:44:24 1993 %%For: Sandhya Dwarkadas (sandhya) %%BoundingBox: 54.0 313.515 468.406 719.0 %%Pages: (atend) %%EndComments %%BeginProlog /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 1.000 1.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def %%EndProlog %%Page: 1 1 save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 54 719 TR [1 0 0 -1 0 0] CN 1.000 1.000 SL 1.0 LW GS 0 0 414 399 CR 1.000 1.000 1.000 SC 0 0 413 398 DR FL GS 0 0 414 399 CR GS 40 16 413 398 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 12.000 SF 39 6 415 408 DR FL 0.000 0.000 0.000 SC 39 6 415 408 DR SP FL 1.000 1.000 1.000 SC 106 357 348 395 DR FL 0.000 0.000 0.000 SC 106 357 348 395 DR SP FL 137 382 MT (2x6x6) SH 120 376 MT 120 376 131 376 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 123 374 MT 0.000 0.000 0.000 SC 123 374 127 378 DL FL 123 378 MT 123 378 127 374 DL FL 220 382 MT (3x5x2x3) SH 202 376 MT 202 376 213 376 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 208 373 MT 0.000 0.000 0.000 SC 208 373 206 377 DL FL 206 377 210 377 DL FL 210 377 208 373 DL FL 302 382 MT (2x6x9) SH 285 376 MT 285 376 296 376 DL FL GS NP 290 376 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 1.000 1.000 1.000 SC 52 19 402 345 DR FL 0.000 0.000 0.000 SC 52 19 402 345 DR SP FL 1.000 1.000 1.000 SC 125 38 386 267 DR FL 217 306 293 332 DR FL 0.000 0.000 0.000 SC 217 306 293 332 DR SP FL 224 325 MT (Processors) SH 125 267 MT 125 267 125 276 DL FL 122 294 MT (1) SH 162 267 MT 162 267 162 38 DL FL 162 267 MT 162 267 162 276 DL FL 159 294 MT (2) SH 199 267 MT 199 267 199 38 DL FL 199 267 MT 199 267 199 276 DL FL 196 294 MT (3) SH 237 267 MT 237 267 237 38 DL FL 237 267 MT 237 267 237 276 DL FL 234 294 MT (4) SH 274 267 MT 274 267 274 38 DL FL 274 267 MT 274 267 274 276 DL FL 271 294 MT (5) SH 311 267 MT 311 267 311 38 DL FL 311 267 MT 311 267 311 276 DL FL 308 294 MT (6) SH 348 267 MT 348 267 348 38 DL FL 348 267 MT 348 267 348 276 DL FL 345 294 MT (7) SH 386 267 MT 386 267 386 276 DL FL 383 294 MT (8) SH 1.000 1.000 1.000 SC 65 120 91 184 DR FL 0.000 0.000 0.000 SC 65 120 91 184 DR SP FL GS 84 177 MT 270 RO (Speedup) SH GR 125 259 MT 125 259 121 259 DL FL 125 252 MT 125 252 121 252 DL FL 125 244 MT 125 244 121 244 DL FL 125 236 MT 125 236 121 236 DL FL 125 267 MT 125 267 116 267 DL FL 103 273 MT (1) SH 125 221 MT 125 221 121 221 DL FL 125 214 MT 125 214 121 214 DL FL 125 206 MT 125 206 121 206 DL FL 125 198 MT 125 198 121 198 DL FL 125 229 MT 125 229 386 229 DL FL 125 229 MT 125 229 116 229 DL FL 103 235 MT (2) SH 125 183 MT 125 183 121 183 DL FL 125 175 MT 125 175 121 175 DL FL 125 168 MT 125 168 121 168 DL FL 125 160 MT 125 160 121 160 DL FL 125 191 MT 125 191 386 191 DL FL 125 191 MT 125 191 116 191 DL FL 103 197 MT (3) SH 125 145 MT 125 145 121 145 DL FL 125 137 MT 125 137 121 137 DL FL 125 130 MT 125 130 121 130 DL FL 125 122 MT 125 122 121 122 DL FL 125 152 MT 125 152 386 152 DL FL 125 152 MT 125 152 116 152 DL FL 103 158 MT (4) SH 125 107 MT 125 107 121 107 DL FL 125 99 MT 125 99 121 99 DL FL 125 91 MT 125 91 121 91 DL FL 125 84 MT 125 84 121 84 DL FL 125 114 MT 125 114 386 114 DL FL 125 114 MT 125 114 116 114 DL FL 103 120 MT (5) SH 125 69 MT 125 69 121 69 DL FL 125 61 MT 125 61 121 61 DL FL 125 53 MT 125 53 121 53 DL FL 125 46 MT 125 46 121 46 DL FL 125 76 MT 125 76 386 76 DL FL 125 76 MT 125 76 116 76 DL FL 103 82 MT (6) SH 125 38 MT 125 38 116 38 DL FL 103 44 MT (7) SH GS 125 38 387 268 CR 125 267 MT 125 267 162 232 DL FL 162 232 MT 162 232 199 201 DL FL 199 201 MT 199 201 237 170 DL FL 237 170 MT 237 170 274 146 DL FL 274 146 MT 274 146 311 128 DL FL 311 128 MT 311 128 348 110 DL FL 348 110 MT 348 110 386 100 DL FL 386 100 MT 386 100 MT GS NP 125 267 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 162 232 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 199 201 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 237 170 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 274 146 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 311 128 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 348 110 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 386 100 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 125 267 MT 125 267 162 233 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 162 233 MT 162 233 199 204 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 199 204 MT 199 204 237 177 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 237 177 MT 237 177 274 153 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 274 153 MT 274 153 311 138 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 311 138 MT 311 138 348 125 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 348 125 MT 348 125 386 121 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 386 121 MT 386 121 MT 125 264 MT 0.000 0.000 0.000 SC 125 264 123 268 DL FL 123 268 127 268 DL FL 127 268 125 264 DL FL 162 230 MT 162 230 160 234 DL FL 160 234 164 234 DL FL 164 234 162 230 DL FL 199 201 MT 199 201 197 205 DL FL 197 205 201 205 DL FL 201 205 199 201 DL FL 237 174 MT 237 174 235 178 DL FL 235 178 239 178 DL FL 239 178 237 174 DL FL 274 150 MT 274 150 272 154 DL FL 272 154 276 154 DL FL 276 154 274 150 DL FL 311 135 MT 311 135 309 139 DL FL 309 139 313 139 DL FL 313 139 311 135 DL FL 348 122 MT 348 122 346 126 DL FL 346 126 350 126 DL FL 350 126 348 122 DL FL 386 118 MT 386 118 384 122 DL FL 384 122 388 122 DL FL 388 122 386 118 DL FL 125 267 MT 125 267 162 238 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 162 238 MT 162 238 199 214 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 199 214 MT 199 214 237 196 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 237 196 MT 237 196 274 185 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 274 185 MT 274 185 311 178 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 311 178 MT 311 178 348 174 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 348 174 MT 348 174 386 172 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 386 172 MT 386 172 MT 123 265 MT 0.000 0.000 0.000 SC 123 265 127 269 DL FL 123 269 MT 123 269 127 265 DL FL 160 236 MT 160 236 164 240 DL FL 160 240 MT 160 240 164 236 DL FL 197 212 MT 197 212 201 216 DL FL 197 216 MT 197 216 201 212 DL FL 235 194 MT 235 194 239 198 DL FL 235 198 MT 235 198 239 194 DL FL 272 183 MT 272 183 276 187 DL FL 272 187 MT 272 187 276 183 DL FL 309 176 MT 309 176 313 180 DL FL 309 180 MT 309 180 313 176 DL FL 346 172 MT 346 172 350 176 DL FL 346 176 MT 346 176 350 172 DL FL 384 170 MT 384 170 388 174 DL FL 384 174 MT 384 174 388 170 DL FL GR 386 267 MT 386 267 386 38 DL FL 125 38 MT 125 38 386 38 DL FL 125 267 MT 125 267 386 267 DL FL 125 267 MT 125 267 125 38 DL FL GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF showpage restore %%Trailer %%Pages: 1 %%EndDocument endTexFig 252 1125 a Fj(Figure)16 b(4:)j(Sp)q(eedup)e(on)e(an)h(A)l(TM)e(Net)o(w)o (ork)g(-)i(RP01-3)e(p)q(edigree,)i(di\013eren)o(t)f(lo)q(ci)p 473 1185 1004 2 v 472 1241 2 57 v 481 1241 V 507 1224 a(RP01-3)p 678 1241 V 63 w(RP01-3)p 891 1241 V 49 w(RP01-3)p 1089 1241 V 64 w(BAD)p 1255 1241 V 120 w(CLP)p 1467 1241 V 1476 1241 V 472 1298 V 481 1298 V 538 1281 a(2x6x6)p 678 1298 V 49 w(3x5x2x3)p 891 1298 V 80 w(2x6x9)p 1089 1298 V 49 w(2x4x4)p 1255 1298 V 49 w(2x4x4x4)p 1467 1298 V 1476 1298 V 473 1299 1004 2 v 472 1356 2 57 v 481 1356 V 586 1339 a(904)p 678 1356 V 121 w(9585)p 891 1356 V 106 w(4808)p 1089 1356 V 96 w(936)p 1255 1356 V 121 w(6208)p 1467 1356 V 1476 1356 V 473 1358 1004 2 v 205 1433 a(T)l(able)h(2:)k(Unipro)q(cessor)c(Execution)g(Times)f(in)h (Seconds)g(on)f(an)h(SGI)f(Multipro)q(cessor)150 1566 y(than)d(those)g (obtained)h(using)g(the)f(A)l(TM)g(net)o(w)o(ork)f(for)g(the)i(larger)f (problems.)19 b(On)13 b(the)f(smaller)150 1623 y(problems,)g(the)g(SGI)f(mac) o(hine)h(do)q(es)g(m)o(uc)o(h)f(b)q(etter.)18 b(The)12 b(SGI)f(unipro)q (cessor)h(execution)h(times)150 1679 y(are)i(presen)o(ted)h(in)g(T)l(able)g (2.)221 1736 y(Tw)o(o)e(factors)h(con)o(tribute)h(to)e(the)i(less)g(than)g(p) q(erfect)g(sp)q(eedup)h(observ)o(ed)e(in)i(the)f(exp)q(eri-)150 1792 y(men)o(ts:)k(load)15 b(im)o(balance)h(and)g(|)e(on)h(T)l(readMarks)g(|) f(comm)o(unication)i(o)o(v)o(erhead.)221 1849 y(P)o(erfect)c(load)h (balancing)g(cannot)g(b)q(e)g(ac)o(hiev)o(ed)h(b)q(ecause)f(of)f(imp)q (erfect)i(kno)o(wledge)f(of)f(the)150 1905 y(com)o(bined)i(genot)o(yp)q(es)f (p)q(ossible)h(for)e(the)h(t)o(w)o(o)f(paren)o(ts.)18 b(While)c(our)f(load)g (balancing)h(strategy)150 1962 y(tak)o(es)h(adv)m(an)o(tage)g(of)h(the)g (sparsit)o(y)f(of)h(eac)o(h)g(paren)o(t's)f Fb(genarray)p Fj(,)f(it)i(ma)o(y) f(b)q(e)i(the)f(case)g(that)150 2018 y(a)i(pair)g(of)g(genot)o(yp)q(es)g(\()p Fe(i;)8 b(j)s Fj(\))15 b(is)k(not)f(sim)o(ultaneously)h(p)q(ossible,)h (although)e Fe(i)g Fj(is)h(p)q(ossible)h(for)150 2075 y(the)g(\014rst)g (paren)o(t)g(and)h Fe(j)h Fj(is)f(p)q(ossible)h(for)d(the)i(second)g(paren)o (t.)34 b(An)21 b(alternativ)o(e)f(strategy)150 2131 y(w)o(ould)g(b)q(e)h(to)e (determine)i(the)f(p)q(ossible)h(com)o(binations)f(on)g(the)g(master)f(pro)q (cessor)h(b)q(efore)150 2187 y(distributing)k(the)f(w)o(ork.)40 b(The)23 b(increase)g(in)h(sequen)o(tial)f(computation)g(w)o(ould,)h(ho)o(w)o (ev)o(er,)150 2244 y(out)o(w)o(eigh)18 b(the)g(b)q(ene\014ts)h(of)e(b)q (etter)h(load)g(balancing.)30 b(Load)18 b(im)o(balance)h(as)e(a)h(result)g (of)g(the)150 2300 y(unequal)g(assignmen)o(t)f(of)g(p)q(ossible)i(genot)o(yp) q(e)e(pairs)g(is)h(presen)o(t)f(to)f(some)h(degree)g(in)h(all)g(the)150 2357 y(data)d(sets.)221 2413 y(The)d(problem)g(of)g(deciding)i(whether)e(a)g (pair)g(of)f(paren)o(tal)h(genot)o(yp)q(es)g(\()p Fe(i;)c(j)s Fj(\))h(is)k(compatible)150 2470 y(with)h(the)f(c)o(hildren)i(is)f (di\013eren)o(t)f(from)g(the)g(problem)h(of)f(genot)o(yp)q(e)g(elimination)j (as)c(addressed)150 2526 y(in)22 b([12])f(or)g(in)h(the)g Fb(unknown)f Fj(prepro)q(cessor)g(program)g(that)g(is)h(part)f(of)g(LINKA)o(GE.)h(The)952 2678 y(14)p eop %%Page: 15 15 15 14 bop 525 255 a 14208860 13782590 3552215 20623568 30812571 47297085 startTexFig 525 255 a %%BeginDocument: sgi5.ps %!PS-Adobe-2.0 EPSF-2.0 %%Creator: Informix Wingz Version 1.1b %%CreationDate: Tue Nov 2 14:31:37 1993 %%For: Sandhya Dwarkadas (sandhya) %%BoundingBox: 54.0 313.515 468.406 719.0 %%Pages: (atend) %%EndComments %%BeginProlog /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 1.000 1.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def %%EndProlog %%Page: 1 1 save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 54 719 TR [1 0 0 -1 0 0] CN 1.000 1.000 SL 1.0 LW GS 0 0 414 399 CR 1.000 1.000 1.000 SC 0 0 413 398 DR FL GS 0 0 414 399 CR GS 40 16 413 398 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 12.000 SF 39 6 414 406 DR FL 0.000 0.000 0.000 SC 39 6 414 406 DR SP FL 1.000 1.000 1.000 SC 107 355 346 393 DR FL 0.000 0.000 0.000 SC 107 355 346 393 DR SP FL 138 380 MT (BAD) SH 121 374 MT 121 374 132 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 124 372 MT 0.000 0.000 0.000 SC 124 372 128 376 DL FL 124 376 MT 124 376 128 372 DL FL 224 380 MT (RP01-3) SH 206 374 MT 206 374 217 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 212 371 MT 0.000 0.000 0.000 SC 212 371 210 375 DL FL 210 375 214 375 DL FL 214 375 212 371 DL FL 309 380 MT (CLP) SH 292 374 MT 292 374 303 374 DL FL GS NP 297 374 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 1.000 1.000 1.000 SC 52 19 401 343 DR FL 0.000 0.000 0.000 SC 52 19 401 343 DR SP FL 1.000 1.000 1.000 SC 125 38 385 265 DR FL 217 304 293 330 DR FL 0.000 0.000 0.000 SC 217 304 293 330 DR SP FL 224 323 MT (Processors) SH 125 265 MT 125 265 125 274 DL FL 122 292 MT (1) SH 162 265 MT 162 265 162 38 DL FL 162 265 MT 162 265 162 274 DL FL 159 292 MT (2) SH 199 265 MT 199 265 199 38 DL FL 199 265 MT 199 265 199 274 DL FL 196 292 MT (3) SH 236 265 MT 236 265 236 38 DL FL 236 265 MT 236 265 236 274 DL FL 233 292 MT (4) SH 273 265 MT 273 265 273 38 DL FL 273 265 MT 273 265 273 274 DL FL 270 292 MT (5) SH 310 265 MT 310 265 310 38 DL FL 310 265 MT 310 265 310 274 DL FL 307 292 MT (6) SH 347 265 MT 347 265 347 38 DL FL 347 265 MT 347 265 347 274 DL FL 344 292 MT (7) SH 385 265 MT 385 265 385 274 DL FL 382 292 MT (8) SH 1.000 1.000 1.000 SC 65 119 91 183 DR FL 0.000 0.000 0.000 SC 65 119 91 183 DR SP FL GS 84 176 MT 270 RO (Speedup) SH GR 125 257 MT 125 257 121 257 DL FL 125 250 MT 125 250 121 250 DL FL 125 242 MT 125 242 121 242 DL FL 125 235 MT 125 235 121 235 DL FL 125 265 MT 125 265 116 265 DL FL 103 271 MT (1) SH 125 220 MT 125 220 121 220 DL FL 125 212 MT 125 212 121 212 DL FL 125 204 MT 125 204 121 204 DL FL 125 197 MT 125 197 121 197 DL FL 125 227 MT 125 227 385 227 DL FL 125 227 MT 125 227 116 227 DL FL 103 233 MT (2) SH 125 182 MT 125 182 121 182 DL FL 125 174 MT 125 174 121 174 DL FL 125 167 MT 125 167 121 167 DL FL 125 159 MT 125 159 121 159 DL FL 125 189 MT 125 189 385 189 DL FL 125 189 MT 125 189 116 189 DL FL 103 195 MT (3) SH 125 144 MT 125 144 121 144 DL FL 125 136 MT 125 136 121 136 DL FL 125 129 MT 125 129 121 129 DL FL 125 121 MT 125 121 121 121 DL FL 125 151 MT 125 151 385 151 DL FL 125 151 MT 125 151 116 151 DL FL 103 157 MT (4) SH 125 106 MT 125 106 121 106 DL FL 125 99 MT 125 99 121 99 DL FL 125 91 MT 125 91 121 91 DL FL 125 83 MT 125 83 121 83 DL FL 125 114 MT 125 114 385 114 DL FL 125 114 MT 125 114 116 114 DL FL 103 120 MT (5) SH 125 68 MT 125 68 121 68 DL FL 125 61 MT 125 61 121 61 DL FL 125 53 MT 125 53 121 53 DL FL 125 46 MT 125 46 121 46 DL FL 125 76 MT 125 76 385 76 DL FL 125 76 MT 125 76 116 76 DL FL 103 82 MT (6) SH 125 38 MT 125 38 116 38 DL FL 103 44 MT (7) SH GS 125 38 386 266 CR 125 265 MT 125 265 162 229 DL FL 162 229 MT 162 229 199 193 DL FL 199 193 MT 199 193 236 166 DL FL 236 166 MT 236 166 273 146 DL FL 273 146 MT 273 146 310 107 DL FL 310 107 MT 310 107 347 72 DL FL 347 72 MT 347 72 385 67 DL FL 385 67 MT 385 67 MT GS NP 125 265 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 162 229 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 199 193 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 236 166 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 273 146 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 310 107 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 347 72 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 385 67 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 125 265 MT 125 265 162 231 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 162 231 MT 162 231 199 199 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 199 199 MT 199 199 236 164 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 236 164 MT 236 164 273 134 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 273 134 MT 273 134 310 111 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 310 111 MT 310 111 347 82 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 347 82 MT 347 82 385 52 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 385 52 MT 385 52 MT 125 262 MT 0.000 0.000 0.000 SC 125 262 123 266 DL FL 123 266 127 266 DL FL 127 266 125 262 DL FL 162 228 MT 162 228 160 232 DL FL 160 232 164 232 DL FL 164 232 162 228 DL FL 199 196 MT 199 196 197 200 DL FL 197 200 201 200 DL FL 201 200 199 196 DL FL 236 161 MT 236 161 234 165 DL FL 234 165 238 165 DL FL 238 165 236 161 DL FL 273 131 MT 273 131 271 135 DL FL 271 135 275 135 DL FL 275 135 273 131 DL FL 310 108 MT 310 108 308 112 DL FL 308 112 312 112 DL FL 312 112 310 108 DL FL 347 79 MT 347 79 345 83 DL FL 345 83 349 83 DL FL 349 83 347 79 DL FL 385 49 MT 385 49 383 53 DL FL 383 53 387 53 DL FL 387 53 385 49 DL FL 125 265 MT 125 265 162 236 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 162 236 MT 162 236 199 205 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 199 205 MT 199 205 236 180 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 236 180 MT 236 180 273 157 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 273 157 MT 273 157 310 134 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 310 134 MT 310 134 347 121 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 347 121 MT 347 121 385 98 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 385 98 MT 385 98 MT 123 263 MT 0.000 0.000 0.000 SC 123 263 127 267 DL FL 123 267 MT 123 267 127 263 DL FL 160 234 MT 160 234 164 238 DL FL 160 238 MT 160 238 164 234 DL FL 197 203 MT 197 203 201 207 DL FL 197 207 MT 197 207 201 203 DL FL 234 178 MT 234 178 238 182 DL FL 234 182 MT 234 182 238 178 DL FL 271 155 MT 271 155 275 159 DL FL 271 159 MT 271 159 275 155 DL FL 308 132 MT 308 132 312 136 DL FL 308 136 MT 308 136 312 132 DL FL 345 119 MT 345 119 349 123 DL FL 345 123 MT 345 123 349 119 DL FL 383 96 MT 383 96 387 100 DL FL 383 100 MT 383 100 387 96 DL FL GR 385 265 MT 385 265 385 38 DL FL 125 38 MT 125 38 385 38 DL FL 125 265 MT 125 265 385 265 DL FL 125 265 MT 125 265 125 38 DL FL GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF showpage restore %%Trailer %%Pages: 1 %%EndDocument endTexFig 319 1226 a Fj(Figure)15 b(5:)20 b(Sp)q(eedup)d(on)e(an)g(SGI)h(Multipro)q (cessor)g(-)f(Di\013eren)o(t)g(p)q(edigrees)525 1472 y 14208860 13782590 3552215 20623568 30812571 47297085 startTexFig 525 1472 a %%BeginDocument: sgi6.ps %!PS-Adobe-2.0 EPSF-2.0 %%Creator: Informix Wingz Version 1.1b %%CreationDate: Tue Nov 2 14:24:46 1993 %%For: Sandhya Dwarkadas (sandhya) %%BoundingBox: 54.0 313.515 468.406 719.0 %%Pages: (atend) %%EndComments %%BeginProlog /AC /arc load def /AN /arcn load def /AT /arcto load def /CL /clip load def /CN /concat load def /CP /closepath load def /CR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP CL NP } bind def /DL { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y2 LT SP } bind def /DR { /y2 exch def /x2 exch def /y1 exch def /x1 exch def NP x1 y1 MT x2 y1 LT x2 y2 LT x1 y2 LT CP } bind def /DS { scrfreq scrang scrproc cvx setscreen } bind def /EC /eoclip load def /EF /eofill load def /FL /fill load def /GS /gsave load def /GR /grestore load def /LT /lineto load def /LW /setlinewidth load def /MOF { /uid exch def /sw exch def /nfn exch def /bfn exch def /bfd bfn findfont def /nent bfd maxlength 1 add def bfd /UniqueID known not { /nent nent 1 add def } if /ofd nent dict def bfd { exch dup /FID ne { exch ofd 3 1 roll put } { pop pop } ifelse } forall ofd /FontName nfn put ofd /PaintType get 0 eq { ofd /PaintType 2 put } if ofd /StrokeWidth sw put ofd /UniqueID uid put nfn ofd definefont pop } bind def /MT /moveto load def /NP /newpath load def /RE { /nfn exch def /bfn exch def /bfd bfn findfont def /nf bfd maxlength dict def bfd { exch dup /FID ne {dup /Encoding eq {exch dup length array copy nf 3 1 roll put } {exch nf 3 1 roll put} ifelse } {pop pop} ifelse } forall bfn (Symbol) ne { nf /FontName nfn put vect aload pop vect length 2 idiv {nf /Encoding get 3 1 roll put} repeat } if nfn nf definefont pop } bind def /RL /rlineto load def /RM /rmoveto load def /RO /rotate load def /SF { /s exch def /f exch def f findfont [s 0 0 s neg 0 0 ] makefont setfont } bind def /SG /setgray load def /SH /show load def /SL /scale load def /SK /stroke load def /SP /strokepath load def /SC /setrgbcolor load def /SD { /stl exch def /hud exch def /sz exch def /udof exch def /sof exch def /uw exch def /str exch def /len str stringwidth pop def currentrgbcolor /blue exch def /green exch def /red exch def 0.333 SG GS sof 0 RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW sof udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def sof yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if red green blue SC str stringwidth pop /x exch def /xoff sof x add def /yoff sof neg def xoff neg yoff RM str SH hud 1 eq { GS str stringwidth pop neg 0 RM stl 2 eq { uw LW 0 udof RM len 0 RL } if stl 6 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if GR str stringwidth pop sof RM } bind def /CF { /cliptype exch def /pndex exch def /bgb exch def /bgg exch def /bgr exch def /fgb exch def /fgg exch def /fgr exch def GS 1.000 1.000 SL GS flattenpath pathbbox 2 index sub /height exch cvi def 2 index sub /width exch cvi def /iy exch cvi def /ix exch cvi def GR cliptype cvx exec pndex 1 eq { fgr fgg fgb SC FL } { bgr bgg bgb SC FL pndex 20 ne { fgr fgg fgb SC ix iy TR 0 8 height { /yoff exch def 0 8 width { /xoff exch def GS xoff yoff TR 8 8 true matrix {pats pndex get} imagemask GR } for } for } if } ifelse GR } bind def /ST { /stl exch def /hud exch def /sz exch def /udof exch def /uw exch def /str exch def /len str stringwidth pop def hud 1 eq { GS stl 0 eq { uw LW 0 udof RM len 0 RL } if stl 4 eq { sz 72 div LW /off uw 2 div def /yoff udof off sub def 0 yoff RM len 0 RL GS SK GR len neg uw RM len 0 RL } if SK GR } if str SH } bind def /TR /translate load def /vect [ 8#260 /Adieresis 8#265 /Aring 8#276 /Ccedilla 8#300 /Eacute 8#311 /Ntilde 8#314 /Odieresis 8#321 /Udieresis 8#322 /aacute 8#323 /agrave 8#324 /acircumflex 8#325 /adieresis 8#326 /atilde 8#327 /aring 8#330 /ccedilla 8#331 /eacute 8#332 /egrave 8#333 /ecircumflex 8#334 /edieresis 8#335 /iacute 8#336 /igrave 8#337 /icircumflex 8#340 /idieresis 8#342 /ntilde 8#344 /oacute 8#345 /ograve 8#346 /ocircumflex 8#347 /odieresis 8#354 /otilde 8#355 /uacute 8#356 /ugrave 8#357 /ucircumflex 8#360 /udieresis 8#362 /Agrave 8#363 /Atilde 8#364 /Otilde 8#366 /ydieresis 8#367 /Ydieresis 8#374 /Acircumflex 8#375 /Ecircumflex 8#376 /Aacute 8#377 /Edieresis 8#177 /Egrave 8#200 /Iacute 8#201 /Icircumflex 8#202 /Idieresis 8#203 /Igrave 8#204 /Oacute 8#205 /Ocircumflex 8#206 /Ograve 8#207 /Uacute 8#210 /Ucircumflex 8#211 /Ugrave 8#365 /dotlessi ]def /pats [ <00 00 00 00 00 00 00 00>
<55 ff 55 ff 55 ff 55 ff> <88 88 88 88 88 88 88 88> <80 10 02 20 01 08 40 04> <80 00 00 00 00 00 00 00> <80 40 20 00 02 04 08 00> <82 44 39 44 82 01 01 01> <55 A0 40 40 55 0A 04 04> <20 50 88 88 88 88 05 02> <00 00 00 00 00 00 00 00> <80 00 08 00 80 00 08 00> <88 00 22 00 88 00 22 00> <88 22 88 22 88 22 88 22> <11 22 44 88 11 22 44 88> <01 02 04 08 10 20 40 80> <08 1C 22 C1 80 01 02 04> <88 14 22 41 88 00 AA 00> <40 A0 00 00 04 0A 00 00> <03 84 48 30 0C 02 01 01> <80 80 41 3E 08 08 14 E3> <10 20 54 AA FF 02 04 08> <77 89 8F 8F 77 98 F8 F8> <00 08 14 2A 55 2A 14 08> ] def /BEPSF { /IS save def /dcnt countdictstack def /opcnt count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EEPSF { count opcnt sub {pop} repeat countdictstack dcnt sub {end} repeat IS restore } bind def %%EndProlog %%Page: 1 1 save currentscreen /scrproc exch cvlit def /scrang exch def /scrfreq exch def 2 setlinecap 54 719 TR [1 0 0 -1 0 0] CN 1.000 1.000 SL 1.0 LW GS 0 0 414 399 CR 1.000 1.000 1.000 SC 0 0 413 398 DR FL GS 0 0 414 399 CR GS 40 16 413 398 CR /Helvetica /Helvetica-Wingz RE /Helvetica-Wingz 12.000 SF 39 6 414 406 DR FL 0.000 0.000 0.000 SC 39 6 414 406 DR SP FL 1.000 1.000 1.000 SC 106 355 348 393 DR FL 0.000 0.000 0.000 SC 106 355 348 393 DR SP FL 137 380 MT (2x6x6) SH 119 374 MT 119 374 130 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 123 372 MT 0.000 0.000 0.000 SC 123 372 127 376 DL FL 123 376 MT 123 376 127 372 DL FL 219 380 MT (3x5x2x3) SH 202 374 MT 202 374 213 374 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 207 371 MT 0.000 0.000 0.000 SC 207 371 205 375 DL FL 205 375 209 375 DL FL 209 375 207 371 DL FL 302 380 MT (2x6x9) SH 284 374 MT 284 374 295 374 DL FL GS NP 290 374 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 1.000 1.000 1.000 SC 52 19 401 343 DR FL 0.000 0.000 0.000 SC 52 19 401 343 DR SP FL 1.000 1.000 1.000 SC 125 38 385 265 DR FL 217 304 293 330 DR FL 0.000 0.000 0.000 SC 217 304 293 330 DR SP FL 224 323 MT (Processors) SH 125 265 MT 125 265 125 274 DL FL 122 292 MT (1) SH 162 265 MT 162 265 162 38 DL FL 162 265 MT 162 265 162 274 DL FL 159 292 MT (2) SH 199 265 MT 199 265 199 38 DL FL 199 265 MT 199 265 199 274 DL FL 196 292 MT (3) SH 236 265 MT 236 265 236 38 DL FL 236 265 MT 236 265 236 274 DL FL 233 292 MT (4) SH 273 265 MT 273 265 273 38 DL FL 273 265 MT 273 265 273 274 DL FL 270 292 MT (5) SH 310 265 MT 310 265 310 38 DL FL 310 265 MT 310 265 310 274 DL FL 307 292 MT (6) SH 347 265 MT 347 265 347 38 DL FL 347 265 MT 347 265 347 274 DL FL 344 292 MT (7) SH 385 265 MT 385 265 385 274 DL FL 382 292 MT (8) SH 1.000 1.000 1.000 SC 65 119 91 183 DR FL 0.000 0.000 0.000 SC 65 119 91 183 DR SP FL GS 84 176 MT 270 RO (Speedup) SH GR 125 257 MT 125 257 121 257 DL FL 125 250 MT 125 250 121 250 DL FL 125 242 MT 125 242 121 242 DL FL 125 235 MT 125 235 121 235 DL FL 125 265 MT 125 265 116 265 DL FL 103 271 MT (1) SH 125 220 MT 125 220 121 220 DL FL 125 212 MT 125 212 121 212 DL FL 125 204 MT 125 204 121 204 DL FL 125 197 MT 125 197 121 197 DL FL 125 227 MT 125 227 385 227 DL FL 125 227 MT 125 227 116 227 DL FL 103 233 MT (2) SH 125 182 MT 125 182 121 182 DL FL 125 174 MT 125 174 121 174 DL FL 125 167 MT 125 167 121 167 DL FL 125 159 MT 125 159 121 159 DL FL 125 189 MT 125 189 385 189 DL FL 125 189 MT 125 189 116 189 DL FL 103 195 MT (3) SH 125 144 MT 125 144 121 144 DL FL 125 136 MT 125 136 121 136 DL FL 125 129 MT 125 129 121 129 DL FL 125 121 MT 125 121 121 121 DL FL 125 151 MT 125 151 385 151 DL FL 125 151 MT 125 151 116 151 DL FL 103 157 MT (4) SH 125 106 MT 125 106 121 106 DL FL 125 99 MT 125 99 121 99 DL FL 125 91 MT 125 91 121 91 DL FL 125 83 MT 125 83 121 83 DL FL 125 114 MT 125 114 385 114 DL FL 125 114 MT 125 114 116 114 DL FL 103 120 MT (5) SH 125 68 MT 125 68 121 68 DL FL 125 61 MT 125 61 121 61 DL FL 125 53 MT 125 53 121 53 DL FL 125 46 MT 125 46 121 46 DL FL 125 76 MT 125 76 385 76 DL FL 125 76 MT 125 76 116 76 DL FL 103 82 MT (6) SH 125 38 MT 125 38 116 38 DL FL 103 44 MT (7) SH GS 125 38 386 266 CR 125 265 MT 125 265 162 231 DL FL 162 231 MT 162 231 199 199 DL FL 199 199 MT 199 199 236 164 DL FL 236 164 MT 236 164 273 134 DL FL 273 134 MT 273 134 310 111 DL FL 310 111 MT 310 111 347 82 DL FL 347 82 MT 347 82 385 52 DL FL 385 52 MT 385 52 MT GS NP 125 265 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 162 231 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 199 199 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 236 164 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 273 134 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 310 111 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 347 82 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR GS NP 385 52 TR 3.000000 3.000000 SL 0 0 1 0 360 AC 0.333333 0.333333 SL 2.250000 2.250000 SL 0 0 1 0 360 AC 0.444444 0.444444 SL EF GR 125 265 MT 125 265 162 228 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 162 228 MT 162 228 199 198 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 199 198 MT 199 198 236 163 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 236 163 MT 236 163 273 133 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 273 133 MT 273 133 310 106 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 310 106 MT 310 106 347 81 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 347 81 MT 347 81 385 66 DL 0.000 0.000 0.000 1.000 1.000 1.000 6 (CL) CF 385 66 MT 385 66 MT 125 262 MT 0.000 0.000 0.000 SC 125 262 123 266 DL FL 123 266 127 266 DL FL 127 266 125 262 DL FL 162 225 MT 162 225 160 229 DL FL 160 229 164 229 DL FL 164 229 162 225 DL FL 199 195 MT 199 195 197 199 DL FL 197 199 201 199 DL FL 201 199 199 195 DL FL 236 160 MT 236 160 234 164 DL FL 234 164 238 164 DL FL 238 164 236 160 DL FL 273 130 MT 273 130 271 134 DL FL 271 134 275 134 DL FL 275 134 273 130 DL FL 310 103 MT 310 103 308 107 DL FL 308 107 312 107 DL FL 312 107 310 103 DL FL 347 78 MT 347 78 345 82 DL FL 345 82 349 82 DL FL 349 82 347 78 DL FL 385 63 MT 385 63 383 67 DL FL 383 67 387 67 DL FL 387 67 385 63 DL FL 125 265 MT 125 265 162 232 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 162 232 MT 162 232 199 203 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 199 203 MT 199 203 236 176 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 236 176 MT 236 176 273 155 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 273 155 MT 273 155 310 128 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 310 128 MT 310 128 347 115 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 347 115 MT 347 115 385 90 DL 0.000 0.000 0.000 1.000 1.000 1.000 26 (CL) CF 385 90 MT 385 90 MT 123 263 MT 0.000 0.000 0.000 SC 123 263 127 267 DL FL 123 267 MT 123 267 127 263 DL FL 160 230 MT 160 230 164 234 DL FL 160 234 MT 160 234 164 230 DL FL 197 201 MT 197 201 201 205 DL FL 197 205 MT 197 205 201 201 DL FL 234 174 MT 234 174 238 178 DL FL 234 178 MT 234 178 238 174 DL FL 271 153 MT 271 153 275 157 DL FL 271 157 MT 271 157 275 153 DL FL 308 126 MT 308 126 312 130 DL FL 308 130 MT 308 130 312 126 DL FL 345 113 MT 345 113 349 117 DL FL 345 117 MT 345 117 349 113 DL FL 383 88 MT 383 88 387 92 DL FL 383 92 MT 383 92 387 88 DL FL GR 385 265 MT 385 265 385 38 DL FL 125 38 MT 125 38 385 38 DL FL 125 265 MT 125 265 385 265 DL FL 125 265 MT 125 265 125 38 DL FL GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF GR /Helvetica-Wingz 12.000 SF showpage restore %%Trailer %%Pages: 1 %%EndDocument endTexFig 202 2443 a Fj(Figure)h(6:)j(Sp)q(eedup)f(on)d(an)g(SGI)g(Multipro)q(cessor)h (-)f(RP01-3)f(p)q(edigree,)j(di\013eren)o(t)e(lo)q(ci)952 2678 y(15)p eop %%Page: 16 16 16 15 bop 150 195 a Fj(distinction)18 b(can)e(b)q(est)g(b)q(e)h(illustrated)h (with)e(a)g(trivial)h(one-lo)q(cus,)g(t)o(w)o(o-allele,)g(one-c)o(hild)h(ex-) 150 252 y(ample.)25 b(Let)18 b(the)f(paren)o(ts)f(b)q(e)h Fe(p)g Fj(and)g Fe(q)i Fj(and)e(the)g(c)o(hild)h(b)q(e)g Fe(r)q Fj(.)24 b(Supp)q(ose)18 b(that)f(for)f(eac)o(h)h(of)f Fe(p)150 308 y Fj(and)d Fe(q)i Fj(the)e(p)q(ossible)i(genot)o(yp)q(es)d(are)h Fa(f)p Fj(1)p Fa(j)p Fj(2)p Fe(;)8 b Fj(2)p Fa(j)p Fj(2)p Fa(g)i Fj(and)j(that)f Fe(r)q Fj('s)g(genot)o(yp)q(e)h(is)h(kno)o(wn)e(to)h(b)q(e)g (1)p Fa(j)p Fj(2.)150 364 y(F)l(rom)i(this)h(information)f(it)h(can)g(b)q(e)g (inferred)g(that)f(it)h(is)g(not)f(sim)o(ultaneously)h(p)q(ossible)i(that)150 421 y Ff(b)n(oth)e Fe(p)f Fj(and)h Fe(q)h Fj(ha)o(v)o(e)e(genot)o(yp)q(e)h(2) p Fa(j)p Fj(2,)e(but)i(it)g(is)g(p)q(ossible)h(that)e(either)i(one)e(has)h (genot)o(yp)q(e)f(2)p Fa(j)p Fj(2,)150 477 y(while)h(the)f(other)f(has)g (genot)o(yp)q(e)h(1)p Fa(j)p Fj(2.)k(Suc)o(h)c(a)f(situation)h(is)g(detected) h(within)f(the)g(lik)o(eliho)q(o)q(d)150 534 y(calculation)j(itself)g(and)f (not)g(b)o(y)f(an)o(y)h(genot)o(yp)q(e)f(elimination)j(algorithm.)25 b(Genot)o(yp)q(e)17 b(elimi-)150 590 y(nation)d(algorithms)g(only)g (eliminate)h(genot)o(yp)q(es)f(that)f(an)g(individual)k(cannot)d(ha)o(v)o(e;) f(they)h(do)150 647 y(not)g(eliminate)i(com)o(binations)f(of)f(genot)o(yp)q (es)h(that)e(collections)k(of)d(individuals)j(cannot)d(ha)o(v)o(e)150 703 y(sim)o(ultaneously)l(.)32 b(It)19 b(w)o(ould)g(require)g(to)q(o)f(m)o (uc)o(h)h(storage)e(to)h(precompute)h(the)g(set)f(of)h(p)q(os-)150 760 y(sible)f(genot)o(yp)q(e)e(com)o(binations)g(for)g(all)h(n)o(uclear)g (families,)g(ev)o(en)g(for)e(mo)q(derate-size)i(3-lo)q(cus)150 816 y(problems.)221 873 y(Comm)o(unication)g(o)o(v)o(erhead)g(adds)h(to)e (the)i(decline)h(in)f(sp)q(eedup)h(on)e(T)l(readMarks.)26 b(The)150 929 y(e\013ect)12 b(of)f(comm)o(unication)i(o)o(v)o(erhead)e(on)h(the)g(sp)q (eedup)i(dep)q(ends)f(on)f(the)g(input)h(p)q(edigree)h(and)150 985 y(the)h(lo)q(ci)g(for)f(whic)o(h)h(the)g Fe(\022)h Fj(v)o(ector)e(is)h(b) q(eing)g(estimated.)20 b(As)15 b(the)f(n)o(um)o(b)q(er)h(of)f(p)q(ossible)i (alleles)150 1042 y(increases,)g(the)f(length)h(of)f(the)g(computation)h (increases)g(with)f(little)i(c)o(hange)e(in)h(the)g(amoun)o(t)150 1098 y(of)h(data)f(comm)o(unicated,)i(resulting)g(in)g(impro)o(v)o(ed)f(sp)q (eedups.)27 b(The)17 b(run)g(with)h(4)e(lo)q(ci)j(tak)o(es)150 1155 y(m)o(uc)o(h)e(longer)g(b)q(ecause)g(it)g(tak)o(es)f(man)o(y)g(more)g (lik)o(eliho)q(o)q(d)k(estimates)c(to)g(con)o(v)o(erge,)g(but)h(the)150 1211 y(time)f(p)q(er)f(lik)o(eliho)q(o)q(d)j(estimate)d(is)h(comparable)g(to) e(the)h(large)h(3-lo)q(cus)g(run.)221 1268 y(In)e(addition,)h(the)f(presence) i(of)d(lo)q(ops)i(in)g(the)f(p)q(edigreee)i(can)e(further)g(increase)h(the)f (com-)150 1324 y(m)o(unication)i(rate.)j(One)c(example)g(is)h(BAD.)e(Muc)o(h) h(of)f(BAD's)g(complexit)o(y)h(comes)g(from)f(the)150 1381 y(presence)g(of)f(the)g(lo)q(op)h(in)g(the)f(p)q(edigree)i(rather)d(than)i(a) e(high)i(allele)i(pro)q(duct.)j(The)14 b(w)o(a)o(y)e(that)150 1437 y(LINKA)o(GE)20 b(handles)h(lo)q(ops)e(in)i(the)e(p)q(edigree)i(is)f (that)e(the)i(input)g(format)e(designates)i(one)150 1494 y(individual)i(to)d (b)q(e)g(the)g Ff(lo)n(op)h(br)n(e)n(aker)p Fj(.)31 b(F)l(or)18 b(eac)o(h)i(ev)m(aluation)g(of)e(the)i(lik)o(eliho)q(o)q(d)h(estimate,)150 1550 y(LINKA)o(GE)14 b(do)q(es)g(a)f(separate)g(tra)o(v)o(ersal)g(of)g(the)g (p)q(edigree)i(for)e(eac)o(h)h(genot)o(yp)q(e)f(that)g(the)g(lo)q(op)150 1606 y(break)o(er)k(individual)j(ma)o(y)c(ha)o(v)o(e.)24 b(Th)o(us,)17 b(one)g(ev)m(aluation)h(of)e(the)h(lik)o(eliho)q(o)q(d)j(estimate)d(ma)o(y) 150 1663 y(include)k(man)o(y)c(p)q(edigree)j(tra)o(v)o(ersals.)28 b(In)19 b(eac)o(h)f(tra)o(v)o(ersal)f(eac)o(h)i(n)o(uclear)g(family)g(up)q (date)f(is)150 1719 y(parallelized)f(as)d(b)q(efore,)g(resulting)i(in)f(man)o (y)f(small)h(pieces)g(of)f(w)o(ork)g(and)g(large)g(comm)o(unica-)150 1776 y(tion)g(o)o(v)o(erhead.)19 b(F)l(or)13 b(more)g(details)i(on)f(ho)o(w)f (LINKA)o(GE)h(handles)h(lo)q(ops)f(see)g(pages)g(170{171)150 1832 y(of)h([22)o(].)221 1889 y(As)j(discussed)h(in)h(the)e(section)h (describing)h(the)e(parallel)i(algorithm,)e(when)h(the)f(size)h(of)150 1945 y(the)c(reduced)i(iteration)e(rectangle)h(R)e(drops)h(b)q(elo)o(w)h(a)f (threshold,)g(the)g(T)l(readMarks)g(v)o(ersion)150 2002 y(p)q(erforms)e(the)h (computation)f(sequen)o(tially)j(to)c(a)o(v)o(oid)i(high)g(comm)o(unication)g (o)o(v)o(erheads.)19 b(Al-)150 2058 y(though)f(this)g(metho)q(d)h(reduces)g (comm)o(unication,)g(it)f(leads)h(to)f(further)f(load)i(im)o(balance)g(in)150 2115 y(the)e(T)l(readMarks)e(v)o(ersion.)24 b(This)18 b(con)o(tributes)e(to)g (our)h(algorithm's)f(p)q(o)q(or)g(p)q(erformance)h(on)150 2171 y(BAD.)12 b(This)h(explanation)h(is)f(supp)q(orted)g(b)o(y)g(the)g(im)o (balance)g(in)h(sync)o(hronization)g(w)o(ait)e(times)150 2227 y(b)q(et)o(w)o(een)j(the)f(master)f(pro)q(cessor)h(that)g(p)q(erforms)g(the)g (sequen)o(tial)h(computation)f(and)h(all)g(the)150 2284 y(other)k(pro)q (cessors)h(\(a)f(ratio)g(of)h(1)f(to)g(6.5)g(on)h(a)o(v)o(erage)e(in)j(w)o (ait)e(times)h(at)f(8)h(pro)q(cessors)f(on)150 2340 y(the)f(A)l(TM)g(net)o(w) o(ork\).)28 b(Ho)o(w)o(ev)o(er,)18 b(p)q(erforming)g(all)i(the)e(computation) g(in)h(parallel)h(only)f(re-)150 2397 y(sults)d(in)h(w)o(orse)e(sp)q(eedup)j (b)q(ecause)f(of)e(the)h(small)h(amoun)o(t)e(of)g(computation)h(relativ)o(e)h (to)e(the)150 2453 y(comm)o(unication)h(o)o(v)o(erhead.)221 2510 y(F)l(or)g(eac)o(h)h(of)g(the)g(runs)h(and)f(data)g(sets)g(on)g(the)g(A) l(TM)g(net)o(w)o(ork,)f(T)l(able)i(3)f(pro)o(vides)h(the)952 2678 y(16)p eop %%Page: 17 17 17 16 bop 236 155 1478 2 v 235 212 2 57 v 244 212 V 269 195 a Fj(#)16 b(Pro)q(cs)p 457 212 V 718 212 V 310 w(RP01-3)p 916 212 V 64 w(RP01-3)p 1128 212 V 48 w(RP01-3)p 1326 212 V 64 w(BAD)p 1492 212 V 120 w(CLP)p 1705 212 V 1714 212 V 235 268 V 244 268 V 457 268 V 718 268 V 775 251 a(2x6x6)p 916 268 V 49 w(3x5x2x3)p 1128 268 V 81 w(2x6x9)p 1326 268 V 49 w(2x4x4)p 1492 268 V 49 w(2x4x4x4)p 1705 268 V 1714 268 V 236 270 1478 2 v 235 326 2 57 v 244 326 V 340 309 a(2)p 457 326 V 137 w(msgs/sec)p 718 326 V 168 w(74)p 916 326 V 167 w(31)p 1128 326 V 151 w(26)p 1326 326 V 98 w(101)p 1492 326 V 166 w(12)p 1705 326 V 1714 326 V 458 328 1256 2 v 235 383 2 57 v 244 383 V 457 383 V 483 366 a(\045w)o(aittime)p 718 383 V 140 w(5.7)p 916 383 V 153 w(4.3)p 1128 383 V 139 w(3.1)p 1326 383 V 84 w(10.0)p 1492 383 V 153 w(2.2)p 1705 383 V 1714 383 V 236 384 1478 2 v 235 441 2 57 v 244 441 V 340 424 a(4)p 457 441 V 137 w(msgs/sec)p 718 441 V 145 w(477)p 916 441 V 144 w(225)p 1128 441 V 129 w(189)p 1326 441 V 97 w(533)p 1492 441 V 166 w(80)p 1705 441 V 1714 441 V 458 443 1256 2 v 235 497 2 57 v 244 497 V 457 497 V 483 480 a(\045w)o(aittime)p 718 497 V 117 w(14.1)p 916 497 V 130 w(10.7)p 1128 497 V 139 w(7.5)p 1326 497 V 84 w(20.4)p 1492 497 V 153 w(8.7)p 1705 497 V 1714 497 V 236 499 1478 2 v 235 555 2 57 v 244 555 V 340 538 a(8)p 457 555 V 137 w(msgs/sec)p 718 555 V 123 w(2019)p 916 555 V 120 w(1099)p 1128 555 V 106 w(1042)p 1326 555 V 74 w(1800)p 1492 555 V 143 w(449)p 1705 555 V 1714 555 V 458 557 1256 2 v 235 612 2 57 v 244 612 V 457 612 V 483 595 a(\045w)o(aittime)p 718 612 V 117 w(25.7)p 916 612 V 130 w(26.1)p 1128 612 V 116 w(17.1)p 1326 612 V 84 w(33.3)p 1492 612 V 131 w(20.0)p 1705 612 V 1714 612 V 236 614 1478 2 v 477 691 a(T)l(able)g(3:)k(Ov)o(erhead)15 b(Statistics)h(on)f(an) g(A)l(TM)g(Net)o(w)o(ork)150 812 y(a)o(v)o(erage)c(n)o(um)o(b)q(er)h(of)f (messages)g(p)q(er)h(second)g(\()p Fb(msgs/sec)p Fj(\),)f(and)h(the)f(p)q (ercen)o(tage)h(of)f(total)h(run-)150 868 y(ning)17 b(time)f(that)f(eac)o(h)h (pro)q(cessor)g(on)g(a)o(v)o(erage)e(sp)q(ends)j(w)o(aiting)f(at)g(sync)o (hronization)h(p)q(oin)o(ts)150 925 y(\()p Fb(\045waittime)p Fj(\).)31 b(The)19 b(n)o(um)o(b)q(er)h(of)f(messages)g(p)q(er)h(second)g(and) f(the)h(p)q(ercen)o(tage)g(w)o(ait)f(time)150 981 y(increase)i(with)f (increasing)h(n)o(um)o(b)q(er)f(of)f(pro)q(cessors,)h(explaining)i(the)e (decreasing)h(slop)q(e)f(of)150 1038 y(the)15 b(sp)q(eedup)i(curv)o(es.)221 1094 y(The)22 b(data)g(in)h(T)l(able)h(3)e(also)g(allo)o(ws)h(us)g(to)f (deriv)o(e)h(a)f(quan)o(titativ)o(e)g(estimate)h(of)f(the)150 1150 y(relativ)o(e)14 b(con)o(tributions)g(of)f(load)g(im)o(balance)i(and)f (comm)o(unication)g(o)o(v)o(erhead)f(to)f(the)i(decline)150 1207 y(in)i(sp)q(eedup)h(on)e(b)q(oth)g(the)h(SGI)f(and)g(the)h(A)l(TM)f(net) o(w)o(ork.)j(The)e(form)o(ula)618 1304 y(sp)q(eedup)e(=)f(8)d Fa(\002)g Fj(\(1)g Fa(\000)g Fj(\045w)o(aittime)p Fe(=)p Fj(100\))150 1400 y(estimates)j(the)g(sp)q(eedup)i(if)f(load)f(im)o(balance)i(w)o(ere)e (the)g(only)h(limiting)h(factor)d(and)h(comm)o(uni-)150 1457 y(cation)j(o)o(v)o(erhead)f(w)o(ere)g(negligible.)24 b(F)l(o)q(cusing)16 b(on)f(the)h(results)g(with)g(8)f(pro)q(cessors,)g(T)l(able)h(4)150 1513 y(sho)o(ws)e(that)g(this)i(predicted)g(sp)q(eedup)h(matc)o(hes)d(v)o (ery)h(w)o(ell)g(with)h(the)f(observ)o(ed)g(sp)q(eedup)h(on)150 1570 y(the)d(SGI)f(for)g(all)i(data)e(and)g(input)i(sets.)19 b(In)13 b(order)f(to)g(estimate)g(the)h(e\013ect)f(of)g(comm)o(unication)150 1626 y(o)o(v)o(erhead)g(on)g(the)h(sp)q(eedup,)h(w)o(e)e(assume)g(that)g(the) g(reduction)i(in)f(sp)q(eedup)h(is)f(linear)g(in)h(terms)150 1683 y(of)h(the)g(n)o(um)o(b)q(er)h(of)e(messages)h(p)q(er)h(second,)f(or)458 1779 y(sp)q(eedup)g(=)e(8)c Fa(\002)i Fj(\(1)e Fa(\000)i Fj(\045w)o(aittime)p Fe(=)p Fj(100)o(\))e Fa(\000)i Fj(F)f Fa(\002)g Fj(msgs)p Fe(=)p Fj(sec)150 1876 y(where)h Fe(F)17 b Fj(is)11 b(determined)h(b)o(y)f(a)f (least)h(squares)g(\014t.)18 b(Again,)12 b(the)f(matc)o(h)f(b)q(et)o(w)o(een) h(the)g(predicted)150 1933 y(sp)q(eedups)j(and)e(the)g(sp)q(eedups)i(observ)o (ed)e(on)g(the)g(A)l(TM)g(is)h(remark)m(able)f(\(see)g(T)l(able)h(5\).)19 b(These)150 1989 y(deriv)m(ations,)f(although)f(appro)o(ximate,)g(con\014rm)f (our)h(basic)h(conclusions:)24 b(Sp)q(eedup)19 b(on)e(the)150 2045 y(SGI)e(is)g(limited)i(b)o(y)d(load)h(im)o(balance,)h(while)g(sp)q (eedup)h(on)d(the)h(A)l(TM)g(net)o(w)o(ork)e(is)i(limited)i(b)o(y)150 2102 y(a)e(com)o(bination)h(of)e(load)i(im)o(balance)g(and)g(comm)o (unication)g(o)o(v)o(erhead.)221 2158 y(The)f(exp)q(erimen)o(ts)i(sho)o(w)e (that)f(our)i(parallel)h(algorithm)e(do)q(es)h(a)f(reasonable)h(job)f(of)g (bal-)150 2215 y(ancing)c(the)f(load)h(b)q(et)o(w)o(een)g(pro)q(cessors,)f (and)h(can)f(ac)o(hiev)o(e)h(go)q(o)q(d)f(sp)q(eedups)i(on)e(runs)h(that)e (ha)o(v)o(e)150 2271 y(a)15 b(large)g(computation-to-comm)o(unication)g (ratio.)k(While)e(some)d(sp)q(eedup)j(can)e(b)q(e)g(obtained)150 2328 y(using)i(the)f(Ethernet,)g(p)q(erformance)h(closer)f(to)g(that)g(of)f (a)h(shared-memory)g(m)o(ultipro)q(cessor)150 2384 y(is)f(p)q(ossible)h (using)f(an)f(A)l(TM)g(net)o(w)o(ork)g(on)g(large)g(runs.)20 b(F)l(or)14 b(small)h(runs,)f(suc)o(h)h(as)f(BAD,)g(it)g(is)150 2441 y(not)h(clear)h(that)e(a)h(parallel)i(implemen)o(tation)f(of)f(an)o(y)g (sort)f(is)i(of)f(m)o(uc)o(h)g(b)q(ene\014t.)221 2497 y(A)l(TM)g(net)o(w)o (orks)f(are)h(gaining)i(p)q(opularit)o(y)f(b)q(ecause)g(they)g(are)f (suitable)i(for)e(use)h(in)g(b)q(oth)150 2554 y(high-p)q(erformance)k(lo)q (cal-area)g(and)f(wide-area)g(net)o(w)o(orks.)30 b(Our)19 b(exp)q(erimen)o (ts)h(sho)o(w)f(that)952 2678 y(17)p eop %%Page: 18 18 18 17 bop 259 155 1432 2 v 258 212 2 57 v 267 212 V 695 212 V 721 195 a Fj(RP01-3)p 893 212 V 64 w(RP01-3)p 1105 212 V 48 w(RP01-3)p 1303 212 V 64 w(BAD)p 1469 212 V 120 w(CLP)p 1682 212 V 1691 212 V 258 268 V 267 268 V 695 268 V 752 251 a(2x6x6)p 893 268 V 49 w(3x5x2x3)p 1105 268 V 81 w(2x6x9)p 1303 268 V 49 w(2x4x4)p 1469 268 V 49 w(2x4x4x4)p 1682 268 V 1691 268 V 259 270 1432 2 v 258 326 2 57 v 267 326 V 292 309 a(Estimated)16 b(sp)q(eedup)p 695 326 V 118 w(5.94)p 893 326 V 131 w(5.91)p 1105 326 V 115 w(6.63)p 1303 326 V 84 w(5.34)p 1469 326 V 131 w(6.40)p 1682 326 V 1691 326 V 258 383 V 267 383 V 302 366 a(Observ)o(ed)f(sp)q(eedup)p 695 383 V 128 w(5.61)p 893 383 V 131 w(6.26)p 1105 383 V 115 w(6.64)p 1303 383 V 84 w(5.41)p 1469 383 V 131 w(6.23)p 1682 383 V 1691 383 V 259 384 1432 2 v 333 462 a(T)l(able)h(4:)k(Estimated)15 b(and)g(Observ)o(ed)h(Sp) q(eedup)h(on)e(SGI:)g(8)g(Pro)q(cessors)p 259 500 V 258 556 2 57 v 267 556 V 695 556 V 721 539 a(RP01-3)p 893 556 V 64 w(RP01-3)p 1105 556 V 48 w(RP01-3)p 1303 556 V 64 w(BAD)p 1469 556 V 120 w(CLP)p 1682 556 V 1691 556 V 258 613 V 267 613 V 695 613 V 752 596 a(2x6x6)p 893 613 V 49 w(3x5x2x3)p 1105 613 V 81 w(2x6x9)p 1303 613 V 49 w(2x4x4)p 1469 613 V 49 w(2x4x4x4)p 1682 613 V 1691 613 V 259 614 1432 2 v 258 671 2 57 v 267 671 V 292 654 a(Estimated)h(sp)q(eedup)p 695 671 V 118 w(3.47)p 893 671 V 131 w(4.56)p 1105 671 V 115 w(5.35)p 1303 671 V 84 w(3.14)p 1469 671 V 131 w(5.85)p 1682 671 V 1691 671 V 258 727 V 267 727 V 302 710 a(Observ)o(ed)f(sp)q(eedup)p 695 727 V 128 w(3.49)p 893 727 V 131 w(4.83)p 1105 727 V 115 w(5.38)p 1303 727 V 84 w(3.15)p 1469 727 V 131 w(5.73)p 1682 727 V 1691 727 V 259 729 1432 2 v 226 806 a(T)l(able)h(5:)k(Estimated)15 b(and)g(Observ)o(ed)h(Sp)q(eedup)h(on)e(A)l(TM)g(Net)o(w)o(ork:)k(8)c(Pro)q (cessors)150 940 y(for)21 b(link)m(age)h(analysis,)i(the)d(p)q(erformance)g (of)g(a)g(shared-memory)g(m)o(ultipro)q(cessor)h(can)f(b)q(e)150 996 y(obtained)h(at)f(a)h(fraction)f(of)h(the)f(cost,)i(without)f (compromising)g(the)g(con)o(v)o(enien)o(t)g(shared)150 1053 y(memory)15 b(abstraction)f(presen)o(ted)i(to)f(the)g(programmer.)221 1109 y(T)l(o)j(b)q(e)h(a)f(little)h(more)f(quan)o(titativ)o(e)g(ab)q(out)g (price/p)q(erformance,)i(in)f(the)f(F)l(all)i(of)d(1992,)150 1165 y(the)d(cost)f(ratio)g(w)o(as)f(appro)o(ximately)i(1:2:3)e(comparing)h (8)h(DECstations)e(connected)j(b)o(y)e(Eth-)150 1222 y(ernet,)18 b(8)f(DECstations)f(connected)j(b)o(y)e(A)l(TM,)g(and)h(the)f(SGI)h(4D/480,)e (resp)q(ectiv)o(ely)l(,)k(with)150 1278 y(prices)e(falling)h(for)d(the)i(A)l (TM)f(net)o(w)o(ork)f(and)h(the)h(shared-memory)e(m)o(ultipro)q(cessor.)27 b(Av)o(er-)150 1335 y(aged)19 b(o)o(v)o(er)g(all)i(data)d(and)i(input)h (sets,)f(the)f(sp)q(eedups)i(ac)o(hiev)o(ed)g(on)e(8)g(pro)q(cessors)h(are)f (3.3)150 1391 y(for)g(the)h(Ethernet,)h(4.5)e(for)h(the)g(A)l(TM)g(net)o(w)o (ork,)f(and)i(6.0)e(for)g(the)h(SGI.)g(Although)h(suc)o(h)150 1448 y(comparisons)14 b(need)i(to)e(b)q(e)h(tak)o(en)f(with)h(a)f(grain)g(of) g(salt,)g(the)h(Ethernet)f(curren)o(tly)h(o\013ers)f(the)150 1504 y(b)q(est)h(price/p)q(erformance)i(ratio,)d(while)j(the)e(SGI)g (o\013ers)g(the)g(b)q(est)h(p)q(erformance.)150 1647 y Fg(7)69 b(Discussion)150 1749 y Fj(The)14 b(structure)f(of)g(general)h(p)q(edigree)h (link)m(age)g(computations)e(using)h(the)f(lik)o(eliho)q(o)q(d)k(metho)q(d) 150 1805 y(do)q(es)g(not)f(lend)i(itself)g(v)o(ery)e(w)o(ell)i(to)e(v)o (ector)g(pro)q(cessing)h(or)f(\014ne)i(grain)e(parallel)i(pro)q(cessing.)150 1862 y(A)f(coarse-grain)f(parallel)j(mac)o(hine,)f(where)f(a)f(large)h (memory)f(is)h(pro)o(vided)h(with)f(eac)o(h)g(pro-)150 1918 y(cessor,)d(is)g(more)g(suitable)h(for)e(programs)g(suc)o(h)h(as)g(LINKA)o (GE.)g(W)l(e)g(ha)o(v)o(e)f(sho)o(wn)h(that)f(using)150 1975 y(T)l(readMarks,)k(a)h(new)g(distributed)h(shared)g(memory)e(system,)h(has)f (resulted)i(in)g(signi\014can)o(t)150 2031 y(p)q(erformance)g(impro)o(v)o (emen)o(t)f(on)g(all)i(t)o(yp)q(es)e(of)g(genetic)i(link)m(age)g(analysis)f (problems.)30 b(This)150 2088 y(includes)15 b(problems)f(in)o(v)o(olving)g(a) f(small)g(n)o(um)o(b)q(er)h(of)e(p)q(edigrees.)21 b(Large)12 b(single)j(p)q(edigrees)f(fre-)150 2144 y(quen)o(tly)g(are)f(the)g(basis)h (of)f(disease)h(studies)g(and)g(require)g(some)f(of)g(the)h(longest)f (computation)150 2201 y(times.)26 b(P)o(erformance)17 b(results)g(for)g(this) h(t)o(yp)q(e)f(of)g(problem)h(are)f(sp)q(eci\014cally)j(co)o(v)o(ered)d(in)h (the)150 2257 y(previous)e(section.)221 2313 y(Genetic)i(link)m(age)i (analysis)f(is)f(computationally)h(in)o(tensiv)o(e.)30 b(With)18 b(the)g(recen)o(t)g(gro)o(wth)150 2370 y(in)f(the)f(n)o(um)o(b)q(er)g(and)g (informativ)o(eness)g(of)f(genetic)i(mark)o(ers,)e(computation)g(times)i(ha)o (v)o(e)e(in-)150 2426 y(creased)d(dramatically)l(.)20 b(Our)12 b(researc)o(h)g(in)o(to)g(w)o(a)o(ys)f(to)g(reduce)i(computation)f(time)h (previously)150 2483 y(led)18 b(to)e(impro)o(v)o(emen)o(ts)g(in)i(the)f Ff(se)n(quential)f Fj(algorithms.)24 b(Here,)17 b(w)o(e)g(demonstrate)f(a)g (general)150 2539 y(purp)q(ose)k(metho)q(d)g(for)f(pro)q(cessing)i(the)e (LINKA)o(GE)h(programs)f(in)h Ff(p)n(ar)n(al)r(lel)f Fj(on)h(a)f(net)o(w)o (ork)952 2678 y(18)p eop %%Page: 19 19 19 18 bop 150 195 a Fj(of)17 b(w)o(orkstations)f(that)h(further)h(reduces)g (computation)g(time)g(as)f(the)h(n)o(um)o(b)q(er)g(of)f(a)o(v)m(ailable)150 252 y(pro)q(cessors)e(gro)o(ws.)221 308 y(W)l(e)f(presen)o(ted)h(a)e (parallelization)k(strategy)c(that)g(w)o(orks)h(ev)o(en)g(for)g(single)h(p)q (edigrees)h(and)150 364 y(single)k(starting)e(v)o(ectors.)29 b(Our)19 b(strategy)e(mak)o(es)h(go)q(o)q(d)g(use)h(of)f(the)h(underlying)h (biological)150 421 y(theory)15 b(and)g(fo)q(cuses)g(on)g(getting)f(go)q(o)q (d)h(sp)q(eedup)i(for)d(long)h(runs.)20 b(Nev)o(ertheless,)15 b(w)o(e)g(are)g(ex-)150 477 y(ploring)f(some)e(mo)q(di\014cations)i(of)e(our) g(strategy)f(in)j(the)e(hop)q(es)i(of)e(further)g(impro)o(ving)h(parallel)150 534 y(p)q(erformance.)20 b(W)l(e)15 b(giv)o(e)h(three)f(examples.)221 590 y(When)f(ILINK)j(estimates)d(the)g(partial)h(deriv)m(ativ)o(es)h(of)e (the)g(lik)o(eliho)q(o)q(d)k(function)d(in)g(m)o(ul-)150 647 y(tilo)q(cus)g(analysis,)g(a)e(separate)h(lik)o(eliho)q(o)q(d)j(ev)m (aluation)e(is)f(done)h(for)e(eac)o(h)h(dimension)i(of)d(the)h Fe(\022)150 703 y Fj(v)o(ector.)19 b(These)d(ev)m(aluations)g(could)g(b)q(e)g (done)g(in)g(parallel.)221 760 y(The)11 b(p)q(edigree)h(tra)o(v)o(ersal)d (and)i(n)o(uclear)h(family)f(up)q(dates)g(are)g(v)o(ery)f(similar)i(for)e (eac)o(h)h(c)o(hoice)150 816 y(of)k Fe(\022)q Fj(.)22 b(Therefore,)15 b(it)g(migh)o(t)h(mak)o(e)f(sense)h(to)f(measure)g(the)h(time)g(of)f(a)g(giv) o(en)h(distribution)h(of)150 873 y(w)o(ork)c(among)h(the)g(pro)q(cessors)g (at)g(one)g(function)h(ev)m(aluation)h(and)e(use)h(the)f(timing)h(results)g (to)150 929 y(b)q(etter)g(distribute)i(the)e(w)o(ork)f(on)h(the)h(next)f (function)h(ev)m(aluation.)221 985 y(The)h(\014nal)h(idea)f(in)h(our)f (parallelization)i(strategy)d(w)o(as)g(to)g(do)h(a)g(threshold)h(test)e(on)h (the)150 1042 y(size)k(of)f(the)h(iteration)f(space)h Fe(R)p Fj(.)35 b(Based)20 b(on)h(the)f(result)h(of)f(the)g(test)g(w)o(e)g(either)h (used)g(all)150 1098 y(pro)q(cessors)c(or)g(only)h(one)f(pro)q(cessor)g(to)g (do)g(that)g(up)q(date.)26 b(One)18 b(migh)o(t)g(consider)g(a)f(v)m(ariet)o (y)150 1155 y(of)e(options)g(for)g(ho)o(w)g(man)o(y)g(pro)q(cessors)g(to)g (use)g(\(e.g.,)f(2,)h(3,)g(4,)f(or)h(more\))g(dep)q(ending)j(on)d(the)150 1211 y(size)h(of)f Fe(R)p Fj(.)221 1268 y(As)g(sho)o(wn)f(ab)q(o)o(v)o(e,)g (the)i(parallel)g(implemen)o(tation)g(pro)o(vides)g(a)f(reasonable)g(sp)q (eedup)i(for)150 1324 y(the)12 b(n)o(um)o(b)q(er)g(of)f(a)o(v)m(ailable)i (pro)q(cessors.)18 b(Sp)q(eedups)c(impro)o(v)o(e)d(as)g(the)h(size)g(of)f (the)h(computation)150 1381 y(in)o(v)o(olv)o(ed)21 b(increases.)35 b(Because)21 b(the)g(t)o(w)o(o)d(metho)q(ds)j(of)e(sp)q(eed)i(impro)o(v)o (emen)o(t,)g(algorithmic)150 1437 y(and)c(no)o(w)f(parallel)j(pro)q(cessing)e (are)g(implemen)o(ted)h(in)g(completely)g(indep)q(enden)o(t)h(w)o(a)o(ys,)d (the)150 1494 y(sp)q(eedups)h(comp)q(ound.)221 1550 y(As)d(T)l(readMarks)g(b) q(ecomes)i(a)f(mature)f(soft)o(w)o(are)f(pac)o(k)m(age)i(w)o(e)g(in)o(tend)h (to)e(organize)h(large)150 1606 y(n)o(um)o(b)q(ers)h(of)g(w)o(orkstations)e (on)i(our)g(lo)q(cal)h(net)o(w)o(ork)e(for)g(pro)q(cessing)i(long)f(link)m (age)i(analyses.)150 1663 y(Because)g(most)e(w)o(orkstations)g(ha)o(v)o(e)g (a)h(large)g(amoun)o(t)g(of)f(free)h(cycles)i(a)o(v)m(ailable,)f(esp)q (ecially)150 1719 y(at)d(nigh)o(t)g(and)h(on)f(w)o(eek)o(ends,)h(w)o(e)f(w)o (ould)h(mak)o(e)e(use)i(of)f(these)h(for)e(link)m(age)j(problems.)22 b(If)15 b(our)150 1776 y(lo)q(cal)k(e\013orts)f(are)g(successful,)i(w)o(e)e (ma)o(y)g(wish)h(to)e(expand)i(the)g(net)o(w)o(ork)e(more)h(broadly)h(for)150 1832 y(v)o(ery)c(large)g(problems)h(and)f(organize)h(a)f(link)m(age)h (analysis)g(consortium)g(o)o(v)o(er)e(In)o(ternet.)221 1889 y(This)d(e\013ort)f(con\014rmed)i(our)f(exp)q(erience)i(that)d(a)h(syn)o (thesis)g(of)g(the)g(biology)h(and)f(computer)150 1945 y(science)j(kno)o (wledge)e(relev)m(an)o(t)h(to)f(the)g(problem)h(is)f(necessary)h(to)e(mak)o (e)h(link)m(age)i(analysis)f(soft-)150 2002 y(w)o(are)18 b(run)h(m)o(uc)o(h)f (faster.)29 b(W)l(e)19 b(concur)g(with)g(the)g(authors)f(of)g([19)o(])g(that) g(to)g(parallelize)j(the)150 2058 y(LINKA)o(GE)16 b(programs)e(e\013ectiv)o (ely)l(,)h(the)g(programmer)f(m)o(ust)h(put)g Ff(explicit)g Fj(parallel)h(instruc-)150 2115 y(tions)d(in)h(the)f(programs)f Ff(using)h(know)r(le)n(dge)h(of)g(the)h(underlying)e(genetic)h(applic)n (ation)g(domain)p Fj(.)150 2171 y(Automatic)f(parallelization)i(to)q(ols)d (and)h(blind)i(reliance)f(on)f(massiv)o(e)g(hardw)o(are)f(installations)150 2227 y(are)j(no)g(substitute)h(for)e(h)o(uman)h(reasoning)h(ab)q(out)f(the)g (genetics)h(and)g(the)f(algorithms.)150 2371 y Fg(Ac)n(kno)n(wledgmen)n(ts) 150 2472 y Fj(W)l(e)c(thank)f(Dr.)18 b(Stephen)12 b(P)l(.)e(Daiger,)h(Dr.)17 b(Lori)12 b(A.)e(Sadler,)i(Dr.)18 b(Da)o(vid)10 b(R.)g(Co)o(x,)g(Dr.)18 b(Ric)o(hard)150 2529 y(M.)d(My)o(ers,)f(Dr.)20 b(Susan)c(H.)f(Blan)o(ton)g (and)h(Dr.)k(Jacqueline)e(T.)d(Hec)o(h)o(t)g(for)g(con)o(tributing)h(the)952 2678 y(19)p eop %%Page: 20 20 20 19 bop 150 195 a Fj(disease)13 b(family)f(data)f(for)g(our)h(exp)q(erimen) o(ts.)19 b(Dev)o(elopmen)o(t)12 b(of)g(the)f(RP)g(data)g(w)o(as)g(supp)q (orted)150 252 y(b)o(y)i(gran)o(ts)f(from)g(the)h(National)g(Retinitis)h (Pigmen)o(tosa)e(F)l(oundation)h(and)g(the)g(George)g(Gund)150 308 y(F)l(oundation.)19 b(The)13 b(Amish)g(family)f(data)g(w)o(as)f(dev)o (elop)q(ed)j(with)f(the)f(supp)q(ort)g(of)g(a)g(gran)o(t)f(from)150 364 y(the)k(National)h(Institutes)g(of)f(Health.)21 b(Dev)o(elopmen)o(t)15 b(of)g(the)h(CLP)f(data)g(w)o(as)f(supp)q(orted)i(b)o(y)150 421 y(gran)o(ts)e(from)g(the)i(National)f(Institutes)h(of)f(Health)g(and)h (Shriners)g(Hospital.)21 b(W)l(e)15 b(thank)g(Dr.)150 477 y(Mic)o(hael)g (Scott)f(at)f(the)i(Univ)o(ersit)o(y)g(of)e(Ro)q(c)o(hester)h(for)g(pro)o (viding)h(us)f(access)g(to)g(their)h(Silicon)150 534 y(Graphics)i(m)o (ultipro)q(cessor.)26 b(The)17 b(mac)o(hine)h(w)o(as)e(purc)o(hased)i(with)f (funds)h(from)e(a)h(National)150 590 y(Science)e(F)l(oundation)e(gran)o(t.)18 b(W)l(e)13 b(thank)g(Hongh)o(ui)g(Lu)h(for)e(her)h(w)o(ork)f(in)i(getting)e (the)h(link)m(age)150 647 y(programs)e(running)i(on)f(the)h(SGI.)f(This)g(w)o (ork)g(w)o(as)f(supp)q(orted)i(b)o(y)f(gran)o(ts)f(from)g(the)i(National)150 703 y(Science)i(F)l(oundation,)e(the)g(T)l(exas)g(Adv)m(anced)i(T)l(ec)o (hnology)e(Program,)f(the)h(Human)g(Genome)150 760 y(Program)h(of)h(the)g (National)g(Institutes)h(of)f(Health,)g(and)h(the)f(W.)f(M.)h(Kec)o(k)h(F)l (oundation.)150 922 y Fg(References)173 1023 y Fj([1])21 b(S.)11 b(H.)g(Blan)o(ton,)h(J.)f(R.)g(Hec)o(k)o(enliv)o(ely)l(,)j(A.)d(W.)f (Cottingham,)h(J.)g(F)l(riedman,)h(L.)g(A.)f(Sadler,)243 1080 y(M.)k(W)l(agner,)g(L.)h(H.)f(F)l(riedman,)h(and)f(S.)h(P)l(.)f(Daiger.)21 b(Link)m(age)16 b(mapping)h(of)e(autosomal)243 1136 y(dominan)o(t)i (retinitis)g(pigmen)o(tosa)f(\(RP1\))f(to)g(the)i(p)q(ericen)o(tric)h(region) e(of)g(h)o(uman)g(c)o(hro-)243 1192 y(mosome)f(8.)k Ff(Genomics)p Fj(,)c(11:857{869,)d(1991.)173 1282 y([2])21 b(R.)g(W.)f(Cottingham)h(Jr.,)h (R.)e(M.)h(Idury)l(,)i(and)e(A.)g(A.)g(Sc)o(h\177)-23 b(a\013er.)37 b(F)l(aster)21 b(sequen)o(tial)243 1338 y(genetic)d(link)m(age)g (computations.)23 b Ff(A)o(meric)n(an)17 b(Journal)g(of)h(Human)g(Genetics)p Fj(,)d(53:252{)243 1395 y(263,)f(1993.)173 1485 y([3])21 b(S.)13 b(Dw)o(ark)m(adas,)f(P)l(.)h(Keleher,)i(A.L.)d(Co)o(x,)h(and)g(W.)f(Zw)o (aenep)q(o)q(el.)18 b(Ev)m(aluation)c(of)e(release)243 1541 y(consisten)o(t)19 b(soft)o(w)o(are)e(distributed)i(shared)g(memory)f(on)g (emerging)h(net)o(w)o(ork)e(tec)o(hnol-)243 1597 y(ogy)l(.)i(In)c Ff(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)j(the)g(20th)g(A)o(nnual)f(International)f (Symp)n(osium)i(on)f(Computer)243 1654 y(A)o(r)n(chite)n(ctur)n(e)p Fj(,)g(pages)g(144{155,)d(Ma)o(y)j(1993.)173 1744 y([4])21 b(R.)13 b(C.)g(Elston)g(and)h(J.)f(Stew)o(art.)j(A)d(general)h(mo)q(del)h (for)d(the)i(analysis)g(of)f(p)q(edigree)i(data.)243 1800 y Ff(Human)i(Her)n(e)n(dity)p Fj(,)d(21:523{542,)e(1971.)173 1890 y([5])21 b(T.)11 b(M.)f(Goradia,)i(K.)f(Lange,)h(P)l(.)f(L.)g(Miller,)i (and)e(P)l(.)g(M.)g(Nadk)m(arni.)j(F)l(ast)c(computation)h(of)243 1946 y(genetic)16 b(lik)o(eliho)q(o)q(ds)i(on)e(h)o(uman)f(p)q(edigree)i (data.)i Ff(Human)d(Her)n(e)n(dity)p Fj(,)e(42:42{62,)f(1992.)173 2036 y([6])21 b(J.)d(T.)g(Hec)o(h)o(t,)g(Y.)g(W)l(ang,)g(B.)f(Connor,)h(and)g (S.)g(H.)g(Blan)o(tonand)g(S.)g(P)l(.)g(Daiger.)28 b(Non-)243 2092 y(syndromic)21 b(cleft)g(lip)h(and)f(palate:)30 b(No)20 b(evidence)i(of)e(link)m(age)i(to)e(hla)h(or)f(factor)f(13a.)243 2149 y Ff(A)o(meric)n(an)d(Journal)g(of)h(Human)f(Genetics)p Fj(,)e(52:1230{1233,)d(1993.)173 2238 y([7])21 b(P)l(.)g(Keleher,)j(A.)d(Co)o (x,)g(S.)g(Dw)o(ark)m(adas,)g(and)h(W.)e(Zw)o(aenep)q(o)q(el.)39 b(T)l(readmarks:)31 b(Dis-)243 2295 y(tributed)17 b(shared)g(memory)e(on)h (standard)g(w)o(orkstations)f(and)h(op)q(erating)h(systems.)22 b(T)l(o)243 2351 y(app)q(ear)16 b(in)g Ff(Pr)n(o)n(c)n(e)n(e)n(dings)e(of)i (the)h(1994)g(Winter)f(USENIX)f(Confer)n(enc)n(e)p Fj(,)d(1994.)173 2441 y([8])21 b(P)l(.)11 b(Keleher,)h(A.)e(L.)h(Co)o(x,)f(and)h(W.)f(Zw)o (aenep)q(o)q(el.)j(Lazy)d(release)h(consistency)h(for)e(soft)o(w)o(are)243 2497 y(distributed)21 b(shared)e(memory)l(.)31 b(In)20 b Ff(Pr)n(o)n(c)n(e)n (e)n(dings)e(of)i(the)g(19th)g(A)o(nnual)f(International)243 2554 y(Symp)n(osium)e(on)f(Computer)h(A)o(r)n(chite)n(ctur)n(e)p Fj(,)d(pages)h(13{21,)e(Ma)o(y)i(1992.)952 2678 y(20)p eop %%Page: 21 21 21 20 bop 173 195 a Fj([9])21 b(J.)h(M.)g(Lalouel.)41 b(GEMINI)22 b(-)g(a)g(computer)g(program)f(for)g(optimization)i(of)e(general)243 252 y(nonlinear)e(functions.)28 b(T)l(ec)o(hnical)19 b(Rep)q(ort)e(14,)g (Univ)o(ersit)o(y)h(of)f(Utah,)h(Departmen)o(t)e(of)243 308 y(Medical)h(Bioph)o(ysics)g(and)e(Computing,)g(Salt)g(Lak)o(e)h(Cit)o(y)l(,)e (Utah,)h(1979.)150 402 y([10])21 b(E.)14 b(S.)g(Lander)h(and)f(P)l(.)g (Green.)k(Construction)c(of)g(m)o(ultilo)q(cus)i(genetic)f(link)m(age)g(maps) f(in)243 458 y(h)o(umans.)20 b Ff(Pr)n(o)n(c.)c(Nat.)g(A)n(c)n(ad.)g(Sci.)g (USA)p Fj(,)d(84:2363{2367,)f(1987.)150 552 y([11])21 b(E.)g(S.)f(Lander,)i (P)l(.)f(Green,)h(J.)e(Abrahamson,)i(A.)e(Barlo)o(w,)h(M.)f(J.)h(Daly)l(,)h (S.)e(E.)h(Lin-)243 609 y(coln,)i(and)d(L.)h(Newburg.)35 b(MAPMAKER:)19 b(An)i(in)o(teractiv)o(e)g(computer)f(pac)o(k)m(age)h(for)243 665 y(constructing)c(primary)g(genetic)g(link)m(age)h(maps)e(of)g(exp)q (erimen)o(tal)i(and)f(natural)f(p)q(opu-)243 721 y(lations.)21 b Ff(Genomics)p Fj(,)14 b(1:174{81,)f(1987.)150 815 y([12])21 b(K.)12 b(Lange)f(and)h(T.)e(M.)h(Goradia.)i(An)e(algorithm)h(for)e (automatic)h(genot)o(yp)q(e)g(elimination.)243 872 y Ff(A)o(meric)n(an)16 b(Journal)g(of)h(Human)f(Genetics)p Fj(,)e(40:250{256,)e(1987.)150 966 y([13])21 b(K.)27 b(Lange,)j(D.)c(W)l(eeks,)k(and)d(M.)f(Bo)q(ehnk)o(e.) 56 b(Programs)25 b(for)h(p)q(edigree)j(analysis:)243 1022 y(MENDEL,)15 b(FISHER,)g(and)g(dGene.)20 b Ff(Genetic)c(Epidemiolo)n(gy)p Fj(,)f(5:471{473,)d(1988.)150 1116 y([14])21 b(K.)g(Lange)f(and)h(D.)e(E.)h (W)l(eeks.)35 b(E\016cien)o(t)21 b(computation)f(of)g(lo)q(d)h(scores)f({)g (genot)o(yp)q(e)243 1172 y(elimination,)c(genot)o(yp)q(e)d(rede\014nition,)i (and)e(h)o(ybrid)h(maxim)o(um)f(lik)o(eliho)q(o)q(d)j(algorithms.)243 1229 y Ff(A)o(nnals)f(of)h(Human)h(Genetics)p Fj(,)d(53:67{83,)e(1989.)150 1323 y([15])21 b(G.)16 b(M.)f(Lathrop)i(and)f(J.)g(M.)g(Lalouel.)24 b(Easy)16 b(calculations)i(of)e(lo)q(d)h(scores)f(and)g(genetic)243 1379 y(risks)h(on)g(small)g(computers.)23 b Ff(A)o(meric)n(an)17 b(Journal)h(of)f(Human)h(Genetics)p Fj(,)d(36:460{465,)243 1435 y(1984.)150 1529 y([16])21 b(G.)16 b(M.)f(Lathrop,)h(J.)g(M.)g(Lalouel,) h(C.)f(Julier,)i(and)e(J.)g(Ott.)23 b(Strategies)16 b(for)f(m)o(ultilo)q(cus) 243 1586 y(link)m(age)20 b(analysis)f(in)h(h)o(umans.)29 b Ff(Pr)n(o)n(c.)19 b(Natl.)f(A)n(c)n(ad.)h(Sci.)g(USA)p Fj(,)e(81:3443{344)o (6,)f(June)243 1642 y(1984.)150 1736 y([17])21 b(G.)12 b(M.)g(Lathrop,)h(J.)f (M.)g(Lalouel,)i(C.)e(Julier,)j(and)e(J.)f(Ott.)k(Multilo)q(cus)e(link)m(age) g(analysis)243 1792 y(in)20 b(h)o(umans:)28 b(detection)20 b(of)f(link)m(age)i(and)e(estimation)h(of)e(recom)o(bination.)33 b Ff(A)o(meric)n(an)243 1849 y(Journal)17 b(of)f(Human)h(Genetics)p Fj(,)c(37:482{498,)f(1985.)150 1943 y([18])21 b(A.)14 b(La)o(w,)f(C.)g(W.)h (Ric)o(hard)f(I)q(I)q(I,)i(R.)e(W.)g(Cottingham)g(Jr)h(.,)g(G.)f(M.)g (Lathrop,)g(D.)g(R.)g(Co)o(x,)243 1999 y(and)18 b(R.)f(M.)g(My)o(ers.)26 b(Genetic)18 b(link)m(age)h(analysis)f(of)f(bip)q(olar)i(a\013ectiv)o(e)f (disorder)g(in)g(an)243 2056 y(old)e(order)f(amish)h(p)q(edigree.)21 b Ff(Human)16 b(Genetics)p Fj(,)e(88:562{568,)e(1992.)150 2149 y([19])21 b(P)l(.)h(L.)h(Miller,)i(P)l(.)d(Nadk)m(arni,)i(J.)f(E.)e(Gelern)o (ter,)j(N.)e(Carriero,)h(A.)f(J.)h(P)o(akstis,)g(and)243 2206 y(K.)18 b(K.)f(Kidd.)29 b(P)o(arallelizing)20 b(genetic)e(link)m(age)h (analysis:)26 b(A)17 b(case)h(study)g(for)f(applying)243 2262 y(parallel)c(computation)d(in)i(molecular)f(biology)l(.)i Ff(Computers)g(and) f(Biome)n(dic)n(al)f(R)n(ese)n(ar)n(ch)p Fj(,)243 2319 y(24:234{248,)h(1991.) 150 2413 y([20])21 b(J.)15 b(Ott.)k(Estimation)c(of)f(the)h(recom)o(bination) h(fraction)f(in)g(h)o(uman)g(p)q(edigrees{)h(e\016cien)o(t)243 2469 y(computation)g(of)e(the)i(lik)o(eliho)q(o)q(d)i(for)c(h)o(uman)i(link)m (age)g(studies.)21 b Ff(A)o(meric)n(an)15 b(Journal)i(of)243 2526 y(Human)g(Genetics)p Fj(,)d(26:588{597,)e(1974.)952 2678 y(21)p eop %%Page: 22 22 22 21 bop 150 195 a Fj([21])21 b(J.)c(Ott.)24 b(A)17 b(computer)g(program)e (for)i(link)m(age)h(analysis)f(of)g(general)g(h)o(uman)g(p)q(edigrees.)243 252 y Ff(A)o(meric)n(an)f(Journal)g(of)h(Human)f(Genetics)p Fj(,)e(28:528{29,)e(1976.)150 345 y([22])21 b(J.)e(Ott.)30 b Ff(A)o(nalysis)17 b(of)j(Human)f(Genetic)g(Linkage)p Fj(.)29 b(The)19 b(Johns)g(Hopkins)g(Univ)o(ersit)o(y)243 402 y(Press,)c(Baltimore)h (and)f(London,)g(1991.)k(Revised)d(edition.)150 496 y([23])21 b(M.S.)12 b(V)l(aughan.)k(A)d(distributed)h(approac)o(h)e(to)g(h)o(uman)h (genetic)g(link)m(age)h(analysis.)j(M.S.)243 552 y(Thesis,)f(Departmen)o(t)e (of)h(Computer)g(Science,)i(Duk)o(e)e(Univ)o(ersit)o(y)l(,)g(1991.)952 2678 y(22)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fastlink-4.1P-fix95/README.parallel0000644000265600020320000001563306737457627016111 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: October 6, 1997 Running FASTLINK on parallel computers Starting with FASTLINK version 2.3P, much of the code can run in parallel on a variety of UNIX platforms. |*| Parallel Code, Introduction --------------------------- The (sequential) FASTLINK package already provides considerable running time improvements over the older programs for the LINKAGE package. Response from users about sequential FASTLINK has been extremely enthusiastic and yet, it is abundantly clear that more speedup is necessary. At this time, we believe that one realistic way to obtain substantially more speedup on long runs is to use multiple processors in parallel. We continue to investigate further sequential speedups. Two attempts to parallelize ILINK from FASTLINK are described in the papers: 3. Sandhya Dwarkadas, Alejandro A. Schaffer, Robert W. Cottingham Jr., Alan L. Cox, Peter Keleher, and Willy Zwaenepoel, Parallelization of General Linkage Analysis Problems, Human Heredity 44(1994), pp. 127--141. 4. Sandeep K. Gupta, Alejandro A. Schaffer, Alan L. Cox, Sandhya Dwarkadas, and Willy Zwaenepoel, Integrating Parallelization Strategies for Linkage Analysis, Computers and Biomedical Research 28(1995), pp. 116-139. These two papers are available as paper3.ps and paper4.ps with the distribution. The version of parallel ILINK that we are distributing is similar algorithmically to that described in the second paper. We were able to achieve speedups in the 5 to 7 range on a network of 8 DECStation5000/Ultrix processors on ILINK runs that take tens of minutes sequentially. As explained in the second paper, ILINK is the hard case to parallelize; our preliminary timing experiments with LINKMAP and MLINK suggest that the speedup for those two programs is better. At this time, parallel FASTLINK does not provide all of the functionality of the sequential code. On the basis of a variety of sample data sets I have gotten, it appears to handle the vast majority of cases that desperately need more speedup. The main limitations on the parallel version are: 1. LODSCORE is not parallelized because very few users use it and similar functionality is provided by ILINK. 2. Only autosomal data is handled. 3. Checkpointing is not available. Version 2.3P could not handle multiple loops very well, but that limitation is removed in 3.0P. |*| Parallel FASTLINK, Operation ---------------------------- FASTLINK 2.3P and beyond can be run in parallel on two different types of platforms: shared-memory multiprocessors and networks of UNIX workstations. |*| FASTLINK on shared-memory multiprocessors: ----------------------------------------- The shared-memory version uses the p4 macros which are available by anonymous ftp to Argonne National Labs. More detailed retrieval and installation instructions can be found in README.p4 that comes with FASTLINK. So far we have successfuly run the shared-memory version on SUN multiprocessors using SOLARIS, a DEC Alpha using OSF, and an SGI Challenge. The p4 macro package can be used on a wide variety of shared-memory machines. We are keenly interested to work with users who have access to different shared-memory models to help ensure that parallel FASTLINK does port properly. |*| FASTLINK on network of workstations: ----------------------------------- If you have access to a network of (uniprocessor) Unix workstations, then you can run parallel FASTLINK using a runtime package called TreadMarks. TreadMarks essentially provides the same execution environment on a network of workstations as that available on shared-memory multiprocessors. TreadMarks is available for a small fee for universities and medical schools, and at commercial rates for other institutions. All users can get a 30-day free trial license. See README.TreadMarks for more details on how to configure FASTLINK with TreadMarks. Currently available for Ethernet, ATM, FDDI, HIPPI networks of SUN, DEC, HP, IBM, SGI, or Intel (running Linux pr FreeBSD) computers. Also available on IBM SP-1 and SP-2. TreadMarks only executes on a homogeneous set of machines: i.e., all machines must be of the same architecture, although of course other machines may be present on the network. TreadMarks licenses can be obtained by sending e-mail to treadmarks@ece.rice.edu. Please specify the nature of your organization (commercial or university/medical school) and the machine architecture and operating system you plan to use TreadMarks for. Once you return the signed license and the license fee, a copy of TreadMarks will be sent to you or be made available via ftp. A free 30-day demo copy can also be obtained by sending e-mail to the same address. As usual, the current FASTLINK can be ftp-ed from ftp-bimas.dcrt.nih.gov or softlib.cs.rice.edu in the directory pub/fastlink We recognize that installing the parallel code is more difficult that installing the sequential code because of the need to configure both the FASTLINK code and the runtime library (either p4 or TreadMarks). We will be pleased to work with you in getting the parallel code up and running on your system. |*| Parallel FASTLINK, References ----------------------------- The main references for sequential FASTLINK are: 1. R. W. Cottingham Jr., R. M. Idury, and A. A. Schaffer, Faster Sequential Genetic Linkage Computations, American Journal of Human Genetics, 53(1993), pp. 252-263. 2. A. A. Schaffer, S. K. Gupta, K. Shriram, and R. W. Cottingham, Jr., Avoiding Recomputation in Genetic Linkage Analysis, Human Heredity, 44(1994), pp. 225-237. 5. G. M. Lathrop, J.-M. Lalouel, C. Julier, and J. Ott, Strategies for Multilocus Analysis in Humans, PNAS 81(1984), pp. 3443-3446. 6. G. M. Lathrop and J.-M. Lalouel, Easy Calculations of LOD Scores and Genetic Risks on Small Computers, American Journal of Human Genetics, 36(1984), pp. 460-465. 7. G. M. Lathrop, J.-M. Lalouel, and R. L. White, Construction of Human Genetic Linkage Maps: Likelihood Calculations for Multilocus Analysis, Genetic Epidemiology 3(1986), pp. 39-52. One reference for p4 is: 8. R. Butler and E. Lusk. Monitors, Messages and Clusters: The p4 Parallel Programming System, Parallel Computing 20(1994), pp. 547-564. One reference for TreadMarks is: 9. P. Keleher, A.L. Cox, S. Dwarkadas, and W. Zwaenepoel, TreadMarks: Distributed Shared Memory on Standard Workstations and Operating Systems, Proceedings of the Winter 94 Usenix Conference, pp. 115-131, January 1994. Parallel FASTLINK represents the conjunction of 5 substantial research efforts and software engineering projects. Therefore, if you use FASTLINK in parallel, we ask that you cite: at least one of 5,6,7 to give credit to LINKAGE at least one of 1,2 to give credit to sequential FASTLINK at least one of 3,4 to give credit for the parallel algorithms and either 8 (p4) or 9 (TreadMarks) to give credit for the runtime library that you use. fastlink-4.1P-fix95/README.unknown0000644000265600020320000000551706737457627016014 0ustar tilleaadminFrom: ftp-bimas.cit.nih.gov Last mod: June 27, 1999 FASTLINK, version 2.3P and beyond This file describes some modifications to the UNKNOWN preprocessor program introduced in FASTLINK 2.3P and beyond. We have improved the error reporting capability and fixed some bugs. A scholarly description of what UNKNOWN does can be found in unknown.ps. One purpose of UNKNOWN is to catch violations of Mendelian rules of inheritance. Previous versions of UNKNOWN reported an error by identifying the pedigree and locus of the error. The new version tries to identify the nuclear family/families in which errors occur. When an error occurs at least one nuclear family will be identified either by a child or parent. For any pedigree-locus pair, the first nuclear family identified is guaranteed to contain an error. Subsequent nuclear families identified may or may not contain errors. If you want to see only the first nuclear family with an error, then change the constant ONE_ERROR_ONLY from 0 to 1. I fixed a printing bug that arose when the number of liability classes was greater than 99. As a result the output of UNKNOWN will be spaced differently than before. Thanks to Margaret Gelder Ehm for reporting the bug. Lots of other aspects of UNKNOWN are explained in the documents unknown.ps and loops.ps, including subsequent changes to UNKNOWN. Both FASTLINK 3.0P and 4.0P introduced fundamental, drastic changes to UNKNOWN that are best explained in a longer, more scholarly document. These changes make the interesting part of UNKNOWN incompatible with previous versions of FASTLINK and LINKAGE. However, extra computation is done for the sake of backwards compatibility. Version 3.0P introduced much better inference for looped pedigrees including for the first time the ability to detect Mendelian inconsistencies in looped pedigrees. Version 4.1P improved some of the loop breaker genotype inference algorithms. Information about possible genotypes for different loop breaker vectors is kept in the file loopfile.dat. See README.loopfile for a description of the syntax. Version 4.0P introduced the ability to improve on the user's choice of loop breakers. For looped pedigrees UNKNOWN chooses a provably optimal loop breaker set. For looped pedigrees with multiple marriages UNKNOWN and the main programs can now use one loop breaker to break multiple loops. In version 4.1P these methods were enhanced with a better algorithm for pedigrees with multiple marriages, and the ability to select loop breakers from scratch without having to rely on the makeped and LOOPS preprocessor programs. For a scholarly description of the loop breaker selection methods see paper6.ps, and paper7.ps. For a scholarly description on what loop breakers are all about see loops.ps. For a simple practical method to choose loop breakers see README.lselect.