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); }
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; }