#
#ｎ個のネットワークファイル（pajek用　拡張子）をマージする
#		author	akinori-i
#		
#		参考プログラム
#			mergeNetworksBynameShort.pl（まつしんさん）
#			networkShrinker.pl(ろぎさん)
#
#		◇入力
#			・ｎ個の.netファイル
#		
#		◇出力
#			ｎ個の.netファイルをマージしてパーティション情報を組み合わせた.palファイル
#
#		◇使用法
#			コマンドラインでマージするファイルを並べて以下のコマンドをたたく（要 Perl 5以上）
#			perl MboxNetworkMergePajek.pl data1-1983.net data2-1983.net ・・・
#
#
#�@ファイル読み込む⇒OK
#	↓
#�A各アドレスに新IDを与えていき⇒OK、前に既に登場していればアドレスは.palに出力しない（１から順に新IDを与えていく）
#	↓#�Cあらかじめ与えられているIDと新IDを互換するハッシュを作成⇒OK
#�B新IDがどの2^iのグループとして、前に出ていれば新ネットワークの2^jを足し合わせる
#	↓

#	↓
#�DArcsを新IDに変換
#	↓
#�EArcsに足し合わせる
#
#


#
use strict;
use warnings;

my $n = 4;							#ネットワークの個数
my $filename;
my @add;
my @nameline;						#取り込むファイルの行
my %key;
my @address;
my %newold;
my $old;
my %groupid;
my @arcsline;						#旧Arcsの１行をスプリットしてる
my $send;							#新送信ノード
my $receive;						#新受信ノード
my $times;							#送受信回数
my @arcs;							#新Arcs部分

&merge();


sub merge {
	my $j=0;
	my $newid=1;
	my $k=1;
	
	#ファイルの読み込み
	for (my $i=0; $i<$n; $i++){
		$filename=$ARGV[$i];
		open NET,"$filename";
		$filename =~ tr/0-9/ /cs;
		#print $filename;
		#$newid = ($newid << $k);		
		#print "k = $k\n";
		#アドレスを順に読み込む
		while($_=<NET>){
			#アドレスが記述されている行の判断（「(数字)　"アドレス"」から始まる）
			if($_ =~ /^[0-9]+ "[a-zA-Z0-9\.\-\_\$]+\@[a-zA-Z0-9\.\-\_]+"/){
				#"アドレス"の取り込み
				@nameline = split(/ /,$_);
				$old = $nameline[0];
								
				#以前に登録したかどうか
				if($key{$nameline[1]}){								#前に存在する
					$newold{$old} = $key{$nameline[1]};
					$groupid{$key{$nameline[1]}} = ($newid << $k) + $groupid{$key{$nameline[1]}};
					#print "元=($newid << ($k-1))	groupid = $groupid{$key{$nameline[1]}} \n";
				}
				else{												#初めて出てきた
					$j++;
					#アドレス=>新IDのハッシュ
					$key{$nameline[1]} = $j;
					$newold{$old} = $j;
					$groupid{$j} = ($newid << $k);
					push(@address,"$key{$nameline[1]} $nameline[1]");
				}
				#print "	$groupid{$key{$nameline[1]}}	$key{$nameline[1]}	$nameline[1]";
				
			}
			
			
			
			#Arcsのノード番号変換
			elsif($_ =~ /^[0-9]+ [0-9]+ [0-9]+/){
				@arcsline = split(/ /,$_);
				$send = $newold{$arcsline[0]};
				$receive = $newold{$arcsline[1]};
				$times = $arcsline[2];
				push(@arcs,"$send $receive $times");
			}
		}
		close(NET);
		$k++;
	}


	open NEWNET, ">>$filename.paj" or die "cannot open savefile.\n";
	print NEWNET "*NETWORK eclipse_$filename\n";
	print NEWNET "*Vertices $j\n";
	print NEWNET join ('',@address);
	print NEWNET "*Arcs\n";
	print NEWNET join ('',@arcs);
	print NEWNET "*Partition eclipse_$filename.clu\n";
	print NEWNET "*Vertices $j\n";
	my $l;
	for($l=1; $l<=$j; $l++){
	#		print NEWNET join ('',"$groupid{$l}\n");
	#}
	
		if ($groupid{$l} == 1<<1){
			print NEWNET join ('',"1\n");
		}
		elsif ($groupid{$l} == 1<<2){
			print NEWNET join ('',"2\n");
		}
		elsif ($groupid{$l} == 1<<3){
			print NEWNET join ('',"3\n");
		}
		elsif ($groupid{$l} == 1<<4){
			print NEWNET join ('',"4\n");
		}
		else{
		print NEWNET join ('',"5\n");
		}
	}
	close(NEWNET);
}
