Exemplo n.º 1
0
    void GlobalsCollector::visit(ast::FunctionDec & e)
    {
        locals.emplace(e.getSymbol());
        DeclaredMacroDef dmd(&e);
        GlobalsCollector gc(dmd);

        for (const auto global : gc.globals)
        {
            if (locals.find(global) == locals.end())
            {
                globals.emplace(global);
            }
        }
    }
Exemplo n.º 2
0
void c_elegans::update(){
    if(has_gone){
        has_gone=false;//prevent more than one update happening without call to rhs
        if(!first_round){
            if(next_comb(abl_neur, num_neur)){
                holder->write_dat();
                char ind_str[20];//won't ever have a 20 digit index
                //handy buffer to overflow for those hacking this.
                sprintf(ind_str, "%d", cur_ind);
                err(std::string("Combinations exhausted in index ") + ind_str,
                        "c_elegans::update","rhs/c_elegans.cpp", FATAL_ERROR);
            }
            auto dat_inds =
                std::shared_ptr<writer>(new writer(true));
            dat_inds->add_data(data::create("Ablations", abl_neur.data(), abl_neur.size()), writer::OTHER);
            holder->add_writer(dat_inds);

        }
        else{
            first_round=false;
        }

        Matrix<double, Dynamic, Dynamic> ag_dense(num_neur, num_neur);
        //insert code to zero it out later

        auto ag_m = ag_full;
        AEchem_trans = AEchem_trans_full;
        auto fncval = [this](int i, int j, double val)->bool{
            for(int kk = 0; kk < (int)this->abl_neur.size(); kk++){
                if((int)this->abl_neur[kk] == i || (int)this->abl_neur[kk] == j){
                    return false;
                }
            }
            return true;
        };
        AEchem_trans.prune(fncval);
        ag_m.prune(fncval);
        ag_dense = ag_m *  Matrix<double, num_neur, num_neur, ColMajor>::Identity();
        dmd(ag_dense);
        auto sumvals = ag_dense.colwise().sum();
        sparse_type temp(num_neur, num_neur);
        //generate the sparse diagonal matrix to build the lapacian
        std::vector<Triplet<double, int> > temp_tr;
        for(int i = 0; i < (int)num_neur; i++){
            temp_tr.push_back(Triplet<double, int>(i, i, sumvals[i]));
        }
        temp.setFromTriplets(temp_tr.begin(), temp_tr.end());
        laplacian = temp - ag_m;
        //initialize the Echem array
        for(size_t i = 0; i < num_neur; i++){
            if(GABAergic[i]){
                Echem[i] = EchemInh;
            }
            else{
                Echem[i] = EchemEx;
            }
        }
        //Initialize the sig array
        for(size_t i = 0; i < num_neur; i++){
            sig[i] = 0.5;
        }

        eqS = sig * (ar/(ar*sig + ad));
        //more initialization of temporary dense matrices
        Matrix<double, Dynamic, Dynamic> ldense(num_neur,num_neur);
        ldense = laplacian*Matrix<double, num_neur, num_neur>::Identity();
        Matrix<double, Dynamic, Dynamic> aedense(num_neur, num_neur);
        aedense= AEchem_trans*Matrix<double, num_neur, num_neur>::Identity();
        Matrix<double, Dynamic, Dynamic> C(num_neur, num_neur);
        //create the C matrix
        C= memG*Matrix<double, num_neur, num_neur>::Identity() + gelec*ldense;
        //initialize matrix to modify diagonal part of C
        Matrix<double, num_neur, 1> tmp =(gchem * aedense * eqS.matrix()); 
        for(size_t i = 0; i < num_neur; i++){
            C(i, i) += tmp(i);
        }
        Matrix<double, num_neur, 1> Ivals;
        Ivals.setZero();
        double amp=2e4;
        Ivals[276]=amp;
        Ivals[278]=amp;
        Matrix<double, num_neur, 1> b;
        //create B vector
        b= gchem*aedense*(eqS * Echem).matrix();
        for(size_t i = 0; i < num_neur; i++){
            b[i] += (memG*memV + Ivals[i]);
        }
        //calculate eqV
        eqV.matrix() = C.inverse()*b;
        vmean = eqV+(1.0/beta) * (1.0/sig - 1).log();
        for(auto val : abl_neur){
            eqV[val] = vmean [val] = eqS[val] = 0;
        };
    }
}