#!/usr/local/bin/perl -w # Nflip.p - from NCY.p # # reads in a list of difference sets and writes out # derived lists differing by flips. # # Fri 5/7/02 It can also handle multiple such lists separated by n=500 statements # # Nflip.p DSfile=DS500 # # Nflip.p DSfile=NCY/200.4.6a # Nflip.p DSfile=200.4.5a # foreach g ( 200.4.5a ) # Nflip.p DSfile=$g # echo $g > $g.result # foreach f ( $g???? ) # echo $f >> $g.result # NCY.p s=1 DSfile=$f >> $g.result # end # end # based on binarize.p and G2H.p # writes Alist matrix to stdout sub bynumber { $a <=> $b; } $M=0; $DSfile = "string/157.10" ; # difference set $v = 0 ; eval "\$$1=\$2" while @ARGV && $ARGV[0]=~ /^(\w+)=(.*)/ && shift; if($M < "0" ) { print STDERR "usage:\n "; print STDERR " Nflip.p DSfile=200.4.5a\n" ; } open ( H , "< $DSfile" ) ; $i = 0 ; $k = 0 ; # k counts how many entire matrices we have read. @r = ; close(H) ; $pending = 0 ; # whether we have a set pending $m= 0 ; foreach $row ( @r ) { if ($v ) { print STDERR "processing row - $row\n" ; } if ( $row =~ m/[n]=(\d+)/ ) { if($pending){ # flush out the previous example $k++ ; $matrices = $m; $outfile = "$DSfile.$k." ; recurse(1,$outfile,$top) ; $m=0; } $M = $1 ; print STDERR "found M=$M from file\n" ; $top = $row ; } else { $pending = 1 ; $_ = $row ; $head= "" ; if ( s/^(.*\:\s+)// ){ $head = $1 ;} @set = split ; $m ++ ; $I[$m] = $#set+1 ; print STDERR "matrix $m has $I[$m] entries\n" ; for ( $i = 0 ; $i < $I[$m] ; $i ++ ) { $set[$i] = $M-1 - $set[$i]; } $otherset = join ( " " , reverse ( @set ) ) ; $reverse{$m,1} = $head . $otherset . "\n" ; $reverse{$m,0} = $row ; } } if($k < 1){ # there is only one example $outfile = $DSfile ; } else { $k++ ; $outfile = "$DSfile.$k." ; } # $matrices = $m; recurse(1,$outfile,$top) ; sub recurse { local ( $m , $file , $stri ) = @_ ; local($f) = 0 ; for ( ;$f<=1;$f++) { # run through flip states if($v){ print " "x$m."$m,$f\n" ; } local($newfile)=$file.$f ; local($newstri) = $stri.$reverse{$m,$f} ; if ( $m == $matrices ) { open ( F , ">$newfile" ) ; print F $newstri ; close(F) ; } else { recurse($m+1,$newfile,$newstri) ; } } }