/// <summary>
        /// compute the similarity of case base's cases and problem case
        ///
        /// </summary>
        /// <param name="cases"></param>
        /// <param name="problem"></param>
        /// <returns></returns>
        public ArrayList ComputeSimilarity(ArrayList cases, Case problem)
        {
            if (_env == null)
            {
                throw new ContextException("environment variable is not set");
            }

            ICBRContext ctx = CBRContextManager.GetCBRContext(_env);

            if (ctx == null)
            {
                throw new ContextException("not set context");
            }

            ISimilarity sim = (ISimilarity)ctx.GetSimilarity();

            if (sim == null)
            {
                throw new ContextException("similarity method is not set");
            }

            ArrayList stats = new ArrayList();
            double    similarityThrehold = ctx.GetSimilarityThrehold();

            for (int i = 0; i < cases.Count; i++)
            {
                Case   solution   = (Case)cases[i];
                double similarity = sim.Compare(problem, solution);
                //continue if the similarity by comparing is lower than the
                //similarity threhold in context setting
                if (similarity < similarityThrehold)
                {
                    continue;
                }
                IStat s = StatFactory.newInstance();
                s.SetCBRCase(solution);
                s.SetCaseSimilarity(similarity);
                //bi-sort similarity
                if (stats.Count <= 0)
                {
                    stats.Add(s);
                    continue;
                }
                SortSimilarity(stats, s);
            }

            return(stats);
        }
        /// <summary>
        /// test data:
        ///		case structure:
        ///			feature name	feature type	weight		key
        ///			speed			double			0.5			false
        ///			temperature		double			0.3			false
        ///			quality			double			0.2			false
        ///			result			double			0			true
        ///		case 1 data:
        ///			speed		2.0
        ///			temperature	3.0
        ///			quality		1
        ///			result		1
        ///		case 2 data:
        ///			speed		3.0
        ///			temperature 4.0
        ///			quality		2
        ///			result		2
        ///	expected result value is 1 / (1 + Math.Sqrt(0.38)* 1
        ///
        /// </summary>
        [Test] public void testCompare()
        {
            double diff = sim.Compare(c1, c2);

            Assert.AreEqual(1 / (1 + Math.Sqrt(0.38) * 1), diff);
        }