def _add_shaper(self, jmx):
    '\n        Add shaper\n        :param jmx: JMX\n        :return:\n        '
    if (not self.load.duration):
        self.log.warning("You must set 'ramp-up' and/or 'hold-for' when using 'throughput' option")
        return
    etree_shaper = jmx.get_rps_shaper()
    if self.load.ramp_up:
        if (isinstance(self.load.throughput, numeric_types) and self.load.duration):
            start_rps = (self.load.throughput / float(self.load.duration))
            start_rps = max(start_rps, 0.001)
            start_rps = min(start_rps, 1.0)
        else:
            start_rps = 1
        if (not self.load.steps):
            jmx.add_rps_shaper_schedule(etree_shaper, start_rps, self.load.throughput, self.load.ramp_up)
        else:
            step_h = (self.load.throughput / self.load.steps)
            step_w = (float(self.load.ramp_up) / self.load.steps)
            accum_time = 0
            for step in range(1, (self.load.steps + 1)):
                jmx.add_rps_shaper_schedule(etree_shaper, (step_h * step), (step_h * step), ((step_w * step) - accum_time))
                accum_time += cond_int(((step_w * step) - accum_time))
    if self.load.hold:
        jmx.add_rps_shaper_schedule(etree_shaper, self.load.throughput, self.load.throughput, self.load.hold)
    jmx.append(JMeterScenarioBuilder.TEST_PLAN_SEL, etree_shaper)
    jmx.append(JMeterScenarioBuilder.TEST_PLAN_SEL, etree.Element('hashTree'))
Add shaper
:param jmx: JMX
:return:
def _add_shaper(self, jmx):
    '\n        Add shaper\n        :param jmx: JMX\n        :return:\n        '
    if (not self.load.duration):
        self.log.warning("You must set 'ramp-up' and/or 'hold-for' when using 'throughput' option")
        return
    etree_shaper = jmx.get_rps_shaper()
    if self.load.ramp_up:
        if (isinstance(self.load.throughput, numeric_types) and self.load.duration):
            start_rps = (self.load.throughput / float(self.load.duration))
            start_rps = max(start_rps, 0.001)
            start_rps = min(start_rps, 1.0)
        else:
            start_rps = 1
        if (not self.load.steps):
            jmx.add_rps_shaper_schedule(etree_shaper, start_rps, self.load.throughput, self.load.ramp_up)
        else:
            step_h = (self.load.throughput / self.load.steps)
            step_w = (float(self.load.ramp_up) / self.load.steps)
            accum_time = 0
            for step in range(1, (self.load.steps + 1)):
                jmx.add_rps_shaper_schedule(etree_shaper, (step_h * step), (step_h * step), ((step_w * step) - accum_time))
                accum_time += cond_int(((step_w * step) - accum_time))
    if self.load.hold:
        jmx.add_rps_shaper_schedule(etree_shaper, self.load.throughput, self.load.throughput, self.load.hold)
    jmx.append(JMeterScenarioBuilder.TEST_PLAN_SEL, etree_shaper)
    jmx.append(JMeterScenarioBuilder.TEST_PLAN_SEL, etree.Element('hashTree'))