| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| use warnings; |
|
|
| my $ini = shift; |
| die "usage: absolutize_moses_model.pl path-to-moses.ini > moses.abs.ini" |
| if !defined $ini; |
|
|
| binmode(STDIN, ":utf8"); |
| binmode(STDOUT, ":utf8"); |
| binmode(STDERR, ":utf8"); |
|
|
| $inih = my_open($ini); |
| while (<$inih>) { |
| if (/^\[([^\]]*)\]\s*$/) { |
| $section = $1; |
| } |
| if (/^[0-9]/) { |
| if ($section eq "ttable-file") { |
| chomp; |
| my ($type, $b, $c, $d, $fn) = split(/ /, $_, 5); |
|
|
| if ( $type eq '8' ) { |
| |
| my ($src, $tgt, $align) = split(/ /, $fn); |
|
|
| my $abs_src = ensure_absolute($src, $ini); |
| die "File not found or empty: $src (searched for $abs_src or $abs_src.binphr.idx)" |
| if ! -s $abs_src && ! -s $abs_src.".binphr.idx"; |
|
|
| my $abs_tgt = ensure_absolute($tgt, $ini); |
| die "File not found or empty: $tgt (searched for $abs_tgt or $abs_tgt.binphr.idx)" |
| if ! -s $abs_tgt && ! -s $abs_tgt.".binphr.idx"; |
|
|
| my $abs_align = ensure_absolute($align, $ini); |
| die "File not found or empty: $align (searched for $abs_align or $abs_align.binphr.idx)" |
| if ! -s $abs_align && ! -s $abs_align.".binphr.idx"; |
|
|
| $_ = "$type $b $c $d $abs_src $abs_tgt $abs_align\n"; |
| } |
| elsif ( $type eq '12' ) { |
| $abs = ensure_absolute($fn, $ini); |
| die "File not found or empty: $fn (searched for $abs.minphr)" |
| if ! -s $abs.".minphr"; |
| $_ = "$type $b $c $d $abs\n"; |
| } |
| else { |
| $abs = ensure_absolute($fn, $ini); |
| die "File not found or empty: $fn (searched for $abs or $abs.binphr.idx)" |
| if ! -s $abs && ! -s $abs.".binphr.idx"; |
| $_ = "$type $b $c $d $abs\n"; |
| } |
| } |
| if ($section eq "generation-file" || $section eq "lmodel-file") { |
| chomp; |
| my ($a, $b, $c, $fn) = split / /; |
| $abs = ensure_absolute($fn, $ini); |
| die "File not found or empty: $fn (searched for $abs)" |
| if ! -s $abs; |
| $_ = "$a $b $c $abs\n"; |
| } |
| if ($section eq "distortion-file") { |
| chomp; |
| my ($a, $b, $c, $fn) = split / /; |
| $abs = ensure_absolute($fn, $ini); |
| die "File not found or empty: $fn (searched for $abs or $abs.binlexr.idx or $abs.minlexr)" |
| if ! -s $abs && ! -s $abs.".binlexr.idx" && ! -s $abs.".minlexr"; |
| $_ = "$a $b $c $abs\n"; |
| } |
| } |
| print $_; |
| } |
| close $inih if $ini ne "-"; |
|
|
| sub safesystem { |
| print STDERR "Executing: @_\n"; |
| system(@_); |
| if ($? == -1) { |
| print STDERR "Failed to execute: @_\n $!\n"; |
| exit(1); |
| } |
| elsif ($? & 127) { |
| printf STDERR "Execution of: @_\n died with signal %d, %s coredump\n", |
| ($? & 127), ($? & 128) ? 'with' : 'without'; |
| } |
| else { |
| my $exitcode = $? >> 8; |
| print STDERR "Exit code: $exitcode\n" if $exitcode; |
| return ! $exitcode; |
| } |
| } |
|
|
| sub ensure_absolute { |
| my $target = shift; |
| my $originfile = shift; |
|
|
| my $cwd = `pawd 2> /dev/null`; |
| $cwd = `pwd` if ! defined $cwd; |
| die "Failed to absolutize $target. Failing to get cwd!" if ! defined $cwd; |
| chomp $cwd; |
| $cwd.="/"; |
|
|
| my $absorigin = ensure_relative_to_origin($originfile, $cwd); |
| return ensure_relative_to_origin($target, $absorigin); |
| } |
|
|
| sub ensure_relative_to_origin { |
| my $target = shift; |
| my $originfile = shift; |
| return $target if $target =~ /^\/|^~/; |
| $originfile =~ s/[^\/]*$//; |
| my $out = $originfile."/".$target; |
| $out =~ s/\/+/\//g; |
| $out =~ s/\/(\.\/)+/\//g; |
| return $out; |
| } |
|
|
| sub my_open { |
| my $f = shift; |
| if ($f eq "-") { |
| binmode(STDIN, ":utf8"); |
| return *STDIN; |
| } |
|
|
| die "Not found: $f" if ! -e $f; |
|
|
| my $opn; |
| my $hdl; |
| my $ft = `file '$f'`; |
| |
| if ($f =~ /\.gz$/ || $ft =~ /gzip compressed data/) { |
| $opn = "zcat '$f' |"; |
| } elsif ($f =~ /\.bz2$/ || $ft =~ /bzip2 compressed data/) { |
| $opn = "bzcat '$f' |"; |
| } else { |
| $opn = "$f"; |
| } |
| open $hdl, $opn or die "Can't open '$opn': $!"; |
| binmode $hdl, ":utf8"; |
| return $hdl; |
| } |
|
|