⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iqagent.h

📁 经典numerical receip 配套代码
💻 H
字号:
struct IQagent {
	static const Int nbuf = 1000;
	Int nq, nt, nd;
	VecDoub pval,dbuf,qile;
	Doub q0, qm;

	IQagent() : nq(251), nt(0), nd(0), pval(nq), dbuf(nbuf),
	qile(nq,0.), q0(1.e99), qm(-1.e99) {
		for (Int j=85;j<=165;j++) pval[j] = (j-75.)/100.;
		for (Int j=84;j>=0;j--) {
			pval[j] = 0.87191909*pval[j+1];
			pval[250-j] = 1.-pval[j];
		}
	}
		
	void add(Doub datum) {
		dbuf[nd++] = datum;
		if (datum < q0) {q0 = datum;}
		if (datum > qm) {qm = datum;}
		if (nd == nbuf) update();
	}

	void update() {
		Int jd=0,jq=1,iq;
		Doub target, told=0., tnew=0., qold, qnew;
		VecDoub newqile(nq);
		sort(dbuf,nd);
		qold = qnew = qile[0] = newqile[0] = q0;
		qile[nq-1] = newqile[nq-1] = qm;
		pval[0] = min(0.5/(nt+nd),0.5*pval[1]);
		pval[nq-1] = max(1.-0.5/(nt+nd),0.5*(1.+pval[nq-2]));
		for (iq=1;iq<nq-1;iq++) {
			target = (nt+nd)*pval[iq];
			if (tnew < target) for (;;) {
				if (jq < nq && (jd >= nd || qile[jq] < dbuf[jd])) {
					qnew = qile[jq];
					tnew = jd + nt*pval[jq++];
					if (tnew >= target) break;
				} else {
					qnew = dbuf[jd];
					tnew = told;
					if (qile[jq]>qile[jq-1]) tnew += nt*(pval[jq]-pval[jq-1])
						*(qnew-qold)/(qile[jq]-qile[jq-1]);
					jd++;
					if (tnew >= target) break;
					told = tnew++;
					qold = qnew;
					if (tnew >= target) break;
				}
				told = tnew;
				qold = qnew;
			}
			if (tnew == told) newqile[iq] = 0.5*(qold+qnew);
			else newqile[iq] = qold + (qnew-qold)*(target-told)/(tnew-told);
			told = tnew;
			qold = qnew;
		}
		qile = newqile;
		nt += nd;
		nd = 0;
	}

	Doub report(Doub p) {
		Doub q;
		if (nd > 0) update();
		Int jl=0,jh=nq-1,j;
		while (jh-jl>1) {
			j = (jh+jl)>>1;
			if (p > pval[j]) jl=j;
			else jh=j;
		}
		j = jl;
		q =  qile[j] + (qile[j+1]-qile[j])*(p-pval[j])/(pval[j+1]-pval[j]);
		return MAX(qile[0],MIN(qile[nq-1],q));
	}
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -