@Override
 public boolean equals(Object obj) {
   if (this == obj) {
     return true;
   }
   if (obj == null) {
     return false;
   }
   if (!(obj instanceof AbstractFailureNode)) {
     return false;
   }
   AbstractFailureNode other = (AbstractFailureNode) obj;
   if (_desiredOutputNode == null) {
     if (other._desiredOutputNode != null) {
       return false;
     }
   } else if (!_desiredOutputNode.equals(other._desiredOutputNode)) {
     return false;
   }
   if (_functionEntry == null) {
     if (other._functionEntry != null) {
       return false;
     }
   } else if (!_functionEntry.equals(other._functionEntry)) {
     return false;
   }
   if (_valueRequirementNode == null) {
     if (other._valueRequirementNode != null) {
       return false;
     }
   } else if (!_valueRequirementNode.equals(other._valueRequirementNode)) {
     return false;
   }
   return true;
 }
 @Override
 public int hashCode() {
   final int prime = 31;
   int result = 1;
   result = prime * result + ((_desiredOutputNode == null) ? 0 : _desiredOutputNode.hashCode());
   result = prime * result + ((_functionEntry == null) ? 0 : _functionEntry.hashCode());
   result =
       prime * result + ((_valueRequirementNode == null) ? 0 : _valueRequirementNode.hashCode());
   return result;
 }