###########################
# Kristian S. Gleditsch
# Started: 23.03.2000
#
# This file creates annual dyadic observations from the system data
#
# The output file will be sorted by state 1 cownumber,
#	state 2 cownumber and year (if annual)
#
# Requires Sort::Field module from CPAN
#
# current version: 16.07.2000
############################


#################################
# I. Creating ouput files
open(USEOUT,">dyads.asc") || die "Cannot create the target file";
open(ERRLOG,">err.log") || die "Cannot create the error log file";
print ERRLOG "The following errors ocurred\n";


##################################
# II. Get preferences
#
# Change parameters to change output
#

$include_long_names = 'F';

$directed_dyads = 'F';

$annual = 'T';

$include_microstates = 'F';

$minyear = 1875;
$maxyear = 1992;

if ($include_long_names eq 'F'){
 if ($annual eq 'T'){
   @variables = ("numbera","ida","numberb","idb","year");
 }
 if ($annual eq 'F'){
   @variables = ("numbera","ida","numberb","idb","start","end");
 }
 $sep_char = " ";
}

print USEOUT join($sep_char,@variables[0..(@variables-1)])."\n";

###########################################

# III Read in the raw data

if ($include_microstates eq 'T'){
 use Sort::Fields;
 open(IN1,"ksgmdw/iisystem.dat") || die "Cannot open iisystem file";
 open(IN2,"ksgmdw/microstatessystem.dat") || die "Cannot open iisystem file";
 @inlist1 = <IN1>; # read everything
 @inlist2 = <IN2>; # read everything
 @uselist = fieldsort['1n'], (@inlist1,@inlist2);
}

if ($include_microstates eq 'F'){
 use Sort::Fields;
 open(IN,"ksgmdw/iisystem.dat") || die "Cannot open input file";
 @inlist = <IN>;
 @uselist = fieldsort['1n'], @inlist;
}

# Make a copy of uselist to loop over
open(OUTLIST,">uselist.dat") || die "Cannot create a uselist file";
foreach(@uselist){
 print OUTLIST $_
}
close(OUTLIST);

foreach(@uselist) { # Loop over lines in list
  chop($_);			# get rid of newline
  @info = split(/\t/,$_);  	# read 
  $ctynum = $info[0];
  $ctyid = $info[1];
  $long_name = $info[2];
  $start = $info[3];
  $end = $info[4];

  @startinfo = split(/:/,$start); 
  @endinfo = split(/:/,$end); 
  $startyear = $startinfo[2];
  $endyear = $endinfo[2];

  # grab countries in system
  push(@in_system_ids,$ctyid);  
  push(@in_system_nums,$ctynum);  
  push(@in_system_start,$startyear);  
  push(@in_system_end,$endyear);  
  if ($annual eq 'F'){
    push(@start_day,$startinfo[0]);
    push(@start_month,$startinfo[1]);
    push(@end_day,$endinfo[0]);
    push(@end_month,$endinfo[1]);
  }
} # End loop over @uselist

# VI Loop over countries
for ($i = 0; $i <= (@in_system_nums-1); $i++) {
 open(INLIST, "uselist.dat") || die "Cannot open the uselist.dat file";
 while(<INLIST>) { # Read lines from IN to $_, loop until EOF
  chop($_);			# get rid of newline
  @info = split(/\t/,$_);  	# read 
  $ctynum = $info[0];
  $ctyid = $info[1];
  $long_name = $info[2];
  $start = $info[3];
  $end = $info[4];

  @startinfo = split(/:/,$start); 
  @endinfo = split(/:/,$end); 
  $startyear = $startinfo[2];
  $endyear = $endinfo[2];
  if ($annual eq 'F'){
    $startday = $startinfo[0];
    $startmonth = $startinfo[1];
    $endday = $endinfo[0];
    $endmonth = $endinfo[1];
  }


 # VI Output depending on preferences

  #Annual observations

  if($annual eq 'T'){
    #Directed dyads
    if($directed_dyads eq 'T'){  
     if($in_system_nums[$i]!=$ctynum){ # for all other N-1 states

     undef $dyadstart;
     undef $dyadend;
     # Find the appropriate start year
     if($in_system_start[$i]<$startyear){$dyadstart = $startyear;} 
     elsif($in_system_start[$i]>=$startyear){$dyadstart = $in_system_start[$i];}

     # Find the appropriate end year
     if($in_system_end[$i]>$endyear){$dyadend = $endyear;} 
     elsif($in_system_end[$i]<=$endyear){$dyadend = $in_system_end[$i];}

     # Restrict years to the permissible range 
     if($dyadstart<$minyear){$dyadstart = $minyear;}
     if($dyadend>$maxyear){$dyadend = $maxyear;}
 
     # Write out dyad for the appropriate range 
     for ($j = $dyadstart; $j <= $dyadend; $j++) {
      @outvars = ($in_system_nums[$i],$in_system_ids[$i],
	$ctynum, $ctyid, $j);
      print USEOUT join($sep_char,@outvars[0..(@outvars-1)])."\n";

     } # Close yearloop
    } # Close number comparison
   } # End directed dyads eq 'T'

   #Not directed dyads
   if($directed_dyads eq 'F'){  
   if($in_system_nums[$i]<$ctynum){# for all dyads where 
				   # cownum for A < B
     undef $dyadstart;
     undef $dyadend;
     # Find the appropriate start year
     if($in_system_start[$i]<$startyear){$dyadstart = $startyear;} 
     elsif($in_system_start[$i]>=$startyear){$dyadstart = $in_system_start[$i];}

     # Find the appropriate end year
     if($in_system_end[$i]>$endyear){$dyadend = $endyear;} 
     elsif($in_system_end[$i]<=$endyear){$dyadend = $in_system_end[$i];}

     # Restrict years to the permissible range 
     if($dyadstart<$minyear){$dyadstart = $minyear;}
     if($dyadend>$maxyear){$dyadend = $maxyear;}
 
     # Write out dyad for the appropriate range 
     for ($j = $dyadstart; $j <= $dyadend; $j++) {
       @outvars = ($in_system_nums[$i],$in_system_ids[$i],
	$ctynum, $ctyid, $j);
       print USEOUT join($sep_char,@outvars[0..(@outvars-1)])."\n";

     } # Close yearloop
    } # Close number comparison
   } # End directed dyads eq 'F'

  } # End annual T

  #Not annual observations
  if($annual eq 'F'){
   #Directed dyads
   if($directed_dyads eq 'T'){  
    if($in_system_nums[$i]!=$ctynum){

      undef $dyadstart;
      undef $dyadend;

      # For countries existing at the same time 
      # Find appropriate starting date

      if($in_system_start[$i]<$startyear){
	$dyadstart = join ("/",($startday,$startmonth,$startyear));
	} 
      elsif($in_system_start[$i]>$startyear){
	$dyadstart = join ("/",($start_day[$i],$start_month[$i],$in_system_start[$i]));
        }
      elsif($in_system_start[$i]==$startyear) { # If year is the same
        if($start_month[$i]<$startmonth){
	   $dyadstart = join ("/",($startday,$startmonth,$startyear));
        }
        elsif($start_month[$i]>$startmonth){
	   $dyadstart = join ("/",($start_day[$i],$start_month[$i],$in_system_start[$i]));
        }
        elsif($start_month[$i]==$startmonth) { # month is the same
          if($start_day[$i]<$startday){
	    $dyadstart = join ("/",($startday,$startmonth,$startyear));
          }
          else{ # day is the same
	    $dyadstart = join ("/",($start_day[$i],$start_month[$i],$in_system_start[$i]));
          }
        } # Close elsif for same start month
      } # Close elsif for same start year
 
     # Find appropriate end date
     if($in_system_end[$i]>$endyear){
	$dyadend = join ("/",($endday,$endmonth,$endyear));
     } 
     elsif($in_system_end[$i]<$endyear){
	$dyadend = join ("/",($end_day[$i],
		$end_month[$i],$in_system_end[$i]));
     }
     else { # year must be the same
        if($end_month[$i]>$endmonth){
	   $dyadend = join ("/",($endday,$endmonth,$endyear));
        }
        elsif($end_month[$i]<$endmonth){
	   $dyadend = join ("/",($end_day[$i],$end_month[$i],$in_system_end[$i]));
        }
	else { # month must be the same
          if($end_day[$i]>$endday){
	    $dyadend = join ("/",($endday,$endmonth,$endyear));
          }
          else{$dyadend = join ("/",($end_day[$i],
		    $end_month[$i],$in_system_end[$i]));
          }
       } # Close else for same end month
      } # Close else for same end year

      # Restrict to valid range 
      @checkstart = split(/\//,$dyadstart); 
      if($checkstart[2]<$minyear){
	$dyadstart = join ("/",("01","01",$minyear));
        $checkstart[2] = $minyear; # Set to current
      }
      @checkend = split(/\//,$dyadend); 
      if($checkend[2]>$maxyear){
	$dyadend = join ("/",("01","01",$maxyear));
        $checkend[2] = $maxyear; # Set to current
      }

     # Don't print dyads where one state exits 
     # before the other's starting date
     if($checkstart[2]<=$checkend[2]){    
      @outvars = ($in_system_nums[$i],$in_system_ids[$i],
	$ctynum, $ctyid, $dyadstart, $dyadend);
      print USEOUT join($sep_char,@outvars[0..(@outvars-1)])."\n";
     } # Close check for country not exiting before other's starting date

    } # Close number comparison
   } # End directed dyads eq 'T'

 
  #Not directed dyads
   if($directed_dyads eq 'F'){  
   if($in_system_nums[$i]<$ctynum){

      undef $dyadstart;
      undef $dyadend;

      # For countries existing at the same time 
      # Find appropriate starting date

      if($in_system_start[$i]<$startyear){
	$dyadstart = join ("/",($startday,$startmonth,$startyear));
	} 
      elsif($in_system_start[$i]>$startyear){
	$dyadstart = join ("/",($start_day[$i],$start_month[$i],$in_system_start[$i]));
        }
      elsif($in_system_start[$i]==$startyear) { # If year is the same
        if($start_month[$i]<$startmonth){
	   $dyadstart = join ("/",($startday,$startmonth,$startyear));
        }
        elsif($start_month[$i]>$startmonth){
	   $dyadstart = join ("/",($start_day[$i],$start_month[$i],$in_system_start[$i]));
        }
        elsif($start_month[$i]==$startmonth) { # month is the same
          if($start_day[$i]<$startday){
	    $dyadstart = join ("/",($startday,$startmonth,$startyear));
          }
          else{ # day is the same
	    $dyadstart = join ("/",($start_day[$i],$start_month[$i],$in_system_start[$i]));
          }
        } # Close elsif for same start month
      } # Close elsif for same start year
 
     # Find appropriate end date
     if($in_system_end[$i]>$endyear){
	$dyadend = join ("/",($endday,$endmonth,$endyear));
     } 
     elsif($in_system_end[$i]<$endyear){
	$dyadend = join ("/",($end_day[$i],
		$end_month[$i],$in_system_end[$i]));
     }
     else { # year must be the same
        if($end_month[$i]>$endmonth){
	   $dyadend = join ("/",($endday,$endmonth,$endyear));
        }
        elsif($end_month[$i]<$endmonth){
	   $dyadend = join ("/",($end_day[$i],$end_month[$i],$in_system_end[$i]));
        }
	else { # month must be the same
          if($end_day[$i]>$endday){
	    $dyadend = join ("/",($endday,$endmonth,$endyear));
          }
          else{$dyadend = join ("/",($end_day[$i],
		    $end_month[$i],$in_system_end[$i]));
          }
       } # Close else for same end month
      } # Close else for same end year

      # Restrict to valid range 
      @checkstart = split(/\//,$dyadstart); 
      if($checkstart[2]<$minyear){
	$dyadstart = join ("/",("01","01",$minyear));
        $checkstart[2] = $minyear; # Set to current
      }
      @checkend = split(/\//,$dyadend); 
      if($checkend[2]>$maxyear){
	$dyadend = join ("/",("01","01",$maxyear));
        $checkend[2] = $maxyear; # Set to current
      }

     # Don't print dyads where one state exits 
     # before the other's starting date
     if($checkstart[2]<=$checkend[2]){    
      @outvars = ($in_system_nums[$i],$in_system_ids[$i],
	$ctynum, $ctyid, $dyadstart, $dyadend);
      print USEOUT join($sep_char,@outvars[0..(@outvars-1)])."\n";
     } # Close check for country not exiting before other's starting date

    } # Close number comparison
   } # End directed dyads eq 'F'

 } # End annual F

 } # Close loop over @state2list

} # Close loop over countries 


