public double H(String tag1, String tag2, String tag3) throws IOException {
		int s1 = ergate.core.Tag.TagMapper.tag2I(tag1);
		int s2 = ergate.core.Tag.TagMapper.tag2I(tag2);
		int s3 = ergate.core.Tag.TagMapper.tag2I(tag3);
		double p = 0.0;
		Tag t1 = tagMap.get(s1);
		Tag t2 = tagMap.get(s2);
		Tag t3 = tagMap.get(s3);
		long id = NumUtils.ID(s1, s3);
		Long N_T1_T2_T3 = t2.about.get(id);
		double lamda = 1.0;
		if (N_T1_T2_T3 != null) {
			lamda = Math.exp(-N_T1_T2_T3);
			long N_T1_T3 = 0;
			Long temp;
			for (Tag t : tagMap.values()) {
				temp = t.about.get(id);
				if (temp != null)
					N_T1_T3 += temp;
			}
			p += N_T1_T2_T3 * (1 - lamda) / N_T1_T3;
		}
		Long N_T1_T2 = t1.trans.getVal(s2);
		lamda = lamda / 2;
		if (N_T1_T2 != null) {
			p += N_T1_T2 * lamda / t1.freq();

		}
		Long N_T2_T3 = t2.trans.getVal(s3);
		if (N_T2_T3 != null) {
			p += N_T2_T3 * lamda / t3.freq();
		}
		return NumUtils.H(p);
	}