docs: def get_mleap_model(self, transformer, attributes_to_serialize=None):
          """
          Generates the model.json given a list of attributes, which are a tuple comprised of:
              - name
              - value
          Type is figured out automatically, but we should consider specifying it explicitly.
          Note: this only supports doubles and tensors that are vectors/lists of doubles.
          :param transformer:
          :param attributes_to_serialize: Tuple of (name, value)
          :return:
          """
          js = {
              'op': transformer.op
          }
  
          # If the transformer doesn't have any attributes, return just the op name
          if attributes_to_serialize is None:
              return js
  
          attributes = {}
  
          for name, value in attributes_to_serialize:
              if isinstance(value, float):
                  attributes[name] = {
                      "double": value
                  }
  
              elif isinstance(value, bool) and value in [True, False]:
                  attributes[name] = {
                      "boolean": value
                  }
  
              elif isinstance(value, int):
                  attributes[name] = {
                      "long": value
                  }
              elif isinstance(value, Vector):
                  attributes[name] = {
                      "type": "list",
                      "double": value.values
                  }
              elif isinstance(value, list) and (isinstance(value[0], np.float64) or isinstance(value[0], np.float32) or isinstance(value[0], float)):
                  base = type(value[0])
                  attributes[name] = {
                      _type_map[base]: value,
                      "shape": {
                          "dimensions": [{
                              "size": len(value),
                              "name": ""
                          }]
                      },
                      "type": "tensor"
                  }
              elif isinstance(value, list) and isinstance(value[0], str):
                  attributes[name] = {
                        "type": "list",
                        "string": value
                  }
  
              elif isinstance(value, np.ndarray):
                  attributes[name] = {
                      "double":  list(value.flatten()),
                      "shape": {
                          "dimensions": [{
                              "size": list(value.shape),
                              "name": ""
                          }]
                      },
                      "type": "tensor"
                  }
  
              elif isinstance(value, str):
                  attributes[name] = {
                      'string': value
                  }
  
              elif isinstance(value, dict):
                  shapes = list()
                  for shape in value['data_shape']:
                      if shape['shape'] == 'scalar':
                          shapes.append(({"base": "scalar",
                                          "isNullable": False}))
                      elif shape['shape'] == 'tensor':
                          shapes.append(({"base": "tensor",
                                          "isNullable": False,
                                          "tensorShape": {
                                              "dimensions": [{
                                                  "size": shape['tensor_shape']['dimensions'][0]['size'],
                                                  "name": ""
                                                  }]
                                              }
                                          }
                                         ))
                  attributes[name] = {
                      'type': 'list',
                      'data_shape': shapes
                  }
  
          js['attributes'] = attributes
  
          return js