Example #1
0
void bookkeeping (FFNet me) {
	long nWeights = 0;
	my nNodes = my nUnitsInLayer[0];
	for (long i = 1; i <= my nLayers; i++) {
		my nNodes += my nUnitsInLayer[i] + 1;
		nWeights += my nUnitsInLayer[i] * (my nUnitsInLayer[i - 1] + 1);
	}
	if (my nWeights > 0 && my nWeights != nWeights) {
		Melder_throw (U"Number of weights is incorret.");
	}
	my nWeights = nWeights;

	// The following test is essential because when an FFNet is read from file the w array already exists
	if (my w == 0) {
		my w = NUMvector<double> (1, my nWeights);
	}
	my activity = NUMvector<double> (1, my nNodes);
	my isbias = NUMvector<long> (1, my nNodes);
	my nodeFirst = NUMvector<long> (1, my nNodes);
	my nodeLast = NUMvector<long> (1, my nNodes);
	my wFirst = NUMvector<long> (1, my nNodes);
	my wLast = NUMvector<long> (1, my nNodes);
	my wSelected = NUMvector<long> (1, my nWeights);
	my error = NUMvector<double> (1, my nNodes);
	my deriv = NUMvector<double> (1, my nNodes);
	my dwi = NUMvector<double> (1, my nWeights);
	my dw = NUMvector<double> (1, my nWeights);
	my nInputs = my nUnitsInLayer[0];
	my nOutputs = my nUnitsInLayer[my nLayers];
	my isbias[my nInputs + 1] = 1;
	my activity[my nInputs + 1] = 1.0;

	long n = my nUnitsInLayer[0] + 2;
	long firstNodeInPrevious = 1, lastWeightInPrevious = 0;
	for (long j = 1; j <= my nLayers; j++,  n++) {
		for (long i = 1; i <= my nUnitsInLayer[j]; i++, n++) {
			my isbias[n] = 0;
			my nodeFirst[n] = firstNodeInPrevious;
			my nodeLast[n] = my nodeFirst[n] + my nUnitsInLayer[j - 1];
			my wFirst[n] = lastWeightInPrevious + (i - 1) * (my nUnitsInLayer[j - 1] + 1) + 1;
			my wLast[n] = my wFirst[n] + my nUnitsInLayer[j - 1];
		}
		if (j != my nLayers) {
			my isbias[n] = 1;
			my activity[n] = 1.0;
		}
		lastWeightInPrevious = my wLast[n - 1];
		firstNodeInPrevious += my nUnitsInLayer[j - 1] + 1;
	}
	FFNet_selectAllWeights (me);
}
Example #2
0
static int bookkeeping (FFNet me)
{
    long j, i, n = my nUnitsInLayer[0] + 2, nWeights = 0;
    long firstNodeInPrevious = 1, lastWeightInPrevious = 0;
    
    my nNodes = my nUnitsInLayer[0];
    for (i = 1; i <= my nLayers; i++)
    {
		my nNodes += my nUnitsInLayer[i] + 1;
        nWeights += my nUnitsInLayer[i] * (my nUnitsInLayer[i - 1] + 1);
    }
    if (my nWeights > 0 && my nWeights != nWeights) return 0;
    my nWeights = nWeights;
    /* FFNet_readText already fills my w */ 
	if ( (! my w && ! (my w = NUMdvector (1, my nWeights))) ||
        ! (my activity     = NUMdvector (1, my nNodes)) ||
        ! (my isbias       = NUMlvector (1, my nNodes)) ||
        ! (my nodeFirst    = NUMlvector (1, my nNodes)) ||
        ! (my nodeLast     = NUMlvector (1, my nNodes)) ||
        ! (my wFirst       = NUMlvector (1, my nNodes)) ||
        ! (my wLast        = NUMlvector (1, my nNodes)) ||
        ! (my wSelected    = NUMlvector (1, my nWeights)) ||
        ! (my error        = NUMdvector (1, my nNodes)) ||
        ! (my deriv  	   = NUMdvector (1, my nNodes)) ||
        ! (my dwi          = NUMdvector (1, my nWeights)) ||
        ! (my dw           = NUMdvector (1, my nWeights))) return 0;
	my nInputs = my nUnitsInLayer[0];
	my nOutputs = my nUnitsInLayer[my nLayers];
    my isbias[my nInputs + 1] = my activity[my nInputs + 1] = 1;
    for (j=1; j <= my nLayers; j++,  n++)
    {
        for (i=1; i <= my nUnitsInLayer[j]; i++, n++)
        {
            my isbias[n] = 0;
            my nodeFirst[n] = firstNodeInPrevious;
            my nodeLast[n] = my nodeFirst[n] + my nUnitsInLayer[j-1];
            my wFirst[n] = lastWeightInPrevious + (i-1)* (my nUnitsInLayer[j-1] + 1) + 1;
            my wLast[n] = my wFirst[n] + my nUnitsInLayer[j-1];
        }
        if (j != my nLayers) my isbias[n] = my activity[n] = 1;
        lastWeightInPrevious = my wLast[n-1];
        firstNodeInPrevious += my nUnitsInLayer[j-1] + 1;
     }
     FFNet_selectAllWeights (me);
     return 1;
}