예제 #1
0
/*! Deep first search to build a connective component
 * \param curr_vertex
 *          start vertex for the search
 * \param not_checked_vertices
 *          set of not checked vertices
 * \param curr_conn_comp
 *          connective component that is being built by this search
 * \param graph
 *          sc-addr of graph structure to search connective components
 */
void deep_first_search_for_find_conn_comp(sc_addr curr_vertex, sc_addr not_checked_vertices, sc_addr curr_conn_comp, sc_addr graph)
{
    sc_iterator3 *it3 = sc_iterator3_f_a_f_new(not_checked_vertices,
                                             sc_type_arc_pos_const_perm,
                                             curr_vertex);

    if (sc_iterator3_next(it3) == SC_TRUE)
        sc_memory_element_free(it3->results[1]);

    sc_iterator3_free(it3);

    sc_memory_arc_new(sc_type_arc_pos_const_perm, curr_conn_comp, curr_vertex);

    sc_iterator5 *it5 = sc_iterator5_f_a_a_a_f_new(curr_vertex,
                                                   sc_type_edge_common | sc_type_const,
                                                   sc_type_node | sc_type_const,
                                                   sc_type_arc_pos_const_perm,
                                                   graph);

    while(sc_iterator5_next(it5) == SC_TRUE)
    {
        if (sc_helper_check_arc(not_checked_vertices, it5->results[2],
                                sc_type_arc_pos_const_perm) == SC_TRUE)
            deep_first_search_for_find_conn_comp(it5->results[2], not_checked_vertices, curr_conn_comp, graph);
    }
    sc_iterator5_free(it5);

}
예제 #2
0
void finish_question(sc_addr question)
{
    sc_iterator3 *it = nullptr;
    sc_addr arc;

    it = sc_iterator3_f_a_f_new(keynode_question_initiated, sc_type_arc_pos_const_perm, question);
    while (sc_iterator3_next(it))
        sc_memory_element_free(sc_iterator3_value(it, 1));
    sc_iterator3_free(it);

    arc = sc_memory_arc_new(sc_type_arc_pos_const_perm, keynode_question_finished, question);
    SYSTEM_ELEMENT(arc);
}
예제 #3
0
sc_bool sc_helper_check_arc(sc_memory_context const * ctx, sc_addr beg_el, sc_addr end_el, sc_type arc_type)
{
    sc_iterator3 *it = 0;
    sc_bool res = SC_FALSE;

    it = sc_iterator3_f_a_f_new(ctx, beg_el, arc_type, end_el);
    if (it == null_ptr)
        return SC_FALSE;

    if (sc_iterator3_next(it) == SC_TRUE)
        res = SC_TRUE;

    sc_iterator3_free(it);
    return res;
}
scp_iterator3 *scp_iterator3_new(scp_operand *param1, scp_operand *param2, scp_operand *param3)
{
    sc_uint32 fixed1 = 0;
    sc_uint32 fixed3 = 0;
    sc_uint32 fixed = 0;
    if (param2->param_type == SCP_FIXED)
    {
        print_error("SCP ITERATOR 3 NEW", "Parameter 2 must have ASSIGN modifier");
        return nullptr;
    }
    if (param1->param_type == SCP_FIXED)
    {
        if (SC_FALSE == sc_memory_is_element(param1->addr))
        {
            print_error("SCP ITERATOR 3 NEW", "Parameter 1 has modifier FIXED, but has not value");
            return nullptr;
        }
        fixed1 = 0x1;
    }
    if (param3->param_type == SCP_FIXED)
    {
        if (SC_FALSE == sc_memory_is_element(param3->addr))
        {
            print_error("SCP ITERATOR 3 NEW", "Parameter 3 has modifier FIXED, but has not value");
            return nullptr;
        }
        fixed3 = 0x100;
    }
    fixed = (fixed1 | fixed3);
    switch (fixed)
    {
        case 0x001:
            return (scp_iterator3 *)sc_iterator3_f_a_a_new(param1->addr, param2->element_type, param3->element_type);
        case 0x100:
            return (scp_iterator3 *)sc_iterator3_a_a_f_new(param1->element_type, param2->element_type, param3->addr);
        case 0x101:
            return (scp_iterator3 *)sc_iterator3_f_a_f_new(param1->addr, param2->element_type, param3->addr);
        default:
            print_error("SCP ITERATOR 3 NEW", "Unsupported parameter type combination");
            return nullptr;
    }
    return nullptr;
}
예제 #5
0
scp_result searchSetStr3_f_a_f(sc_memory_context *context, scp_operand *param1, scp_operand *param2, scp_operand *param3, scp_operand *sets)
{
    scp_result res = SCP_RESULT_FALSE;
    if (sets[1].set == SCP_TRUE && sets[1].param_type == SCP_ASSIGN)
    {
        sets[1].addr = sc_memory_node_new(context, sc_type_node | sc_type_const);
    }
    sc_iterator3 *it = sc_iterator3_f_a_f_new(context, param1->addr, param2->element_type, param3->addr);
    while (SC_TRUE == sc_iterator3_next(it))
    {
        res = SCP_RESULT_TRUE;
        param2->addr = sc_iterator3_value(it, 1);
        if (sets[1].set == SCP_TRUE)
        {
            sc_memory_arc_new(context, sc_type_arc_pos_const_perm, sets[1].addr, param2->addr);
        }
    }
    sc_iterator3_free(it);
    return res;
}
예제 #6
0
template<> TIterator3<Addr, sc_type, Addr>::TIterator3(MemoryContext const & context, Addr const & p1, sc_type const & p2, Addr const & p3)
{
    mIterator = sc_iterator3_f_a_f_new(context.getRealContext(), p1.mRealAddr, p2, p3.mRealAddr);
}
예제 #7
0
파일: test.cpp 프로젝트: drax08/sc-machine
void test4()
{
    sc_addr node[10], arc[10][10];
    sc_uint32 i, j;
    sc_iterator3 *it = 0;
    sc_addr addr1, addr2, addr3;

    printf("Create 10 nodes and 100 arcs, that connect nodes each other\n");
    for (i = 0; i < 10; i++)
        node[i] = sc_storage_element_new(sc_type_node);

    for (i = 0; i < 10; i++)
        for (j = 0; j < 10; j++)
            arc[i][j] = sc_storage_arc_new(0, node[i], node[j]);

    print_storage_statistics();
    printf("---\nTest iterator3_f_a_a\n");
    for (i = 0; i < 10; i++)
    {
        it = sc_iterator3_f_a_a_new(node[i], 0, 0);
        g_assert(it != 0);

        printf("Node %d:\n", i);
        while (sc_iterator3_next(it))
        {
            addr1 = sc_iterator3_value(it, 0);
            addr2 = sc_iterator3_value(it, 1);
            addr3 = sc_iterator3_value(it, 2);

            printf("\t%u, %u; %u, %u; %u, %u\n", addr1.seg, addr1.offset, addr2.seg, addr2.offset, addr3.seg, addr3.offset);
        }

        sc_iterator3_free(it);
    }

    printf("---\nTest iterator3_a_a_f\n");
    for (i = 0; i < 10; i++)
    {
        it = sc_iterator3_a_a_f_new(0, 0, node[i]);
        g_assert(it != 0);

        printf("Node %d:\n", i);
        while (sc_iterator3_next(it))
        {
            addr1 = sc_iterator3_value(it, 0);
            addr2 = sc_iterator3_value(it, 1);
            addr3 = sc_iterator3_value(it, 2);

            printf("\t%u, %u; %u, %u; %u, %u\n", addr1.seg, addr1.offset, addr2.seg, addr2.offset, addr3.seg, addr3.offset);
        }

        sc_iterator3_free(it);
    }

    printf("---\nTest iterator3_f_a_f\n");
    for (i = 0; i < 10; i++)
    {
        it = sc_iterator3_f_a_f_new(node[i], 0, node[9 - i]);
        g_assert(it != 0);

        printf("Node %d:\n", i);
        while (sc_iterator3_next(it))
        {
            addr1 = sc_iterator3_value(it, 0);
            addr2 = sc_iterator3_value(it, 1);
            addr3 = sc_iterator3_value(it, 2);

            printf("\t%u, %u; %u, %u; %u, %u\n", addr1.seg, addr1.offset, addr2.seg, addr2.offset, addr3.seg, addr3.offset);
        }

        sc_iterator3_free(it);
    }

    // iterator allocations
    printf("---\nTest iterator allocation(dealocation) speed...\n");

    timer = g_timer_new();

    g_timer_reset(timer);
    g_timer_start(timer);

    for (i = 0; i < iterator_alloc_count; i++)
    {
        it = sc_iterator3_f_a_a_new(node[0], 0, 0);
        sc_iterator3_free(it);
    }

    g_timer_stop(timer);
    printf("Allocated iterators: %d\n", iterator_alloc_count);
    printf("Allocation/deallocation per second: %f\n", iterator_alloc_count / g_timer_elapsed(timer, 0));

    g_timer_destroy(timer);

}
예제 #8
0
sc_iterator5* sc_iterator5_new(sc_iterator5_type type, sc_iterator_param p1, sc_iterator_param p2, sc_iterator_param p3, sc_iterator_param p4, sc_iterator_param p5)
{

    // check params with template
    switch (type)
    {
    case sc_iterator5_f_a_a_a_f:
        if (p1.is_type || !p2.is_type || !p3.is_type || !p4.is_type || p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_a_a_f_a_f:
        if (!p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_f_a_f_a_f:
        if (p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_f_a_f_a_a:
        if (p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || !p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_f_a_a_a_a:
        if (p1.is_type || !p2.is_type || !p3.is_type || !p4.is_type || !p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    case sc_iterator5_a_a_f_a_a:
        if (!p1.is_type || !p2.is_type || p3.is_type || !p4.is_type || !p5.is_type)
            return (sc_iterator5*)nullptr;
        break;
    };

    sc_iterator5 *it = g_new0(sc_iterator5, 1);

    it->params[0] = p1;
    it->params[1] = p2;
    it->params[2] = p3;
    it->params[3] = p4;
    it->params[4] = p5;

    it->type = type;
    it->time_stamp = sc_storage_get_time_stamp();

    // create main cycle iterator
    switch (type)
    {
    case sc_iterator5_f_a_a_a_f:
        it->it_main = sc_iterator3_f_a_a_new(p1.addr ,p2.type, p3.type);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        it->results[4] = p5.addr;
        break;
    case sc_iterator5_a_a_f_a_f:
        it->it_main = sc_iterator3_a_a_f_new(p1.type, p2.type, p3.addr);
        it->it_attr = nullptr;
        it->results[2] = p3.addr;
        it->results[4] = p5.addr;
        break;
    case sc_iterator5_f_a_f_a_f:
        it->it_main = sc_iterator3_f_a_f_new(p1.addr, p2.type, p3.addr);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        it->results[2] = p3.addr;
        it->results[4] = p5.addr;
        break;
    case sc_iterator5_f_a_f_a_a:
        it->it_main = sc_iterator3_f_a_f_new(p1.addr, p2.type, p3.addr);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        it->results[2] = p3.addr;
        break;
    case sc_iterator5_a_a_f_a_a:
        it->it_main = sc_iterator3_a_a_f_new(p1.type,p2.type,p3.addr);
        it->it_attr = nullptr;
        it->results[2] = p3.addr;
        break;
    case sc_iterator5_f_a_a_a_a:
        it->it_main = sc_iterator3_f_a_a_new(p1.addr, p2.type, p3.type);
        it->it_attr = nullptr;
        it->results[0] = p1.addr;
        break;
    };

    sc_iterator_add_used_timestamp(it->time_stamp);

    return it;
}
예제 #9
0
sc_bool system_sys_search_recurse(sc_memory_context *context, sc_addr sc_pattern, sc_type_hash *pattern, sc_addr curr_const_element, sc_addr curr_pattern_element, sc_type_result *inp_result, sc_type_result_vector *out_common_result, int level)
{
    sc_addr addr1, addr2, temp, temp1;
    int out_arc_count = 0;

    sc_type_result_vector common_result;
    sc_type_result_vector del_result;
    sc_type_result inp_result_copy = *inp_result;
    common_result.push_back(inp_result);

    //Pattern arcs list
    sc_addr_vector pattern_arc_set;

    sc_iterator3 *it_pattern_arc = sc_iterator3_f_a_a_new(context, curr_pattern_element, 0, 0);
    if (it_pattern_arc == null_ptr) {return SC_FALSE;}
    while (SC_TRUE == sc_iterator3_next(it_pattern_arc))
    {
        addr2 = sc_iterator3_value(it_pattern_arc, 1);
        if (pattern->find(SC_ADDR_LOCAL_TO_INT(addr2)) != pattern->end())
        {
            out_arc_count++;
            pattern_arc_set.push_back(addr2);
        }
    }
    sc_iterator3_free(it_pattern_arc);

    it_pattern_arc = sc_iterator3_a_a_f_new(context, 0, 0, curr_pattern_element);
    if (it_pattern_arc == null_ptr) {return SC_FALSE;}
    while (SC_TRUE == sc_iterator3_next(it_pattern_arc))
    {
        addr1 = sc_iterator3_value(it_pattern_arc, 0);
        if (SC_ADDR_IS_EQUAL(addr1, sc_pattern)) continue;
        addr2 = sc_iterator3_value(it_pattern_arc, 1);
        if (pattern->find(SC_ADDR_LOCAL_TO_INT(addr2)) != pattern->end())
        {
            pattern_arc_set.push_back(addr2);
        }
    }
    sc_iterator3_free(it_pattern_arc);

    sc_addr pattern_arc;
    sc_addr const_arc;
    sc_addr next_pattern_element;
    sc_addr next_const_element;
    sc_addr next_pattern_element_begin, next_pattern_element_end;
    sc_addr next_const_element_begin, next_const_element_end;
    sc_bool out_arc_flag = SC_TRUE;
    sc_type_result_vector new_common_result;
    sc_type_result_vector next_common_result;
    sc_type_result_vector next_common_result_arc;
    sc_type_result_vector next_common_result_begin;
    sc_type_result_vector next_common_result_end;
    sc_type_result_vector next_common_result_element;

    sc_bool next_pattern_element_is_node = SC_FALSE;
    sc_type next_pattern_element_type;
    sc_type next_pattern_element_begin_type;
    sc_type next_pattern_element_end_type;

    sc_bool pattern_arc_is_const_or_has_value = SC_FALSE;
    sc_bool pattern_is_const_or_has_value = SC_FALSE;
    sc_bool pattern_begin_is_const_or_has_value = SC_FALSE;
    sc_bool pattern_end_is_const_or_has_value = SC_FALSE;

    //Pattern arcs loop
    for (sc_uint i = 0; i < pattern_arc_set.size(); i++)
    {
        pattern_arc = pattern_arc_set[i];
        out_arc_flag = SC_TRUE;

        //!check pattern_arc type
        sc_type pattern_arc_type;
        if (sc_memory_get_element_type(context, pattern_arc, &pattern_arc_type) != SC_RESULT_OK)
            continue;
        if ((sc_type_const & pattern_arc_type) == sc_type_const)
            continue;

        pattern_arc_is_const_or_has_value = SC_FALSE;
        pattern_is_const_or_has_value = SC_FALSE;

        if (out_arc_count > 0)
        {
            if (SC_RESULT_OK != sc_memory_get_arc_end(context, pattern_arc, &next_pattern_element))
                continue;
            out_arc_count--;
        }
        else
        {
            if (SC_RESULT_OK != sc_memory_get_arc_begin(context, pattern_arc, &next_pattern_element))
                continue;
            out_arc_flag = SC_FALSE;
        }

        if (sc_memory_get_element_type(context, next_pattern_element, &next_pattern_element_type) != SC_RESULT_OK) {continue;}
        if ((sc_type_node & next_pattern_element_type) == sc_type_node)
        {
            next_pattern_element_is_node = SC_TRUE;
        }
        else
        {
            next_pattern_element_is_node = SC_FALSE;
            if (SC_RESULT_OK != sc_memory_get_arc_begin(context, next_pattern_element, &next_pattern_element_begin)) {continue;}
            if (SC_RESULT_OK != sc_memory_get_arc_end(context, next_pattern_element, &next_pattern_element_end)) {continue;}
        }

        if (pattern->find(SC_ADDR_LOCAL_TO_INT(next_pattern_element)) == pattern->end())
        {
            continue;
        }
        if (next_pattern_element_is_node == SC_FALSE)
        {
            if (pattern->find(SC_ADDR_LOCAL_TO_INT(next_pattern_element_begin)) == pattern->end())
            {
                continue;
            }
            if (pattern->find(SC_ADDR_LOCAL_TO_INT(next_pattern_element_end)) == pattern->end())
            {
                continue;
            }
        }

        sc_type_result::iterator arc_it = inp_result_copy.find(pattern_arc);
        if (arc_it != inp_result_copy.end())
        {
            const_arc = (*arc_it).second;
            pattern_arc_is_const_or_has_value = SC_TRUE;
            if (out_arc_flag == SC_TRUE)
            {
                if (SC_RESULT_OK != sc_memory_get_arc_end(context, const_arc, &next_const_element))
                    continue;
            }
            else
            {
                if (SC_RESULT_OK != sc_memory_get_arc_begin(context, const_arc, &next_const_element))
                    continue;
            }
        }

        //!check next_pattern_element type
        if ((sc_type_const & next_pattern_element_type) == sc_type_const)
        {
            if (pattern_arc_is_const_or_has_value == SC_TRUE)
            {
                if (!SC_ADDR_IS_EQUAL(next_const_element, next_pattern_element))
                {
                    continue;
                }
            }
            else
            {
                next_const_element = next_pattern_element;
            }
            pattern_is_const_or_has_value = SC_TRUE;
        }
        else
        {
            sc_type_result::iterator it = inp_result_copy.find(next_pattern_element);
            if (it != inp_result_copy.end())
            {
                if (pattern_arc_is_const_or_has_value == SC_TRUE)
                {
                    if (!SC_ADDR_IS_EQUAL(next_const_element, (*it).second))
                    {
                        continue;
                    }
                }
                else
                {
                    next_const_element = (*it).second;
                }
                pattern_is_const_or_has_value = SC_TRUE;
            }
        }

        if (next_pattern_element_is_node == SC_FALSE)
        {
            pattern_begin_is_const_or_has_value = SC_FALSE;
            pattern_end_is_const_or_has_value = SC_FALSE;
            if (sc_memory_get_element_type(context, next_pattern_element_begin, &next_pattern_element_begin_type) != SC_RESULT_OK) {continue;}
            if (sc_memory_get_element_type(context, next_pattern_element_end, &next_pattern_element_end_type) != SC_RESULT_OK) {continue;}

            if (SC_TRUE == pattern_arc_is_const_or_has_value || SC_TRUE == pattern_is_const_or_has_value)
            {
                if (SC_RESULT_OK != sc_memory_get_arc_begin(context, next_const_element, &next_const_element_begin)) {continue;}
                if (SC_RESULT_OK != sc_memory_get_arc_end(context, next_const_element, &next_const_element_end)) {continue;}
            }

            //!check next_pattern_element_begin type
            if ((sc_type_const & next_pattern_element_begin_type) == sc_type_const)
            {
                if (SC_TRUE == pattern_arc_is_const_or_has_value || SC_TRUE == pattern_is_const_or_has_value)
                {
                    if (!SC_ADDR_IS_EQUAL(next_const_element_begin, next_pattern_element_begin))
                    {
                        continue;
                    }
                }
                else
                {
                    next_const_element_begin = next_pattern_element_begin;
                }
                pattern_begin_is_const_or_has_value = SC_TRUE;
            }
            else
            {
                sc_type_result::iterator it = inp_result_copy.find(next_pattern_element_begin);
                if (it != inp_result_copy.end())
                {
                    if (SC_TRUE == pattern_arc_is_const_or_has_value || SC_TRUE == pattern_is_const_or_has_value)
                    {
                        if (!SC_ADDR_IS_EQUAL(next_const_element_begin, (*it).second))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        next_const_element_begin = (*it).second;
                    }
                    pattern_begin_is_const_or_has_value = SC_TRUE;
                }
            }

            //!check next_pattern_element_end type
            if ((sc_type_const & next_pattern_element_end_type) == sc_type_const)
            {
                if (SC_TRUE == pattern_arc_is_const_or_has_value || SC_TRUE == pattern_is_const_or_has_value)
                {
                    if (!SC_ADDR_IS_EQUAL(next_const_element_end, next_pattern_element_end))
                    {
                        continue;
                    }
                }
                else
                {
                    next_const_element_end = next_pattern_element_end;
                }
                pattern_end_is_const_or_has_value = SC_TRUE;
            }
            else
            {
                sc_type_result::iterator it = inp_result_copy.find(next_pattern_element_end);
                if (it != inp_result_copy.end())
                {
                    if (SC_TRUE == pattern_arc_is_const_or_has_value || SC_TRUE == pattern_is_const_or_has_value)
                    {
                        if (!SC_ADDR_IS_EQUAL(next_const_element_end, (*it).second))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        next_const_element_end = (*it).second;
                    }
                    pattern_end_is_const_or_has_value = SC_TRUE;
                }
            }
        }

        //!const arc loop
        sc_addr_vector const_arc_set;

        if (pattern_arc_is_const_or_has_value == SC_FALSE)
        {
            sc_iterator3 *it_const_arc;
            sc_type const_arc_type = ((~sc_type_var & pattern_arc_type) | sc_type_const);
            if (out_arc_flag == SC_TRUE)
            {
                if (pattern_is_const_or_has_value == SC_TRUE)
                {
                    it_const_arc = sc_iterator3_f_a_f_new(context, curr_const_element, const_arc_type, next_const_element);
                }
                else
                {
                    sc_type next_const_element_type = ((~sc_type_var & next_pattern_element_type) | sc_type_const);
                    if ((sc_type_node & next_pattern_element_type) == sc_type_node)
                    {
                        next_const_element_type = next_const_element_type & sc_type_link;
                    }
                    it_const_arc = sc_iterator3_f_a_a_new(context, curr_const_element, const_arc_type, next_const_element_type);
                }
            }
            else
            {
                if (pattern_is_const_or_has_value == SC_TRUE)
                {
                    it_const_arc = sc_iterator3_f_a_f_new(context, next_const_element, const_arc_type, curr_const_element);
                }
                else
                {
                    sc_type next_const_element_type = ((~sc_type_var & next_pattern_element_type) | sc_type_const);
                    if ((sc_type_node & next_pattern_element_type) == sc_type_node)
                    {
                        next_const_element_type = next_const_element_type & sc_type_link;
                    }
                    it_const_arc = sc_iterator3_a_a_f_new(context, next_const_element_type, const_arc_type, curr_const_element);
                }
            }
            while (SC_TRUE == sc_iterator3_next(it_const_arc))
            {
                if (out_arc_flag == SC_FALSE)
                {
                    addr1 = sc_iterator3_value(it_const_arc, 0);
                    if (SC_ADDR_IS_EQUAL(addr1, sc_pattern))
                        continue;
                }
                addr2 = sc_iterator3_value(it_const_arc, 1);
                const_arc_set.push_back(addr2);
            }
            sc_iterator3_free(it_const_arc);
        }
        else
        {
            const_arc_set.push_back(const_arc);
        }

        for (sc_uint j = 0; j < const_arc_set.size(); j++)
        {
            const_arc = const_arc_set[j];

            if (pattern_arc_is_const_or_has_value == SC_FALSE)
            {
                if (out_arc_flag == SC_TRUE)
                {
                    if (SC_RESULT_OK != sc_memory_get_arc_end(context, const_arc, &next_const_element))
                        continue;
                }
                else
                {
                    if (SC_RESULT_OK != sc_memory_get_arc_begin(context, const_arc, &next_const_element))
                        continue;
                }
            }

            //!TODO Optimize
            if (SC_FALSE == next_pattern_element_is_node)
            {
                sc_addr next_const_element_begin1, next_const_element_end1;
                if (SC_RESULT_OK != sc_memory_get_arc_begin(context, next_const_element, &next_const_element_begin1)) {continue;}
                if (SC_RESULT_OK != sc_memory_get_arc_end(context, next_const_element, &next_const_element_end1)) {continue;}
                if (SC_TRUE == pattern_begin_is_const_or_has_value && SC_ADDR_IS_NOT_EQUAL(next_const_element_begin, next_const_element_begin1))
                {
                    continue;
                }
                if (SC_TRUE == pattern_end_is_const_or_has_value && SC_ADDR_IS_NOT_EQUAL(next_const_element_end, next_const_element_end1))
                {
                    continue;
                }
                next_const_element_begin = next_const_element_begin1;
                next_const_element_end = next_const_element_end1;
            }

            //!Results loop
            for (sc_uint k = 0; k < common_result.size(); k++)
            {
                sc_type_result *result = common_result[k];

                if (pattern_arc_is_const_or_has_value == SC_FALSE)
                {
                    if (SC_TRUE == find_result_pair_for_const(result, const_arc, &temp))
                        continue;


                    if (SC_FALSE == pattern_is_const_or_has_value
                        && SC_TRUE == find_result_pair_for_const(result, next_const_element, &temp1)
                        && SC_ADDR_IS_NOT_EQUAL(temp1, next_pattern_element))
                    {
                        continue;
                    }
                    if (SC_FALSE == next_pattern_element_is_node)
                    {
                        if (SC_FALSE == pattern_begin_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_const(result, next_const_element_begin, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_pattern_element_begin))
                        {
                            continue;
                        }
                        if (SC_FALSE == pattern_end_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_const(result, next_const_element_end, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_pattern_element_end))
                        {
                            continue;
                        }
                    }

                    if (SC_TRUE == find_result_pair_for_var(result, pattern_arc, &temp))
                    {
                        //!Gen new result

                        if (SC_FALSE == check_coherence(context, next_pattern_element, sc_pattern, pattern_arc, !out_arc_flag, result, &inp_result_copy))
                        {
                            continue;
                        }

                        sc_type_result *new_result = new sc_type_result();

                        (*new_result) = (*result);
                        new_common_result.push_back(new_result);
                        result = new_result;
                        result->erase(pattern_arc);
                        if (pattern_is_const_or_has_value == SC_FALSE)
                        {
                            result->erase(next_pattern_element);
                        }
                        if (SC_FALSE == next_pattern_element_is_node)
                        {
                            if (pattern_begin_is_const_or_has_value == SC_FALSE)
                            {
                                result->erase(next_pattern_element_begin);
                            }
                            if (pattern_end_is_const_or_has_value == SC_FALSE)
                            {
                                result->erase(next_pattern_element_end);
                            }
                        }
                    }
                    else
                    {
                        //! TODO Add flags to not add already existing elements
                        if (SC_FALSE == pattern_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_var(result, next_pattern_element, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_const_element))
                        {
                            continue;
                        }
                        if (SC_FALSE == next_pattern_element_is_node)
                        {
                            if (SC_FALSE == pattern_begin_is_const_or_has_value
                                && SC_TRUE == find_result_pair_for_var(result, next_pattern_element_begin, &temp1)
                                && SC_ADDR_IS_NOT_EQUAL(temp1, next_const_element_begin))
                            {
                                continue;
                            }
                            if (SC_FALSE == pattern_end_is_const_or_has_value
                                && SC_TRUE == find_result_pair_for_var(result, next_pattern_element_end, &temp1)
                                && SC_ADDR_IS_NOT_EQUAL(temp1, next_const_element_end))
                            {
                                continue;
                            }
                        }
                    }

                    //!Genering pair for 2nd element
                    result->insert(sc_addr_pair(pattern_arc, const_arc));

                    //!Genering pair for 3rd element
                    if (pattern_is_const_or_has_value == SC_FALSE)
                    {
                        result->insert(sc_addr_pair(next_pattern_element, next_const_element));
                    }

                    //! Generating pair for next pattern element begin and end
                    if (SC_FALSE == next_pattern_element_is_node)
                    {
                        if (pattern_begin_is_const_or_has_value == SC_FALSE)
                        {
                            result->insert(sc_addr_pair(next_pattern_element_begin, next_const_element_begin));
                        }
                        if (pattern_end_is_const_or_has_value == SC_FALSE)
                        {
                            result->insert(sc_addr_pair(next_pattern_element_end, next_const_element_end));
                        }
                    }
                }
                else
                {
                    if (SC_TRUE == find_result_pair_for_const(result, const_arc, &temp1)
                        && SC_ADDR_IS_NOT_EQUAL(temp1, pattern_arc))
                    {
                        continue;
                    }
                    if (SC_TRUE == find_result_pair_for_var(result, pattern_arc, &temp1)
                        && SC_ADDR_IS_NOT_EQUAL(temp1, const_arc))
                    {
                        continue;
                    }
                    if (SC_FALSE == pattern_is_const_or_has_value
                        && SC_TRUE == find_result_pair_for_const(result, next_const_element, &temp1)
                        && SC_ADDR_IS_NOT_EQUAL(temp1, next_pattern_element))
                    {
                        continue;
                    }
                    if (SC_FALSE == next_pattern_element_is_node)
                    {
                        if (SC_FALSE == pattern_begin_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_const(result, next_const_element_begin, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_pattern_element_begin))
                        {
                            continue;
                        }
                        if (SC_FALSE == pattern_end_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_const(result, next_const_element_end, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_pattern_element_end))
                        {
                            continue;
                        }
                    }
                    if (SC_FALSE == pattern_is_const_or_has_value
                        && SC_TRUE == find_result_pair_for_var(result, next_pattern_element, &temp1)
                        && SC_ADDR_IS_NOT_EQUAL(temp1, next_const_element))
                    {
                        continue;
                    }
                    if (SC_FALSE == next_pattern_element_is_node)
                    {
                        if (SC_FALSE == pattern_begin_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_var(result, next_pattern_element_begin, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_const_element_begin))
                        {
                            continue;
                        }
                        if (SC_FALSE == pattern_end_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_var(result, next_pattern_element_end, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_const_element_end))
                        {
                            continue;
                        }
                    }
                    //!Genering pair for 3rd element
                    if (pattern_is_const_or_has_value == SC_FALSE)
                    {
                        result->insert(sc_addr_pair(next_pattern_element, next_const_element));
                    }

                    //! Generating pair for next pattern element begin and end
                    if (SC_FALSE == next_pattern_element_is_node)
                    {
                        if (pattern_begin_is_const_or_has_value == SC_FALSE)
                        {
                            result->insert(sc_addr_pair(next_pattern_element_begin, next_const_element_begin));
                        }
                        if (pattern_end_is_const_or_has_value == SC_FALSE)
                        {
                            result->insert(sc_addr_pair(next_pattern_element_end, next_const_element_end));
                        }
                    }
                }

                sc_type_result *arc_result = new sc_type_result();
                (*arc_result) = (*result);
                del_result.push_back(result);

                pattern->erase(SC_ADDR_LOCAL_TO_INT(pattern_arc));
                pattern->erase(SC_ADDR_LOCAL_TO_INT(next_pattern_element));
                if (next_pattern_element_is_node == SC_FALSE)
                {
                    pattern->erase(SC_ADDR_LOCAL_TO_INT(next_pattern_element_begin));
                    pattern->erase(SC_ADDR_LOCAL_TO_INT(next_pattern_element_end));
                }

                system_sys_search_recurse(context, sc_pattern, pattern, const_arc, pattern_arc,
                                          arc_result, &next_common_result_arc, level + 1);

                for (sc_uint kk = 0; kk < next_common_result_arc.size(); kk++)
                {
                    sc_type_result *element_result = next_common_result_arc[kk];
                    system_sys_search_recurse(context, sc_pattern, pattern, next_const_element, next_pattern_element,
                                              element_result, &next_common_result_element, level + 1);

                    if (SC_FALSE == next_pattern_element_is_node)
                    {
                        //! Recurse for begin element
                        for (sc_uint kk_begin = 0; kk_begin < next_common_result_element.size(); kk_begin++)
                        {
                            sc_type_result *begin_result = next_common_result_element[kk_begin];
                            system_sys_search_recurse(context, sc_pattern, pattern, next_const_element_begin, next_pattern_element_begin,
                                                      begin_result, &next_common_result_begin, level + 1);

                            //! Recurse for end element
                            for (sc_uint kk_end = 0; kk_end < next_common_result_begin.size(); kk_end++)
                            {
                                sc_type_result *end_result = next_common_result_begin[kk_end];
                                system_sys_search_recurse(context, sc_pattern, pattern, next_const_element_end, next_pattern_element_end,
                                                          end_result, &next_common_result_end, level + 1);

                                next_common_result.insert(next_common_result.end(),
                                                          next_common_result_end.begin(), next_common_result_end.end());
                                next_common_result_end.clear();
                            }

                            next_common_result_begin.clear();
                        }
                        next_common_result_element.clear();
                    }
                    else
                    {
                        next_common_result.insert(next_common_result.end(),
                                                  next_common_result_element.begin(), next_common_result_element.end());
                        next_common_result_element.clear();
                    }
                }

                pattern->insert(sc_hash_pair(SC_ADDR_LOCAL_TO_INT(pattern_arc), pattern_arc));
                pattern->insert(sc_hash_pair(SC_ADDR_LOCAL_TO_INT(next_pattern_element), next_pattern_element));
                if (next_pattern_element_is_node == SC_FALSE)
                {
                    pattern->insert(sc_hash_pair(SC_ADDR_LOCAL_TO_INT(next_pattern_element_begin), next_pattern_element_begin));
                    pattern->insert(sc_hash_pair(SC_ADDR_LOCAL_TO_INT(next_pattern_element_end), next_pattern_element_end));
                }

                out_common_result->insert(out_common_result->end(), next_common_result.begin(), next_common_result.end());
                new_common_result.insert(new_common_result.end(), next_common_result.begin(), next_common_result.end());
                next_common_result.clear();
                next_common_result_arc.clear();
            }
        }//const loop

        common_result.insert(common_result.begin(), new_common_result.begin(), new_common_result.end());

        new_common_result.clear();
        remove_all_elements(&del_result, &common_result);
        remove_all_elements(&del_result, out_common_result);
        free_result_vector(&del_result);
    }//pattern loop

    out_common_result->insert(out_common_result->end(), common_result.begin(), common_result.end());
    common_result.clear();
    cantorize_result_vector(out_common_result);

    return SC_TRUE;
}
sc_result agent_search_links_of_relation_connected_with_element(const sc_event *event, sc_addr arg)
{
    sc_addr question, answer, param_elem, param_rel;
    sc_iterator3 *it1, *it2, *it3, *it4;
    sc_iterator5 *it5, *it_order;
    sc_type el_type;
    sc_bool sys_off = SC_TRUE;
    sc_bool param_elem_found = SC_FALSE, param_rel_found = SC_FALSE, found = SC_FALSE;

    if (!sc_memory_get_arc_end(arg, &question))
        return SC_RESULT_ERROR_INVALID_PARAMS;

    // check question type
    if (sc_helper_check_arc(keynode_question_search_links_of_relation_connected_with_element, question, sc_type_arc_pos_const_perm) == SC_FALSE)
        return SC_RESULT_ERROR_INVALID_TYPE;

    answer = create_answer_node();

    // get question arguments
    it5 = sc_iterator5_f_a_a_a_a_new(question,
                                     sc_type_arc_pos_const_perm,
                                     0,
                                     sc_type_arc_pos_const_perm,
                                     sc_type_node | sc_type_const);
    while (sc_iterator5_next(it5) == SC_TRUE)
    {
        if (SC_ADDR_IS_EQUAL(sc_iterator5_value(it5, 4), keynode_rrel_1))
        {
            param_elem = sc_iterator5_value(it5, 2);
            param_elem_found = SC_TRUE;
            continue;
        }
        if (SC_ADDR_IS_EQUAL(sc_iterator5_value(it5, 4), keynode_rrel_2))
        {
            param_rel = sc_iterator5_value(it5, 2);
            param_rel_found = SC_TRUE;
            continue;
        }
    }
    sc_iterator5_free(it5);
    if (param_elem_found == SC_FALSE || param_rel_found == SC_FALSE)
    {
        return SC_RESULT_ERROR;
    }

    appendIntoAnswer(answer, param_elem);

    if (IS_SYSTEM_ELEMENT(param_elem) || IS_SYSTEM_ELEMENT(param_rel))
        sys_off = SC_FALSE;

    if (SC_TRUE == sc_helper_check_arc(keynode_quasybinary_relation, param_rel, sc_type_arc_pos_const_perm))
    {
        // Search subclasses in quasybinary relation
        // Iterate input arcs of quasybinary relation
        it5 = sc_iterator5_a_a_f_a_f_new(sc_type_const,
                                         sc_type_const | sc_type_arc_common,
                                         param_elem,
                                         sc_type_arc_pos_const_perm,
                                         param_rel);
        while (sc_iterator5_next(it5) == SC_TRUE)
        {
            if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 0))
                                       || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 1))
                                       || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 3))))
                continue;

            found = SC_TRUE;

            appendIntoAnswer(answer, sc_iterator5_value(it5, 0));
            appendIntoAnswer(answer, sc_iterator5_value(it5, 1));
            appendIntoAnswer(answer, sc_iterator5_value(it5, 3));

            search_arc_components(sc_iterator5_value(it5, 0), answer, sys_off);

            // Iterate subclasses in quasybinary relation
            it1 = sc_iterator3_f_a_a_new(sc_iterator5_value(it5, 0),
                                         sc_type_arc_pos_const_perm,
                                         sc_type_const | sc_type_node);
            while (sc_iterator3_next(it1) == SC_TRUE)
            {
                if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator3_value(it1, 1))
                                           || IS_SYSTEM_ELEMENT(sc_iterator3_value(it1, 2))))
                    continue;

                appendIntoAnswer(answer, sc_iterator3_value(it1, 1));
                appendIntoAnswer(answer, sc_iterator3_value(it1, 2));

                search_arc_components(sc_iterator3_value(it1, 2), answer, sys_off);

                // iterate order relations between elements
                it_order = sc_iterator5_f_a_a_a_a_new(sc_iterator3_value(it1, 2),
                                                      sc_type_arc_common | sc_type_const,
                                                      sc_type_node | sc_type_const,
                                                      sc_type_arc_pos_const_perm,
                                                      sc_type_node | sc_type_const);
                while (sc_iterator5_next(it_order) == SC_TRUE)
                {
                    if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator5_value(it_order, 1)) || IS_SYSTEM_ELEMENT(sc_iterator5_value(it_order, 2))
                                               || IS_SYSTEM_ELEMENT(sc_iterator5_value(it_order, 3)) || IS_SYSTEM_ELEMENT(sc_iterator5_value(it_order, 4))))
                        continue;

                    if (SC_FALSE == sc_helper_check_arc(keynode_order_relation, sc_iterator5_value(it_order, 4), sc_type_arc_pos_const_perm))
                        continue;
                    if (SC_FALSE == sc_helper_check_arc(sc_iterator5_value(it5, 0), sc_iterator5_value(it_order, 2), sc_type_arc_pos_const_perm))
                        continue;

                    appendIntoAnswer(answer, sc_iterator5_value(it_order, 1));
                    appendIntoAnswer(answer, sc_iterator5_value(it_order, 2));
                    appendIntoAnswer(answer, sc_iterator5_value(it_order, 3));
                    appendIntoAnswer(answer, sc_iterator5_value(it_order, 4));
                }
                sc_iterator5_free(it_order);

                // iterate roles of element in link
                it2 = sc_iterator3_a_a_f_new(sc_type_node | sc_type_const,
                                             sc_type_arc_pos_const_perm,
                                             sc_iterator3_value(it1, 1));
                while (sc_iterator3_next(it2) == SC_TRUE)
                {
                    sc_memory_get_element_type(sc_iterator3_value(it2, 0), &el_type);
                    if (!(el_type & sc_type_node_role))
                        continue;

                    if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator3_value(it2, 0))
                                               || IS_SYSTEM_ELEMENT(sc_iterator3_value(it2, 1))))
                        continue;

                    appendIntoAnswer(answer, sc_iterator3_value(it2, 0));
                    appendIntoAnswer(answer, sc_iterator3_value(it2, 1));
                }
                sc_iterator3_free(it2);
            }
            sc_iterator3_free(it1);
        }
        sc_iterator5_free(it5);

        // Iterate input arcs of quasybinary relation
        it1 = sc_iterator3_a_a_f_new(sc_type_const | sc_type_node,
                                     sc_type_arc_pos_const_perm,
                                     param_elem);
        while (sc_iterator3_next(it1) == SC_TRUE)
        {
            if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator3_value(it1, 0))
                                       || IS_SYSTEM_ELEMENT(sc_iterator3_value(it1, 1))))
                continue;

            // search all parents in quasybinary relation
            it5 = sc_iterator5_f_a_a_a_f_new(sc_iterator3_value(it1, 0),
                                             sc_type_arc_common | sc_type_const,
                                             sc_type_node | sc_type_const,
                                             sc_type_arc_pos_const_perm,
                                             param_rel);
            if (sc_iterator5_next(it5) == SC_TRUE)
            {
                if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 1))
                                           || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 2))
                                           || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 3))))
                    continue;

                appendIntoAnswer(answer, sc_iterator5_value(it5, 1));
                appendIntoAnswer(answer, sc_iterator5_value(it5, 2));
                appendIntoAnswer(answer, sc_iterator5_value(it5, 3));

                search_arc_components(sc_iterator5_value(it5, 2), answer, sys_off);

                appendIntoAnswer(answer, sc_iterator3_value(it1, 0));
                appendIntoAnswer(answer, sc_iterator3_value(it1, 1));

                search_arc_components(sc_iterator3_value(it1, 0), answer, sys_off);
            }
            sc_iterator5_free(it5);
        }
        sc_iterator3_free(it1);
    }
    else
    {
        // Iterate output arcs of given relation
        it5 = sc_iterator5_f_a_a_a_f_new(param_elem,
                                         sc_type_const,
                                         sc_type_const,
                                         sc_type_arc_pos_const_perm,
                                         param_rel);
        while (sc_iterator5_next(it5) == SC_TRUE)
        {
            if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 1))
                                       || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 2))
                                       || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 3))))
                continue;

            found = SC_TRUE;

            appendIntoAnswer(answer, sc_iterator5_value(it5, 1));
            appendIntoAnswer(answer, sc_iterator5_value(it5, 2));
            appendIntoAnswer(answer, sc_iterator5_value(it5, 3));

            search_arc_components(sc_iterator5_value(it5, 2), answer, sys_off);
        }
        sc_iterator5_free(it5);

        // Iterate input arcs of given relation
        it5 = sc_iterator5_a_a_f_a_f_new(sc_type_const,
                                         sc_type_const,
                                         param_elem,
                                         sc_type_arc_pos_const_perm,
                                         param_rel);
        while (sc_iterator5_next(it5) == SC_TRUE)
        {
            if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 0))
                                       || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 1))
                                       || IS_SYSTEM_ELEMENT(sc_iterator5_value(it5, 3))))
                continue;

            appendIntoAnswer(answer, sc_iterator5_value(it5, 0));
            appendIntoAnswer(answer, sc_iterator5_value(it5, 1));
            appendIntoAnswer(answer, sc_iterator5_value(it5, 3));

            search_arc_components(sc_iterator5_value(it5, 0), answer, sys_off);
        }
        sc_iterator5_free(it5);

        // Iterate input arcs for input element
        it1 = sc_iterator3_a_a_f_new(sc_type_const,
                                     sc_type_arc_pos_const_perm,
                                     param_elem);
        while (sc_iterator3_next(it1) == SC_TRUE)
        {
            if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator3_value(it1, 0))
                                       || IS_SYSTEM_ELEMENT(sc_iterator3_value(it1, 1))))
                continue;

            // Iterate input arcs for input element
            it2 = sc_iterator3_f_a_f_new(param_rel,
                                         sc_type_arc_pos_const_perm,
                                         sc_iterator3_value(it1, 0));
            if (sc_iterator3_next(it2) == SC_TRUE)
            {
                if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator3_value(it2, 1))))
                    continue;

                appendIntoAnswer(answer, sc_iterator3_value(it2, 1));
                appendIntoAnswer(answer, sc_iterator3_value(it1, 0));

                // Iterate elements of fonnd link of given relation
                it3 = sc_iterator3_f_a_a_new(sc_iterator3_value(it1, 0),
                                             sc_type_arc_pos_const_perm,
                                             sc_type_const);
                while (sc_iterator3_next(it3) == SC_TRUE)
                {
                    if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator3_value(it3, 1))
                                               || IS_SYSTEM_ELEMENT(sc_iterator3_value(it3, 2))))
                        continue;

                    appendIntoAnswer(answer, sc_iterator3_value(it3, 1));
                    appendIntoAnswer(answer, sc_iterator3_value(it3, 2));

                    search_arc_components(sc_iterator3_value(it3, 2), answer, sys_off);

                    // Iterate role relations
                    it4 = sc_iterator3_a_a_f_new(sc_type_const | sc_type_node,
                                                 sc_type_arc_pos_const_perm,
                                                 sc_iterator3_value(it3, 1));
                    while (sc_iterator3_next(it4) == SC_TRUE)
                    {
                        if (sys_off == SC_TRUE && (IS_SYSTEM_ELEMENT(sc_iterator3_value(it4, 0))
                                                   || IS_SYSTEM_ELEMENT(sc_iterator3_value(it4, 1))))
                            continue;

                        appendIntoAnswer(answer, sc_iterator3_value(it4, 0));
                        appendIntoAnswer(answer, sc_iterator3_value(it4, 1));

                        search_arc_components(sc_iterator3_value(it4, 0), answer, sys_off);
                    }
                    sc_iterator3_free(it4);
                }
                sc_iterator3_free(it3);
            }
            sc_iterator3_free(it2);
        }
        sc_iterator3_free(it1);
    }

    if (found == SC_TRUE)
    {
        appendIntoAnswer(answer, param_rel);
    }

    connect_answer_to_question(question, answer);
    finish_question(question);

    return SC_RESULT_OK;
}
예제 #11
0
sc_bool system_sys_search_recurse(sc_addr sc_pattern, sc_type_hash pattern, sc_addr curr_const_element, sc_addr curr_pattern_element, sc_type_result *inp_result, sc_type_result_vector *out_common_result, int element_number)
{
    sc_type input_element_type;
    if (sc_memory_get_element_type(curr_pattern_element, &input_element_type) != SC_RESULT_OK) {return SC_FALSE;}
    if (element_number == 2 && (sc_type_node & input_element_type) != sc_type_node)
    {
        //!Input element is arc
        sc_addr const_element, pattern_element, temp, end_pattern_element, end_const_element;
        sc_type pattern_element_type, end_pattern_element_type;
        sc_memory_get_arc_begin(curr_const_element, &const_element);
        sc_memory_get_arc_begin(curr_pattern_element, &pattern_element);
        sc_memory_get_arc_end(curr_const_element, &end_const_element);
        sc_memory_get_arc_end(curr_pattern_element, &end_pattern_element);

        if (sc_memory_get_element_type(pattern_element, &pattern_element_type) != SC_RESULT_OK) {return SC_TRUE;}
        if ((sc_type_const & pattern_element_type) == sc_type_const)
        {
            if (SC_ADDR_IS_NOT_EQUAL(const_element, pattern_element))
            {
                inp_result->erase(curr_pattern_element);
                return SC_TRUE;
            }
        }
        else if (SC_TRUE == find_result_pair_for_var(inp_result, pattern_element, &temp))
        {
            if (SC_ADDR_IS_NOT_EQUAL(const_element, temp))
            {
                inp_result->erase(curr_pattern_element);
                return SC_TRUE;
            }
        }

        if (sc_memory_get_element_type(end_pattern_element, &end_pattern_element_type) != SC_RESULT_OK) {return SC_TRUE;}
        if ((sc_type_const & end_pattern_element_type) == sc_type_const)
        {
            if (SC_ADDR_IS_NOT_EQUAL(end_const_element, end_pattern_element))
            {
                inp_result->erase(curr_pattern_element);
                return SC_TRUE;
            }
        }
        else if (SC_TRUE == find_result_pair_for_var(inp_result, end_pattern_element, &temp))
        {
            if (SC_ADDR_IS_NOT_EQUAL(end_const_element, temp))
            {
                inp_result->erase(curr_pattern_element);
                return SC_TRUE;
            }
        }
        if (SC_ADDR_IS_NOT_EQUAL(const_element, pattern_element))
        {
            inp_result->insert(sc_addr_pair(pattern_element, const_element));
        }
        pattern.insert(sc_hash_pair(SC_ADDR_LOCAL_TO_INT(curr_pattern_element), curr_pattern_element));
        system_sys_search_recurse(sc_pattern, pattern, const_element, pattern_element, inp_result, out_common_result, 2);
        return SC_TRUE;
    }

    sc_addr addr1, addr2, temp, temp1;
    int out_arc_count = 0;

    sc_type_result_vector common_result;
    sc_type_result_vector del_result;
    sc_type_result inp_result_copy = *inp_result;
    common_result.push_back(inp_result);

    //Pattern arcs list

    sc_addr_vector pattern_arc_set;

    sc_iterator3 *it_pattern_arc = sc_iterator3_f_a_a_new(curr_pattern_element, 0, 0);
    if (it_pattern_arc == nullptr) {return SC_FALSE;}
    while (SC_TRUE == sc_iterator3_next(it_pattern_arc))
    {
        addr2 = sc_iterator3_value(it_pattern_arc, 1);
        if (pattern.find(SC_ADDR_LOCAL_TO_INT(addr2)) != pattern.end())
        {
            out_arc_count++;
            pattern_arc_set.push_back(addr2);
        }
    }
    sc_iterator3_free(it_pattern_arc);

    it_pattern_arc = sc_iterator3_a_a_f_new(0, 0, curr_pattern_element);
    if (it_pattern_arc == nullptr) {return SC_FALSE;}
    while (SC_TRUE == sc_iterator3_next(it_pattern_arc))
    {
        addr1 = sc_iterator3_value(it_pattern_arc, 0);
        if (SC_ADDR_IS_EQUAL(addr1, sc_pattern)) continue;
        addr2 = sc_iterator3_value(it_pattern_arc, 1);
        if (pattern.find(SC_ADDR_LOCAL_TO_INT(addr2)) != pattern.end())
        {
            pattern_arc_set.push_back(addr2);
        }
    }
    sc_iterator3_free(it_pattern_arc);

    sc_addr pattern_arc;
    sc_addr const_arc;
    sc_addr next_pattern_element;
    sc_addr next_const_element;
    sc_bool out_arc_flag = SC_TRUE;
    sc_type_result_vector new_common_result;
    sc_type_result_vector next_common_result;
    sc_type_result_vector next_common_result_arc;
    sc_type_result_vector next_common_result1;

    sc_bool pattern_arc_is_const_or_has_value = SC_FALSE;
    sc_bool pattern_is_const_or_has_value = SC_FALSE;

    //Pattern arcs loop
    for (sc_uint i = 0; i < pattern_arc_set.size(); i++)
    {
        pattern_arc = pattern_arc_set[i];
        out_arc_flag = SC_TRUE;

        //!check pattern_arc type
        sc_type pattern_arc_type;
        if (sc_memory_get_element_type(pattern_arc, &pattern_arc_type) != SC_RESULT_OK)
            continue;
        if ((sc_type_const & pattern_arc_type) == sc_type_const)
            continue;

        pattern_arc_is_const_or_has_value = SC_FALSE;
        pattern_is_const_or_has_value = SC_FALSE;

        if (out_arc_count > 0)
        {
            if (SC_RESULT_OK != sc_memory_get_arc_end(pattern_arc, &next_pattern_element))
                continue;
            out_arc_count--;
        }
        else
        {
            if (SC_RESULT_OK != sc_memory_get_arc_begin(pattern_arc, &next_pattern_element))
                continue;
            out_arc_flag = SC_FALSE;
        }

        if (pattern.find(SC_ADDR_LOCAL_TO_INT(next_pattern_element)) == pattern.end())
        {
            continue;
        }

        sc_type_result::iterator arc_it = inp_result_copy.find(pattern_arc);
        if (arc_it != inp_result_copy.end())
        {
            const_arc = (*arc_it).second;
            pattern_arc_is_const_or_has_value = SC_TRUE;
            if (out_arc_flag == SC_TRUE)
            {
                if (SC_RESULT_OK != sc_memory_get_arc_end(const_arc, &next_const_element))
                    continue;
            }
            else
            {
                if (SC_RESULT_OK != sc_memory_get_arc_begin(const_arc, &next_const_element))
                    continue;
            }
        }

        //!check next_pattern_element type
        sc_type next_pattern_element_type;
        if (sc_memory_get_element_type(next_pattern_element, &next_pattern_element_type) != SC_RESULT_OK) {continue;}
        if ((sc_type_const & next_pattern_element_type) == sc_type_const)
        {
            if (pattern_arc_is_const_or_has_value == SC_TRUE)
            {
                if (!SC_ADDR_IS_EQUAL(next_const_element, next_pattern_element))
                {
                    continue;
                }
            }
            else
            {
                next_const_element = next_pattern_element;
            }
            pattern_is_const_or_has_value = SC_TRUE;
        }
        else
        {
            sc_type_result::iterator it = inp_result_copy.find(next_pattern_element);
            if (it != inp_result_copy.end())
            {
                if (pattern_arc_is_const_or_has_value == SC_TRUE)
                {
                    if (!SC_ADDR_IS_EQUAL(next_const_element, (*it).second))
                    {
                        continue;
                    }
                }
                else
                {
                    next_const_element = (*it).second;
                }
                pattern_is_const_or_has_value = SC_TRUE;
            }
        }

        pattern.erase(SC_ADDR_LOCAL_TO_INT(next_pattern_element));

        //!const arc loop
        sc_addr_vector const_arc_set;

        if (pattern_arc_is_const_or_has_value == SC_FALSE)
        {
            sc_iterator3 *it_const_arc;
            sc_type const_arc_type = ((~sc_type_var & pattern_arc_type) | sc_type_const);
            if (out_arc_flag == SC_TRUE)
            {
                if (pattern_is_const_or_has_value == SC_TRUE)
                {
                    it_const_arc = sc_iterator3_f_a_f_new(curr_const_element, const_arc_type, next_const_element);
                }
                else
                {
                    sc_type next_const_element_type = ((~sc_type_var & next_pattern_element_type) | sc_type_const);
                    it_const_arc = sc_iterator3_f_a_a_new(curr_const_element, const_arc_type, next_const_element_type);
                }
            }
            else
            {
                if (pattern_is_const_or_has_value == SC_TRUE)
                {
                    it_const_arc = sc_iterator3_f_a_f_new(next_const_element, const_arc_type, curr_const_element);
                }
                else
                {
                    sc_type next_const_element_type = ((~sc_type_var & next_pattern_element_type) | sc_type_const);
                    it_const_arc = sc_iterator3_a_a_f_new(next_const_element_type, const_arc_type, curr_const_element);
                }
            }
            while (SC_TRUE == sc_iterator3_next(it_const_arc))
            {
                if (out_arc_flag == SC_FALSE)
                {
                    addr1 = sc_iterator3_value(it_const_arc, 0);
                    if (SC_ADDR_IS_EQUAL(addr1, sc_pattern))
                        continue;
                }
                addr2 = sc_iterator3_value(it_const_arc, 1);
                const_arc_set.push_back(addr2);
            }
            sc_iterator3_free(it_const_arc);
        }
        else
        {
            const_arc_set.push_back(const_arc);
        }

        //printf("ELEMENT %u|%u CONST ARCS COUNT:%d\n", curr_const_element.seg, curr_const_element.offset, const_arc_set.size());

        for (sc_uint j = 0; j < const_arc_set.size(); j++)
        {
            const_arc = const_arc_set[j];

            if (pattern_arc_is_const_or_has_value == SC_FALSE)
            {
                if (out_arc_flag == SC_TRUE)
                {
                    if (SC_RESULT_OK != sc_memory_get_arc_end(const_arc, &next_const_element))
                        continue;
                }
                else
                {
                    if (SC_RESULT_OK != sc_memory_get_arc_begin(const_arc, &next_const_element))
                        continue;
                }
            }

            if (pattern_is_const_or_has_value == SC_FALSE && pattern.find(SC_ADDR_LOCAL_TO_INT(next_const_element)) != pattern.end())
            {
                continue;
            }

            //!Results loop
            for (sc_uint k = 0; k < common_result.size(); k++)
            {
                sc_type_result *result = common_result[k];
                sc_bool gen_arc = SC_FALSE;

                if (pattern_arc_is_const_or_has_value == SC_FALSE)
                {
                    if (SC_TRUE == find_result_pair_for_const(result, const_arc, &temp))
                        continue;


                    if (SC_TRUE == find_result_pair_for_var(result, pattern_arc, &temp))
                    {
                        //!Gen new result
                        if (SC_FALSE == pattern_is_const_or_has_value
                            && SC_TRUE == find_result_pair_for_const(result, next_const_element, &temp1)
                            && SC_ADDR_IS_NOT_EQUAL(temp1, next_pattern_element))
                        {
                            continue;
                        }
                        sc_type_result *new_result = new sc_type_result();
                        //class_count++;
                        (*new_result) = (*result);
                        new_common_result.push_back(new_result);
                        result = new_result;
                        result->erase(pattern_arc);
                        if (pattern_is_const_or_has_value == SC_FALSE)
                        {
                            result->erase(next_pattern_element);
                        }
                    }

                    gen_arc = SC_TRUE;
                }

                //!Genering pair for 3rd element
                if (pattern_is_const_or_has_value == SC_FALSE
                    && SC_FALSE == find_result_pair_for_var(result, next_pattern_element, &temp))
                {
                    //!Genering pair for 2nd element
                    if (gen_arc == SC_TRUE)
                    {
                        result->insert(sc_addr_pair(pattern_arc, const_arc));
                        pattern.erase(SC_ADDR_LOCAL_TO_INT(pattern_arc));
                    }
                    result->insert(sc_addr_pair(next_pattern_element, next_const_element));
                    pattern.erase(SC_ADDR_LOCAL_TO_INT(next_pattern_element));
                }
                else
                {
                    //!Genering pair for 2nd element
                    if (gen_arc == SC_TRUE)
                    {
                        result->insert(sc_addr_pair(pattern_arc, const_arc));
                        pattern.erase(SC_ADDR_LOCAL_TO_INT(pattern_arc));
                    }
                }

                sc_type_result *recurse_result = new sc_type_result();
                (*recurse_result) = (*result);
                del_result.push_back(result);

                system_sys_search_recurse(sc_pattern, pattern, const_arc, pattern_arc,
                                          recurse_result, &next_common_result_arc, 1);

                for (sc_uint kk = 0; kk < next_common_result_arc.size(); kk++)
                {
                    sc_type_result *element_result = next_common_result_arc[kk];
                    system_sys_search_recurse(sc_pattern, pattern, next_const_element, next_pattern_element,
                                              element_result, &next_common_result1, 2);
                    if (!next_common_result1.empty())
                    {
                        next_common_result.insert(next_common_result.end(),
                                                  next_common_result1.begin(), next_common_result1.end());
                        next_common_result1.clear();
                    }
                    else
                    {
                        next_common_result.push_back(element_result);
                    }
                }

                pattern.insert(sc_hash_pair(SC_ADDR_LOCAL_TO_INT(pattern_arc), pattern_arc));
                pattern.insert(sc_hash_pair(SC_ADDR_LOCAL_TO_INT(next_pattern_element), next_pattern_element));

                out_common_result->insert(out_common_result->end(), next_common_result.begin(), next_common_result.end());
                new_common_result.insert(new_common_result.end(), next_common_result.begin(), next_common_result.end());
                cantorize_result_vector(&new_common_result);
                next_common_result.clear();
                next_common_result_arc.clear();
            }
        }//const loop

        common_result.insert(common_result.begin(), new_common_result.begin(), new_common_result.end());

        new_common_result.clear();
        remove_all_elements(&del_result, &common_result);
        remove_all_elements(&del_result, out_common_result);
        free_result_vector(&del_result);
    }//pattern loop

    out_common_result->insert(out_common_result->end(), common_result.begin(), common_result.end());
    common_result.clear();
    cantorize_result_vector(out_common_result);

    return SC_TRUE;
}