Пример #1
0
void AddUniformCentroid(Destin *d, uint l)
{
    uint i, j, ni, nb, np, ns, idx;

    Node * n = GetNodeFromDestin(d, l, 0, 0);
    nb = n->nb;
    ni = n->ni;
    np = n->np;
    ns = n->ns;
    idx = ni + nb;

    // Layer l
    float * newMu, * newSigma, * newAvgDelta, * newAvgSquaredDelta;

    MALLOCV(newMu, float, (ns+1));
    MALLOCV(newSigma, float, (ns+1));
    MALLOCV(newAvgDelta, float, (ns+1));
    MALLOCV(newAvgSquaredDelta, float, (ns+1));

    _generateNewUniformCentroidMu(d, l, VICINITY_OF_ADDED_CENTROID, newMu);
    for (j=0; j < ns+1; j++)
    {
        newSigma[j] = INIT_SIGMA;
        newAvgDelta[j] = 0;
        newAvgSquaredDelta[j] = 0;
    }

    for (i = 0; i < nb; i++)
    {
        ArrayInsertFloat(&d->uf_mu[l][i], ns, idx, 0);
        _normalizeMu(d->uf_mu[l][i], ni, nb+1, np);
        ArrayInsertFloat(&d->uf_sigma[l][i], ns, idx, INIT_SIGMA);
        ArrayInsertFloat(&d->uf_avgDelta[l][i], ns, idx, 0);
        ArrayInsertFloat(&d->uf_avgSquaredDelta[l][i], ns, idx, 0);
    }
    ArrayInsertFloat(&d->uf_absvar[l], ns, idx, 0);
    ArrayInsertFloat(&d->uf_avgAbsDelta[l], ns, idx, 0);

    ArrayAppendPtr((void *)&d->uf_mu[l], nb, newMu);
    ArrayAppendPtr((void *)&d->uf_sigma[l], nb, newSigma);
    ArrayAppendUInt(&d->uf_winCounts[l], nb, 0);
    ArrayAppendLong(&d->uf_persistWinCounts[l], nb, 0);
    ArrayAppendLong(&d->uf_persistWinCounts_detailed[l], nb, 0);
    ArrayAppendPtr((void *)&d->uf_avgDelta[l], nb, newAvgDelta);
    ArrayAppendPtr((void *)&d->uf_avgSquaredDelta[l], nb, newAvgSquaredDelta);
    ArrayAppendFloat(&d->uf_starv[l], nb, 1);

    ArrayAppendFloat(&d->uf_winFreqs[l], nb, 1/(float) nb);
    _normalizeFloatArray(d->uf_winFreqs[l], nb+1);

    d->nb[l]++;  // increase global number of centroids for layer l
    for (j = 0; j < d->layerSize[l]; j++)
    {
        n =& d->nodes[d->layerNodeOffsets[l] + j];

        ArrayAppendFloat(&n->belief, nb, 0);
        ArrayAppendFloat(&n->beliefEuc, nb, 0);
        ArrayAppendFloat(&n->beliefMal, nb, 0);
        ArrayAppendFloat(&n->outputBelief, nb, 0);
        ArrayInsertFloat(&n->delta, ns, idx, 0);
        ArrayInsertFloat(&n->observation, ns, idx, 0);

        // increase centroid dimensionality for each node from layer l
        UpdateNodeSizes(n, n->ni, nb+1, n->np, n->nc);

        // pointers may change due to reallocation
        n->mu = d->uf_mu[l];
        n->starv = d->uf_starv[l];
    }

    // Layer l+1
    if (l+1 < d->nLayers)
    {
        n = GetNodeFromDestin(d, l+1, 0, 0);
        ns = n->ns;
        uint childIndexes[n->nChildren];  // indexes of added centroids for all childs
        float childValues[n->nChildren];  // initial values for all childs
        float childSigmas[n->nChildren];

        for (i = 0; i < n->nChildren; i++)
        {
            childIndexes[i] = (i+1)*nb;
            childValues[i] = 0;
            childSigmas[i] = INIT_SIGMA;
        }
        for (i = 0; i < n->nb; i++)
        {
            ArrayInsertFloats(&d->uf_mu[l+1][i], ns, childIndexes, childValues, n->nChildren);
            ArrayInsertFloats(&d->uf_sigma[l+1][i], ns, childIndexes, childSigmas, n->nChildren);
            ArrayInsertFloats(&d->uf_avgDelta[l+1][i], ns, childIndexes, childValues, n->nChildren);
            ArrayInsertFloats(&d->uf_avgSquaredDelta[l+1][i], ns, childIndexes, childValues, n->nChildren);
        }
        ArrayInsertFloats(&d->uf_absvar[l+1], ns, childIndexes, childValues, n->nChildren);
        ArrayInsertFloats(&d->uf_avgAbsDelta[l+1], ns, childIndexes, childValues, n->nChildren);

        for (j = 0; j < d->layerSize[l+1]; j++)
        {
            n =& d->nodes[d->layerNodeOffsets[l+1] + j];

            ArrayInsertFloats(&n->delta, ns, childIndexes, childValues, n->nChildren);
            ArrayInsertFloats(&n->observation, ns, childIndexes, childValues, n->nChildren);

            // increase centroid dimensionality for each node from layer l+1
            UpdateNodeSizes(n, n->ni + n->nChildren, n->nb, n->np, n->nc);

            // pointers may change due to reallocation
            n->mu = d->uf_mu[l+1];
            n->starv = d->uf_starv[l+1];
        }
    }

    // Layer l-1
    if (l > 0)
    {
        n = GetNodeFromDestin(d, l-1, 0, 0);
        ns = n->ns;
        uint pIdx = n->ni + n->nb + n->np;   // index of added parent centroid

        for (i = 0; i < n->nb; i++)
        {
            ArrayInsertFloat(&d->uf_mu[l-1][i], ns, pIdx, 0);
            _normalizeMu(d->uf_mu[l-1][i], n->ni, n->nb, n->np+1);
            ArrayInsertFloat(&d->uf_sigma[l-1][i], ns, pIdx, INIT_SIGMA);
            ArrayInsertFloat(&d->uf_avgDelta[l-1][i], ns, pIdx, 0);
            ArrayInsertFloat(&d->uf_avgSquaredDelta[l-1][i], ns, pIdx, 0);
        }
        ArrayInsertFloat(&d->uf_absvar[l-1], ns, pIdx, 0);
        ArrayInsertFloat(&d->uf_avgAbsDelta[l-1], ns, pIdx, 0);

        for (j = 0; j < d->layerSize[l-1]; j++)
        {
            n =& d->nodes[d->layerNodeOffsets[l-1] + j];

            ArrayInsertFloat(&n->delta, ns, pIdx, 0);
            ArrayInsertFloat(&n->observation, ns, pIdx, 0);

            // increase centroid dimensionality for each node from layer l-1
            UpdateNodeSizes(n, n->ni, n->nb, n->np+1, n->nc);

            // pointers may change due to reallocation
            n->mu = d->uf_mu[l-1];
            n->starv = d->uf_starv[l-1];
        }
    }

}
Пример #2
0
PetscErrorCode FiberFieldInitLocalFiber( FiberField fibers, int numVerticies, PetscReal l0,
    FiberTypeID vertexType, FiberTypeID edgeType, FiberTypeID bendingEdgeType )
{
  int i;
  int flen = numVerticies;
  Array fiber = fibers->fiber;
  Vertex v0;
  Vertex v1;
  Vertex v2;
  PetscRandom rnd = fibers->rnd;
  PetscBool hitBoundary;
  Coor rndSphere;
  Coor n;
  Coor r;
  Coor s;
  Coor d;
  Coor lmin = fibers->localBounds.min;
  Coor lmax = fibers->localBounds.max;
  PetscReal NORTH_HEMISPHERE = 0.65;
  const PetscReal WHOLE_SPHERE = 0.0;
  const PetscReal DELTA = PETSC_SMALL;
  PetscErrorCode ierr;

  PetscFunctionBegin;
  ierr = ArraySetSize(fiber, 0); CHKERRQ(ierr);
  ierr = ArraySetMaxSize( fibers->verts, flen + ArrayLength(fibers->verts) ); CHKERRQ(ierr);

  // add small delta
  lmin.x += DELTA;
  lmin.y += DELTA;
  lmin.z += DELTA;
  lmax.x -= DELTA;
  lmax.y -= DELTA;
  lmax.z -= DELTA;

  ierr = PetscOptionsGetReal(0,"-fiber_bend",&NORTH_HEMISPHERE,0); CHKERRQ(ierr);

  // Initialize v0 anywhere in the local bbox
  ierr = FiberFieldAddVertex( fibers, vertexType, &v0); CHKERRQ(ierr);
  ierr = ArrayAppendPtr( fiber, v0); CHKERRQ(ierr);
  PetscRandomGetValue(rnd,&v0->X.x); // [0,1]
  PetscRandomGetValue(rnd,&v0->X.y); // [0,1]
  PetscRandomGetValue(rnd,&v0->X.z); // [0,1]
  // map [0, 1] to local bbox [lmin, lmax]
  v0->X.x = (1-v0->X.x) * lmin.x + v0->X.x * lmax.x;
  v0->X.y = (1-v0->X.y) * lmin.y + v0->X.y * lmax.y;
  v0->X.z = (1-v0->X.z) * lmin.z + v0->X.z * lmax.z;

  // Initialize v1 anywhere spherically from v0
  ierr = FiberFieldAddVertex( fibers, vertexType, &v1); CHKERRQ(ierr);
  ierr = ArrayAppendPtr( fiber, v1); CHKERRQ(ierr);
  SphericalDistribution(rnd, WHOLE_SPHERE, &d);
  v1->X.x = v0->X.x + l0*d.x;
  v1->X.y = v0->X.y + l0*d.y;
  v1->X.z = v0->X.z + l0*d.z;
  BoundaryCheck( lmin, lmax, &v1->X, &hitBoundary );
  if (hitBoundary) {
    ierr = FiberFieldAddEdge( fibers, v0, v1, edgeType, l0 ); CHKERRQ(ierr);
    PetscFunctionReturn(0);
  }

  for (i = 1; i < flen-1; i++ ) {
    ierr = FiberFieldAddVertex( fibers, vertexType, &v2); CHKERRQ(ierr);
    ierr = ArrayAppendPtr( fiber, v2); CHKERRQ(ierr);

    SphericalDistribution(rnd, NORTH_HEMISPHERE, &rndSphere);
    Rotation(v0->X,v1->X,&n,&r,&s);
    MatVec(&n,&r,&s,&rndSphere, &d);

    v2->X.x = v1->X.x + l0*d.x;
    v2->X.y = v1->X.y + l0*d.y;
    v2->X.z = v1->X.z + l0*d.z;

    BoundaryCheck( lmin, lmax, &v2->X, &hitBoundary );
    if (hitBoundary) {
      break;
    }

    v0 = v1;
    v1 = v2;
  }

  flen = ArrayLength( fiber );
  Vertex *v = ArrayGetData( fiber );
  // Link fiber edges: v_i -- v_i+1
  for (i = 0; i < flen-1; i++) {
    ierr = FiberFieldAddEdge( fibers, v[i], v[i+1], edgeType, l0 ); CHKERRQ(ierr);
  }

  // Link bending edges: v_i-1 -- v_i+1
  for (i = 1; i < flen-1; i++) {
    ierr = FiberFieldAddEdge( fibers, v[i-1], v[i+1], bendingEdgeType, 2*l0 ); CHKERRQ(ierr);
  }

  PetscFunctionReturn(0);
}
Пример #3
0
//function for adding rescaled centroids to the existing system.
//Here each node has an extra belief dimensionality(an extra centroid)
void AddRescaledCentroids(Destin *destin,uint l,float * rcentroid,uint centid)
{
	uint i,j,ns,nb,np,idx,ni;
	Node * n = GetNodeFromDestin(destin, l, 0, 0);
    	nb = n->nb;ni = n->ni;np = n->np;ns = n->ns;
    	idx = ni + nb;
    	float * rMu, * rSigma, * rAvgDelta, * rAvgSquaredDelta;
	
	//if rescaled function was already called before we delete duplicate centroids
	if(destin->rescale==1)
	{
		
		for(i=rindex;i<destin->nb[l];i++)
		{
			DeleteUniformCentroid(destin,l,i);
		}
	}
	
	
	
	//allocate space for  uniform centroid location
	destin->rindex=ni+nb;
    	MALLOCV(rMu, float, (ns+1));
    	MALLOCV(rSigma, float, (ns+1));
    	MALLOCV(rAvgDelta, float, (ns+1));
    	MALLOCV(rAvgSquaredDelta, float, (ns+1));
    	
    	//initializing rMu with rescaled centroid size
    	for(i=0;i<ns;i++)
    	{
    		rMu[i]=rcentroid[i];
    	}
    	
    	//initializing rsigma,rAvgDelta and rAvgSquaredDelta
    	for (j=0; j < ns+1; j++)
    	{
        rSigma[j] = INIT_SIGMA;
        rAvgDelta[j] = 0;
        rAvgSquaredDelta[j] = 0;
   	 }
   	 
   	 
   	 //similiar to add uniform centroids in centroid.c
   	 for (i = 0; i < nb; i++)
   	{
        ArrayInsertFloat(&destin->uf_mu[l][i], ns, idx, 0);
        _normalizeMu(destin->uf_mu[l][i], ni, nb+1, np);
       ArrayInsertFloat(&destin->uf_sigma[l][i], ns, idx, INIT_SIGMA);
        ArrayInsertFloat(&destin->uf_avgDelta[l][i], ns, idx, 0);
        ArrayInsertFloat(&destin->uf_avgSquaredDelta[l][i], ns, idx, 0);
    	}
    	
    	ArrayInsertFloat(&destin->uf_absvar[l], ns, idx, 0);
    	ArrayInsertFloat(&destin->uf_avgAbsDelta[l], ns, idx, 0);
	ArrayAppendPtr((void *)&destin->uf_mu[l], nb, rMu);
    	ArrayAppendPtr((void *)&destin->uf_sigma[l], nb, rSigma);
    	ArrayAppendUInt(&destin->uf_winCounts[l], nb, 0);
    	ArrayAppendLong(&destin->uf_persistWinCounts[l], nb, 0);
    	ArrayAppendLong(&destin->uf_persistWinCounts_detailed[l], nb, 0);
    	ArrayAppendPtr((void *)&destin->uf_avgDelta[l], nb, rAvgDelta);
    	ArrayAppendPtr((void *)&destin->uf_avgSquaredDelta[l], nb, rAvgSquaredDelta);
    	ArrayAppendFloat(&destin->uf_starv[l], nb, 1);

    	ArrayAppendFloat(&destin->uf_winFreqs[l], nb, 1/(float) nb);
    	_normalizeFloatArray(destin->uf_winFreqs[l], nb+1);
    	
    	destin->nb[l]++;  // increase global number of centroids for layer l
    	for (j = 0; j < destin->layerSize[l]; j++)
    	{
        n =& destin->nodes[destin->layerNodeOffsets[l] + j];

        ArrayAppendFloat(&n->belief, nb, 0);
        ArrayAppendFloat(&n->beliefEuc, nb, 0);
        ArrayAppendFloat(&n->beliefMal, nb, 0);
        ArrayAppendFloat(&n->outputBelief, nb, 0);
        ArrayInsertFloat(&n->delta, ns, idx, 0);
        ArrayInsertFloat(&n->observation, ns, idx, 0);

        // increase centroid dimensionality for each node from layer l
        UpdateNodeSizes(n, n->ni, nb+1, n->np, n->nc);

        // pointers may change due to reallocation
        n->mu = destin->uf_mu[l];
        n->starv = destin->uf_starv[l];
    	}
    	if (l+1 < destin->nLayers)
    {
        n = GetNodeFromDestin(destin, l+1, 0, 0);
        ns = n->ns;
        uint childIndexes[n->nChildren];  // indexes of added centroids for all childs
        float childValues[n->nChildren];  // initial values for all childs
        float childSigmas[n->nChildren];

        for (i = 0; i < n->nChildren; i++)
        {
            childIndexes[i] = (i+1)*nb;
            childValues[i] = 0;
            childSigmas[i] = INIT_SIGMA;
        }
        for (i = 0; i < n->nb; i++)
        {
            ArrayInsertFloats(&destin->uf_mu[l+1][i], ns, childIndexes, childValues, n->nChildren);
            ArrayInsertFloats(&destin->uf_sigma[l+1][i], ns, childIndexes, childSigmas, n->nChildren);
            ArrayInsertFloats(&destin->uf_avgDelta[l+1][i], ns, childIndexes, childValues, n->nChildren);
            ArrayInsertFloats(&destin->uf_avgSquaredDelta[l+1][i], ns, childIndexes, childValues, n->nChildren);
        }
        ArrayInsertFloats(&destin->uf_absvar[l+1], ns, childIndexes, childValues, n->nChildren);
        ArrayInsertFloats(&destin->uf_avgAbsDelta[l+1], ns, childIndexes, childValues, n->nChildren);

        for (j = 0; j < destin->layerSize[l+1]; j++)
        {
            n =& destin->nodes[destin->layerNodeOffsets[l+1] + j];

            ArrayInsertFloats(&n->delta, ns, childIndexes, childValues, n->nChildren);
            ArrayInsertFloats(&n->observation, ns, childIndexes, childValues, n->nChildren);

            // increase centroid dimensionality for each node from layer l+1
            UpdateNodeSizes(n, n->ni + n->nChildren, n->nb, n->np, n->nc);

            // pointers may change due to reallocation
            n->mu = destin->uf_mu[l+1];
            n->starv = destin->uf_starv[l+1];
        }
    }

    // Layer l-1
    if (l > 0)
    {
        n = GetNodeFromDestin(destin, l-1, 0, 0);
        ns = n->ns;
        uint pIdx = n->ni + n->nb + n->np;   // index of added parent centroid

        for (i = 0; i < n->nb; i++)
        {
            ArrayInsertFloat(&destin->uf_mu[l-1][i], ns, pIdx, 0);
            _normalizeMu(destin->uf_mu[l-1][i], n->ni, n->nb, n->np+1);
            ArrayInsertFloat(&destin->uf_sigma[l-1][i], ns, pIdx, INIT_SIGMA);
            ArrayInsertFloat(&destin->uf_avgDelta[l-1][i], ns, pIdx, 0);
            ArrayInsertFloat(&destin->uf_avgSquaredDelta[l-1][i], ns, pIdx, 0);
        }
        ArrayInsertFloat(&destin->uf_absvar[l-1], ns, pIdx, 0);
        ArrayInsertFloat(&destin->uf_avgAbsDelta[l-1], ns, pIdx, 0);

        for (j = 0; j < destin->layerSize[l-1]; j++)
        {
            n =& destin->nodes[destin->layerNodeOffsets[l-1] + j];

            ArrayInsertFloat(&n->delta, ns, pIdx, 0);
            ArrayInsertFloat(&n->observation, ns, pIdx, 0);

            // increase centroid dimensionality for each node from layer l-1
            UpdateNodeSizes(n, n->ni, n->nb, n->np+1, n->nc);

            // pointers may change due to reallocation
            n->mu = destin->uf_mu[l-1];
            n->starv = destin->uf_starv[l-1];
        }
    }

    	
    	return;
    	
    	
}