docs: public void initFunctionFromProperties(String mappedTfName, DifferentialFunction on, Map<String, OnnxProto3.AttributeProto> attributesForNode, OnnxProto3.NodeProto node, OnnxProto3.GraphProto graph) {
          val properties = on.mappingsForFunction();
          val tfProperties = properties.get(mappedTfName);
          val fields = DifferentialFunctionClassHolder.getInstance().getFieldsForFunction(on);
          val attributeAdapters = on.attributeAdaptersForFunction();
          for(val entry : tfProperties.entrySet()) {
              val tfAttrName = entry.getValue().getTfAttrName();
              val currentField = fields.get(entry.getKey());
  
              AttributeAdapter adapter = null;
              if(tfAttrName != null) {
                  if(currentField == null) {
                      continue;
                  }
                  if(attributeAdapters != null && !attributeAdapters.isEmpty()) {
                      val mappers = attributeAdapters.get(on.tensorflowName());
                      val adapterFor = mappers.get(entry.getKey());
                      adapter = adapterFor;
                  }
  
  
                  if(attributesForNode.containsKey(tfAttrName)) {
                      val attr = attributesForNode.get(tfAttrName);
                      switch (attr.getType()) {
                          case STRING:
                              val setString = attr.getS().toStringUtf8();
                              if(adapter != null) {
                                  adapter.mapAttributeFor(setString,currentField,on);
                              }
                              else
                                  on.setValueFor(currentField,setString);
                              break;
                          case INT:
                              val setInt = (int) attr.getI();
                              if(adapter != null) {
                                  adapter.mapAttributeFor(setInt,currentField,on);
                              }
                              else
                                  on.setValueFor(currentField,setInt);
                              break;
                          case INTS:
                              val setList = attr.getIntsList();
                              if(!setList.isEmpty()) {
                                  val intList = Ints.toArray(setList);
                                  if(adapter != null) {
                                      adapter.mapAttributeFor(intList,currentField,on);
                                  }
                                  else
                                      on.setValueFor(currentField,intList);
                              }
                              break;
                          case FLOATS:
                              val floatsList = attr.getFloatsList();
                              if(!floatsList.isEmpty()) {
                                  val floats = Floats.toArray(floatsList);
                                  if(adapter != null) {
                                      adapter.mapAttributeFor(floats,currentField,on);
                                  }
  
                                  else
                                      on.setValueFor(currentField,floats);
                                  break;
                              }
                              break;
                          case TENSOR:
                              val tensorToGet = mapTensorProto(attr.getT());
                              if(adapter != null) {
                                  adapter.mapAttributeFor(tensorToGet,currentField,on);
                              }
                              else
                                  on.setValueFor(currentField,tensorToGet);
                              break;
  
                      }
                  }
              }
  
  
          }
      }