I fucked up some of the arithmetic in my first post. I'm still not 100% sure it's correct but the python code in the spoiler tags should tell you at what mob remaining health you should swap out of your proc weapons to your dps weapons. I'll do a little more testing, probably tomorrow.
Code:
def remaining_health(low_dps=33,
high_dps=47,
mob_dps=11,
proc_delay_seconds = 4.1/1.34,
procs_per_minute = 1,
slow_reduction = .5
):
damage_spent = proc_delay_seconds * (high_dps - low_dps)
print("By swinging the proc weapon once you lowered damage dealt by " + str(damage_spent))
time_extended = damage_spent / high_dps
print("By swinging the proc weapon once you extended the fight length by " + str(time_extended))
extra_damage_taken = time_extended * mob_dps
print("By swinging the proc weapon once you took extra damage of " + str(extra_damage_taken))
swings_per_minute = 60 / proc_delay_seconds
procs_per_swing = procs_per_minute / swings_per_minute
slow_expected_reduction_percent = slow_reduction * procs_per_swing
damage_needed = extra_damage_taken / slow_expected_reduction_percent
print("Damage needed to take to outweight extra damage taken: " + str(damage_needed))
damage_to_do = high_dps * damage_needed / low_dps
print("Mob health remaining before die/flee when you should swap out of proc weapon: " + str(damage_to_do))
print("at that remaining health, possible outcomes:")
print("using dps weapons")
length = damage_to_do/high_dps
damage = mob_dps * length
print("length of fight: {}, damage taken: {}".format(length, damage))
length = proc_delay_seconds + (damage_to_do - low_dps * proc_delay_seconds)/high_dps
damage_no_proc = mob_dps * length
print("swing slow weapon and then switch to dps weapons, no proc")
print("length of fight: {}, damage taken: {}".format(length, damage_no_proc))
print("swing slow weapon and then switch to dps weapons, proc")
length = proc_delay_seconds + (damage_to_do - low_dps * proc_delay_seconds)/high_dps
damage_proc = slow_reduction * mob_dps * length
print("length of fight: {}, damage taken: {}".format(length, damage_proc))
Anyway, the way I've been treating it on my ranger is that if the mob is easy (Grobb Bashers, hill giants) I skip the swarmcaller. If the mob is challenging (geos), if I've been using the swarmcaller with no proc and I'm at ~30-40% I probably won't be able to win a fight toe-to-toe even if I get a proc, so I'll swap to sboz/swiftwind and when I hit ~20% I'll root the mob, back up and switch to archery until the root wears off. By that point I've probably regenned enough health that my dps weapons will be able to finish the fight.