/* Parse netlink message to set options */ static int netem_change(struct Qdisc *sch, struct nlattr *opt) { struct netem_sched_data *q = qdisc_priv(sch); struct nlattr *tb[TCA_NETEM_MAX + 1]; struct tc_netem_qopt *qopt; int ret; if (opt == NULL) return -EINVAL; qopt = nla_data(opt); ret = parse_attr(tb, TCA_NETEM_MAX, opt, netem_policy, sizeof(*qopt)); if (ret < 0) return ret; ret = fifo_set_limit(q->qdisc, qopt->limit); if (ret) { pr_debug("netem: can't set fifo limit\n"); return ret; } q->latency = qopt->latency; q->jitter = qopt->jitter; q->limit = qopt->limit; q->gap = qopt->gap; q->counter = 0; q->loss = qopt->loss; q->duplicate = qopt->duplicate; /* for compatibility with earlier versions. * if gap is set, need to assume 100% probability */ if (q->gap) q->reorder = ~0; if (tb[TCA_NETEM_CORR]) get_correlation(sch, tb[TCA_NETEM_CORR]); if (tb[TCA_NETEM_DELAY_DIST]) { ret = get_dist_table(sch, tb[TCA_NETEM_DELAY_DIST]); if (ret) return ret; } if (tb[TCA_NETEM_REORDER]) get_reorder(sch, tb[TCA_NETEM_REORDER]); if (tb[TCA_NETEM_CORRUPT]) get_corrupt(sch, tb[TCA_NETEM_CORRUPT]); return 0; }
static int netem_change(struct Qdisc *sch, struct rtattr *opt) { struct netem_sched_data *q = qdisc_priv(sch); struct tc_netem_qopt *qopt; int ret; if (opt == NULL || RTA_PAYLOAD(opt) < sizeof(*qopt)) return -EINVAL; qopt = RTA_DATA(opt); ret = set_fifo_limit(q->qdisc, qopt->limit); if (ret) { pr_debug("netem: can't set fifo limit\n"); return ret; } q->latency = qopt->latency; q->jitter = qopt->jitter; q->limit = qopt->limit; q->gap = qopt->gap; q->loss = qopt->loss; q->duplicate = qopt->duplicate; /* Handle nested options after initial queue options. * Should have put all options in nested format but too late now. */ if (RTA_PAYLOAD(opt) > sizeof(*qopt)) { struct rtattr *tb[TCA_NETEM_MAX]; if (rtattr_parse(tb, TCA_NETEM_MAX, RTA_DATA(opt) + sizeof(*qopt), RTA_PAYLOAD(opt) - sizeof(*qopt))) return -EINVAL; if (tb[TCA_NETEM_CORR-1]) { ret = get_correlation(sch, tb[TCA_NETEM_CORR-1]); if (ret) return ret; } if (tb[TCA_NETEM_DELAY_DIST-1]) { ret = get_dist_table(sch, tb[TCA_NETEM_DELAY_DIST-1]); if (ret) return ret; } } return 0; }
void build_mim_subset(double mim[],double data[], int namat [],int nvar,int nsample, int subset [],int size_subset){ //compute mutual information matrix //mim: matrix (stored as vector) in which the mi values will be stored //data: contains all data in a vector; variable-wise appended //nvar: number of variables //nsample: number of samples in dataset //subset: indices of samples to be included in the bootstrapping data //size_subset: number of variables in the bootstrapped dataset double tmp; double *data_x; int *namat_x; namat_x = (int*) R_alloc(nvar*size_subset, sizeof(int)); data_x = (double *) R_alloc(nvar*size_subset, sizeof(double)); for(unsigned int i=0; i< size_subset; ++i){ for(unsigned int j=0; j< nvar; ++j){ data_x[size_subset*j+i]=data[(subset[i])+nsample*j]; namat_x[size_subset*j+i]=namat[(subset[i])+nsample*j]; } } for(unsigned int i=0; i< nvar; ++i){ mim[i*nvar+i]=0; for(unsigned int j=i+1; j< nvar; ++j){ tmp=get_correlation(data_x,namat_x,i*size_subset,j*size_subset,size_subset); tmp=tmp*tmp; if(tmp>0.999999){ tmp=0.999999; } mim[j*nvar+i]= -0.5* log (1-tmp); mim[i*nvar+j]=mim[j*nvar+i]; } } }