/**
     * Updates the state of the watcher, given reception of a new message.
     *
     * @param m
     *          The message that was received.
     */
    private void update(WatcherMessage m)
    {
        WatcherNode wn2;
        HashSet<WatcherNode> spawnedNodes;
        HashSet<WatcherNode> newNodes = new HashSet<WatcherNode>();
        int size = 0, atoms = 0;

        foreach (WatcherNode wn in m_nodes)
        {
            wn2 = new WatcherNode();
            wn2.setGamma(wn.getDelta());
            spawnedNodes = wn2.spawn(m);

            foreach (WatcherNode wn3 in spawnedNodes)
            {
                newNodes.Add(wn3);
            }
        }

        m_nodes = newNodes;

        // Updates statistics about maximum number of nodes
        size = m_nodes.Count;

        if (size > m_maxNodes)
        {
            m_maxNodes = size;
        }

        // Updates statistics about total number of formulae
        size = 0;
        atoms = 0;

        foreach (WatcherNode wn in m_nodes)
        {
            size += wn.getSize();
            atoms += wn.getAtoms();
        }

        if (size > m_maxFormulae)
        {
            m_maxFormulae = size;
        }

        if (atoms > m_maxAtoms)
        {
            m_maxAtoms = atoms;
        }
    }