void QPBO<REAL>::Reset()
{
	node_last[0] = nodes[0];
	node_last[1] = nodes[1];
	node_num = 0;

	if (nodeptr_block) 
	{ 
		delete nodeptr_block; 
		nodeptr_block = NULL; 
	}
	if (changed_list)
	{
		delete changed_list;
		changed_list = NULL;
	}
	if (fix_node_info_list)
	{
		delete fix_node_info_list;
		fix_node_info_list = NULL;
	}

	maxflow_iteration = 0;
	zero_energy = 0;

	stage = 0;
	all_edges_submodular = true;

	memset(arcs[0], 0, 2*arc_shift);
	InitFreeList();
}
	QPBO<REAL>::QPBO(int node_num_max, int edge_num_max, void (*err_function)(char *))
	: node_num(0),
	  nodeptr_block(NULL),
	  changed_list(NULL),
	  fix_node_info_list(NULL),
	  stage(0),
	  all_edges_submodular(true),
	  error_function(err_function),
	  zero_energy(0)
{
	
	node_num_max += 4;
	if (node_num_max < 16) node_num_max = 16;
	if (edge_num_max < 16) edge_num_max = 16;

	nodes[0] = (Node*) malloc(2*node_num_max*sizeof(Node));
	arcs[0] = (Arc*) malloc(4*edge_num_max*sizeof(Arc));
	if (!nodes[0] || !arcs[0]) { if (error_function) (*error_function)("Not enough memory!"); exit(1); }

	node_last[0] = nodes[0];
	node_max[0] = nodes[1] = node_last[1] = nodes[0] + node_num_max;
	node_max[1] = nodes[1] + node_num_max;
	node_shift = node_num_max*sizeof(Node);

	arc_max[0] = arcs[1] = arcs[0] + 2*edge_num_max;
	arc_max[1] = arcs[1] + 2*edge_num_max;
	arc_shift = 2*edge_num_max*sizeof(Arc);

	maxflow_iteration = 0;

	memset(arcs[0], 0, 2*arc_shift);
	InitFreeList();
}
Beispiel #3
0
void QPBO<REAL>::reallocate_arcs(int arc_num_max_new)
{
    int arc_num_max_old = (int)(arc_max[0] - arcs[0]);
    int arc_num_max = arc_num_max_new;
    if (arc_num_max & 1) arc_num_max ++;
    code_assert(arc_num_max > arc_num_max_old);
    Arc* arcs_old[2] = { arcs[0], arcs[1] };

    arcs[0] = (Arc*) realloc(arcs_old[0], 2*arc_num_max*sizeof(Arc));
    if (!arcs[0]) {
        if (error_function) (*error_function)("Not enough memory!");
        exit(1);
    }

    arc_shift = arc_num_max*sizeof(Arc);
    arc_max[0] = arcs[1] = arcs[0] + arc_num_max;
    arc_max[1] = arcs[1] + arc_num_max;

    if (stage)
    {
        memmove(arcs[1], arcs[0]+arc_num_max_old, arc_num_max_old*sizeof(Arc));
        memset(arcs[0]+arc_num_max_old, 0, (arc_num_max-arc_num_max_old)*sizeof(Arc));
        memset(arcs[1]+arc_num_max_old, 0, (arc_num_max-arc_num_max_old)*sizeof(Arc));
    }
    else
    {
        memset(arcs[0]+arc_num_max_old, 0, (2*arc_num_max-arc_num_max_old)*sizeof(Arc));
    }

    Node* i;
    Arc* a;
    for (i=nodes[0]; i<node_last[stage]; i++)
    {
        if (i==node_last[0]) i = nodes[1];

        if (i->first)
        {
            int k = (i->first < arcs_old[1]) ? 0 : 1;
            i->first = (Arc*) ((char*)i->first + (((char*) arcs[k]) - ((char*) arcs_old[k])));
        }
    }
    for (a=arcs[0]; a<arc_max[stage]; a++)
    {
        if (a->sister)
        {
            if (a->next)
            {
                int k = (a->next < arcs_old[1]) ? 0 : 1;
                a->next = (Arc*) ((char*)a->next + (((char*) arcs[k]) - ((char*) arcs_old[k])));
            }
            int k = (a->sister < arcs_old[1]) ? 0 : 1;
            a->sister = (Arc*) ((char*)a->sister + (((char*) arcs[k]) - ((char*) arcs_old[k])));
        }
    }

    InitFreeList();
}
Beispiel #4
0
QPBO<REAL>::QPBO(QPBO<REAL>& q)
    : node_num(q.node_num),
      nodeptr_block(NULL),
      changed_list(NULL),
      fix_node_info_list(NULL),
      stage(q.stage),
      all_edges_submodular(q.all_edges_submodular),
      error_function(q.error_function),
      zero_energy(q.zero_energy)
{
    int node_num_max = q.node_shift/sizeof(Node);
    int arc_num_max = (int)(q.arc_max[0] - q.arcs[0]);
    Node* i;
    Arc* a;

    nodes[0] = (Node*) malloc(2*node_num_max*sizeof(Node));
    arcs[0] = (Arc*) malloc(2*arc_num_max*sizeof(Arc));
    if (!nodes[0] || !arcs[0]) {
        if (error_function) (*error_function)("Not enough memory!");
        exit(1);
    }

    node_last[0] = nodes[0] + node_num;
    node_max[0] = nodes[1] = nodes[0] + node_num_max;
    node_last[1] = nodes[1] + node_num;
    node_max[1] = nodes[1] + node_num_max;
    node_shift = node_num_max*sizeof(Node);

    arc_max[0] = arcs[1] = arcs[0] + arc_num_max;
    arc_max[1] = arcs[1] + arc_num_max;
    arc_shift = arc_num_max*sizeof(Arc);

    maxflow_iteration = 0;

    memcpy(nodes[0], q.nodes[0], 2*node_num_max*sizeof(Node));
    memcpy(arcs[0], q.arcs[0], 2*arc_num_max*sizeof(Arc));

    for (i=nodes[0]; i<node_last[stage]; i++)
    {
        if (i==node_last[0]) i = nodes[1];
        if (i->first) i->first = (Arc*) ((char*)i->first + (((char*) arcs[0]) - ((char*) q.arcs[0])));
    }

    for (a=arcs[0]; a<arc_max[stage]; a++)
    {
        if (a == arc_max[0]) a = arcs[1];
        if (a->sister)
        {
            a->head              = (Node*) ((char*)a->head   + (((char*) nodes[0]) - ((char*) q.nodes[0])));
            if (a->next) a->next = (Arc*)  ((char*)a->next   + (((char*) arcs[0])  - ((char*) q.arcs[0])));
            a->sister            = (Arc*)  ((char*)a->sister + (((char*) arcs[0])  - ((char*) q.arcs[0])));
        }
    }

    InitFreeList();
}
Beispiel #5
0
/*
 * Initialize shared buffer pool
 *
 * This is called once during shared-memory initialization (either in the
 * postmaster, or in a standalone backend).
 */
void
InitBufferPool(void)
{
	char	   *BufferBlocks;
	bool		foundBufs,
				foundDescs;
	int			i;

	Data_Descriptors = NBuffers;
	Free_List_Descriptor = Data_Descriptors;
	Lookup_List_Descriptor = Data_Descriptors + 1;
	Num_Descriptors = Data_Descriptors + 1;

	/*
	 * It's probably not really necessary to grab the lock --- if there's
	 * anyone else attached to the shmem at this point, we've got
	 * problems.
	 */
	LWLockAcquire(BufMgrLock, LW_EXCLUSIVE);

#ifdef BMTRACE
	CurTraceBuf = (long *) ShmemInitStruct("Buffer trace",
							(BMT_LIMIT * sizeof(bmtrace)) + sizeof(long),
										   &foundDescs);
	if (!foundDescs)
		MemSet(CurTraceBuf, 0, (BMT_LIMIT * sizeof(bmtrace)) + sizeof(long));

	TraceBuf = (bmtrace *) & (CurTraceBuf[1]);
#endif

	BufferDescriptors = (BufferDesc *)
		ShmemInitStruct("Buffer Descriptors",
					  Num_Descriptors * sizeof(BufferDesc), &foundDescs);

	BufferBlocks = (char *)
		ShmemInitStruct("Buffer Blocks",
						NBuffers * BLCKSZ, &foundBufs);

	if (foundDescs || foundBufs)
	{
		/* both should be present or neither */
		Assert(foundDescs && foundBufs);
	}
	else
	{
		BufferDesc *buf;
		char	   *block;

		buf = BufferDescriptors;
		block = BufferBlocks;

		/*
		 * link the buffers into a circular, doubly-linked list to
		 * initialize free list, and initialize the buffer headers. Still
		 * don't know anything about replacement strategy in this file.
		 */
		for (i = 0; i < Data_Descriptors; block += BLCKSZ, buf++, i++)
		{
			Assert(ShmemIsValid((unsigned long) block));

			buf->freeNext = i + 1;
			buf->freePrev = i - 1;

			CLEAR_BUFFERTAG(&(buf->tag));
			buf->buf_id = i;

			buf->data = MAKE_OFFSET(block);
			buf->flags = (BM_DELETED | BM_FREE | BM_VALID);
			buf->refcount = 0;
			buf->io_in_progress_lock = LWLockAssign();
			buf->cntx_lock = LWLockAssign();
			buf->cntxDirty = false;
			buf->wait_backend_id = 0;
		}

		/* close the circular queue */
		BufferDescriptors[0].freePrev = Data_Descriptors - 1;
		BufferDescriptors[Data_Descriptors - 1].freeNext = 0;
	}

	/* Init other shared buffer-management stuff */
	InitBufTable();
	InitFreeList(!foundDescs);

	LWLockRelease(BufMgrLock);
}