std::vector<long long> q::qList2Dec(K data) throw(std::string) { if (data == K_NIL) { throw std::string("nil decimal list"); } else if (data->t <= 0) { throw std::string("not a decimal list"); } assert(data->n >= 0); std::vector<long long> result(static_cast<std::size_t>(data->n), 0L); switch (data->t) { case KB: { struct Converter { long long operator()(G x) const { return x ? 1 : 0; } }; std::transform(kG(data), kG(data) + data->n, result.begin(), Converter()); break; } case KG: std::copy(kG(data), kG(data) + data->n, result.begin()); break; case KH: std::copy(kH(data), kH(data) + data->n, result.begin()); break; case KI: std::copy(kI(data), kI(data) + data->n, result.begin()); break; case KJ: std::copy(kJ(data), kJ(data) + data->n, result.begin()); break; default: throw std::string("not a decimal list"); } return result; }
int mlput(K x,K y){ int fstype=y->t,fsint=y->i,i=0,funcerr=0; K z; char b[2]={0,0}; mlint64 j={0,0}; //printf("%s:%d,%d\n","mlput",x->t,x->n); switch(x->t){ case -KB: case -KG: case -KC:b[0]=x->g;R MLPutString(ml_lp,b); case -KH:R MLPutInteger16(ml_lp,x->h); case -KI:R MLPutInteger32(ml_lp,x->i); case -KJ:*(J*)&j=x->j;R MLPutInteger64(ml_lp,j); case -KE:R MLPutReal32(ml_lp,x->e); case -KF:R MLPutReal64(ml_lp,x->f); case -KS:R MLPutSymbol(ml_lp,x->s); case KB: case KG: case KC:R MLPutByteString(ml_lp,kG(x),x->n); case KH:R MLPutInteger16List(ml_lp,kH(x),x->n); case KI:R MLPutInteger32List(ml_lp,kI(x),x->n); case KJ:R MLPutInteger64List(ml_lp,(mlint64*)kJ(x),x->n); case KE:R MLPutReal32List(ml_lp,kE(x),x->n); case KF:R MLPutReal64List(ml_lp,kF(x),x->n); case KS:if(!MLPutFunction(ml_lp,"List",x->n)){ R 0; }else{ for(i=0;i<x->n;i++)if(!MLPutSymbol(ml_lp,kS(x)[i]))R 0; } break; case 0: if(0==x->n){ R MLPutFunction(ml_lp, "List",0); }else if((3==x->n)&&(fstype==kK(x)[0]->t)){ z=kK(x)[2]; if(!MLPutFunction(ml_lp,kK(x)[1]->s,z->n)){R 0;}else{ switch(z->t){ case 0:for(i=0;i<z->n;i++)if(!mlput(kK(z)[i],y))R 0;break; case KH:for(i=0;i<z->n;i++)if(!MLPutInteger16(ml_lp,kH(z)[i]))R 0;break; case KI:for(i=0;i<z->n;i++)if(!MLPutInteger32(ml_lp,kI(z)[i]))R 0;break; case KJ:for(i=0;i<z->n;i++){*(J*)&j=kJ(z)[i];if(!MLPutInteger64(ml_lp,j))R 0;}break; case KE:for(i=0;i<z->n;i++)if(!MLPutReal32(ml_lp,kE(z)[i]))R 0;break; case KF:for(i=0;i<z->n;i++)if(!MLPutReal64(ml_lp,kF(z)[i]))R 0;break; case KS:for(i=0;i<z->n;i++)if(!MLPutSymbol(ml_lp,kS(z)[i]))R 0;break; case KC:for(i=0;i<z->n;i++){b[0]=kC(z)[i];if(!MLPutString(ml_lp,b))R 0;}break; default:break; } } }else{ if(!MLPutFunction(ml_lp,"List",x->n)){R 0;}else{for(i=0;i<x->n;i++)if(!mlput(kK(x)[i],y)){MLPutSymbol(ml_lp,"ParaErr");funcerr=1;}if(funcerr)R 0;} } break; default: R 0; } R 1; }
int main(int argc,char*argv[]) { K flip,result,columnNames,columnData; int row,col,nCols,nRows; int handle=khpu("localhost",1234,"user:password"); if(handle<0) exit(1); result = k(handle,"`asc",(K)0); std::string str = "([]a:til 10;b:reverse til 10;c:10#01010101010b;d:`a)"; result = k(handle,str.c_str(),(K)0); if(!result) printf("Network Error\n"),perror("Network"),exit(1); if(result->t==-128) printf("Server Error %s\n",result->s),kclose(handle),exit(1); // kclose(handle); if(result->t!=99&&result->t!=98) { printf("type %d\n",result->t); r0(result); exit(1); } flip = ktd(result); // if keyed table, unkey it. ktd decrements ref count of arg. // table (flip) is column names!list of columns (data) columnNames = kK(flip->k)[0]; columnData = kK(flip->k)[1]; nCols = columnNames->n; nRows = kK(columnData)[0]->n; for(row=0;row<nRows;row++) { if(0==row) { for(col=0;col<nCols;col++) { if(col>0)printf(","); printf("%s",kS(columnNames)[col]); } printf("\n"); } for(col=0;col<nCols;col++) { K obj=kK(columnData)[col]; if(col>0)printf(","); switch(obj->t) { case(1):{printf("%d",kG(obj)[row]);}break; case(4):{printf("%d",kG(obj)[row]);}break; case(5):{printf("%d",kH(obj)[row]);}break; case(6):{printf("%d",kI(obj)[row]);}break; case(7):{printf("%lld",kJ(obj)[row]);}break; case(8):{printf("%f",kE(obj)[row]);}break; case(9):{printf("%f",kF(obj)[row]);}break; case(11):{printf("%s",kS(obj)[row]);}break; default:{printf("unknown type");}break; } } printf("\n"); } r0(flip); return 0; }
//create ,pass and recieve a simple table. int eg7() { K cc,d,e,v,tab; K flip,result,columnNames,columnData; int row,col,nCols,nRows; cc=ktn(KS,2);kS(cc)[0]=ss("pid");kS(cc)[1]=ss("uid"); d=ktn(KS,3);kS(d)[0]=ss("ibm");kS(d)[1]=ss("gte");kS(d)[2]=ss("kvm"); e=ktn(KI,3);kI(e)[0]=1;kI(e)[1]=2;kI(e)[2]=3; v=knk(2,d,e); tab=xT(xD(cc,v)); flip=k(c,"{[x]a:update t:.z.t,y:.z.d from x;.tst.t:a;a}",tab,(K)0); //Turn into a dictionary. flip->k [transpose?] //Display table. [Borrowed from code.kx.com: // https://code.kx.com/trac/attachment/wiki/Cookbook/InterfacingWithC/csv.c ] columnNames=kK(flip->k)[0]; columnData=kK(flip->k)[1]; nCols=columnNames->n; nRows=kK(columnData)[0]->n; for(row=0;row<nRows;row++) { if(0==row) { for(col=0;col<nCols;col++) { if(col>0)printf(","); printf("%s",kS(columnNames)[col]); } printf("\n"); } for(col=0;col<nCols;col++) { K obj=kK(columnData)[col]; if(col>0)printf(","); switch(obj->t) { case(1):{printf("%d",kG(obj)[row]);}break; case(4):{printf("%d",kG(obj)[row]);}break; case(5):{printf("%d",kH(obj)[row]);}break; case(6):{printf("%d",kI(obj)[row]);}break; case(7):{printf("%lld",kJ(obj)[row]);}break; case(8):{printf("%f",kE(obj)[row]);}break; case(9):{printf("%f",kF(obj)[row]);}break; case(11):{printf("%s",kS(obj)[row]);}break; case(19):{printf("%i",kI(obj)[row]);}break; case(14):{printf("%i",kI(obj)[row]);}break; default:{printf("unknown type");}break; } } printf("\n"); } return 1; }
double *getklist(K p) { double *r; r=g_malloc(p->n*sizeof(double)); switch(p->t){ case 1 : case 4 : DO(p->n,r[i]=kG(p)[i]);break; case 5 : DO(p->n,r[i]=kH(p)[i]);break; case 6 : case 13 : case 14 : case 17 : case 18 : DO(p->n,r[i]=kI(p)[i]);break; case 7 : case 16 : DO(p->n,r[i]=kJ(p)[i]);break; case 8 : DO(p->n,r[i]=kE(p)[i]);break; case 9 : case 15 : DO(p->n,r[i]=kF(p)[i]);break; case 10 : DO(p->n,r[i]=kC(p)[i]);break; default : g_free(r);return (double *)kerr("invalid numeric type"); } return r; }
Real DistCircle3Circle3<Real>::GetSquared () { Vector3<Real> kDiff = m_pkCircle1->Center - m_pkCircle0->Center; Real fU0U1 = m_pkCircle0->U.Dot(m_pkCircle1->U); Real fU0V1 = m_pkCircle0->U.Dot(m_pkCircle1->V); Real fV0U1 = m_pkCircle0->V.Dot(m_pkCircle1->U); Real fV0V1 = m_pkCircle0->V.Dot(m_pkCircle1->V); Real fA0 = -kDiff.Dot(m_pkCircle0->U); Real fA1 = -m_pkCircle1->Radius*fU0U1; Real fA2 = -m_pkCircle1->Radius*fU0V1; Real fA3 = kDiff.Dot(m_pkCircle0->V); Real fA4 = m_pkCircle1->Radius*fV0U1; Real fA5 = m_pkCircle1->Radius*fV0V1; Real fB0 = -kDiff.Dot(m_pkCircle1->U); Real fB1 = m_pkCircle0->Radius*fU0U1; Real fB2 = m_pkCircle0->Radius*fV0U1; Real fB3 = kDiff.Dot(m_pkCircle1->V); Real fB4 = -m_pkCircle0->Radius*fU0V1; Real fB5 = -m_pkCircle0->Radius*fV0V1; // compute polynomial p0 = p00+p01*z+p02*z^2 Polynomial1<Real> kP0(2); kP0[0] = fA2*fB1-fA5*fB2; kP0[1] = fA0*fB4-fA3*fB5; kP0[2] = fA5*fB2-fA2*fB1+fA1*fB4-fA4*fB5; // compute polynomial p1 = p10+p11*z Polynomial1<Real> kP1(1); kP1[0] = fA0*fB1-fA3*fB2; kP1[1] = fA1*fB1-fA5*fB5+fA2*fB4-fA4*fB2; // compute polynomial q0 = q00+q01*z+q02*z^2 Polynomial1<Real> kQ0(2); kQ0[0] = fA0*fA0+fA2*fA2+fA3*fA3+fA5*fA5; kQ0[1] = ((Real)2.0)*(fA0*fA1+fA3*fA4); kQ0[2] = fA1*fA1-fA2*fA2+fA4*fA4-fA5*fA5; // compute polynomial q1 = q10+q11*z Polynomial1<Real> kQ1(1); kQ1[0] = ((Real)2.0)*(fA0*fA2+fA3*fA5); kQ1[1] = ((Real)2.0)*(fA1*fA2+fA4*fA5); // compute coefficients of r0 = r00+r02*z^2 Polynomial1<Real> kR0(2); kR0[0] = fB0*fB0; kR0[1] = (Real)0.0; kR0[2] = fB3*fB3-fB0*fB0; // compute polynomial r1 = r11*z; Polynomial1<Real> kR1(1); kR1[0] = (Real)0.0; kR1[1] = ((Real)2.0)*fB0*fB3; // compute polynomial g0 = g00+g01*z+g02*z^2+g03*z^3+g04*z^4 Polynomial1<Real> kG0(4); kG0[0] = kP0[0]*kP0[0] + kP1[0]*kP1[0] - kQ0[0]*kR0[0]; kG0[1] = ((Real)2.0)*(kP0[0]*kP0[1] + kP1[0]*kP1[1]) - kQ0[1]*kR0[0] - kQ1[0]*kR1[1]; kG0[2] = kP0[1]*kP0[1] + ((Real)2.0)*kP0[0]*kP0[2] - kP1[0]*kP1[0] + kP1[1]*kP1[1] - kQ0[2]*kR0[0] - kQ0[0]*kR0[2] - kQ1[1]*kR1[1]; kG0[3] = ((Real)2.0)*(kP0[1]*kP0[2] - kP1[0]*kP1[1]) - kQ0[1]*kR0[2] + kQ1[0]*kR1[1]; kG0[4] = kP0[2]*kP0[2] - kP1[1]*kP1[1] - kQ0[2]*kR0[2] + kQ1[1]*kR1[1]; // compute polynomial g1 = g10+g11*z+g12*z^2+g13*z^3 Polynomial1<Real> kG1(3); kG1[0] = ((Real)2.0)*kP0[0]*kP1[0] - kQ1[0]*kR0[0]; kG1[1] = ((Real)2.0)*(kP0[1]*kP1[0] + kP0[0]*kP1[1]) - kQ1[1]*kR0[0] - kQ0[0]*kR1[1]; kG1[2] = ((Real)2.0)*(kP0[2]*kP1[0] + kP0[1]*kP1[1]) - kQ1[0]*kR0[2] - kQ0[1]*kR1[1]; kG1[3] = ((Real)2.0)*kP0[2]*kP1[1] - kQ1[1]*kR0[2] - kQ0[2]*kR1[1]; // compute polynomial h = sum_{i=0}^8 h_i z^i Polynomial1<Real> kH(8); kH[0] = kG0[0]*kG0[0] - kG1[0]*kG1[0]; kH[1] = ((Real)2.0)*(kG0[0]*kG0[1] - kG1[0]*kG1[1]); kH[2] = kG0[1]*kG0[1] + kG1[0]*kG1[0] - kG1[1]*kG1[1] + ((Real)2.0)*(kG0[0]*kG0[2] - kG1[0]*kG1[2]); kH[3] = ((Real)2.0)*(kG0[1]*kG0[2] + kG0[0]*kG0[3] + kG1[0]*kG1[1] - kG1[1]*kG1[2] - kG1[0]*kG1[3]); kH[4] = kG0[2]*kG0[2] + kG1[1]*kG1[1] - kG1[2]*kG1[2] + ((Real)2.0)*(kG0[1]*kG0[3] + kG0[0]*kG0[4] + kG1[0]*kG1[2] - kG1[1]*kG1[3]); kH[5] = ((Real)2.0)*(kG0[2]*kG0[3] + kG0[1]*kG0[4] + kG1[1]*kG1[2] + kG1[0]*kG1[3] - kG1[2]*kG1[3]); kH[6] = kG0[3]*kG0[3] + kG1[2]*kG1[2] - kG1[3]*kG1[3] + ((Real)2.0)*(kG0[2]*kG0[4] + kG1[1]*kG1[3]); kH[7] = ((Real)2.0)*(kG0[3]*kG0[4] + kG1[2]*kG1[3]); kH[8] = kG0[4]*kG0[4] + kG1[3]*kG1[3]; PolynomialRoots<Real> kPR(Math<Real>::ZERO_TOLERANCE); kPR.FindB(kH,-(Real)1.01,(Real)1.01,6); int iCount = kPR.GetCount(); const Real* afRoot = kPR.GetRoots(); Real fMinSqrDist = Math<Real>::MAX_REAL; Real fCs0, fSn0, fCs1, fSn1; for (int i = 0; i < iCount; i++) { fCs1 = afRoot[i]; if (fCs1 < -(Real)1.0) { fCs1 = -(Real)1.0; } else if (fCs1 > (Real)1.0) { fCs1 = (Real)1.0; } // You can also try sn1 = -g0(cs1)/g1(cs1) to avoid the sqrt call, // but beware when g1 is nearly zero. For now I use g0 and g1 to // determine the sign of sn1. fSn1 = Math<Real>::Sqrt(Math<Real>::FAbs((Real)1.0-fCs1*fCs1)); Real fG0 = kG0(fCs1), fG1 = kG1(fCs1), fProd = fG0*fG1; if (fProd > (Real)0.0) { fSn1 = -fSn1; } else if (fProd < (Real)0.0) { // fSn1 already has correct sign } else if (fG1 != (Real)0.0) { // g0 == 0.0 // assert( fSn1 == 0.0 ); } else // g1 == 0.0 { // TO DO: When g1 = 0, there is no constraint on fSn1. // What should be done here? In this case, fCs1 is a afRoot // to the quartic equation g0(fCs1) = 0. Is there some // geometric significance? assert(false); } Real fM00 = fA0 + fA1*fCs1 + fA2*fSn1; Real fM01 = fA3 + fA4*fCs1 + fA5*fSn1; Real fM10 = fB2*fSn1 + fB5*fCs1; Real fM11 = fB1*fSn1 + fB4*fCs1; Real fDet = fM00*fM11 - fM01*fM10; if (Math<Real>::FAbs(fDet) >= Math<Real>::ZERO_TOLERANCE) { Real fInvDet = ((Real)1.0)/fDet; Real fLambda = -(fB0*fSn1 + fB3*fCs1); fCs0 = fLambda*fM00*fInvDet; fSn0 = -fLambda*fM01*fInvDet; // Unitize in case of numerical error. Remove if you feel // confidant of the accuracy for fCs0 and fSn0. Real fTmp = Math<Real>::InvSqrt(fCs0*fCs0+fSn0*fSn0); fCs0 *= fTmp; fSn0 *= fTmp; Vector3<Real> kClosest0 = m_pkCircle0->Center + m_pkCircle0->Radius*(fCs0*m_pkCircle0->U + fSn0*m_pkCircle0->V); Vector3<Real> kClosest1 = m_pkCircle1->Center + m_pkCircle1->Radius*(fCs1*m_pkCircle1->U + fSn1*m_pkCircle1->V); kDiff = kClosest1 - kClosest0; Real fSqrDist = kDiff.SquaredLength(); if (fSqrDist < fMinSqrDist) { fMinSqrDist = fSqrDist; m_kClosestPoint0 = kClosest0; m_kClosestPoint1 = kClosest1; } } else { // TO DO: Handle this case. Is there some geometric // significance? assert(false); } } return fMinSqrDist; }