code: def fit(self,
              target_type,
              target,
              adjust_thickness=False,
              adjust_site_atten=False,
              adjust_source_vel=False):
          density = self.profile.density
          nl = len(density)
          slowness = self.profile.slowness
          thickness = self.profile.thickness
          site_atten = self._site_atten
          initial = slowness
          bounds = 1 / np.tile((4000, 100), (nl, 1))
          if not adjust_source_vel:
              bounds[-1] = (initial[-1], initial[-1])
          if adjust_thickness:
              bounds = np.r_[bounds, [[t / 2, 2 * t] for t in thickness]]
              initial = np.r_[initial, thickness]
          if adjust_site_atten:
              bounds = np.r_[bounds, [[0.0001, 0.200]]]
              initial = np.r_[initial, self.site_atten]
          def calc_rmse(this, that):
              return np.mean(((this - that) / that) ** 2)
          def err(x):
              _slowness = x[0:nl]
              if adjust_thickness:
                  _thickness = x[nl:(2 * nl)]
              else:
                  _thickness = thickness
              if adjust_site_atten:
                  self._site_atten = x[-1]
              crustal_amp, site_term = self._calc_amp(density, _thickness,
                                                      _slowness)
              calc = crustal_amp if target_type == 'crustal_amp' else site_term
              err = 10 * calc_rmse(target, calc)
              err += calc_rmse(slowness, _slowness)
              if adjust_thickness:
                  err += calc_rmse(thickness, _thickness)
              if adjust_site_atten:
                  err += calc_rmse(self._site_atten, site_atten)
              return err
          res = minimize(err, initial, method='L-BFGS-B', bounds=bounds)
          slowness = res.x[0:nl]
          if adjust_thickness:
              thickness = res.x[nl:(2 * nl)]
          profile = Profile([
              Layer(l.soil_type, t, 1 / s)
              for l, t, s in zip(self.profile, thickness, slowness)
          ], self.profile.wt_depth)
          return (self.motion, profile, self.loc_input)