/* * set the given vbox-tone with full path (without appending) * the tone is played and after eof, a message is received */ void EndpointAppPBX::set_tone_efi(const char *tone) { struct lcr_msg *message; if (tone == NULL) tone = ""; if (!ea_endpoint->ep_portlist) { PERROR("EPOINT(%d) no portlist\n", ea_endpoint->ep_serial); } message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_VBOX_TONE); SCPY(message->param.tone.dir, (char *)"tones_efi"); SCPY(message->param.tone.name, tone); message_put(message); PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s set tone '%s'\n", ea_endpoint->ep_serial, e_ext.number, tone); }
void QuasiNewton<dcomplex>::symmHerDiag(int NTrial, ostream &output){ /* * Solve S(R)| X(R) > = E(R)| X(R) > (1/ω) * * | X(R) > = | X(R)_g > * | X(R)_u > * * The opposite (1/ω vs ω) is solved because the metric is not positive definite * and can therefore not be solved using DSYGV because of the involved Cholesky * decomposition. * */ char JOBV = 'V'; char UPLO = 'L'; int iType = 1; int TwoNTrial = 2*NTrial; int INFO; ComplexCMMap SSuper(this->SSuperMem, 2*NTrial,2*NTrial); ComplexCMMap SCPY(this->SCPYMem, TwoNTrial,TwoNTrial); SCPY = SSuper; // Copy of original matrix to use for re-orthogonalization // Perform diagonalization of reduced subspace using DSYGV zhegv_(&iType,&JOBV,&UPLO,&TwoNTrial,this->SSuperMem,&TwoNTrial, this->ASuperMem,&TwoNTrial,this->RealEMem,this->WORK,&this->LWORK, this->RWORK,&INFO); if(INFO!=0) CErr("ZHEGV failed to converge in Davison Iterations",output); // Grab the "positive paired" roots (throw away other element of the pair) this->RealEMem += NTrial; RealVecMap ER (this->RealEMem,NTrial); new (&SSuper) ComplexCMMap(this->SSuperMem+2*NTrial*NTrial,2*NTrial,NTrial); // Swap the ordering because we solve for (1/ω) for(auto i = 0 ; i < NTrial; i++) ER(i) = 1.0/ER(i); for(auto i = 0 ; i < NTrial/2; i++){ SSuper.col(i).swap(SSuper.col(NTrial - i - 1)); double tmp = ER(i); ER(i) = ER(NTrial - i - 1); ER(NTrial - i - 1) = tmp; } /* * Re-orthogonalize the eigenvectors with respect to the metric S(R) * because DSYGV orthogonalzies the vectors with respect to E(R) * because we solve the opposite problem. * * Gramm-Schmidt */ this->metBiOrth(SSuper,SCPY); // Separate the eigenvectors into gerade and ungerade parts ComplexCMMap XTSigmaR(this->XTSigmaRMem,NTrial,NTrial); ComplexCMMap XTSigmaL(this->XTSigmaLMem,NTrial,NTrial); XTSigmaR = SSuper.block(0, 0,NTrial,NTrial); XTSigmaL = SSuper.block(NTrial,0,NTrial,NTrial); } // symmHerDiag
void QuasiNewton<double>::symmNonHerDiag(int NTrial, ostream &output){ char JOBVL = 'N'; char JOBVR = 'V'; int TwoNTrial = 2*NTrial; int *IPIV = new int[TwoNTrial]; int INFO; RealCMMap SSuper(this->SSuperMem, TwoNTrial,TwoNTrial); RealCMMap ASuper(this->ASuperMem, TwoNTrial,TwoNTrial); RealCMMap SCPY(this->SCPYMem, TwoNTrial,TwoNTrial); RealCMMap NHrProd(this->NHrProdMem,TwoNTrial,TwoNTrial); SCPY = SSuper; // Copy of original matrix to use for re-orthogonalization // Invert the metric (maybe not needed?) dgetrf_(&TwoNTrial,&TwoNTrial,this->SSuperMem,&TwoNTrial,IPIV,&INFO); dgetri_(&TwoNTrial,this->SSuperMem,&TwoNTrial,IPIV,this->WORK,&this->LWORK,&INFO); delete [] IPIV; NHrProd = SSuper * ASuper; //cout << endl << "PROD" << endl << NHrProd << endl; dgeev_(&JOBVL,&JOBVR,&TwoNTrial,NHrProd.data(),&TwoNTrial,this->ERMem,this->EIMem, this->SSuperMem,&TwoNTrial,this->SSuperMem,&TwoNTrial,this->WORK,&this->LWORK, &INFO); // Sort eigensystem using Bubble Sort RealVecMap ER(this->ERMem,TwoNTrial); RealVecMap EI(this->EIMem,TwoNTrial); RealCMMap VR(this->SSuperMem,TwoNTrial,TwoNTrial); // cout << endl << ER << endl; this->eigSrt(VR,ER); // cout << endl << ER << endl; // Grab the "positive paired" roots (throw away other element of the pair) this->ERMem += NTrial; new (&ER ) RealVecMap(this->ERMem,NTrial); new (&SSuper) RealCMMap(this->SSuperMem+2*NTrial*NTrial,2*NTrial,NTrial); /* * Re-orthogonalize the eigenvectors with respect to the metric S(R) * because DSYGV orthogonalzies the vectors with respect to E(R) * because we solve the opposite problem. * * Gramm-Schmidt */ this->metBiOrth(SSuper,SCPY); // Separate the eigenvectors into gerade and ungerade parts RealCMMap XTSigmaR(this->XTSigmaRMem,NTrial,NTrial); RealCMMap XTSigmaL(this->XTSigmaLMem,NTrial,NTrial); XTSigmaR = SSuper.block(0, 0,NTrial,NTrial); XTSigmaL = SSuper.block(NTrial,0,NTrial,NTrial); //cout << endl << "ER" << endl << ER << endl << endl; //cout << endl << "CR" << endl << XTSigmaR << endl << endl; //cout << endl << "CR" << endl << XTSigmaL << endl << endl; // CErr(); }
/* * setup to exactly one endpoint * if it fails, the calling endpoint is released. * if other outgoing endpoints already exists, they are release as well. * note: if this functions fails, it will destroy its own join object! */ int JoinPBX::out_setup(unsigned int epoint_id, int message_type, union parameter *param, char *newnumber, char *newkeypad) { struct join_relation *relation; struct lcr_msg *message; class Endpoint *epoint; PDEBUG(DEBUG_JOIN, "no endpoint found, so we will create an endpoint and send the setup message we have.\n"); /* create a new relation */ if (!(relation=add_relation())) FATAL("No memory for relation.\n"); relation->type = RELATION_TYPE_SETUP; relation->channel_state = 0; /* audio is assumed on a new join */ relation->tx_state = NOTIFY_STATE_ACTIVE; /* new joins always assumed to be active */ relation->rx_state = NOTIFY_STATE_ACTIVE; /* new joins always assumed to be active */ /* create a new endpoint */ epoint = new Endpoint(0, j_serial); if (!epoint) FATAL("No memory for Endpoint instance\n"); epoint->ep_app = new_endpointapp(epoint, 1, EAPP_TYPE_PBX); // outgoing relation->epoint_id = epoint->ep_serial; /* send setup message to new endpoint */ //printf("JOLLY DEBUG: %d\n",join_countrelations(j_serial)); //i if (options.deb & DEBUG_JOIN) // joinpbx_debug(join, "Join::message_epoint"); message = message_create(j_serial, relation->epoint_id, JOIN_TO_EPOINT, message_type); memcpy(&message->param, param, sizeof(union parameter)); if (newnumber) SCPY(message->param.setup.dialinginfo.id, newnumber); else message->param.setup.dialinginfo.id[0] = '\0'; if (newkeypad) SCPY(message->param.setup.dialinginfo.keypad, newkeypad); else message->param.setup.dialinginfo.keypad[0] = '\0'; PDEBUG(DEBUG_JOIN, "setup message sent to ep %d with number='%s' keypad='%s'.\n", relation->epoint_id, message->param.setup.dialinginfo.id, message->param.setup.dialinginfo.keypad); message_put(message); return(0); }
/* send play message to all members to play join/release jingle */ void JoinPBX::play_jingle(int in) { struct join_relation *relation; struct lcr_msg *message; relation = j_relation; if (!relation) return; if (!relation->next) return; while(relation) { message = message_create(j_serial, relation->epoint_id, JOIN_TO_EPOINT, MESSAGE_TONE); SCPY(message->param.tone.name, (char *)((in)?"joined":"left")); message_put(message); relation = relation->next; } }
/* * constructor for a new join * the join will have a relation to the calling endpoint */ JoinRemote::JoinRemote(unsigned int serial, char *remote_name, int remote_id) : Join() { union parameter param; SCPY(j_remote_name, remote_name); j_remote_id = remote_id; j_type = JOIN_TYPE_REMOTE; j_remote_ref = new_remote++; PDEBUG(DEBUG_JOIN, "Constructor(new join) ref=%d\n", j_remote_ref); j_epoint_id = serial; /* this is the endpoint, if created by epoint */ if (j_epoint_id) PDEBUG(DEBUG_JOIN, "New remote join connected to endpoint id %lu and application %s (ref=%d)\n", j_epoint_id, remote_name, j_remote_ref); /* send new ref to remote socket */ memset(¶m, 0, sizeof(union parameter)); if (serial) param.newref.direction = 1; /* new ref from lcr */ if (admin_message_from_lcr(j_remote_id, j_remote_ref, MESSAGE_NEWREF, ¶m)<0) FATAL("No socket with remote application '%s' found, this shall not happen. because we already created one.\n", j_remote_name); }