*! version 1.0  29jun2014
program group_twoway, rclass
	
	version 12
	
	syntax varlist(min=2 max=2) , GENerate(name)
	confirm new variable `generate'
	local vertex1 : word 1 of `varlist'
	local vertex2  : word 2 of `varlist'

	tempvar edge vertexnum vertex ID_vertex ID_min ID_min_aux ID_min_aux2 dif_aux aux_n	
	tempfile aux aux2
	
	preserve
	keep `vertex1' `vertex2' // not necessary, just to make processing quickquer
	duplicates drop
	
	*To account for the possibility that the same vertex is in both the vertex1	and vertex2 list we "reshape" the edge list to long format.  
	gen `edge'=_n	
	expand 2
	sort `edge'
	gen 	`vertex'=`vertex1' if mod(_n,2)==1
	replace `vertex'=`vertex2' if mod(_n,2)==0
	drop `vertex1' `vertex2'

	*creating numeric ID for the vertexes, and making sure `ID_vertex'>`edge' for everi ID and edge number
	egen `ID_vertex'=group(`vertex')
	replace `ID_vertex'=`ID_vertex'+_N	
	
	*grouping:
	gen `ID_min'=`edge'	
	local x = 1
	local l = 0 // counts number of iterations
	while `x'==1 {
		cap drop `ID_min_aux'
		cap drop `ID_min_aux2'
		cap drop `dif_aux'

		egen `ID_min_aux'=min(`ID_min') , by(`vertex')
		replace `ID_min'=`ID_min_aux'
		egen `ID_min_aux2'=min(`ID_min') , by(`edge')
		replace `ID_min'=`ID_min_aux2'	
		
		display `l'
		local `l++'
		
		*loop stops when `ID_min'==`ID_min_aux' for all observations
		egen `dif_aux'=max(`ID_min'!=`ID_min_aux')	
		local x = `dif_aux'		
	}
	
	
	duplicates drop `vertex', force
	egen `generate'=group(`ID_min')
	rename `vertex' `vertex1'
	save `aux'	
	
	restore
	gen `aux_n'=_n
	merge m:1 `vertex1' using `aux' , nogen keep(master match)
	sort `aux_n' 
	end