public double[] estimateOffsetProbability(double x){
		double data[] = new double[1];
		data[0] = x;
		int K = m + n;
		int N = data.length;
		int L = offset.length;
		double r[][][] = new double[N][][];
		for(int i=0;i<N;i++){
			r[i] = new double[K][];
			for(int k=0;k<K;k++){
				r[i][k] = new double[L];
				for(int l=0;l<L;l++) r[i][k][l] = 0;
			}
		}
		
		double Rk[] = new double[K];
		double lowerbound = Double.NEGATIVE_INFINITY;
		double lowerbound_pre = Double.NEGATIVE_INFINITY;
		ONDEParameterDistribution params = this.clone();
		ONDEVB engine = new ONDEVB();
		boolean flag = true;
		do{
			// E step
			engine.Estep(params,data,r);
			// M step
			engine.Mstep(this,data,r,Rk,params);
			// lower bound
			lowerbound_pre = lowerbound;
			lowerbound = engine.lowerbound(this,params,r,Rk);
			// Stop condition
			if(Math.abs(lowerbound - lowerbound_pre) < ONDEVB.threshold) flag = false;
			else if(lowerbound_pre > lowerbound) throw new ArithmeticException();
		}while(flag);
		double w[] = new double[L];
		for(int l=0;l<L;l++){
			w[l] = 0;
			for(int k=0;k<K;k++) w[l] += r[0][k][l];
		}
		return w;
	}