Network NetworkInitialize(Vertex *tails, Vertex *heads, Edge nedges, Vertex nnodes, int directed_flag, Vertex bipartite, int lasttoggle_flag, int time, int *lasttoggle) { Network nw; nw.last_inedge = nw.last_outedge = (Edge)nnodes; /* Calloc will zero the allocated memory for us, probably a lot faster. */ nw.outdegree = (Vertex *) calloc((nnodes+1),sizeof(Vertex)); nw.indegree = (Vertex *) calloc((nnodes+1),sizeof(Vertex)); nw.maxedges = MAX(nedges,1)+nnodes+2; /* Maybe larger than needed? */ nw.inedges = (TreeNode *) calloc(nw.maxedges,sizeof(TreeNode)); nw.outedges = (TreeNode *) calloc(nw.maxedges,sizeof(TreeNode)); /* GetRNGstate(); R function enabling uniform RNG */ if(lasttoggle_flag){ nw.duration_info.time=time; nw.duration_info.lasttoggle = (int *) calloc(DYADCOUNT(nnodes, bipartite, directed_flag), sizeof(int)); if(lasttoggle) memcpy(nw.duration_info.lasttoggle, lasttoggle, DYADCOUNT(nnodes, bipartite, directed_flag) * sizeof(int)); } else nw.duration_info.lasttoggle = NULL; /*Configure a Network*/ nw.nnodes = nnodes; nw.nedges = 0; /* Edges will be added one by one */ nw.directed_flag=directed_flag; nw.bipartite=bipartite; ShuffleEdges(tails,heads,nedges); /* shuffle to avoid worst-case performance */ for(Edge i = 0; i < nedges; i++) { Vertex tail=tails[i], head=heads[i]; if (!directed_flag && tail > head) AddEdgeToTrees(head,tail,&nw); /* Undir edges always have tail < head */ else AddEdgeToTrees(tail,head,&nw); } /* PutRNGstate(); */ return nw; }
void SummStats(Edge n_edges, Vertex *tails, Vertex *heads, Network *nwp, Model *m, double *stats){ GetRNGstate(); /* R function enabling uniform RNG */ ShuffleEdges(tails,heads,n_edges); /* Shuffle edgelist. */ for (unsigned int termi=0; termi < m->n_terms; termi++) m->termarray[termi].dstats = m->workspace; /* Doing this one toggle at a time saves a lot of toggles... */ for(Edge e=0; e<n_edges; e++){ ModelTerm *mtp = m->termarray; double *statspos=stats; for (unsigned int termi=0; termi < m->n_terms; termi++, mtp++){ if(!mtp->s_func){ (*(mtp->d_func))(1, tails+e, heads+e, mtp, nwp); /* Call d_??? function */ for (unsigned int i=0; i < mtp->nstats; i++,statspos++) *statspos += mtp->dstats[i]; }else statspos += mtp->nstats; } ToggleEdge(tails[e],heads[e],nwp); } ModelTerm *mtp = m->termarray; double *dstats = m->workspace; double *statspos=stats; for (unsigned int termi=0; termi < m->n_terms; termi++, dstats+=mtp->nstats, mtp++ ){ if(mtp->s_func){ (*(mtp->s_func))(mtp, nwp); /* Call s_??? function */ for (unsigned int i=0; i < mtp->nstats; i++,statspos++) *statspos = mtp->dstats[i]; }else statspos += mtp->nstats; } PutRNGstate(); }
void SummStats(Edge n_edges, Vertex n_nodes, Vertex *tails, Vertex *heads, Network *nwp, Model *m, double *stats, Network *y0){ Vertex *nodes; /*may need to change*/ nodes = (Vertex *)malloc( 1 * sizeof(Vertex)); GetRNGstate(); /* R function enabling uniform RNG */ ShuffleEdges(tails,heads,n_edges); /* Shuffle edgelist. */ for (unsigned int termi=0; termi < m->n_terms; termi++) m->termarray[termi].dstats = m->workspace; /* Doing this one toggle at a time saves a lot of toggles... */ for(Edge e=0; e<n_edges; e++){ ModelTerm *mtp = m->termarray; double *statspos=stats; nodes[0] = 0; for (unsigned int termi=0; termi < m->n_terms; termi++, mtp++){ if(!mtp->s_func){ (*(mtp->d_func))(1, tails+e, heads+e, nodes, mtp, nwp, y0); /* Call d_??? function */ for (unsigned int i=0; i < mtp->nstats; i++,statspos++) *statspos += mtp->dstats[i]; }else statspos += mtp->nstats; } ToggleEdge(tails[e],heads[e],nwp); } /* Doing this one toggle at a time saves a lot of toggles... */ for(int v=0; v<n_nodes; v++){ if(m->nodalstatus[v]== 2.0){ nodes[0] = (int) (v+1); ModelTerm *mtp = m->termarray; double *statspos=stats; for (unsigned int termi=0; termi < m->n_terms; termi++, mtp++){ if(!mtp->s_func){ (*(mtp->d_func))(1, tails, heads, nodes, mtp, nwp, y0); /* Call d_??? function */ for (unsigned int i=0; i < mtp->nstats; i++,statspos++) *statspos += mtp->dstats[i]; }else statspos += mtp->nstats; } ToggleNode(v+1,nwp); } } ModelTerm *mtp = m->termarray; double *dstats = m->workspace; double *statspos=stats; for (unsigned int termi=0; termi < m->n_terms; termi++, dstats+=mtp->nstats, mtp++ ){ if(mtp->s_func){ (*(mtp->s_func))(mtp, nwp); /* Call s_??? function */ for (unsigned int i=0; i < mtp->nstats; i++,statspos++) *statspos = mtp->dstats[i]; }else statspos += mtp->nstats; } PutRNGstate(); }