Beispiel #1
0
static PyObject *UtilsC_maximization_beta(PyObject *self, PyObject *args){
    PyObject *q_Z,*Z_tilde,*graph;
    PyArrayObject *q_Zarray,*Z_tildearray,*grapharray;
    npy_float64 beta,gamma,Gr,gradientStep;
    int j,J,K,k,ni,maxNeighbours,nn,MaxItGrad;
    PyArg_ParseTuple(args, "dOOiiOdiid", &beta,&q_Z,&Z_tilde,&J,&K,&graph,&gamma,&maxNeighbours,&MaxItGrad,&gradientStep);
    q_Zarray = (PyArrayObject *) PyArray_ContiguousFromObject(q_Z,PyArray_FLOAT64,2,2); 
    Z_tildearray = (PyArrayObject *) PyArray_ContiguousFromObject(Z_tilde,PyArray_FLOAT64,2,2); 
    grapharray = (PyArrayObject *) PyArray_ContiguousFromObject(graph,PyArray_INT,2,2); 
    npy_float64 tmp2[K],Emax,Sum,tmp,Pzmi;
    
    Gr = gamma; 
    ni = 0;
    while( (ni<MaxItGrad) && (fabs(Gr) > eps) ){
        Gr = gamma;
        for (j=0;j<J;j++){
            Emax = 0;
            for (k=0;k<K;k++){
                tmp2[k] = 0;
                nn = 0;
                while(GetValueInt(grapharray,j,nn) != -1 && nn<maxNeighbours) {
                    tmp2[k] += beta * GetValue(Z_tildearray,k,GetValueInt(grapharray,j,nn));
                    nn++;
                }
                if (tmp2[k] > Emax) Emax = tmp2[k];
            }
            Sum = 0;
            for (k=0;k<K;k++){
                Sum += exp(tmp2[k] - Emax);
            }
            for (k=0;k<K;k++){
                tmp = 0;
                nn = 0;
                while(GetValueInt(grapharray,j,nn) != -1 && nn<maxNeighbours) {
                    tmp += GetValue(Z_tildearray,k,GetValueInt(grapharray,j,nn));
                    nn++;
                }
                Pzmi = exp(beta * tmp - Emax) / (Sum + eps);
                Gr += tmp * ( Pzmi - GetValue(q_Zarray,k,j) );
            }
        }
        beta -= gradientStep*Gr;
        ni++;
    }
    if (eps > beta) beta = 0.01;
    Py_DECREF(grapharray);
    Py_DECREF(q_Zarray);
    Py_DECREF(Z_tildearray);
    Py_INCREF(Py_None);
    return Py_BuildValue("d", beta);
}
Beispiel #2
0
int 
main ( int argc, char* argv[] ){

	NodeObj Main = NewNode();

	SetPropInt(Main, "State", Starting);

	TimeUpdate();

	DebugPrint ( "Entering Main", __FILE__, __LINE__, PROG_FLOW);

	ProcessCmdLine(Main, argc, argv);

	Init(Main);

	InstallObjects();

	LoadDefaultApp(Main);

	DebugPrint ( "Entering Main Loop.", __FILE__, __LINE__, PROG_FLOW);

	while(IsRunning(Main)){
		MainLoop(Main);
		// improvement: get delay from next scheduled item, min of 10 usecs
		usleep(10);
	}

	DebugPrint ( "No more tasks scheduled, cleaning up and exiting", __FILE__, __LINE__, PROG_FLOW);

	if (GetValueInt(GetPropNode(Main, "PrintNodes"))) {
		DebugPrint ( "Dumping Main Node on exit because -p was passed on command line.\n", __FILE__, __LINE__, PROG_FLOW);
		PrintNode(Main);
	}

	return 0;
}
Beispiel #3
0
static PyObject *UtilsC_expectation_Z(PyObject *self, PyObject *args){
    PyObject *q_Z,*Z_tilde,*graph,*Sigma_A,*m_A,*sigma_M,*Beta,*mu_M;
    PyArrayObject *q_Zarray,*Z_tildearray,*grapharray,*Sigma_Aarray,*m_Aarray,*sigma_Marray,*Betaarray,*mu_Marray;
    int j,J,K,k,m,maxNeighbours,nn,M;
    PyArg_ParseTuple(args, "OOOOOOOOiiii",&Sigma_A,&m_A,&sigma_M, &Beta,&Z_tilde,&mu_M,&q_Z,&graph,&M,&J,&K,&maxNeighbours);
    q_Zarray = (PyArrayObject *) PyArray_ContiguousFromObject(q_Z,PyArray_FLOAT64,3,3); 
    Z_tildearray = (PyArrayObject *) PyArray_ContiguousFromObject(Z_tilde,PyArray_FLOAT64,3,3); 
    grapharray = (PyArrayObject *) PyArray_ContiguousFromObject(graph,PyArray_INT,2,2); 
    Sigma_Aarray = (PyArrayObject *) PyArray_ContiguousFromObject(Sigma_A,PyArray_FLOAT64,3,3); 
    sigma_Marray = (PyArrayObject *) PyArray_ContiguousFromObject(sigma_M,PyArray_FLOAT64,2,2); 
    m_Aarray = (PyArrayObject *) PyArray_ContiguousFromObject(m_A,PyArray_FLOAT64,2,2); 
    mu_Marray = (PyArrayObject *) PyArray_ContiguousFromObject(mu_M,PyArray_FLOAT64,2,2); 
    Betaarray = (PyArrayObject *) PyArray_ContiguousFromObject(Beta,PyArray_FLOAT64,1,1); 

    npy_float64 tmp[K],Emax,Sum,alpha[K],Malpha,extern_field,Gauss[K],local_energy,energy[K],Probas[K];

    for (j=0;j<J;j++){
        for (m=0;m<M;m++){
            Malpha = 0;
            for (k=0;k<K;k++){
                alpha[k] = -0.5*GetValue3D(Sigma_Aarray,m,m,j) / (eps + GetValue(sigma_Marray,m,k) );
                Malpha += alpha[k]/K;
            }
            for (k=0;k<K;k++){
                alpha[k] /= Malpha;
                tmp[k] = 0;
                nn = 0;
                while(GetValueInt(grapharray,j,nn) != -1 && nn<maxNeighbours){
                    tmp[k] += GetValue3D(Z_tildearray,m,k,GetValueInt(grapharray,j,nn));
                    nn++;
                }
            }
            Emax = 0;
            for (k=0;k<K;k++){
                energy[k] = 0;
                extern_field = log( normpdf(GetValue(m_Aarray,j,m),GetValue(mu_Marray,m,k), sqrt(GetValue(sigma_Marray,m,k)) ) +eps);
                if (extern_field < -100) extern_field = -100;
                extern_field += alpha[k];
                local_energy = GetValue(Betaarray,m,0) * tmp[k];
                energy[k] += local_energy + extern_field;
                if (energy[k] > Emax) Emax = energy[k];
            }
            Sum = 0;
            for (k=0;k<K;k++){
                Probas[k] = exp( energy[k] - Emax );
                Sum += Probas[k];
            }
            for (k=0;k<K;k++){
                GetValue3D(Z_tildearray,m,k,j) = Probas[k] / (Sum + eps);
            }
        }
    }
    /*--------------------------------------------------------------*/
    for (j=0;j<J;j++){
        for (m=0;m<M;m++){
            Malpha = 0;
            for (k=0;k<K;k++){
                alpha[k] = -0.5*GetValue3D(Sigma_Aarray,m,m,j) / (eps + GetValue(sigma_Marray,m,k) );
                Malpha += alpha[k]/K;
            }
            for (k=0;k<K;k++){
                tmp[k] = 0;
                nn = 0;
                alpha[k] /= Malpha;
                while(GetValueInt(grapharray,j,nn) != -1 && nn<maxNeighbours){
                    tmp[k] += GetValue3D(Z_tildearray,m,k,GetValueInt(grapharray,j,nn));
                    nn++;
                }
            }
            Emax = 0;
            for (k=0;k<K;k++){
                energy[k] = 0;
                extern_field = alpha[k];
                local_energy = GetValue(Betaarray,m,0) * tmp[k];
                energy[k] += local_energy + extern_field;
                if (energy[k] > Emax) Emax = energy[k];
                Gauss[k] = normpdf(GetValue(m_Aarray,j,m),GetValue(mu_Marray,m,k), sqrt(GetValue(sigma_Marray,m,k)) );
            }
            Sum = 0;
            for (k=0;k<K;k++){
                Probas[k] = exp( energy[k] - Emax );
                Sum += Probas[k];
            }
            for (k=0;k<K;k++){
                GetValue3D(q_Zarray,m,k,j) = Gauss[k]*Probas[k] / (Sum + eps);
            }
            Sum = 0;
            for (k=0;k<K;k++){
                Sum += GetValue3D(q_Zarray,m,k,j);
            }
            for (k=0;k<K;k++){
                GetValue3D(q_Zarray,m,k,j) /= Sum;
            }
        } 
    }
    Py_DECREF(grapharray);
    Py_DECREF(q_Zarray);
    Py_DECREF(Z_tildearray);
    Py_DECREF(m_Aarray);
    Py_DECREF(mu_Marray);
    Py_DECREF(Sigma_Aarray);
    Py_DECREF(Betaarray);
    Py_DECREF(sigma_Marray);
    Py_INCREF(Py_None);
    return Py_None;
}
Beispiel #4
0
void 
Init(NodeObj Main){

	char * logname;
	NodeObj RegObjList;

	/* just hum along, add in the parts to initialize base object as I find we need them. */

	DebugPrint ( "Entering Init function.", __FILE__, __LINE__, PROG_FLOW);

	/* Set the name of the main object */
	SetName (Main, "Main");

	/* Create a place to store registered Objects */
	SetPropInt(Main, "RegObjList", 1);
	RegObjList = GetPropNode(Main, "RegObjList");
	ObjSetRegObjList(RegObjList);

	/* activate the main object */
	SetPropInt(Main, "State", Running);

	/* Insert release info into the Main node properties */
	SetPropStr(Main, "ReleaseMajor", RELEASEMAJOR);
	SetPropStr(Main, "ReleaseName",  RELEASENAME);
	SetPropStr(Main, "ReleaseMinor", RELEASEMINOR);
	SetPropStr(Main, "ReleaseLevel", RELEASELEVEL);
	SetPropStr(Main, "Copyright",    COPYRIGHT);
	SetPropStr(Main, "Author",       AUTHOR);
	SetPropStr(Main, "ReleaseTag",   RELEASETAG);

	/* process the command line */

	/* print out the help text if printhelp is turned on */
	if (GetValueInt(GetPropNode(Main, "printhelp"))) {
		printf ("%s %s.%s %s - (C) %s %s\n%s\nhttp://grokthink.org\n\n  Usage: framework <options>\n\n  Options:\n\n       -h              : This help screen\n       -d              : Become a server process\n       -l    <logfile> : logfile to output debug info\n       -p              : Print Main Nodes on exit\n       -t              : Perform Unit Testing of library functions\n       -v     <number> : Verbose level from 0 to 9, inclusive\n\n", RELEASENAME, RELEASEMAJOR, RELEASEMINOR, RELEASELEVEL, COPYRIGHT, AUTHOR, RELEASETAG);
	}

	/* if -t command line argument is set, perform unit test */
	if (GetValueInt(GetPropNode(Main, "UnitTest"))) {
		PerformTesting();
	}

	/* if deamon option was turned on, become a deamon */
	if (GetValueInt(GetPropNode(Main, "deamon"))) {
		// also turn off logging in debug print.
		// because part of becoming a deamon is eliminating stdout

		DebugPrint ( "Becoming a Deamon.", __FILE__, __LINE__, PROG_FLOW);
		become_deamon ();
	}

	/* if logname is given, set the debug print to use the logfile */
	logname = GetValueStr(GetPropNode(Main, "logname"));
	if (logname && strlen(logname)) {
		// set up the debug print to output to logfile
		// turn on normal debug printing
		DebugPrint ( "Verbose Logging Enabled.", __FILE__, __LINE__, PROG_FLOW);
		;
	}

	/* set the logging level for debug print */

	DebugPrint ( "Logging Level Set.", __FILE__, __LINE__, PROG_FLOW);


	/* Setup task list */
	Tasks = CreateList();

}