private string GetGenderCompatibilityFeature(Mention.MentionContext entityContext, DiscourseEntity discourseEntity)
 {
     Similarity.GenderEnum entityGender = discourseEntity.Gender;
     //System.err.println("getGenderCompatibility: mention="+ec.getGender()+" entity="+eg);
     if (entityGender == Similarity.GenderEnum.Unknown || entityContext.GetGender() == Similarity.GenderEnum.Unknown)
     {
         return mGenderUnknown;
     }
     else if (entityContext.GetGender() == entityGender)
     {
         return mGenderCompatible;
     }
     else
     {
         return mGenderIncompatible;
     }
 }
        public override DiscourseEntity Resolve(Mention.MentionContext expression, DiscourseModel discourseModel)
        {
            DiscourseEntity discourseEntity;
            int entityIndex = 0;
            double nonReferentialProbability = mNonReferentialResolver.GetNonReferentialProbability(expression);
            if (mDebugOn)
            {
                System.Console.Error.WriteLine(this.ToString() + ".resolve: " + expression.ToText() + " -> " + "null " + nonReferentialProbability);
            }
            for (; entityIndex < GetNumberEntitiesBack(discourseModel); entityIndex++)
            {
                discourseEntity = discourseModel.GetEntity(entityIndex);
                if (IsOutOfRange(expression, discourseEntity))
                {
                    break;
                }
                if (IsExcluded(expression, discourseEntity))
                {
                    mCandidateProbabilities[entityIndex] = 0;
                    if (mDebugOn)
                    {
                        System.Console.Error.WriteLine("excluded " + this.ToString() + ".resolve: " + expression.ToText() + " -> " + discourseEntity + " " + mCandidateProbabilities[entityIndex]);
                    }
                }
                else
                {
                    string[] features = GetFeatures(expression, discourseEntity).ToArray();
                    try
                    {
                        mCandidateProbabilities[entityIndex] = mModel.Evaluate(features)[mSameIndex];
                    }
                    catch (System.IndexOutOfRangeException e)
                    {
                        mCandidateProbabilities[entityIndex] = 0;
                    }
                    if (mDebugOn)
                    {
                        System.Console.Error.WriteLine(this + ".resolve: " + expression.ToText() + " -> " + discourseEntity + " (" + expression.GetGender() + "," + discourseEntity.Gender + ") " + mCandidateProbabilities[entityIndex] + " " + string.Join(",", features)); //SupportClass.CollectionToString(lfeatures));
                    }
                }
                if (mPreferFirstReferent && mCandidateProbabilities[entityIndex] > nonReferentialProbability)
                {
                    entityIndex++; //update for nonRef assignment
                    break;
                }
            }
            mCandidateProbabilities[entityIndex] = nonReferentialProbability;

            // find max
            int maximumCandidateIndex = 0;
            for (int currentCandidate = 1; currentCandidate <= entityIndex; currentCandidate++)
            {
                if (mCandidateProbabilities[currentCandidate] > mCandidateProbabilities[maximumCandidateIndex])
                {
                    maximumCandidateIndex = currentCandidate;
                }
            }
            if (maximumCandidateIndex == entityIndex)
            {
                // no referent
                return null;
            }
            else
            {
                discourseEntity = discourseModel.GetEntity(maximumCandidateIndex);
                return discourseEntity;
            }
        }
        private string GetGenderCompatibilityFeature(Mention.MentionContext entityContext, DiscourseEntity discourseEntity)
		{
            Similarity.GenderEnum entityGender = discourseEntity.Gender;
            if (entityGender == Similarity.GenderEnum.Unknown || entityContext.GetGender() == Similarity.GenderEnum.Unknown)
			{
				return GenderUnknown;
			}
			else if (entityContext.GetGender() == entityGender)
			{
				return GenderCompatible;
			}
			else
			{
				return GenderIncompatible;
			}
		}