Example #1
0
//Eisagwgh susxetisewn
void loadRelationship(char* filename,Graph* A, Graph *B,char* relationship,int number_of_properties,const int* type,int option){
	
    FILE* from = fopen(filename,"r");
    char* line=NULL;
    int line_size=50;
    int startid,endid;
    int i;
    int line_len;
    Edge* edge;
    char* stringID;
    Node* node;
    char** property;
    property = (char**)malloc(sizeof(char*)*number_of_properties);
    if (A!=NULL)
		insertEdgeProperty(A,relationship);
	if (B!=A && B!=NULL)
   		insertEdgeProperty(B,relationship);

 
	getline(&line,&line_size,from); 
	free(line);
	line = NULL;
    while (!feof(from)){
    	line_len  = getline(&line,&line_size,from);
		
    	if (line_len == -1){

			free(line);
			line=NULL;
			continue;
		}
		
    	stringID = strtok(line,"|");

    	if (stringID==NULL){
			free(line);
			line = NULL;
			continue;
		}   	
    	startid = atoi(stringID);
    	stringID = strtok(NULL,"|\n");
	
    	if (stringID==NULL){
			free(line);
			line = NULL;
			continue;
		}
		endid = atoi(stringID);
		//An dn uparxei to startID h to endID pame sthn epomenh grammh

    	for (i=0;i<number_of_properties;i++){
    		property[i] =  strtok(NULL,"|\n");
    	}
    	//An to option=1 tote ama oi susxetiseis einai metaxu 2 komvwn (an dn uparxoun tous prosthetw)
    	//Gia paradeigma sta posts an dn uparxoun ta posts pou kapios exei kanei like/replie ta prosthetw
    	if (option==1){
			if (A!=NULL && lookupNode(startid,A)==NULL){
				node = setNodeProperties(startid,NULL,NULL,0);
				insertNode(node,A);
			}
			if (A!=B && B!=NULL && lookupNode(endid,B)==NULL)	{
				node = setNodeProperties(endid,NULL,NULL,0);
				insertNode(node,B);
			}
		}
    	if (A!=NULL && lookupNode(startid,A)!=NULL){
				edge = setEdgeProperties(startid,endid,property,type,number_of_properties);
				find_insertEdge(startid,edge,A,relationship);			
			
		}
		if (A!=B && B!=NULL && lookupNode(endid,B)!=NULL){
				edge = setEdgeProperties(endid,startid,property,type,number_of_properties);
				find_insertEdge(endid,edge,B,relationship); 			
			
		}
 
    	free(line);
    	line=NULL;
    
    }	

    free(property);
    fclose(from); 




}
Graph* createTempGraph(){
    int i,j;
    Graph* g = createGraph(M,C,0);
    Node* n1 = createNode(1, NULL);
    Node* n2 = createNode(2, NULL);
    Node* n3 = createNode(3, NULL);
    Node* n4 = createNode(4, NULL);
    Node* n5 = createNode(5, NULL);
    Node* n6 = createNode(6, NULL);
    Node* n7 = createNode(7, NULL);
    Node* n8 = createNode(8, NULL);
    Node* n9 = createNode(9, NULL);

    insertNode(n1,g);
    insertNode(n2,g);
    insertNode(n3,g);
    insertNode(n4,g);
    insertNode(n5,g);
    insertNode(n6,g);
    insertNode(n7,g);
    insertNode(n8,g);
    insertNode(n9,g);

    Edge* e1 = setEdgeProperties(1, 2, "connects",0);
    Edge* e4 = setEdgeProperties(2, 1, "connects",0);
    Edge* e2 = setEdgeProperties(1, 3, "connects",0);
    Edge* e6 = setEdgeProperties(3, 1, "connects",0);
    Edge* e3 = setEdgeProperties(1, 4, "connects",0);
    Edge* e9 = setEdgeProperties(4, 1, "connects",0);
    Edge* e5 = setEdgeProperties(2, 3, "connects",0);
    Edge* e8 = setEdgeProperties(3, 2, "connects",0);
    Edge* e7 = setEdgeProperties(3, 4, "connects",0);
    Edge* e10 = setEdgeProperties(4, 3, "connects",0);
    Edge* e11 = setEdgeProperties(4, 5, "connects",0);
    Edge* e12 = setEdgeProperties(4, 6, "connects",0);
    Edge* e13 = setEdgeProperties(5, 4, "connects",0);
    Edge* e14 = setEdgeProperties(5, 6, "connects",0);
    Edge* e15 = setEdgeProperties(5, 8, "connects",0);
    Edge* e16 = setEdgeProperties(5, 7, "connects",0);
    Edge* e17 = setEdgeProperties(6, 4, "connects",0);
    Edge* e18 = setEdgeProperties(6, 5, "connects",0);
    Edge* e19 = setEdgeProperties(6, 7, "connects",0);
    Edge* e20 = setEdgeProperties(6, 8, "connects",0);
    Edge* e21 = setEdgeProperties(7, 5, "connects",0);
    Edge* e22 = setEdgeProperties(7, 6, "connects",0);
    Edge* e23 = setEdgeProperties(7, 8, "connects",0);
    Edge* e24 = setEdgeProperties(7, 9, "connects",0);
    Edge* e25 = setEdgeProperties(8, 6, "connects",0);
    Edge* e26 = setEdgeProperties(8, 5, "connects",0);
    Edge* e27 = setEdgeProperties(8, 7, "connects",0);
    Edge* e28 = setEdgeProperties(9, 7, "connects",0);

    insertEdge(1, e1, g);
    insertEdge(1, e2, g);
    insertEdge(1, e3, g);
    insertEdge(2, e4, g);
    insertEdge(2, e5, g);
    insertEdge(3, e6, g);
    insertEdge(3, e7, g);
    insertEdge(3, e8, g);
    insertEdge(4, e9, g);
    insertEdge(4, e10, g);
    insertEdge(4, e11, g);
    insertEdge(4, e12, g);
    insertEdge(5, e13, g);
    insertEdge(5, e14, g);
    insertEdge(5, e15, g);
    insertEdge(5, e16, g);
    insertEdge(6, e17, g);
    insertEdge(6, e18, g);
    insertEdge(6, e19, g);
    insertEdge(6, e20, g);
    insertEdge(7, e21, g);
    insertEdge(7, e22, g);
    insertEdge(7, e23, g);
    insertEdge(7, e24, g);
    insertEdge(8, e25, g);
    insertEdge(8, e26, g);
    insertEdge(8, e27, g);
    insertEdge(9, e28, g);

/*    for(i=0;i<g->HT_Size;i++)
        for(j=0;j<g->HashTable[i]->records;j++)
            printf("%d\n",g->HashTable[i]->BucketTable[j]->id);
*/
    return g;
}
int main(void) {

    int m = 2;
    int c = 3;

    /*create empty graph*/
    Graph* g = createGraph(m, c);

    /*create node and set node properties*/
    Node* n1 = setPersonProperties(5, "lonely", "loner", 29); 
    Node* n2 = setPersonProperties(1, "herald", "kllapi", 22); 
    Node* n3 = setPersonProperties(2, "marialena", "kiriakidi", 25); 
    Node* n4 = setPersonProperties(10, "antonia", "saravanou", 18); 
    Node* n5 = setPersonProperties(6, "manos", "karvounis", 19); 
    Node* n6 = setPersonProperties(3, "giannis", "chronis", 20); 
    Node* n7 = setPersonProperties(4, "christoforos", "sfiggos", 16); 
    Node* n8 = setPersonProperties(7, "stamatis", "xristoforidis", 24); 
    Node* n9 = setPersonProperties(8, "xristos", "mallios", 29); 
    Node* n10 = setPersonProperties(14, "johnny", "depp", 35); 
    Node* n11 = setPersonProperties(12, "fox", "mulder", 29); 
    Node* n12 = setPersonProperties(16, "dana", "scully", 25); 

    /*print person*/
    //	printPersonProperties(n1);

    /*insert nodes in graph*/
    insertNode(n1, g);
    insertNode(n2, g);
    insertNode(n3, g);
    insertNode(n4, g);
    insertNode(n5, g);
    insertNode(n6, g);
    insertNode(n7, g);
    insertNode(n8, g);
    insertNode(n10, g);
    insertNode(n9, g);
    insertNode(n11, g);
    insertNode(n12, g);

    /* Create edges and set properties */
    Edge* e1 = setEdgeProperties(1, 6, "knows", 30, g);
    Edge* e2 = setEdgeProperties(6, 1, "knows", 30, g);
    Edge* e3 = setEdgeProperties(1, 2, "knows", 20, g);
    Edge* e4 = setEdgeProperties(2, 1, "knows", 20, g);
    Edge* e5 = setEdgeProperties(1, 4, "knows", 30, g);
    Edge* e6 = setEdgeProperties(4, 1, "knows", 30, g);
    Edge* e7 = setEdgeProperties(2, 6, "knows", 10, g);
    Edge* e8 = setEdgeProperties(6, 2, "knows", 10, g);
    Edge* e9 = setEdgeProperties(4, 3, "knows", 30, g);
    Edge* e10 = setEdgeProperties(3, 4, "knows", 30, g);
    Edge* e11 = setEdgeProperties(4, 7, "knows", 30, g);
    Edge* e12 = setEdgeProperties(7, 4, "knows", 30, g);
    Edge* e13 = setEdgeProperties(4, 8, "knows", 10, g);
    Edge* e14 = setEdgeProperties(8, 4, "knows", 10, g);
    Edge* e15 = setEdgeProperties(3, 10, "knows", 30, g);
    Edge* e16 = setEdgeProperties(10, 3, "knows", 30, g);
    Edge* e17 = setEdgeProperties(10, 7, "knows", 30, g);
    Edge* e18 = setEdgeProperties(7, 10, "knows", 30, g);
    Edge* e19 = setEdgeProperties(10, 14, "knows", 50, g);
    Edge* e20 = setEdgeProperties(14, 10, "knows", 50, g);
    Edge* e21 = setEdgeProperties(14, 12, "knows", 30, g);
    Edge* e22 = setEdgeProperties(12, 14, "knows", 30, g);
    Edge* e23 = setEdgeProperties(12, 16, "knows", 30, g);
    Edge* e24 = setEdgeProperties(16, 12, "knows", 30, g);
    Edge* e25 = setEdgeProperties(16, 14, "knows", 30, g);
    Edge* e26 = setEdgeProperties(14, 16, "knows", 30, g);
	
	


    /* Insert edges in graph */
    insertEdge(1, e1, g);
    insertEdge(6, e2, g);
    insertEdge(1, e3, g);
    insertEdge(2, e4, g);
    insertEdge(1, e5, g);
    insertEdge(4, e6, g);
    insertEdge(2, e7, g);
    insertEdge(6, e8, g);
    insertEdge(4, e9, g);
    insertEdge(3, e10, g);
    insertEdge(4, e11, g);
    insertEdge(7, e12, g);
    insertEdge(4, e13, g);
    insertEdge(8, e14, g);
    insertEdge(3, e15, g);
    insertEdge(10, e16, g);
    insertEdge(10, e17, g);
    insertEdge(7, e18, g);
    insertEdge(10, e19, g);
    insertEdge(14, e20, g);
    insertEdge(14, e21, g);
    insertEdge(12, e22, g);
    insertEdge(12, e23, g);
    insertEdge(16, e24, g);
    insertEdge(16, e25, g);
    insertEdge(14, e26, g);


    /* Perform lookups in the graph */
    Node* nl1 = lookupNode(12, g);
    printPersonProperties(nl1);
    Node* nl2 = lookupNode(16, g);
    printPersonProperties(nl2);

    /* Find shortest path 1-1 */
    int spt1 = reachNode1(1, 12, g);
    CHECK("Shortest path between nodes (1,12)", spt1, 5);

    int spt2 = reachNode1(14, 14, g);
    CHECK("Shortest path between nodes (14,14)", spt2, 0);

    int spt3 = reachNode1(3, 16, g);
    CHECK("Shortest path between nodes (3,16)", spt3, 3);

    int spt4 = reachNode1(5, 3, g);
    CHECK("Shortest path between nodes (5,3)", spt4, INFINITY_REACH_NODE);
    //reachNode1 must return INFINITY_REACH_NODE defined in defines.h when two nodes are not connected

    /* Find shortest paths 1-N */
    ResultSet* res = reachNodeN(1, g);
    int i = 0;

    Pair results[10] = {
        {2, 1},
        {6, 1},
        {4, 1},
        {3, 2},
        {7, 2},
        {8, 2},
        {10, 3},
        {14, 4},
        {16, 5},
        {12, 5}
    };

    Pair pair;
    int k;
    int counter = 0;
    while (next(res, &pair)) {
        ++counter;
        for (k = 0; k < 10; ++k) {
            if (results[k].ID == pair.ID) {
                if (results[k].distance == pair.distance) {
                    printf("Shortest path between nodes (%d,%d): Success\n", 1, results[k].ID);
                } else {
                    printf("Shortest path between nodes (%d,%d): Failed | actual = %3d, expected = %3d\n", 1, results[k].ID, pair.distance, results[k].distance);
                }
                break;
            }
        }
        if (k == 10) {
            printf("ReachNodeN : Failed | Your returned an extra Pair(%d,%d) ", pair.ID, pair.distance);
        }
    }
    delete res;
    CHECK("Number of pairs in the ResultSet", counter, 10);
    delete g;
    return EXIT_SUCCESS;
}