code: def binary(self):
          
          # NB: The existence of the _binary property implies that it is up to date, methods that
          # invalidate it will erase the property
          try:
              binary = self._binary
              if binary is not None:
                  return binary
          except AttributeError:
              pass
  
          if self.vartype is Vartype.BINARY:
              self._binary = binary = self
          else:
              self._counterpart = self._binary = binary = self.change_vartype(Vartype.BINARY, inplace=False)
  
              # we also want to go ahead and set binary.spin to refer back to self
              binary._spin = self
  
          return binary
docs: :class:`.BinaryQuadraticModel`: An instance of the QUBO model subclass of
          the :class:`.BinaryQuadraticModel` superclass, corresponding to a binary quadratic
          model with binary variables.
  
          Enables access to biases for the binary-valued binary quadratic model
          regardless of the :class:`vartype` set when the model was created. If the model
          was created with the :attr:`.spin` vartype, the QUBO model subclass is instantiated
          upon the first use of the :attr:`.binary` property and used in any subsequent reads.
  
          Examples:
             This example creates an Ising model and uses the :attr:`.binary` property
             to instantiate the corresponding QUBO model.
  
             >>> import dimod
             ...
             >>> bqm_spin = dimod.BinaryQuadraticModel({0: 0.0, 1: 0.0}, {(0, 1): 0.5}, -0.5, dimod.SPIN)
             >>> bqm_qubo = bqm_spin.binary
             >>> bqm_qubo  # doctest: +SKIP
             BinaryQuadraticModel({0: -1.0, 1: -1.0}, {(0, 1): 2.0}, 0.0, Vartype.BINARY)
             >>> bqm_qubo.binary is bqm_qubo
             True
  
          Note:
              Methods like :meth:`.add_variable`, :meth:`.add_variables_from`,
              :meth:`.add_interaction`, etc. should only be used on the base model.