예제 #1
0
bool TestListInsertBefore(List *list)
{
    if (!ListEmpty(list)) {
        sprintf(error, "This test requires list to be empty");
        return false;
    }

    int i;
    int k = 5;
    for (i = length-k; i < length; i++)
        ListAppend(list, numbers[i]); // Already tested
    for (i = k - 1; i >= 0; i--)
        ListPrepend(list, numbers[i]); // Already tested

    ListItor itor = ListTail(list);
    for (i = 0; i < k-1; i++)
        itor = ListItorPrev(itor);
    for (i = k; i < length - k; i++)
        if (!ListInsertBefore(itor, numbers[i])) {
            sprintf(error, "ListInsertBefore failed");
            return false;
        }
    if (!VerifyListConsistency(list)) {
        sprintf(error, "List is not consistent with numbers after ListInsertBefore");
        return false;
    }
    return true;
}
void createListNodeWithData(List *nodesList, List *N)
{

    for (ListElem *elem1 = ListFirst(nodesList); elem1 != NULL; elem1 = ListNext(nodesList, elem1))
    {
        /* Get the current node */
        Node_t *node1 = (Node_t *)elem1->obj;

        if (node1->priority != 0)
        {
            /* Insert in the right position inside list N */
            ListElem *elem2 = ListFirst(N);

            while (elem2 != NULL)
            {
                Node_t *node2 = (Node_t *)elem2->obj;

                /* Checking the priority and the node id */
                if ((node1->priority < node2->priority) || \
                    ((node1->priority == node2->priority) && (node1->id > node2->id)))
                {
                    elem2 = ListNext(N, elem2);
                }
                else
                {
                    ListInsertBefore(N, elem1->obj, elem2);
                    break;
                }
            }

            /* If sorted_list is empty or elem1 is smaller than everyone in the sorted list */
            if (elem2 == NULL)
            {
                ListAppend(N, elem1->obj);
            }
        }
    }
}
uint8_t fhssDistributedBlacklistMABFirstBestArmChan(Node_t *parent, Node_t *child, uint64_t asn)
{
    uint8_t freq = 0;

    /* Every epsilon_ts_incr_n time slots we divide increment epsilon_n */
    if ((epsilon_ts_incr_n != 0) && ((asn + 1) % epsilon_ts_incr_n) == 0)
    {
        if (++epsilon_n == epsilon_max_n) {
            epsilon_n = epsilon_init_n;
            PRINTF("Reseting Epsilon to %ld at %lld\n", (long)epsilon_init_n, (long long)asn);
        }
    }

    if ((rand() % epsilon_n) == 0)
    {
        /* We will explore all channels randomly */

        return (fhssDistributedBlacklistMABExplore(parent, asn));
    }
    else
    {
        /* Lets order all channel sorting by average_reward */
        List ordered_channel; memset(&ordered_channel, 0, sizeof(List)); ListInit(&ordered_channel);
        for (uint8_t i = 0; i < NUM_CHANNELS; i++)
        {
            ListElem *elem;
            for (elem = ListFirst(&ordered_channel); elem != NULL; elem = ListNext(&ordered_channel, elem))
            {
                uint8_t channel = (uint8_t)elem->obj;

                if (parent->avg_reward[child->id][i] > parent->avg_reward[child->id][channel])
                {
                    ListInsertBefore(&ordered_channel, (void *)i, elem);
                    break;
                }
            }

            if (elem == NULL)
            {
                ListAppend(&ordered_channel, (void *)i);
            }
        }

        /* Create a blacklist with the first best MAB_FIRST_BEST_ARMS channels */
        uint16_t blacklist = 0;
        uint8_t n_channels = 1;
        for (ListElem *elem = ListFirst(&ordered_channel); elem != NULL; elem = ListNext(&ordered_channel, elem))
        {
            uint8_t channel = (uint8_t)elem->obj;
            blacklist |= (1 << channel);

            /* Check if we already got the MAB_FIRST_BEST_ARMS first best channels */
            if (++n_channels > mab_first_best_arms)
            {
                break;
            }
        }

        for (ListElem *elem = ListFirst(&parent->channels); elem != NULL; elem = ListNext(&parent->channels, elem))
        {
            uint8_t freq_off = (uint8_t)elem->obj;

            freq = fhssOpenwsnChan(freq_off, asn);
            if (blacklist & (1 << freq))
            {
                return (freq);
            }
        }

        return (freq);
    }
    return 0;
}