SymbolTable* SymbolTable::clone(VM& vm)
{
    SymbolTable* result = SymbolTable::create(vm);
    
    result->m_parameterCountIncludingThis = m_parameterCountIncludingThis;
    result->m_usesNonStrictEval = m_usesNonStrictEval;
    result->m_captureStart = m_captureStart;
    result->m_captureEnd = m_captureEnd;
    
    Map::iterator iter = m_map.begin();
    Map::iterator end = m_map.end();
    for (; iter != end; ++iter) {
        result->m_map.add(
            iter->key,
            SymbolTableEntry(iter->value.getIndex(), iter->value.getAttributes()));
    }
    
    if (m_slowArguments) {
        result->m_slowArguments = std::make_unique<SlowArgument[]>(parameterCount());
        for (unsigned i = parameterCount(); i--;)
            result->m_slowArguments[i] = m_slowArguments[i];
    }
    
    return result;
}
Пример #2
0
 ublas::matrix<double> dp2(const ublas::vector<double>& p) const
 {
     ublas::matrix<double> result(parameterCount(), parameterCount());
     result.clear();
     for (typename Data::const_iterator it=data_.begin(); it!=data_.end(); ++it)
     {
         std::complex<double> diffconj = conj(std::complex<double>(f_(it->x, p) - it->y));
         ublas::vector<value_type> dp = f_.dp(it->x,p);
         ublas::matrix<value_type> dp2 = f_.dp2(it->x,p);
         result += 2 * real(diffconj*dp2 + outer_prod(conj(dp),dp));
     }
     return result;
 }
Пример #3
0
SymbolTable* SymbolTable::cloneCapturedNames(VM& vm)
{
    SymbolTable* result = SymbolTable::create(vm);
    
    result->m_parameterCountIncludingThis = m_parameterCountIncludingThis;
    result->m_usesNonStrictEval = m_usesNonStrictEval;
    result->m_captureStart = m_captureStart;
    result->m_captureEnd = m_captureEnd;

    for (auto iter = m_map.begin(), end = m_map.end(); iter != end; ++iter) {
        if (!isCaptured(iter->value.getIndex()))
            continue;
        result->m_map.add(
            iter->key,
            SymbolTableEntry(iter->value.getIndex(), iter->value.getAttributes()));
    }
    
    if (m_slowArguments) {
        result->m_slowArguments = std::make_unique<SlowArgument[]>(parameterCount());
        for (unsigned i = parameterCount(); i--;)
            result->m_slowArguments[i] = m_slowArguments[i];
    }

    if (m_uniqueIDMap && result->m_uniqueIDMap) {

        {
            auto iter = m_uniqueIDMap->begin();
            auto end = m_uniqueIDMap->end();
            for (; iter != end; ++iter)
                result->m_uniqueIDMap->set(iter->key, iter->value);
        }

        {
            auto iter = m_registerToVariableMap->begin();
            auto end = m_registerToVariableMap->end();
            for (; iter != end; ++iter)
                result->m_registerToVariableMap->set(iter->key, iter->value);
        }

        {
            auto iter = m_uniqueTypeSetMap->begin();
            auto end = m_uniqueTypeSetMap->end();
            for (; iter != end; ++iter)
                result->m_uniqueTypeSetMap->set(iter->key, iter->value);
        }
    }

    
    return result;
}
Пример #4
0
factory_method make_factory_method(const types_by_name &known_types, const type &t, const type &f)
{
	assert(!t.is_empty());
	assert(!t.is_qobject());
	assert(!f.is_empty());
	assert(!f.is_qobject());

	auto meta_object = f.meta_object();
	auto method_count = meta_object->methodCount();
	auto factory_methods = std::vector<factory_method>{};

	for (decltype(method_count) i = 0; i < method_count; i++)
	{
		auto method = meta_object->method(i);
		if (method.parameterCount() != 0)
			continue;
		auto return_type = type_by_pointer(known_types, method.typeName());
		if (return_type.is_empty())
			continue;
		auto interfaces = extract_interfaces(return_type);
		if (interfaces.contains(t))
			factory_methods.emplace_back(return_type, method);
	}

	if (factory_methods.size() == 1)
		return factory_methods.front();
	else
		return factory_method{};
}
Пример #5
0
std::string
Polynomial::toString() const
{
	std::ostringstream stream;
	stream << "[Polynomial][" << name() << "][" << equation() << "][" <<
		   parameterCount() << " parameters]";
	return stream.str();
}
Пример #6
0
 ublas::vector<double> dp(const ublas::vector<double>& p) const
 {
     ublas::vector<double> result(parameterCount());
     result.clear();
     for (typename Data::const_iterator it=data_.begin(); it!=data_.end(); ++it)
     {
         std::complex<double> diffconj = conj(std::complex<double>(f_(it->x,p) - it->y));
         result += 2 * real(diffconj*f_.dp(it->x,p));
     }
     return result;
 }