https://github.com/F1000Research/GASOLINE
Raw File
Tip revision: b311a55a1126c2d961686f08fe5b341f930db7e5 authored by GMicale on 12 June 2014, 16:41:05 UTC
Update README.md
Tip revision: b311a55
GASOLINE.java
import java.io.*;
import java.util.*;
import javax.swing.JOptionPane;
import org.cytoscape.work.TaskMonitor;

public class GASOLINE
{
	static double scoreLabel=0.0;
	static double scoreTopology=0.0;
	static double SIGMA=7;
	static int ITER_EXTEND=200;
	static int ITER_SEED=200;
	static double OVERLAP=0.5;
	static int REFINE=10;
	static int MIN_COMPLEX_SIZE=5;
	static boolean PAIR_SCORES;
	static String PATH;
        static String homologyFileName;
	static NetworksData netData;
	static TaskMonitor task;
        
        public static OrderedList<Allineamento> startAlignment(double sigma, 
	int iterExtend, int iterSeed, double overlap, int refine, int minComplexSize, 
	boolean pairSc, String homFName, NetworksData nets, String destFolder, TaskMonitor taskMon) throws Exception
	{
		SIGMA=sigma;
                ITER_EXTEND=iterExtend;
                ITER_SEED=iterSeed;
		PAIR_SCORES=pairSc;
                netData=nets;
                PATH=destFolder;
		task=taskMon;
                
                if(overlap!=0)
			OVERLAP=overlap;
                if(refine!=0)
			REFINE=refine;
                if(minComplexSize!=0)    
			MIN_COMPLEX_SIZE=minComplexSize;
                
                homologyFileName=homFName;
            
                Grafo[] g=new Grafo[netData.getGList().size()];
                for(int j=0; j<netData.getGList().size(); j++)
		{
			g[j]=netData.getGList().get(j);
                }
		OrderedList<Allineamento> rankAlign=new OrderedList<Allineamento>();
		int i=0, j=0, k=0;
		int indIter=0;
		double bestScore=0.0;
		double bestScoreLabel=0.0;
		double bestScoreTopology=0.0;
        
		//Costruzione network
		HashMap<Integer,Integer> mapNet=netData.getMapNet();
		HashMap<String,Integer> mapNodi=netData.getMapNodi();
        
		//Lettura degli score di ortologia
		HashSet<Integer> allOrto=null;
		HashMap mapHomology;
		if(PAIR_SCORES)
		{
			mapHomology=new HashMap<Integer,HashMap<Integer,Double>>();
			allOrto=buildHomologiesFromPairwiseScores(g.length,mapNet,mapHomology,mapNodi);
		}
		else
		{
			mapHomology=new HashMap<Integer,Vector<String>>();
			allOrto=buildHomologiesFromCOG(g.length,mapNet,mapHomology,mapNodi);
		}
                if(allOrto==null)
			return null;
		
		//Inizio algoritmo
		double inizio=System.currentTimeMillis();
		
		//Filtraggio nodi
		HashSet<Integer>[] nodiCluster=filterNodes(g,allOrto);
		
		int maxPercent=Integer.MAX_VALUE;
		for(i=0;i<nodiCluster.length;i++)
		{
			if(nodiCluster[i].size()<maxPercent)
				maxPercent=nodiCluster[i].size();
		}
		
		boolean search=true;
		while(search)
		{
			double currentPercent=Math.min(((double)(indIter+1))/maxPercent,1.0);
			task.setProgress(currentPercent);
			for(i=0;i<nodiCluster.length;i++)
			{
				if(nodiCluster[i].isEmpty())
				{
					//Uno dei set ridotti si è svuotato: l'algoritmo può terminare
					search=false;
					break;
				}
			}
			if(!search)
				continue;
            
			//FASE 1) Ricerca dei seed ottimali
			double alignScore=0.0;
			Vector<Integer>[] seed;
			if(PAIR_SCORES)
			{
				GibbsSamplerSeedPairScores gs=new GibbsSamplerSeedPairScores(ITER_SEED, nodiCluster);
				seed=gs.runGibbs(mapHomology);
				alignScore=gs.getBestScore();
			}
			else
			{
				GibbsSamplerSeedCOG gs=new GibbsSamplerSeedCOG(ITER_SEED, nodiCluster);
				seed=gs.runGibbs(mapHomology);
				alignScore=gs.getBestScore();
			}
			if(alignScore<g.length-1)
			{
				for(i=0;i<seed.length;i++)
				{
					for(j=0;j<seed[i].size();j++)
						nodiCluster[i].remove(seed[i].get(j));
				}
				indIter++;
				continue;
			}	
			HashSet<Integer>[] adiacSeed;
			try
			{
				adiacSeed=getAdiacSeed(g,seed);
			}
			catch(Exception e)
			{
				for(i=0;i<seed.length;i++)
				{
					for(j=0;j<seed[i].size();j++)
						nodiCluster[i].remove(seed[i].get(j));
				}
				indIter++;
				continue;
			}
			
			double scoreAlignment=0.0;
			boolean contin=true;
			double[][][] adiacMaps= new double[g.length][][];
			int[][] ids=new int[g.length][];
			buildMaps(g, seed, adiacSeed, ids, adiacMaps);
			for(j=0;j<ids.length;j++)
			{
				if(ids[j].length==0)
					contin=false;
			}
			if(contin)
			{
				//FASE 2: estensione dell'allineamento di un passo (allineamento ottimale di archi)
				int[] align;
				if(PAIR_SCORES)
				{
					GibbsSamplerExtendPairScores gse=new GibbsSamplerExtendPairScores(ITER_EXTEND,ids,adiacMaps);
					align=gse.runGibbs(mapHomology);
					alignScore=gse.getBestScoreLabel();
				}
				else
				{
					GibbsSamplerExtendCOG gse=new GibbsSamplerExtendCOG(ITER_EXTEND,ids,adiacMaps);
					align=gse.runGibbs(mapHomology);
					alignScore=gse.getBestScoreLabel();
				}
				if(alignScore==g.length)
				{
					for(j=0;j<align.length;j++)
						seed[j].add(align[j]);
					scoreAlignment=scoreAlign(g,seed);
					for(j=0;j<adiacSeed.length;j++)
					{
						HashMap<Integer,Double> adiac=g[j].nodi().get(seed[j].get(seed[j].size()-1)).getAdiacs();
						Set<Integer> keys=adiac.keySet();
						Iterator<Integer> it=keys.iterator();
						while(it.hasNext())
							adiacSeed[j].add(it.next());
						for(k=0;k<seed[j].size();k++)
							adiacSeed[j].remove(seed[j].get(k));
					}
				}
			}
			
			//FASE 3) Eliminazione dei nodi dal set ridotto
			for(i=0;i<seed.length;i++)
			{
				for(j=0;j<seed[i].size();j++)
					nodiCluster[i].remove(seed[i].get(j));
			}
			
			//FASE 4) Estensione e raffinamento dei seed
			if(seed[0].size()>=2)
			{
				int maxSize=seed[0].size();
				Vector<Integer>[] copySeed=new Vector[g.length];
				for(i=0;i<seed.length;i++)
				{
					copySeed[i]=new Vector<Integer>();
					for(j=0;j<seed[i].size();j++)
						copySeed[i].add(seed[i].get(j));
				}
				Allineamento a=new Allineamento(copySeed, copySeed[0].size(), scoreAlignment);
				for(i=0;i<REFINE;i++)
				{
					if(seed[0].size()>2)
						removeNode(g,seed);
					double avgDens=modularity(g,seed);
					extendSeeds(g,seed,adiacSeed,mapHomology,avgDens);
					scoreAlignment=scoreAlign(g,seed);
					if(scoreAlignment*seed[0].size()>a.getIsc()*a.getComplexSize())
					{
						copySeed=new Vector[g.length];
						for(j=0;j<seed.length;j++)
						{
							copySeed[j]=new Vector<Integer>();
							for(k=0;k<seed[j].size();k++)
								copySeed[j].add(seed[j].get(k));
						}
						a=new Allineamento(copySeed, copySeed[0].size(), scoreAlignment);
					}
				}
                
				//Stampa del miglior allineamento locale trovato dopo la refine
				Vector<Integer>[] mapping=a.getMapping();
				if(mapping[0].size()>=MIN_COMPLEX_SIZE)
				{
					rankAlign.insertOrdered(a);
					/*System.out.println("COMPLEX SIZE: "+a.getComplexSize());
					System.out.println("ISC: "+a.getIsc());    
					System.out.println("ITERATION: "+(indIter+1)+"\n");*/
				}
			}
			indIter++;
			
		}
		double currentPercent=1.0;
		task.setProgress(currentPercent);
		
		//POST-PROCESSING: risoluzione overlapping
		checkOverlap(g.length, rankAlign);
        
		//Stampa allineamenti migliori
		writeAlignments(g, rankAlign);
		
		//Fine algoritmo
		double fine=System.currentTimeMillis();
		//System.out.println("Running time: "+(((float)(fine-inizio))/1000)+" sec \n");
                
                return rankAlign;
	}
    
	//Restituisce la lista dei nodi adiacenti ai seed dell'allineamento
	public static HashSet<Integer>[] getAdiacSeed(Grafo[] g, Vector<Integer>[] seed)
	{
		HashSet<Integer>[] adiacSeed=new HashSet[g.length];
		int i=0, j=0;
		for(i=0;i<adiacSeed.length;i++)
		{
			adiacSeed[i]=new HashSet<Integer>();
			for(j=0;j<seed[i].size();j++)
			{
				HashMap<Integer,Double> adiac=g[i].nodi().get(seed[i].get(j)).getAdiacs();
				Set<Integer> keys=adiac.keySet();
				Iterator<Integer> it=keys.iterator();
				while(it.hasNext())
					adiacSeed[i].add(it.next());
			}
			for(j=0;j<seed[i].size();j++)
				adiacSeed[i].remove(seed[i].get(j));
		}
		return adiacSeed;
	}
    
	//Costruisce le strutture dati necessarie per il GibbsSamplerExtend: 1) la lista degli id dei nodi adiacenti, 2) le mappe dei pesi
	//degli archi che collegano i nodi adiacenti ai nodi del seed
	public static void buildMaps(Grafo[] g, Vector<Integer>[] seed, HashSet<Integer>[] adiacSeed, int[][] ids, double[][][] adiacMaps)
	{
		int i=0, j=0, k=0;
		for(i=0;i<adiacSeed.length;i++)
		{
			ids[i]=new int[adiacSeed[i].size()];
			adiacMaps[i]=new double[adiacSeed[i].size()][seed[i].size()];
			Iterator<Integer> it=adiacSeed[i].iterator();
			j=0;
			while(it.hasNext())
			{
				int id=it.next();
				ids[i][j]=id;
				Nodo n=g[i].nodi().get(id);
				HashMap<Integer,Double> adiac=n.getAdiacs();
				for(k=0;k<seed[i].size();k++)
				{
					if(adiac.containsKey(seed[i].get(k)))
						adiacMaps[i][j][k]=adiac.get(seed[i].get(k));
					else
						adiacMaps[i][j][k]=0.0;
				}
				j++;
			}
		}
	}
    
	//Costruisce i sottografi dell'allineamento locale trovato
	public static Grafo buildSubgraph(Grafo gr, Vector<Integer> nodi)
	{
		int i=0, j=0;
		HashMap<Integer,Nodo> listaNodi=gr.nodi();
		Grafo subGr=new Grafo();
		for(i=0;i<nodi.size();i++)
			subGr.addNode(nodi.get(i),listaNodi.get(nodi.get(i)).getLabel());
		HashMap<Integer,Double> adiac=null;
		for(i=0;i<nodi.size();i++)
		{
			adiac=listaNodi.get(nodi.get(i)).getAdiacs();
			for(j=0;j<nodi.size();j++)
			{
				if(adiac.containsKey(nodi.get(j)))
					subGr.addArc(nodi.get(i),nodi.get(j),adiac.get(nodi.get(j)));
			}
		}
		return subGr;
	}
    
	//Calcola lo score di conservazione strutturale dell'allineamento trovato (circular sum)
	public static double scoreAlign(Grafo[] g, Vector<Integer>[] seed)
	{
		int i=0, j=0, k=0;
		double scoreTopology=0.0;
		double parzScoreDegree=0.0;
		double scorePair=0.0;
		double mapScore=0.0;
        
		for(i=0;i<seed.length-1;i++)
		{
			scorePair=0.0;
			for(j=0;j<seed[i].size();j++)
			{
				HashMap<Integer,Double> adiacSource=g[i].nodi().get(seed[i].get(j)).getAdiacs();
				double[] mapSource=new double[seed[i].size()];
				for(k=0;k<seed[i].size();k++)
				{
					if(adiacSource.containsKey(seed[i].get(k)))
						mapSource[k]=adiacSource.get(seed[i].get(k));
					else
						mapSource[k]=0.0;
				}
				HashMap<Integer,Double> adiacDest=g[i+1].nodi().get(seed[i+1].get(j)).getAdiacs();
				double[] mapDest=new double[seed[i+1].size()];
				for(k=0;k<seed[i+1].size();k++)
				{
					if(adiacDest.containsKey(seed[i+1].get(k)))
						mapDest[k]=adiacDest.get(seed[i+1].get(k));
					else
						mapDest[k]=0.0;
				}
				mapScore=0.0;
				for(k=0;k<mapSource.length;k++)
				{
					if((mapSource[k]!=0.0 && mapDest[k]!=0.0)||(mapSource[k]==0.0 && mapDest[k]==0.0))
						mapScore++;
				}
				mapScore=mapScore/mapSource.length;
				scorePair+=mapScore;
			}
			scoreTopology+=scorePair;
		}
		scorePair=0.0;
		for(j=0;j<seed[i].size();j++)
		{
			HashMap<Integer,Double> adiacSource=g[i].nodi().get(seed[i].get(j)).getAdiacs();
			double[] mapSource=new double[seed[i].size()];
			for(k=0;k<seed[i].size();k++)
			{
				if(adiacSource.containsKey(seed[i].get(k)))
					mapSource[k]=adiacSource.get(seed[i].get(k));
				else
					mapSource[k]=0.0;
			}
			HashMap<Integer,Double> adiacDest=g[0].nodi().get(seed[0].get(j)).getAdiacs();
			double[] mapDest=new double[seed[0].size()];
			for(k=0;k<seed[0].size();k++)
			{
				if(adiacDest.containsKey(seed[0].get(k)))
					mapDest[k]=adiacDest.get(seed[0].get(k));
				else
					mapDest[k]=0.0;
			}
			mapScore=0.0;
			for(k=0;k<mapSource.length;k++)
			{
				if((mapSource[k]!=0.0 && mapDest[k]!=0.0)||(mapSource[k]==0.0 && mapDest[k]==0.0))
					mapScore++;
			}
			mapScore=mapScore/mapSource.length;
			scorePair+=mapScore;
		}
		
		scoreTopology+=scorePair;
	        scoreTopology=scoreTopology/(seed[0].size()*g.length);
	        return scoreTopology;
	}
	
	public static double modularity(Grafo[] g, Vector<Integer>[] seed)
	{
		int i=0, j=0, k=0;
		double scoreAlign=1.0;
		for(i=0;i<seed.length;i++)
	        {
			double complexDegreeInt=0.0;
			double totalDegree=0.0;
			for(j=0;j<seed[i].size();j++)
			{
				HashMap<Integer,Double> adiacSource=g[i].nodi().get(seed[i].get(j)).getAdiacs();
				totalDegree+=g[i].nodi().get(seed[i].get(j)).grado();
				for(k=0;k<seed[i].size();k++)
				{
					if(adiacSource.containsKey(seed[i].get(k)))
						complexDegreeInt++;
				}
			}
			scoreAlign*=complexDegreeInt/totalDegree;
		}
		scoreAlign=scoreAlign/seed.length;
	        return scoreAlign;
	}
	
	//Eliminazione dai grafi dei nodi che non hanno ortologhi in tutte le specie e costruzione del set iniziale dei nodi per la ricerca
	//di allineamenti di seed ottimali, formato da nodi che non hanno ortologhi in tutte le specie e nodi con grado < SIGMA
	public static HashSet<Integer>[] filterNodes(Grafo[] g, HashSet<Integer> allOrto)
	{
		int i=0;
		HashSet<Integer>[] nodiCluster=new HashSet[g.length];
		for(i=0;i<g.length;i++)
		{
			nodiCluster[i]=new HashSet<Integer>();
			OrderedList<Degree> rankScores=new OrderedList<Degree>();
			HashMap<Integer,Nodo> mapNodi=g[i].nodi();
			Set<Integer> keys=mapNodi.keySet();
			Iterator<Integer> it=keys.iterator(); 
			while(it.hasNext())
			{
				int id=it.next();
				int grado=mapNodi.get(id).grado();
				Degree c=new Degree(id, grado);
				rankScores.insertOrdered(c);
			}
			NodoOrdList<Degree> aux=rankScores.getMax();
			while(aux!=null)
			{
				Degree c=aux.getInfo();
				if(c.getDegree()>=SIGMA && allOrto.contains(c.getId()))
					nodiCluster[i].add(c.getId());
				if(!allOrto.contains(c.getId()))
					g[i].removeNode(c.getId());
				aux=aux.getNext();
			}
			//System.out.println(nodiCluster[i].size());
		}
		return nodiCluster;
	}
    
	//Rimozione dall'allineamento del set di nodi allineati con goodness minima
	public static void removeNode(Grafo[] g, Vector<Integer>[] seed)
	{
		int i=0, j=0, k=0;
		int indexRemove=0;
		double minGoodness=10;
		for(j=0;j<seed[0].size();j++)
		{
			double goodness=1.0;
			for(i=0;i<seed.length;i++)
			{
				//Calcolo peso nodo
				double inDegree=0.0;
				HashMap<Integer,Double> adiac=g[i].nodi().get(seed[i].get(j)).getAdiacs();
				for(k=0;k<seed[i].size();k++)
				{
					if(adiac.containsKey(seed[i].get(k)))
						inDegree++;
				}
				double modularity=inDegree/g[i].nodi().get(seed[i].get(j)).grado();
				goodness*=modularity;
			}
			if(goodness<minGoodness)
			{
				indexRemove=j;
				minGoodness=goodness;
			}
                }
		//Rimozione dal seed
		for(i=0;i<seed.length;i++)
			seed[i].remove(indexRemove);
	}
    
	//Estensione dei seed dell'allineamento
	public static void extendSeeds(Grafo[] g, Vector<Integer>[] seed, HashSet<Integer>[] adiacSeed, HashMap mapHomology, double initDens)
	{
		boolean cont=true;
		int j=0, k=0;
		double bestDens=initDens;
		while(cont)
		{
			double[][][] adiacMaps= new double[g.length][][];
			int[][] ids=new int[g.length][];
			buildMaps(g, seed, adiacSeed, ids, adiacMaps);
			for(j=0;j<ids.length;j++)
			{
				if(ids[j].length==0)
					cont=false;
			}
			if(cont)
			{
				int[] align;
				double alignScore=0.0;
				if(PAIR_SCORES)
				{
					GibbsSamplerExtendPairScores gse=new GibbsSamplerExtendPairScores(ITER_EXTEND,ids,adiacMaps);
					align=gse.runGibbs(mapHomology);
					alignScore=gse.getBestScoreLabel();
				}
				else
				{
					GibbsSamplerExtendCOG gse=new GibbsSamplerExtendCOG(ITER_EXTEND,ids,adiacMaps);
					align=gse.runGibbs(mapHomology);
					alignScore=gse.getBestScoreLabel();
				}
				if(alignScore<g.length-1)
					cont=false;
				else
				{
					for(j=0;j<align.length;j++)
						seed[j].add(align[j]);
					double avgDens=modularity(g,seed);
					if(avgDens<bestDens)
					{
						for(j=0;j<align.length;j++)
							seed[j].remove(seed[j].size()-1);
						cont=false;
					}
					else
					{
						bestDens=avgDens;
						for(j=0;j<adiacSeed.length;j++)
						{
							HashMap<Integer,Double> adiac=g[j].nodi().get(seed[j].get(seed[j].size()-1)).getAdiacs();
							Set<Integer> keys=adiac.keySet();
							Iterator<Integer> it=keys.iterator();
							while(it.hasNext())
								adiacSeed[j].add(it.next());
							for(k=0;k<seed[j].size();k++)
								adiacSeed[j].remove(seed[j].get(k));
						}
					}
				}
			}
		}
	}
    
	public static HashSet<Integer> buildHomologiesFromCOG(int numNet, HashMap<Integer,Integer> mapNet, HashMap<Integer,Vector<String>> mapHomology, HashMap<String,Integer> mapNodi) throws Exception
	{
		int i=0;
		HashMap<String, boolean[]> groups=new HashMap<String,boolean[]>();
		HashSet<String> allGroups=new HashSet<String>();
		HashSet<Integer> allOrto=new HashSet<Integer>();
		BufferedReader br=new BufferedReader(new FileReader(homologyFileName));
		String str="";
		while((str=br.readLine())!=null)
		{
			String[] campi=str.split("\t");
			String source=campi[0].trim();
			if(mapNodi.containsKey(source))
			{
				int idSource=mapNodi.get(source);
				Vector<String> listaGruppi=new Vector<String>();
				String[] list=campi[1].substring(1,campi[1].length()-1).split(", ");
				for(i=0;i<list.length;i++)
				{
					listaGruppi.add(list[i]);
					boolean[] species=new boolean[numNet];
					if(groups.containsKey(list[i]))
						species=groups.get(list[i]);
					species[mapNet.get(idSource)]=true;
					groups.put(list[i],species);
				}
				Collections.sort(listaGruppi);
				mapHomology.put(idSource,listaGruppi);
			}
		}
		br.close();
		
		Set<String> keys=groups.keySet();
		Iterator<String> it=keys.iterator();
		while(it.hasNext())
		{
			String id=it.next();
			boolean[] species=groups.get(id);
			int cont=0;
			for(i=0;i<species.length;i++)
			{
				if(species[i])
					cont++;
				else
					break;
			}
			if(cont==numNet)
				allGroups.add(id);
		}
		
		Set<Integer> keys2=mapHomology.keySet();
		Iterator<Integer> it2=keys2.iterator();
		while(it2.hasNext())
		{
			int id=it2.next();
			Vector<String> list=mapHomology.get(id);
			for(i=0;i<list.size();i++)
			{
				String group=list.get(i);
				if(!allGroups.contains(group))
					list.remove(group);
			}
			mapHomology.put(id,list);
			if(list.size()!=0)
				allOrto.add(id);
		}
		
		return allOrto;
	}
	
	public static HashSet<Integer> buildHomologiesFromPairwiseScores(int numNet,HashMap<Integer,Integer> mapNet, HashMap<Integer,HashMap<Integer,Double>> mapHomology, HashMap<String,Integer> mapNodi) throws Exception
	{
		int i=0;
		HashMap<Integer,boolean[]> ortologhi=new HashMap<Integer,boolean[]>();
		HashSet<Integer> allOrto=new HashSet<Integer>();
		BufferedReader br=new BufferedReader(new FileReader(homologyFileName));
		br.readLine();
		String str="";
		while((str=br.readLine())!=null)
		{
			String[] campi=str.split("\t");
			String source=campi[0].trim();
			String dest=campi[1].trim();
			if(mapNodi.containsKey(source) && mapNodi.containsKey(dest))
			{
			int idSource=mapNodi.get(source);
			int idDest=mapNodi.get(dest);
			double weight=Double.parseDouble(campi[2].trim());
			HashMap<Integer,Double> omologhi;
			if(idSource<idDest)
			{
				if(mapHomology.containsKey(idSource))
					omologhi=mapHomology.get(idSource);
				else
					omologhi=new HashMap<Integer,Double>();
				omologhi.put(idDest,weight);
				mapHomology.put(idSource,omologhi);
			}
			else
			{
				if(mapHomology.containsKey(idDest))
					omologhi=mapHomology.get(idDest);
				else
					omologhi=new HashMap<Integer,Double>();
				omologhi.put(idSource,weight);
				mapHomology.put(idDest,omologhi);
			}
		
			boolean[] orto;
			if(ortologhi.containsKey(idSource))
				orto=ortologhi.get(idSource);
			else
				orto=new boolean[numNet];
			orto[mapNet.get(idDest)]=true;
			ortologhi.put(idSource,orto);
		
			if(ortologhi.containsKey(idDest))
				orto=ortologhi.get(idDest);
			else
				orto=new boolean[numNet];
			orto[mapNet.get(idSource)]=true;
			ortologhi.put(idDest,orto);
			}
		}
		br.close();
		//System.out.println(mapHomology);
	
		Set<Integer> keys=ortologhi.keySet();
		Iterator<Integer> it=keys.iterator();
		while(it.hasNext())
		{
			int id=it.next();
			boolean[] orto=ortologhi.get(id);
			int cont=0;
			for(i=0;i<orto.length;i++)
			{
				if(i!=mapNet.get(id) && orto[i])
					cont++;
			}
			if(cont==numNet-1)
				allOrto.add(id);
		}
		return allOrto;
	}
	
	public static void writeAlignments(Grafo[] g, OrderedList<Allineamento> rankAlign) throws Exception
	{
		//System.out.println("\nBEST_ALIGNMENTS:\n");
		NodoOrdList<Allineamento> aux=rankAlign.getMax();
		int cont=1;
		int i=0, j=0;
		while(aux!=null)
		{
			Allineamento a=aux.getInfo();
			//System.out.println(a);
			Vector<Integer>[] mapping=a.getMapping();
			//Memorizzazione allineamento
			BufferedWriter bw=new BufferedWriter(new FileWriter(PATH+"/Alignment"+cont+".txt"));
			bw.write("Total score: "+a.getComplexSize()*a.getIsc()+"\r\n");
			bw.write("Complex size: "+a.getComplexSize()+"\r\n");
			bw.write("Index of Structural Conservation (ISC): "+a.getIsc()+"\r\n"+"\r\n");
			for(j=0;j<mapping.length;j++)
			{
				bw.write(g[j].getName().toUpperCase()+":\r\n");
				bw.write(buildSubgraph(g[j], mapping[j])+"\r\n");
			}
			bw.write("MAPPING:\r\n"+"\r\n");
			for(j=0;j<mapping[0].size();j++)
			{
				for(i=0;i<mapping.length;i++)
				{
					HashMap<Integer,Nodo> listaNodi=g[i].nodi();
					bw.write(listaNodi.get(mapping[i].get(j)).getLabel()+"\t");
				}
				bw.write("\r\n");
			}
			bw.close();
			aux=aux.getNext();
			cont++;
		}
		//System.out.println();
	}
	
	public static void checkOverlap(int numNet, OrderedList<Allineamento> rankAlign)
	{
		int i=0, j=0;
		NodoOrdList<Allineamento> aux=rankAlign.getMax();
		HashSet<Integer> nodiOverlap=new HashSet<Integer>();
		while(aux!=null)
		{
			Vector<Integer>[] mapping=aux.getInfo().getMapping();
			double[] overlapping=new double[numNet];
			for(i=0;i<overlapping.length;i++)
				overlapping[i]=0.0;
			for(i=0;i<mapping.length;i++)
			{
				for(j=0;j<mapping[i].size();j++)
				{
					if(nodiOverlap.contains(mapping[i].get(j)))
						overlapping[i]++;
				}
			}
			double avg=0.0;
			for(i=0;i<overlapping.length;i++)
			{
				overlapping[i]=overlapping[i]/mapping[0].size();
				avg+=overlapping[i];
			}
			avg=avg/overlapping.length;
			if(avg<=OVERLAP)
			{
				for(i=0;i<mapping.length;i++)
				{
					for(j=0;j<mapping[i].size();j++)
						nodiOverlap.add(mapping[i].get(j));
				}
			}	
			else
				rankAlign.delete(aux.getInfo());
			aux=aux.getNext();
		}
	}
    
}
back to top