import math
def scurve(t):
    L=lambda x:1/(1+math.exp(-10*(x-0.5)))
    return (L(t)-L(0))/(L(1)-L(0))
def ramp(m,start,rampm,curve="scurve"):
    if m<start: return 0.0
    t=(m-start+1)/rampm
    if t>=1: return 1.0
    if curve=="linear": return t
    if curve=="step": return 0.0
    return scurve(t)
SCEN={"conservative":(2,1.5),"expected":(0,1.0),"aggressive":(-1,0.6)}
def eff(start,rampm,scen):
    s,k=SCEN[scen]; return max(0,start+s), max(1,round(rampm*k))
DELTA={"automate":0.85,"assist":0.45,"human":0.15,"eliminate":1.0}
# Worked example: generic help desk, 4000 requests/month, $60/h
STEPS=[ # name, hours, disposition, start, ramp, runs/unit, units/run(k tokens), price in/out per M
 ("Intake",0.3,"automate",1,3,1,3.0),
 ("Triage",0.2,"automate",1,3,1,2.5),
 ("First-line resolution",0.7,"assist",0,2,1,8.0),
 ("Specialist investigation",1.4,"assist",2,4,1,15.0),
 ("Approval",0.3,"human",0,1,0,0),
 ("Closure and notes",0.3,"automate",1,2,1,4.0),
]
U=4000; RATE=60; PIN=3.0; POUT=15.0; SHARE=0.7; BL=0.75; BH=1.6
def price(units_k): u=units_k*1000; return u*SHARE/1e6*PIN+u*(1-SHARE)/1e6*POUT
def project(scen="expected",H=12):
    out=[]; cum=0
    for m in range(H):
        removed=0; c50=cl=ch=0
        for n,h,d,st,rp,r,uk in STEPS:
            s,k=eff(st,rp,scen); f=ramp(m,s,k)
            removed+=h*DELTA[d]*f
            if r>0:
                runs=U*r*f; c50+=price(runs*uk); cl+=price(runs*uk*BL); ch+=price(runs*uk*BH)
        gross=removed*U*RATE; net=gross-c50; cum+=net
        out.append(dict(m=m,removed=removed,gross=gross,c50=c50,cl=cl,ch=ch,net=net,cum=cum))
    return out
if __name__=="__main__":
    p=project(); ss=p[-1]
    print("hours/unit today", sum(s[1] for s in STEPS))
    print("steady removed/unit %.3f gross %.0f cost %.0f (%.0f..%.0f) net %.0f"%(ss["removed"],ss["gross"],ss["c50"],ss["cl"],ss["ch"],ss["net"]))
    print("cum12 net %.0f payback M%d"%(ss["cum"],next(x["m"] for x in p if x["cum"]>0)+1))
    for sc in SCEN: print(sc, "%.0f"%project(sc)[-1]["cum"])
