function complex$2(args) {
	  var inputs = args.inputs,
	      backend = args.backend;
	  var real = inputs.real,
	      imag = inputs.imag;
	  var complexInfo = backend.makeTensorInfo(real.shape, 'complex64');
	  var complex = backend.texData.get(complexInfo.dataId);
	  var realTensorInfo = identity$2({
	    inputs: {
	      x: real
	    },
	    backend: backend
	  });
	  var realData = backend.texData.get(realTensorInfo.dataId);
	  realData.complexParentRefCount++;
	  var imagTensorInfo = identity$2({
	    inputs: {
	      x: imag
	    },
	    backend: backend
	  });
	  var imagData = backend.texData.get(imagTensorInfo.dataId);
	  imagData.complexParentRefCount++;
	  complex.complexTensorInfos = {
	    real: realTensorInfo,
	    imag: imagTensorInfo
	  };
	  return complexInfo;
	}
In WebGL data is stored in GPU textures which can't be efficiently copied, so
complex tensors share data with their real and imaginary components. Complex
tensors increment the `complexParentRefCount` properties of the underlying
data buckets to prevent them from being disposed, as the engine's disposal
logic does not account for data sharing by complex tensors.

When a complex tensor is disposed, it will explicitly decrease the
`complexParentRefCount` properties of its underlying components.