docs: public void execBackwards(Map<String,INDArray> placeholders){
          if (getFunction("grad") == null) {
              createGradFunction();
          }
  
          //Collect (unique) list of gradient names...
          Set<String> varGradNames = new HashSet<>();
          for(Variable v : variables.values()){
              if(v.getVariable().getVariableType() == VariableType.VARIABLE){
                  SDVariable g = v.getVariable().gradient();
                  if(g != null) {
                      //Not all variables can have gradients... for example: suppose graph has 2 independent loss functions,
                      // optimizing only 1 might not require changing all variables
                      varGradNames.add(g.getVarName());
                  }
              }
          }
  
          //Edge case: if no variables, no variable gradients to calculate...
          if(varGradNames.isEmpty()){
              log.warn("Skipping gradient execution (backward pass) - no variables to be calculated (graph does not contain any VARIABLE type SDVariables).\n" +
                      "If gradients for other variables (such as placeholders) are required, use execBackwards(Map, List) instead");
              return;
          }
  
          List<String> vargradNamesList = new ArrayList<>(varGradNames);
          execBackwards(placeholders, vargradNamesList);
      }