// Hybrid Simulation for Expected Value
// Written by Microsoft Visual C++ 6.0
// Copyright by UTLab @ Tsinghua University
// http://orsc.edu.cn/UTLab

#include <vector>
#include <iostream>
#include <cmath>
#include "utlab.h"
using namespace std;


inline double max(double a, double b)
{
	return (a>b)?a:b;
}


inline double min(double a, double b)
{
	return (a<b)?a:b;
}


void main()
{
	const int N = 2000;

	double e=0,r=0,L=0,a=100000.0,b=0.0,sup1=0,sup2=0,sup=0;
	vector<double> theta1(N,0),theta2(N,0),theta3(N,0),cr(N,0), z1(N,0),z2(N,0),z3(N,0),p(N,0),su1(N,0),su2(N,0);
						//cr[i]=min{theta1,theta2,theta3}?
	int i=0,j=0,k=0;
	std::vector<std::vector<double> > f;
	f.resize(N);
	for (i=0;i<N;i++)
		f[i].resize(N);

	//generate theta1, theta2,..., thetaN from the credibility space
	for (i = 0 ; i < N ; i++){
		theta1[i]=myu(1,3);	
		theta2[i]=myu(2,4);	
		theta3[i]=myu(3,5);
		cr[i]=min(min(triangle(theta1[i],1,2,3) ,triangle(theta2[i],2,3,4) ),triangle(theta3[i],3,4,5) )/2;
	}

	//generate omg1, omg2,..., omgN from the probability space
	for (i = 0 ; i < N ; i++){
		z1[i] = myu(0,1);
		z2[i] = myu(0,1);
		z3[i] = myu(0,1);
	}

	for (i = 0 ; i < N ; i++){
		for (j = 0 ; j < N ; j++){
			f[i][j]=(theta1[i]+z1[j])*(theta2[i]+z2[j])*(theta3[i]+z3[j]);
		}
	}

	for ( i = 0 ; i < N ; i ++){
		for ( j = 0 ; j < N ; j++){
			a=min(a,f[i][j]);
			b=max(b,f[i][j]);
		}
	}

	double temp=0;
	for ( k = 0 ; k < N; k ++){
		r=myu(a,b);
		L=0;temp=0;sup1=0;sup2=0;
		for ( i = 0 ; i < N ; i ++){
			temp=0;
			//for fixed i solve Pr{f(\theta_k,*)}
			for ( j = 0 ; j < N ; j ++){
				if (f[i][j]>=r){
					temp++;							
				}
			}
			p[i]=temp/N;
			su1[i]=min(cr[i],p[i]);
			su2[i]=min(cr[i],1-p[i]);
		}

		for ( i = 0 ; i < N ; i++){
			sup1=max(sup1,su1[i]);
			sup2=max(sup2,su2[i]);
		}

		if (r>=0){
			L=max(sup1,1-sup2);
			e+=L;
		}
		else{
			L=max(sup2,1-sup1);
			e-=L;
		}
	}		
	cout<<max(a,0.0)+min(b,0.0)+e*(b-a)/N<<endl;

}
