inline Tp1 dot_product(const FeatureVector<Tp1, Alloc1>& x, const FeatureVector<Tp2, Alloc2>& y) { typedef FeatureVector<Tp1, Alloc1> feature_vector1_type; typedef FeatureVector<Tp2, Alloc2> feature_vector2_type; if (x.empty() || y.empty()) return Tp1(); // if the same address, we are identical! if (static_cast<const void*>(&x) == static_cast<const void*>(&y)) return details::__inner_product(x.begin(), x.end(), Tp1()); if (x.size() < y.size()) return dot_product(x.begin(), x.end(), y, Tp1()); else return dot_product(x, y.begin(), y.end(), Tp1()); }
inline Tp1 dot_product(const FeatureVector<Tp1, Alloc1>& x, const WeightVector<Tp, Alloc>& w, const FeatureVector<Tp2, Alloc2>& y) { typedef FeatureVector<Tp1, Alloc1> feature_vector1_type; typedef WeightVector<Tp, Alloc> weight_vector_type; typedef FeatureVector<Tp2, Alloc2> feature_vector2_type; if (x.empty() || y.empty()) return Tp1(); if (static_cast<const void*>(&x) == static_cast<const void*>(&y)) return details::__inner_product(x.begin(), x.end(), w, Tp1()); if (x.size() < y.size()) return dot_product(x.begin(), x.end(), w, y, Tp1()); else return dot_product(x, w, y.begin(), y.end(), Tp1()); }
bool CButtonMapXml::Load(void) { TiXmlDocument xmlFile; if (!xmlFile.LoadFile(m_strResourcePath)) { esyslog("Error opening %s: %s", m_strResourcePath.c_str(), xmlFile.ErrorDesc()); return false; } TiXmlElement* pRootElement = xmlFile.RootElement(); if (!pRootElement || pRootElement->NoChildren() || pRootElement->ValueStr() != BUTTONMAP_XML_ROOT) { esyslog("Can't find root <%s> tag", BUTTONMAP_XML_ROOT); return false; } const TiXmlElement* pDevice = pRootElement->FirstChildElement(DEVICES_XML_ELEM_DEVICE); if (!pDevice) { esyslog("Can't find <%s> tag", DEVICES_XML_ELEM_DEVICE); return false; } if (!CDeviceXml::Deserialize(pDevice, m_device)) return false; const TiXmlElement* pController = pDevice->FirstChildElement(BUTTONMAP_XML_ELEM_CONTROLLER); if (!pController) { esyslog("Device \"%s\": can't find <%s> tag", m_device.Name().c_str(), BUTTONMAP_XML_ELEM_CONTROLLER); return false; } // For logging purposes unsigned int totalFeatureCount = 0; while (pController) { const char* id = pController->Attribute(BUTTONMAP_XML_ATTR_CONTROLLER_ID); if (!id) { esyslog("Device \"%s\": <%s> tag has no attribute \"%s\"", m_device.Name().c_str(), BUTTONMAP_XML_ELEM_CONTROLLER, BUTTONMAP_XML_ATTR_CONTROLLER_ID); return false; } FeatureVector features; if (!Deserialize(pController, features)) return false; if (features.empty()) { esyslog("Device \"%s\" has no features for controller %s", m_device.Name().c_str(), id); } else { totalFeatureCount += features.size(); m_buttonMap[id] = std::move(features); } pController = pController->NextSiblingElement(BUTTONMAP_XML_ELEM_CONTROLLER); } dsyslog("Loaded device \"%s\" with %u controller profiles and %u total features", m_device.Name().c_str(), m_buttonMap.size(), totalFeatureCount); return true; }