#include #include #include "Netica.h" #define CHKERR {if (GetError_ns (env, ERROR_ERR, NULL)) goto error;} environ_ns* env; /************************************************************************** Function: enterFinding. This function sets evidence in the network **************************************************************************/ int enterFinding(node_bn* qNode, const nodelist_bn* fNodeList, net_bn* net, FILE* rep, int fNodeName, int fStateName) { int action, i; node_bn* fNode = NthNode_bn(fNodeList, fNodeName); state_bn fState = fStateName; EnterFinding_bn (fNode, fState); sensitivity(qNode, fNodeList, net, rep, 1); RetractNodeFindings_bn(fNode); } /************************************************************************** Function: sensitivity. This function computes and saves entropy and mutual information details to a report **************************************************************************/ int sensitivity(node_bn* qNode, const nodelist_bn* fNodeList, net_bn* net, FILE* rep, int printAction) { sensv_bn* svNode; node_bn* fNode; const nodelist_bn* nodeList; int i, j, k; nodelist_bn* tempNodes = DupNodeList_bn (fNodeList); double tempMutual = 0.0; int tempMutualIndex; nodeList = GetNetNodes_bn (net); printf("\nFindings set: "); if(printAction) fprintf(rep, "\nFindings set: "); for(i=0; i < LengthNodeList_bn(nodeList); i++) { if(GetNodeFinding_bn (NthNode_bn (nodeList, i)) != NO_FINDING) { printf("%s = %s, ", GetNodeName_bn (NthNode_bn (nodeList, i)), GetNodeStateName_bn (NthNode_bn (nodeList, i),GetNodeFinding_bn (NthNode_bn (nodeList, i)))); if(printAction) fprintf(rep, "%s = %s, ", GetNodeName_bn (NthNode_bn (nodeList, i)), GetNodeStateName_bn (NthNode_bn (nodeList, i),GetNodeFinding_bn (NthNode_bn (nodeList, i)))); } } printf("\n"); if(printAction) fprintf(rep, "\n"); svNode = NewSensvToFinding_bn (qNode, fNodeList, ENTROPY_SENSV); printf("Entropy of %s:\t\t %lf\n", GetNodeName_bn (qNode), MutualInfo_bn (svNode, qNode)); if (printAction) fprintf(rep, "Entropy of %s:\t\t %lf\n", GetNodeName_bn (qNode), MutualInfo_bn (svNode, qNode)); for(i=1; i < LengthNodeList_bn(fNodeList); i++) { for(j=i; j < LengthNodeList_bn(fNodeList); j++) { fNode = NthNode_bn(tempNodes, j); if(MutualInfo_bn(svNode, fNode) >= tempMutual) { tempMutualIndex = j; tempMutual = MutualInfo_bn(svNode, fNode); } } fNode = NthNode_bn(tempNodes, tempMutualIndex); printf("Mutual Info of (%s, %s):\t %lf\n", GetNodeName_bn (qNode), GetNodeName_bn (fNode), MutualInfo_bn (svNode, fNode)); if(printAction) fprintf(rep, "Mutual Info of (%s, %s):\t %lf\n", GetNodeName_bn (qNode), GetNodeName_bn (fNode), MutualInfo_bn (svNode, fNode)); SetNthNode_bn(tempNodes, tempMutualIndex, NthNode_bn(tempNodes, i)); SetNthNode_bn(tempNodes, i, fNode); tempMutual = -0.1; } if(MutualInfo_bn(svNode, NthNode_bn(tempNodes, 1)) > 0.0) { fNode = NthNode_bn(tempNodes, 1); DeleteSensvToFinding_bn (svNode); for(i=0; i < GetNodeNumberStates_bn(fNode); i++) { enterFinding(qNode, fNodeList, net, rep, IndexOfNodeInList_bn(fNode, fNodeList, 1), i); printf("----------------------------------------------------------------------------\n"); fprintf(rep, "----------------------------------------------------------------------------\n"); } } return 0; } /************************************************************************** main. This function drives the overall program **************************************************************************/ int main (void){ net_bn* net; char mesg[MESG_LEN_ns]; int res; FILE* rep = fopen("report.txt", "w"); int qNodeName; const nodelist_bn* nodeList; node_bn* qNode; nodelist_bn* fNodeList; int i; env = NewNeticaEnviron_ns (NULL, NULL, NULL); res = InitNetica_bn (&env, mesg); printf ("%s\n", mesg); if (res < 0) exit (-1); net = ReadNet_bn (NewStreamFile_ns ("17Jul GBC Model Complete.dne", env, NULL), NO_WINDOW); CHKERR nodeList = GetNetNodes_bn (net); for(i=0; i < LengthNodeList_bn(nodeList); i++) { qNode = NthNode_bn(nodeList, i); printf("Node: %s\n", GetNodeName_bn (qNode)); fprintf(rep, "Node: %s\n", GetNodeName_bn (qNode)); fNodeList = DupNodeList_bn (GetNodeParents_bn(qNode)); AddNodeToList_bn (qNode, fNodeList, 0); if(sensitivity(qNode, fNodeList, net, rep, 1)) { printf("She canne do it captain!\n"); } printf("============================================================================\n"); fprintf(rep, "============================================================================\n"); } fclose(rep); end: FreeNet_bn (net); res = CloseNetica_bn (env, mesg); printf ("%s\n", mesg); return (res < 0 ? -1 : 0); error: fprintf (stderr, "Sensitivity Analysis: Error in %s\n", ErrorMessage_ns (GetError_ns (env, ERROR_ERR, NULL))); goto end; }