示例#1
0
json Parser::FormatPlayers(const std::vector<Player*>& players) const
{
    json data;
    for(auto p : players)
    {
        json player;
        player["name"]             = p->GetName();
        player["greater_Dalmuti"]  = std::count(p->roles.begin(), p->roles.end(), ROLES::GREATER_DALMUTI);
        player["lesser_Dalmuti"]   = std::count(p->roles.begin(), p->roles.end(), ROLES::LESSER_DALMUTI);
        player["merchant"]         = std::count(p->roles.begin(), p->roles.end(), ROLES::MERCHANT);
        player["lesser_Peon"]      = std::count(p->roles.begin(), p->roles.end(), ROLES::LESSER_PEON);
        player["greater_Peon"]     = std::count(p->roles.begin(), p->roles.end(), ROLES::GREATER_PEON);
        player["average_Turntime"] = ConvertDouble(AverageTurnTime(p->turnTimes));
        player["illegal_Moves"]    = p->illegalMoves;
        data.push_back(player);
    }
    return data;
}
示例#2
0
bool Expression::Compute(mycomplex& com)
{
	if(CheckParenthesis(m_strExp) == false)
	{
		m_strError = "括号不匹配";
		return false;
	}
	if(CheckOperatorPos(m_strExp) == false)
	{
		m_strError = "操作符不对应";
		return false;
	}
	if(CheckDotPos(m_strExp) == false)
	{
		m_strError = "小数点没有填写对";
		return false;
	}
	m_strScanDouble = ConvertDouble(m_strExp);
	if(m_strScanDouble == "error")
	{
		m_strError = "数字输入错误";
		return false;
	}
	m_strScanComplex = ConvertComplex(m_strScanDouble);
	if(CheckImageFlag(m_strScanComplex) == false)
	{
		m_strError = "输入复数格式错误";
		return false;
	}
	m_strInfix = ConvertDoubleToComplex(m_strScanComplex);
	m_vecInfix = ConvertStringToInfix(m_strInfix);
	m_vecPostfix = ConvertInfixToPostfix(m_vecInfix);
	string str("");
	com = Compute2(m_vecPostfix, str);
	if(str == "error")
	{
		m_strError = "输入表达式错误";
		return false;
	}
	return true;
}
	//--
	bool DataProperty::Satisfy(OpenBabel::OBBond* pBond, 
								const std::string& refTo, 
								std::vector<Class*>& vecSatisfiedClasses, 
								std::string& refValue)
	{
		//bool bSatisfied = false;
		int iPosition = -1;

		// [rad] if we are default, we automatically satisfy		
		if(!IsDefault())
		{			
			if(!SatisfyCommon(vecSatisfiedClasses, iPosition))
			{
				// [rad] this property does not apply

				refValue = "";
				return(false);
			}
		}

		// [rad] go through possible data types..

		if(!refTo.compare("BOND_ORDER"))
		{
			ConvertInt(pBond->GetBondOrder(), refValue);
		}
		else if(!refTo.compare("BOND_EQUILIBRIUM_LENGTH"))
		{
			ConvertDouble(pBond->GetEquibLength(), refValue);
		}
		else if(!refTo.compare("BOND_LENGTH"))
		{
			ConvertDouble(pBond->GetLength(), refValue);
		}
		else if(!refTo.compare("BOND_IS_AROMATIC"))
		{
			ConvertBool(pBond->IsAromatic(), refValue);
		}
		else if(!refTo.compare("BOND_IS_IN_RING"))
		{
			ConvertBool(pBond->IsInRing(), refValue);
		}
		else if(!refTo.compare("BOND_IS_ROTOR"))
		{
			ConvertBool(pBond->IsRotor(), refValue);
		}
		else if(!refTo.compare("BOND_IS_AMIDE"))
		{
			ConvertBool(pBond->IsAmide(), refValue);
		}
		else if(!refTo.compare("BOND_IS_PRIMARY_AMIDE"))
		{
			ConvertBool(pBond->IsPrimaryAmide(), refValue);
		}
		else if(!refTo.compare("BOND_IS_SECONDARY_AMIDE"))
		{
			ConvertBool(pBond->IsSecondaryAmide(), refValue);
		}
		else if(!refTo.compare("BOND_IS_ESTER"))
		{
			ConvertBool(pBond->IsEster(), refValue);
		}
		else if(!refTo.compare("BOND_IS_CARBONYL"))
		{
			ConvertBool(pBond->IsCarbonyl(), refValue);
		}
		else if(!refTo.compare("BOND_IS_SINGLE_BOND"))
		{
			ConvertBool(pBond->IsSingle(), refValue);
		}
		else if(!refTo.compare("BOND_IS_DOUBLE_BOND"))
		{
			ConvertBool(pBond->IsDouble(), refValue);
		}
		else if(!refTo.compare("BOND_IS_TRIPLE_BOND"))
		{
			ConvertBool(pBond->IsTriple(), refValue);
		}
		else if(!refTo.compare("BOND_IS_CLOSURE_BOND"))
		{
			ConvertBool(pBond->IsClosure(), refValue);
		}
		else if(!refTo.compare("BOND_IS_UP"))
		{
			ConvertBool(pBond->IsUp(), refValue);
		}
		else if(!refTo.compare("BOND_IS_DOWN"))
		{
			ConvertBool(pBond->IsDown(), refValue);
		}
		else if(!refTo.compare("BOND_IS_HASH"))
		{
			ConvertBool(pBond->IsHash(), refValue);
		}
		else if(!refTo.compare("BOND_IS_WEDGE"))
		{
			ConvertBool(pBond->IsWedge(), refValue);
		}
		else
		{
			// [rad] unknown datatype?
			refValue = "";
			return(false);
		}

		return(true);
	}
	//--
	bool DataProperty::Satisfy(OpenBabel::OBAtom* pAtom, 
								const std::string& refTo, 
								std::vector<Class*>& vecSatisfiedClasses, 
								std::string& refValue)
	{
		//bool bSatisfied = false;
		int iPosition = -1;

		// [rad] if we are default, we automatically satisfy		
		if(!IsDefault())
		{			
			if(!SatisfyCommon(vecSatisfiedClasses, iPosition))
			{
				// [rad] this property does not apply

				refValue = "";
				return(false);
			}
		}

		// [rad] go through possible data types..

		if(!refTo.compare("ATOM_ATOMIC_NUMBER"))
		{
			ConvertInt(pAtom->GetAtomicNum(), refValue);
		}
		else if(!refTo.compare("ATOM_FORMAL_CHARGE"))
		{
			ConvertInt(pAtom->GetFormalCharge(), refValue);
		}
		else if(!refTo.compare("ATOM_ISOTOPE"))
		{
			ConvertInt(pAtom->GetIsotope(), refValue);
		}
		else if(!refTo.compare("ATOM_SPIN_MULTIPLICITY"))
		{
			ConvertInt(pAtom->GetSpinMultiplicity(), refValue);
		}
		else if(!refTo.compare("ATOM_ATOMIC_MASS"))
		{
			ConvertDouble(pAtom->GetAtomicMass(), refValue);
		}
		else if(!refTo.compare("ATOM_EXACT_MASS"))
		{
			ConvertDouble(pAtom->GetExactMass(), refValue);
		}
		else if(!refTo.compare("ATOM_INTERNAL_INDEX"))
		{
			ConvertInt(pAtom->GetIdx(), refValue);
		}
		else if(!refTo.compare("ATOM_VALENCE"))
		{
			ConvertInt(pAtom->GetValence(), refValue);
		}
		else if(!refTo.compare("ATOM_HYBRIDIZATION"))
		{
			ConvertInt(pAtom->GetHyb(), refValue);
		}
		else if(!refTo.compare("ATOM_IMPLICIT_VALENCE"))
		{
			ConvertInt(pAtom->GetImplicitValence(), refValue);
		}
		else if(!refTo.compare("ATOM_HEAVY_VALENCE"))
		{
			ConvertInt(pAtom->GetHvyValence(), refValue);
		}
		else if(!refTo.compare("ATOM_HETERO_VALENCE"))
		{
			ConvertInt(pAtom->GetHeteroValence(), refValue);
		}
		else if(!refTo.compare("ATOM_COORDINATE_X"))
		{
			ConvertDouble(pAtom->GetX(), refValue);
		}
		else if(!refTo.compare("ATOM_COORDINATE_Y"))
		{
			ConvertDouble(pAtom->GetY(), refValue);
		}
		else if(!refTo.compare("ATOM_COORDINATE_Z"))
		{
			ConvertDouble(pAtom->GetZ(), refValue);
		}
		else if(!refTo.compare("ATOM_PARTIAL_CHARGE"))
		{
			ConvertDouble(pAtom->GetPartialCharge(), refValue);
		}
		else if(!refTo.compare("ATOM_FREE_OXYGEN_COUNT"))
		{
			ConvertInt(pAtom->CountFreeOxygens(), refValue);
		}
		else if(!refTo.compare("ATOM_IMPLICIT_HYDROGEN_COUNT"))
		{
			ConvertInt(pAtom->ImplicitHydrogenCount(), refValue);
		}
		else if(!refTo.compare("ATOM_PARTICIPANT_RING_COUNT"))
		{
			ConvertInt(pAtom->MemberOfRingCount(), refValue);
		}
		else if(!refTo.compare("ATOM_AVERAGE_BOND_ANGLE"))
		{
			ConvertDouble(pAtom->AverageBondAngle(), refValue);
		}
		else if(!refTo.compare("ATOM_SMALLEST_BOND_ANGLE"))
		{
			ConvertDouble(pAtom->SmallestBondAngle(), refValue);
		}
		else if(!refTo.compare("ATOM_IS_IN_RING"))
		{
			ConvertBool(pAtom->IsInRing(), refValue);
		}
		else if(!refTo.compare("ATOM_IS_HETERO_ATOM"))
		{
			ConvertBool(pAtom->IsHeteroatom(), refValue);
		}
		else if(!refTo.compare("ATOM_IS_AROMATIC"))
		{
			ConvertBool(pAtom->IsAromatic(), refValue);
		}
		else if(!refTo.compare("ATOM_IS_CHIRAL"))
		{
			ConvertBool(pAtom->IsChiral(), refValue);
		}
		else if(!refTo.compare("ATOM_HAS_SINGLE_BOND"))
		{
			ConvertBool(pAtom->HasSingleBond(), refValue);
		}
		else if(!refTo.compare("ATOM_HAS_DOUBLE_BOND"))
		{
			ConvertBool(pAtom->HasDoubleBond(), refValue);
		}
		else if(!refTo.compare("ATOM_HAS_TRIPLE_BOND"))
		{
			ConvertBool(pAtom->HasBondOfOrder(3), refValue);
		}		
		else if(!refTo.compare("ATOM_HAS_AROMATIC_BOND"))
		{
			ConvertBool(pAtom->HasAromaticBond(), refValue);
		}		
		else if(!refTo.compare("ATOM_SINGLE_BOND_COUNT"))
		{
			ConvertInt(pAtom->CountBondsOfOrder(1), refValue);
		}
		else if(!refTo.compare("ATOM_DOUBLE_BOND_COUNT"))
		{
			ConvertInt(pAtom->CountBondsOfOrder(2), refValue);
		}
		else if(!refTo.compare("ATOM_TRIPLE_BOND_COUNT"))
		{
			ConvertInt(pAtom->CountBondsOfOrder(3), refValue);
		}
		else if(!refTo.compare("ATOM_AROMATIC_BOND_COUNT"))
		{
			ConvertInt(pAtom->CountBondsOfOrder(5), refValue);
		}
		else if(!refTo.compare("ATOM_BOND_COUNT"))
		{
			//return(ConvertInt(pAtom->CountBondsOfOrder(5)));
			OpenBabel::OBBond* pBond;
			std::vector<OpenBabel::OBEdgeBase*>::iterator iter_bond;
			int iCount = 0;

			for(pBond = pAtom->BeginBond(iter_bond); pBond; pBond = pAtom->NextBond(iter_bond))
			{
				iCount++;
			}
	
			ConvertInt(iCount, refValue);
		}
		else
		{
			// [rad] unknown datatype?
			refValue = "";
			return(false);
		}

		return(true);
	}
	//--
	bool DataProperty::Satisfy(OpenBabel::OBMol* pMolecule, 
									const std::string& refTo, 
									std::vector<Class*>& vecSatisfiedClasses, 
									std::string& refValue)
	{
		//bool bSatisfied = false;
		int iPosition = -1;

		// [rad] if we are default, we automatically satisfy		
		if(!IsDefault())
		{			
			if(!SatisfyCommon(vecSatisfiedClasses, iPosition))
			{
				// [rad] this property does not apply

				refValue = "";
				return(false);
			}
		}

		// [rad] go through possible data types..

		if(!refTo.compare("MOLECULE_ATOM_COUNT"))
		{
			ConvertInt(pMolecule->NumAtoms(), refValue);
		}
		else if(!refTo.compare("MOLECULE_BOND_COUNT"))
		{
			ConvertInt(pMolecule->NumBonds(), refValue);
		}
		else if(!refTo.compare("MOLECULE_RING_COUNT"))
		{
			std::vector<OpenBabel::OBRing*>& refSSSR = pMolecule->GetSSSR();
			ConvertInt(refSSSR.size(), refValue);
		}
		else if(!refTo.compare("MOLECULE_HEAVY_HYDROGEN_COUNT"))
		{
			ConvertInt(pMolecule->NumHvyAtoms(), refValue);
		}
		else if(!refTo.compare("MOLECULE_RESIDUE_COUNT"))
		{
			ConvertInt(pMolecule->NumResidues(), refValue);
		}
		else if(!refTo.compare("MOLECULE_ROTOR_COUNT"))
		{
			ConvertInt(pMolecule->NumRotors(), refValue);
		}
		else if(!refTo.compare("MOLECULE_FORMULA"))
		{
			refValue = pMolecule->GetFormula();
		}
		else if(!refTo.compare("MOLECULE_FORMATION_HEAT"))
		{
			ConvertDouble(pMolecule->GetEnergy(), refValue);
		}
		else if(!refTo.compare("MOLECULE_STANDARD_MOLAR_MASS"))
		{
			ConvertDouble(pMolecule->GetMolWt(), refValue);
		}
		else if(!refTo.compare("MOLECULE_EXACT_MASS"))
		{
			ConvertDouble(pMolecule->GetExactMass(), refValue);
		}
		else if(!refTo.compare("MOLECULE_TOTAL_CHARGE"))
		{
			ConvertInt(pMolecule->GetTotalCharge(), refValue);
		}
		else if(!refTo.compare("MOLECULE_SPIN_MULTIPLICITY"))
		{
			ConvertInt(pMolecule->GetTotalSpinMultiplicity(), refValue);
		}
		else if(!refTo.compare("MOLECULE_IS_CHIRAL"))
		{
			ConvertBool(pMolecule->IsChiral(), refValue);
		}
		else if(!refTo.compare("MOLECULE_HAS_AROMATIC_RING"))
		{
			std::vector<OpenBabel::OBRing*>& refSSSR = pMolecule->GetSSSR();
			bool bAromatic = false;
			std::vector<OpenBabel::OBRing*>::iterator iter_rings = refSSSR.begin();
			while(iter_rings != refSSSR.end())
			{
				if((*iter_rings)->IsAromatic())
				{
					bAromatic = true;
					break;
				}

				iter_rings++;
			}

			ConvertBool(bAromatic, refValue);
		}
		else if(!refTo.compare("MOLECULE_HAS_HOMOCYCLIC_RING"))
		{
			std::vector<OpenBabel::OBRing*>& refSSSR = pMolecule->GetSSSR();
			std::vector<OpenBabel::OBRing*>::iterator iter_rings = refSSSR.begin();
			OpenBabel::OBAtom* pAtom;

			bool bHomoCyclic = true;

			while(iter_rings != refSSSR.end())
			{
				std::vector<int>::iterator iter_path = (*iter_rings)->_path.begin();
				while(iter_path != (*iter_rings)->_path.end())
				{
					pAtom = pMolecule->GetAtom((*iter_path));

					if(pAtom)
					{
						if(6 != pAtom->GetAtomicNum())
						{
							bHomoCyclic = false;
							break;
						}
					}

					iter_path++;
				}

				if(!bHomoCyclic) break;

				iter_rings++;
			}
		
			ConvertBool(bHomoCyclic, refValue);
		}
		else if(!refTo.compare("MOLECULE_HAS_HETEROCYCLIC_RING"))
		{
			std::vector<OpenBabel::OBRing*>& refSSSR = pMolecule->GetSSSR();
			std::vector<OpenBabel::OBRing*>::iterator iter_rings = refSSSR.begin();
			OpenBabel::OBAtom* pAtom;

			bool bHeteroCyclic = false;

			while(iter_rings != refSSSR.end())
			{
				std::vector<int>::iterator iter_path = (*iter_rings)->_path.begin();
				while(iter_path != (*iter_rings)->_path.end())
				{
					pAtom = pMolecule->GetAtom((*iter_path));

					if(pAtom)
					{
						if(6 != pAtom->GetAtomicNum())
						{
							bHeteroCyclic = true;
							break;
						}
					}

					iter_path++;
				}

				if(bHeteroCyclic) break;

				iter_rings++;
			}
		
			ConvertBool(bHeteroCyclic, refValue);
		}
		else
		{
			// [rad] maybe it's a descriptor?
			if(SatisfyDescriptor(pMolecule, refTo, refValue))
			{
				return(true);
			}

			// [rad] unknown datatype?
			refValue = "";
			return(false);
		}

		return(true);
	}