code: def ph_supconj(b, orbit, solve_for=None, **kwargs):
      
      orbit_ps = _get_system_ps(b, orbit)
  
      # metawargs = orbit_ps.meta
      #metawargs.pop('qualifier')
  
      # t0_ph0 and phshift both exist by default, so we don't have to worry about creating either
      # t0_ph0 = orbit_ps.get_parameter(qualifier='t0_ph0')
      # phshift = orbit_ps.get_parameter(qualifier='phshift')
      ph_supconj = orbit_ps.get_parameter(qualifier='ph_supconj')
      per0 = orbit_ps.get_parameter(qualifier='per0')
      ecc = orbit_ps.get_parameter(qualifier='ecc')
      period = orbit_ps.get_parameter(qualifier='period')
  
      # true_anom_supconj = pi/2 - per0
      # mean_anom_supconj = true_anom_supconj - ecc*sin(true_anom_supconj)
      # ph_supconj = (mean_anom_supconj + per0) / (2 * pi) - 1/4
  
      if solve_for in [None, ph_supconj]:
          lhs = ph_supconj
  
          #true_anom_supconj = np.pi/2*u.rad - per0
          true_anom_supconj = -1*(per0 - 360*u.deg)
  
          rhs = _true_anom_to_phase(true_anom_supconj, period, ecc, per0)
  
      #elif solve_for in [per0]:
      #    raise NotImplementedError("phshift constraint does not support solving for per0 yet")
      else:
          raise NotImplementedError
  
      return lhs, rhs, {'orbit': orbit}
docs: TODO: add documentation