void DList_Insert( DList *self, void *val, daoint id ) { void **buf = self->items.pVoid - self->offset; daoint i; if( id == 0 ){ DList_PushFront( self, val ); return; }else if( id >= self->size ){ DList_PushBack( self, val ); return; } if( self->type == DAO_DATA_VALUE ) DaoGC_LockData(); if( (daoint)(self->offset + self->size + 1) >= self->bufsize ){ if( self->offset > 0 ) memmove( buf, self->items.pVoid, self->size*sizeof(void*) ); self->bufsize += self->bufsize/5 + 5; self->items.pVoid = (void**) dao_realloc( buf, (self->bufsize+1)*sizeof(void*) ); self->offset = 0; } if( self->type && val != NULL ){ for( i=self->size; i>id; i-- ) self->items.pVoid[i] = self->items.pVoid[i-1]; self->items.pVoid[ id ] = NULL; }else{ for( i=self->size; i>id; i-- ) self->items.pVoid[i] = self->items.pVoid[i-1]; self->items.pVoid[id] = val; } if( self->type == DAO_DATA_VALUE ) DaoGC_UnlockData(); if( self->type && val != NULL ){ self->items.pVoid[ id ] = DList_CopyItem( self, val ); } self->size++; }
static double DaoxGraph_MaxFlow_PRTF_Float( DaoxGraph *self, DaoxNode *source, DaoxNode *sink ) { daoint i, n; double inf = 1.0; DList *list = DList_New(0); for(i=0,n=source->outs->size; i<n; i++){ DaoxEdge *edge = source->outs->items.pgEdge[i]; if( source == edge->first ) inf += edge->X.MF->capacity; } for(i=0,n=self->nodes->size; i<n; i++){ DaoxNode *node = self->nodes->items.pgNode[i]; node->X.MF->nextpush = 0; node->X.MF->height = 0; node->X.MF->excess = 0.0; if( node != source && node != sink ) DList_PushBack( list, node ); } source->X.MF->nextpush = 0; source->X.MF->height = n; source->X.MF->excess = inf; for(i=0,n=self->edges->size; i<n; i++){ DaoxEdge *edge = self->edges->items.pgEdge[i]; edge->X.MF->flow_fw = 0.0; edge->X.MF->flow_bw = 0.0; } for(i=0,n=source->outs->size; i<n; i++){ DaoxEdge *edge = source->outs->items.pgEdge[i]; if( source == edge->first ) MaxFlow_PushFloat( source, edge ); } i = 0; while( i < list->size ){ DaoxNode *U = list->items.pgNode[i]; daoint old_height = U->X.MF->height; MaxFlow_DischargeFloat( U ); if( U->X.MF->height > old_height ){ DList_Erase( list, i, 1 ); DList_PushFront( list, U ); i = 0; }else{ i += 1; } } DList_Delete( list ); inf = 0.0; for(i=0,n=source->outs->size; i<n; i++){ DaoxEdge *edge = source->outs->items.pgEdge[i]; if( source == edge->first ) inf += edge->X.MF->flow_fw; } return inf; }
DaoxEdge* DaoxGraph_AddEdge( DaoxGraph *self, DaoxNode *first, DaoxNode *second ) { DaoxEdge *edge = DaoxEdge_New( self ); DList_PushFront( first->outs, edge ); if( self->directed ){ if( second->ins == NULL ) second->ins = DList_New(DAO_DATA_VALUE); DList_PushBack( second->ins, edge ); }else{ DList_PushBack( second->outs, edge ); } DList_Append( self->edges, edge ); edge->first = first; edge->second = second; return edge; }
static void DaoSTD_Load( DaoProcess *proc, DaoValue *p[], int N ) { DaoNamespace *ns; DaoVmSpace *vms = proc->vmSpace; DString *name = p[0]->xString.value; int import = p[1]->xInteger.value; int runim = p[2]->xInteger.value; int res = 0; DList_PushFront( vms->pathLoading, proc->activeNamespace->path ); ns = DaoVmSpace_LoadEx( vms, DString_GetData( name ), runim ); DaoProcess_PutValue( proc, (DaoValue*) ns ); if( ns == NULL ) DaoProcess_RaiseError( proc, NULL, "loading failed" ); DList_PopFront( vms->pathLoading ); if( import && ns ) DaoNamespace_AddParent( proc->activeNamespace, ns ); }