Пример #1
0
void __convBackward2(Tensor* const prevError, Tensor* const W, Tensor* currError){
	int pR = prevError->R;
	int pC = prevError->C;
	int pN = prevError->N;
	int pB = prevError->B;

	int cR = currError->R; int cC = currError->C; int cN = currError->N; int cB = currError->B;

	int wK1 = W->K1;
	int wK2 = W->K2;
	int wNi = W->Ni;
	int wNo = W->No;

	int padR = wK2 - 1;
	int padC = wK1 - 1;

	#define prevErrorData(c,r,n,b) *(prevError->data + c + r*pC + n*pR*pC + b*pR*pC*pB)
	#define WData(c,r,ni,no) *(W->data + c + r*wK1 + ni*wK1*wK2 + no*wK1*wK2*wNi)
	#define currErrorData(ic, ir, cha, img) *(currError->data + ic + ir*cC + cha*cC*cR + img*cC*cR*cN)

	for(int img = 0; img < pB; ++img)
		for(int no = 0; no < wNo; ++no)
			for(int ni = 0; ni < wNi; ++ni)
				for(int ir=0; ir<padR+pR; ++ir)
					for(int ic=0; ic<padC+pC; ++ic){
						real sum = 0.0;
						for(int iir=0; iir<wK2; ++iir)
							for(int iic=0; iic<wK1; ++iic){
								int gr = ir+iir-1;
								int gc = ic+iic-1;
								int lr = gr - padR;
								int lc = gc - padC;
								if(lr >=0 && lr < pR && lc >=0 && lc<pC){
									sum += prevErrorData(lc,lr,ni,img) * WData(iic,iir,ni,no);
								}
							}
						currErrorData(ic, ir, ni, img) += sum;
					}
	
	#undef prevErrorData
	#undef WData
	#undef currErrorData
}
Пример #2
0
DynNewtonianMCCMap::DynNewtonianMCCMap(dynamo::Simulation* tmp, const magnet::xml::Node& XML):
    DynNewtonian(tmp)
{
    _interaction_name = XML.getAttribute("Interaction");

    if (XML.hasNode("Potential"))
    {
        for (magnet::xml::Node map_node = XML.getNode("Potential").findNode("Map");
                map_node.valid(); ++map_node)
        {
            double Wval = map_node.getAttribute("W").as<double>();
            size_t distance = map_node.getAttribute("Distance").as<size_t>();

            detail::CaptureMap map;
            for (magnet::xml::Node entry_node = map_node.findNode("Contact"); entry_node.valid(); ++entry_node)
                map[detail::CaptureMap::key_type(entry_node.getAttribute("ID1").as<size_t>(), entry_node.getAttribute("ID2").as<size_t>())]
                    = entry_node.getAttribute("State").as<size_t>();
            _W.push_back(std::make_pair(map, WData(distance, Wval)));
        }
    }
}