|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
} |
|
|