STHDRImage* recover_hdr(vector<Photo>& photos, CameraResponse& response) { int width,height; STImage *tmpImage = new STImage(photos[0].filename); width = tmpImage->GetWidth(); height = tmpImage->GetHeight(); delete tmpImage; STHDRImage *newImage = new STHDRImage(width,height); vector< vector<STColor3f> > Ls; vector< vector<STColor3f> > ws; vector< vector<STColor3f> > Lw; for (int i=0;i<width;i++) { vector<STColor3f> row; for (int j=0;j<height;j++) { STColor3f zero(0); row.push_back(zero); } Ls.push_back(row); ws.push_back(row); Lw.push_back(row); } for (int k=0;k<photos.size();k++) { //open photo STImage currentImage(photos[k].filename); //perform calculations for (int i=0;i<width;i++) { for (int j=0;j<height;j++) { STColor4ub currentPixel = currentImage.GetPixel(i, j); Ls[i][j].r += (response.Weight(currentPixel).r * (response.GetExposure(currentPixel).r - logf(photos[k].shutter) ) ); Ls[i][j].g += (response.Weight(currentPixel).g * (response.GetExposure(currentPixel).g - logf(photos[k].shutter) ) ); Ls[i][j].b += (response.Weight(currentPixel).b * (response.GetExposure(currentPixel).b - logf(photos[k].shutter) ) ); ws[i][j] += response.Weight(currentPixel); } } for (int i=0;i<width;i++) { for (int j=0;j<height;j++) { Lw[i][j].r = expf(Ls[i][j].r / ws[i][j].r); Lw[i][j].g = expf(Ls[i][j].g / ws[i][j].g); Lw[i][j].b = expf(Ls[i][j].b / ws[i][j].b); newImage->SetPixel(i, j, Lw[i][j]); } } } return newImage; }
static void reinitialize_fft(MF2UI* ui, uint32_t fft_size) { pthread_mutex_lock (&ui->fft_lock); fftx_free(ui->fa); fftx_free(ui->fb); fft_size = MIN(8192, MAX(64, fft_size)); fft_size--; fft_size |= 0x3f; fft_size |= fft_size >> 2; fft_size |= fft_size >> 4; fft_size |= fft_size >> 8; fft_size |= fft_size >> 16; fft_size++; fft_size = MIN(FFT_BINS_MAX, fft_size); ui->fft_bins = fft_size; ui->fa = (struct FFTAnalysis*) malloc(sizeof(struct FFTAnalysis)); ui->fb = (struct FFTAnalysis*) malloc(sizeof(struct FFTAnalysis)); fftx_init(ui->fa, ui->fft_bins * 2, ui->rate, 25); fftx_init(ui->fb, ui->fft_bins * 2, ui->rate, 25); ui->log_rate = (1.0f - 10000.0f / ui->rate) / ((2000.0f / ui->rate) * (2000.0f / ui->rate)); ui->log_base = log10f(1.0f + ui->log_rate); ui->update_grid = true; for (uint32_t i = 0; i < ui->fft_bins; i++) { ui->phase[i] = 0; ui->level[i] = -100; } int band = 0; uint32_t bin = 0; const double f_r = 1000; const double b = ui->fft_bins < 128 ? 6 : 12; const double f2f = pow(2, 1. / (2. * b)); assert(ui->fa->freq_per_bin < f_r); const int b_l = floorf(b * logf(ui->fa->freq_per_bin / f_r) / logf(2)); const int b_u = ceilf(b * logf(.5 * ui->rate / f_r) / logf(2)); ui->freq_bins = b_u - b_l - 1; free(ui->freq_band); ui->freq_band = (uint32_t*) malloc(ui->freq_bins * sizeof(uint32_t)); for (uint32_t i = 0; i < ui->fft_bins; i++) { double f_m = pow(2, (band + b_l) / b) * f_r; double f_2 = f_m * f2f; if (f_2 > i * ui->fa->freq_per_bin) { continue; } while (f_2 < i * ui->fa->freq_per_bin) { band++; f_m = pow(2, (band + b_l) / b) * f_r; f_2 = f_m * f2f; } ui->freq_band[bin++] = i; } ui->freq_band[bin++] = ui->fft_bins; ui->freq_bins = bin; pthread_mutex_unlock (&ui->fft_lock); }
inline float operator()(const float& x) const { return logf(x); }
//-------------------------------------------------------------------------------------- // Handles mouse input //-------------------------------------------------------------------------------------- void CALLBACK OnMouse( bool bLeftButtonDown, bool bRightButtonDown, bool bMiddleButtonDown, bool bSideButton1Down, bool bSideButton2Down, int nMouseWheelDelta, int xPos, int yPos, void* pUserContext ) { if( g_bDrawTerrain ) { if( bRightButtonDown ) { if( g_pInspectionTexture != NULL ) { g_pInspectionTexture = NULL; } else { g_pInspectionTexture = g_pTerrainView->GetInspectionTexture(); } g_InspectionSliceIndex = 0; } return; } static BOOL MouseDragging = FALSE; static XMFLOAT4 DragMouseCursorPos( 0, 0, 0, 0 ); static XMFLOAT4 DragCameraPos( 0, 0, 0, 0 ); // vMousePos is the mouse cursor's location on the Z far and near planes in homogenous space XMVECTOR vMousePosFar = XMVectorSet( ( (FLOAT)xPos - g_HalfClientWidthPixels ) / g_HalfClientWidthPixels, ( (FLOAT)yPos - g_HalfClientHeightPixels ) / -g_HalfClientHeightPixels, 1, 1 ); XMMATRIX matView = XMLoadFloat4x4A( &g_matView ); XMMATRIX matViewProj = matView * XMLoadFloat4x4A( &g_matProjection ); XMVECTOR vDet; XMMATRIX matInvViewProj = XMMatrixInverse( &vDet, matViewProj ); // vMouseWorldPos is the location in world space of the mouse cursor on the near plane XMVECTOR vMouseWorldPosFar = XMVector3TransformCoord( vMousePosFar, matInvViewProj ); XMVECTOR vCameraPosWorld = XMLoadFloat4A( &g_CameraPos ); const XMVECTOR vPlaneNormal = XMVectorSet( 0, 1, 0, 0 ); const XMVECTOR vPlaneDistance = XMVectorZero(); XMVECTOR vCameraToMouseWorldFar = vMouseWorldPosFar - vCameraPosWorld; XMVECTOR t = ( vPlaneDistance - XMVector3Dot( vPlaneNormal, vCameraPosWorld ) ) / XMVector3Dot( vPlaneNormal, vCameraToMouseWorldFar ); XMVECTOR vMouseCursorWorld = vCameraPosWorld + t * vCameraToMouseWorldFar; if( bLeftButtonDown ) { if( !MouseDragging ) { MouseDragging = TRUE; XMStoreFloat4( &DragMouseCursorPos, vMouseCursorWorld ); XMStoreFloat4( &DragCameraPos, vCameraPosWorld ); } else { XMVECTOR vDragPos = XMLoadFloat4( &DragMouseCursorPos ); XMVECTOR vCameraDelta = vMouseCursorWorld - vDragPos; vCameraPosWorld -= vCameraDelta; XMStoreFloat4A( &g_CameraPos, vCameraPosWorld ); UpdateViewMatrix(); XMStoreFloat4( &DragCameraPos, vCameraPosWorld ); } } else if( MouseDragging ) { MouseDragging = FALSE; } if( bRightButtonDown ) { ID3D11TiledTexture2D* pCurrentTexture = g_pInspectionTexture; g_pInspectionTexture = NULL; UINT SceneObjectCount = (UINT)g_SceneObjects.size(); for( UINT i = 0; i < SceneObjectCount; ++i ) { const SceneObject* pSO = g_SceneObjects[i]; FLOAT X = pSO->matWorld._41; FLOAT Y = pSO->matWorld._43; FLOAT DeltaX = fabsf( X - XMVectorGetX( vMouseCursorWorld ) ); FLOAT DeltaY = fabsf( Y - XMVectorGetZ( vMouseCursorWorld ) ); if( DeltaX <= 0.5f && DeltaY <= 0.5f ) { g_pInspectionTexture = pSO->Textures[0].pTexture; break; } } if( g_pInspectionTexture != pCurrentTexture ) { g_InspectionSliceIndex = 0; } } if( nMouseWheelDelta != 0 ) { const FLOAT LogMoveSpeed = 0.05f * ( (FLOAT)nMouseWheelDelta / 120.0f ); FLOAT CameraY = XMVectorGetY( vCameraPosWorld ); float LogYPos = logf( CameraY ); LogYPos -= LogMoveSpeed; vCameraPosWorld = XMVectorSetY( vCameraPosWorld, max( 0.001f, expf( LogYPos ) ) ); XMStoreFloat4A( &g_CameraPos, vCameraPosWorld ); UpdateViewMatrix(); } }
// . make a web page from results stored in msg40 // . send it on TcpSocket "s" when done // . returns false if blocked, true otherwise // . sets g_errno on error bool gotIndexList ( void *state ) { // the state State10 *st = (State10 *) state; // launch more if ( ! launchRequests ( st ) ) return false; /* // get the date list //fprintf(stderr,"termId now=%lli\n",st->m_termId); //fprintf(stderr,"should be=%lli\n",(st->m_termId & TERMID_MASK)); // . now get the indexList for this termId // . date is complemented, so start with bigger one first key128_t startKey = g_datedb.makeStartKey ( st->m_termId ,0xffffffff); key128_t endKey = g_datedb.makeEndKey ( st->m_termId ,0x0); // get the rdb ptr to titledb's rdb //Rdb *rdb = g_indexdb.getRdb(); // -1 means read from all files in Indexdb long numFiles = -1; // make it zero if caller doesn't want to hit the disk if ( ! st->m_useDisk ) numFiles = 0; // get the title rec at or after this docId if ( ! st->m_msg0.getList ( -1 , 0 , 0 , 0 , // max cache age false , // add to cache? RDB_DATEDB , // rdbId of 2 = indexdb st->m_coll , &st->m_list2 , (char *)&startKey , (char *)&endKey , st->m_numRecs * sizeof(key128_t),//recSizes //st->m_useTree , // include tree? //st->m_useCache , // include cache? //false , // add to cache? //0 , // startFileNum //numFiles , // numFiles st , // state gotIndexListWrapper2 , 0 ) ) // niceness return false; // otherwise call gotResults which returns false if blocked, true else // and sets g_errno on error return gotIndexList2 ( (void *) st , NULL ); } void gotIndexListWrapper2 ( void *state , RdbList *list ) { gotIndexList2 ( state , list ); } void addedKeyWrapper ( void *state ) { gotIndexList2 ( state, NULL ); } // . make a web page from results stored in msg40 // . send it on TcpSocket "s" when done // . returns false if blocked, true otherwise // . sets g_errno on error bool gotIndexList2 ( void *state , RdbList *list ) { // the state State10 *st = (State10 *) state; */ // get the socket TcpSocket *s = st->m_socket; // don't allow pages bigger than 128k in cache //char buf [ 64*1024 ]; // a ptr into "buf" //char *p = buf; //char *pend = buf + 64*1024; /* // get termId key_t k = *(key_t *)st->m_list.getStartKey(); long long termId = g_indexdb.getTermId ( k ); // get groupId from termId //unsigned long groupId = k.n1 & g_hostdb.m_groupMask; unsigned long groupId = g_indexdb.getGroupIdFromKey ( &k ); long hostnum = g_hostdb.makeHostId ( groupId ); */ // check box " checked" strings char *ubs = ""; char *uts = ""; char *uds = ""; char *ucs = ""; char *add = ""; char *del = ""; if ( st->m_useDatedb) ubs = " checked"; if ( st->m_useTree ) uts = " checked"; if ( st->m_useDisk ) uds = " checked"; if ( st->m_useCache ) ucs = " checked"; if ( st->m_add ) add = " checked"; if ( st->m_del ) del = " checked"; SafeBuf *pbuf = &st->m_pbuf; g_pages.printAdminTop ( pbuf , st->m_socket , &st->m_r ); // get base, returns NULL and sets g_errno to ENOCOLLREC on error RdbBase *base; if (!(base=getRdbBase((uint8_t)RDB_INDEXDB,st->m_collnum)))return true; // print the standard header for admin pages pbuf->safePrintf ( "<center>\n" "<table cellpadding=2><tr><td colspan=4>" "useDatedb:<input type=checkbox value=1 name=ub%s> " "useTree:<input type=checkbox value=1 name=ut%s> " "useDisk:<input type=checkbox value=1 name=ud%s> " "useCache:<input type=checkbox value=1 name=uc%s> " "ADD:<input type=checkbox value=1 name=add%s> " "DELETE:<input type=checkbox value=1 name=del%s>" "</td></tr><tr><td>" "query:" "</td><td>" "<input type=text name=q value=\"%s\" size=20>" "</td><td>" "collection:" "</td><td>" "<input type=text name=c value=\"%s\" size=10>" "</td></tr><tr><td>" "termId:" "</td><td>" "<input type=text name=t value=%lli size=20>" "</td><td>" "numRecs:" "</td><td>" "<input type=text name=numRecs value=%li size=10> " "</td></tr><tr><td>" "docId:" "</td><td>" "<input type=text name=d value=%lli size=20> " "</td><td>" "score:" "</td><td>" "<input type=text name=score value=%li size=10> " "</td><td>" "<input type=submit value=ok border=0>" "</td></tr>" "<tr><td colspan=2>" "term appears in about %lli docs +/- %li" "</td></tr>" //"<tr><td colspan=2>" //"this indexlist held by host #%li and twins" //"</td></tr>" "</table>" "</form><br><br>" , ubs, uts, uds, ucs, add, del, st->m_query , st->m_coll , st->m_termId , st->m_numRecs , st->m_docId , (long)st->m_score , st->m_termFreq , 2 * (long)GB_INDEXDB_PAGE_SIZE / 6 * base->getNumFiles() ); //hostnum ); if ( g_errno || (st->m_list.isEmpty() ) ) {//&&st->m_list2.isEmpty())){ if (g_errno)pbuf->safePrintf("Error = %s",mstrerror(g_errno)); else pbuf->safePrintf("List is empty"); pbuf->safePrintf("</center>"); // erase g_errno for sending g_errno = 0; // now encapsulate it in html head/tail and send it off bool status = g_httpServer.sendDynamicPage(s , pbuf->getBufStart(), pbuf->length() ); // delete it mdelete ( st , sizeof(State10) , "PageIndexdb" ); delete (st); return status; } pbuf->safePrintf ( "<table cellpadding=1 border=1>" "<tr><td>#</td><td>score</td>" "<td>docId</td><td>domHash</td></tr>"); //if ( searchingEvents // now print the score/docId of indexlist long i = 0; for ( st->m_list.resetListPtr () ; ! st->m_list.isExhausted () ; st->m_list.skipCurrentRecord () ) { // break if buf is low //if ( p + 1024 >= pend ) break; // but set the ip/port to a host that has this titleRec // stored locally! long long docId = st->m_list.getCurrentDocId () ; //unsigned long groupId = getGroupIdFromDocId ( docId ); long shardNum = getShardNumFromDocId ( docId ); // get the first host's hostId in this groupId //Host *h = g_hostdb.getFastestHostInGroup ( groupId ); Host *hosts = g_hostdb.getShard ( shardNum ); // just pick a host now... Host *h = &hosts[0]; // . pick the first host to handle the cached titleRec request // . we assume it has the best time and is up!! TODO: fix! // . use local ip though if it was an internal request // . otherwise, use the external ip //unsigned long ip = h->m_externalIp; unsigned long ip = h->m_ip; // use the NAT mapped port unsigned short port = h->m_externalHttpPort; // log the first docid so we can blaster url: queries // to PageIndexdb and see if they are in indexdb if ( i == 0 ) logf(LOG_INFO,"indexdb: %llu %s",docId,st->m_query); // adjust ip/port if local if ( st->m_isLocal ) { ip = h->m_ip; port = h->m_httpPort; } unsigned long date = 0; if ( st->m_useDatedb ) date = (unsigned long)st->m_list.getCurrentDate(); uint8_t dh = g_titledb.getDomHash8FromDocId ( docId ); char ds[32]; ds[0]=0; if ( st->m_useDatedb ) sprintf (ds,"%lu/",date); pbuf->safePrintf ( "<tr><td>%li.</td>" "<td>%s%i</td>" "<td>" //"<a href=http://%s:%hu/admin/titledb?d=%llu>" "<a href=/admin/titledb?c=%s&d=%llu>" "%llu" //"<td><a href=/cgi/4.cgi?d=%llu>%llu" "</td>" "<td>" "0x%02lx" "</td>" "</tr>\n" , i++, ds, (int)st->m_list.getCurrentScore() , //iptoa(ip) , port , st->m_coll, docId , docId , (long)dh ); } pbuf->safePrintf ( "</table>" ); /* if ( ! st->m_list2.isEmpty() ) p += sprintf ( p , "<br>" "<br>" "<table cellpadding=1 border=1>" "<tr><td>#</td><td>termId</td>" "<td>date</td><td>score</td>" "<td>docId</td></tr>"); // now print the score/docId of datedb list i = 0; for ( st->m_list2.resetListPtr () ; ! st->m_list2.isExhausted () ; st->m_list2.skipCurrentRecord () ) { // break if buf is low if ( p + 1024 >= pend ) break; // but set the ip/port to a host that has this titleRec // stored locally! long long docId = st->m_list2.getCurrentDocId () ; unsigned long groupId = g_titledb.getGroupId ( docId ); // get the first host's hostId in this groupId Host *h = g_hostdb.getFastestHostInGroup ( groupId ); // . pick the first host to handle the cached titleRec request // . we assume it has the best time and is up!! TODO: fix! // . use local ip though if it was an internal request // . otherwise, use the external ip //unsigned long ip = h->m_externalIp; unsigned long ip = h->m_ip; // use the NAT mapped port unsigned short port = h->m_externalHttpPort; // adjust ip/port if local if ( st->m_isLocal ) { ip = h->m_ip; port = h->m_httpPort; } // debug char kb[16]; st->m_list2.getCurrentKey(kb); //log(LOG_INFO,"debug: n1=%016llx n0=%016llx", // *(long long *)(kb+8),*(long long *)(kb+0)); //if ( (unsigned long)st->m_list2.getCurrentDate() == 0 ) // log("STOP"); sprintf ( p , "<tr><td>%li.</td>" "<td>%llu</td>" "<td>%lu</td><td>%i</td>" "<td>" //"<a href=http://%s:%hu/admin/titledb?d=%llu>" "<a href=/admin/titledb?c=%s&d=%llu>" "%llu" //"<td><a href=/cgi/4.cgi?d=%llu>%llu" "</td></tr>\n" , i++, st->m_list2.getTermId16(kb) , (unsigned long)st->m_list2.getCurrentDate() , (int)st->m_list2.getCurrentScore() , //iptoa(ip) , port , st->m_coll, docId , docId ); p += gbstrlen ( p ); } */ if ( ! st->m_list.isEmpty() ) pbuf->safePrintf ( "</table>" ); // print msg if we could fit all into buf //if ( p + 1024 >= pend ) { // sprintf ( p ,"... truncated ... no mem" ); // p += gbstrlen ( p ); //} // print the final tail //p += g_httpServer.printTail ( p , pend - p ); pbuf->safePrintf ( "</center>\n"); // now encapsulate it in html head/tail and send it off bool status = g_httpServer.sendDynamicPage ( s , pbuf->getBufStart() , pbuf->length() ); // delete the state mdelete ( st , sizeof(State10) , "PageIndexdb" ); delete (st) ; return status; }
static float logsc(float param, const float min,const float max,const float rolloff = 19.0f) { return ((expf(param * logf(rolloff+1)) - 1.0f) / (rolloff)) * (max-min) + min; }
void charging_algorithm_step(void) { #if IMX233_SUBTARGET >= 3700 bool is_5v_present = usb_detect() == USB_INSERTED; /* initial state & 5v -> battery transition */ if(!is_5v_present && charge_state != DISCHARGING) { logf("pwrmgmt: * -> discharging"); logf("pwrmgmt: disable charger and 4p2"); charge_state = DISCHARGING; /* 5V has been lost: disable 4p2 power rail */ BF_SET(POWER_CHARGE, PWD_BATTCHRG); #if IMX233_SUBTARGET >= 3780 BF_WR(POWER_DCDC4P2, ENABLE_DCDC(0)); BF_WR(POWER_DCDC4P2, ENABLE_4P2(0)); BF_WR(POWER_5VCTRL, CHARGE_4P2_ILIMIT(0)); BF_SET(POWER_5VCTRL, PWD_CHARGE_4P2); #endif } /* battery -> 5v transition */ else if(is_5v_present && charge_state == DISCHARGING) { logf("pwrmgmt: discharging -> trickle"); logf("pwrmgmt: begin charging 4p2"); #if IMX233_SUBTARGET >= 3780 /* 5V has been detected: prepare 4.2V power rail for activation * WARNING we can reach this situation when starting after Freescale bootloader * or after RoLo in a state where the DCDC is running. In this case, * we must *NOT* disable it or this will shutdown the device. This procedure * is safe: it will never disable the DCDC and will not reduce the charge * limit on the 4P2 rail. */ BF_WR(POWER_DCDC4P2, ENABLE_4P2(1)); BF_SET(POWER_CHARGE, ENABLE_LOAD); BF_WR(POWER_5VCTRL, CHARGE_4P2_ILIMIT(0)); /* start by drawing 0mA */ BF_CLR(POWER_5VCTRL, PWD_CHARGE_4P2);// FIXME: manual error ? BF_WR(POWER_DCDC4P2, ENABLE_DCDC(1)); /* the tick task will take care of slowly ramping up the current in the rail * every 10ms (since it runs at HZ and HZ=100) */ #endif charge_state = TRICKLE; } /* trickle -> charging transition */ else if(charge_state == TRICKLE) { #if IMX233_SUBTARGET >= 3780 /* If 4.2V current limit has not reached 780mA, don't do anything, the * DPC is still running */ /* If we've reached the maximum, take action */ if(BF_RD(POWER_5VCTRL, CHARGE_4P2_ILIMIT) == MAX_4P2_ILIMIT) #endif { logf("pwrmgmt: enable dcdc and charger"); logf("pwrmgmt: trickle -> charging"); #if IMX233_SUBTARGET >= 3780 /* adjust arbitration between 4.2 and battery */ BF_WR(POWER_DCDC4P2, CMPTRIP(0)); /* 85% */ BF_WR(POWER_DCDC4P2, DROPOUT_CTRL(0xe)); /* select greater, 200 mV drop */ #endif /* switch to DCDC */ BF_CLR(POWER_5VCTRL, DCDC_XFER); BF_SET(POWER_5VCTRL, ENABLE_DCDC); /* enable battery charging */ BF_CLR(POWER_CHARGE, PWD_BATTCHRG); charge_state = CHARGING; timeout_charging = current_tick + IMX233_CHARGING_TIMEOUT; } } /* charging -> error transition */ else if(charge_state == CHARGING && TIME_AFTER(current_tick, timeout_charging)) { /* we have charged for a too long time, declare charger broken */ logf("pwrmgmt: charging timeout exceeded!"); logf("pwrmgmt: charging -> error"); /* stop charging, note that we leave the 4.2 rail active so that the DCDC * keep drawing current from the 4.2 only and leave the battery untouched */ BF_SET(POWER_CHARGE, PWD_BATTCHRG); /* goto error state */ charge_state = CHARGE_STATE_ERROR; } /* charging -> topoff transition */ else if(charge_state == CHARGING && !BF_RD(POWER_STS, CHRGSTS)) { logf("pwrmgmt: topping off"); logf("pwrmgmt: charging -> topoff"); charge_state = TOPOFF; timeout_topping_off = current_tick + IMX233_TOPOFF_TIMEOUT; } /* topoff -> disabled transition */ else if(charge_state == TOPOFF && TIME_AFTER(current_tick, timeout_topping_off)) { logf("pwrmgmt: charging finished"); logf("pwrmgmt: topoff -> disabled"); /* stop charging, note that we leave the 4.2 rail active so that the DCDC * keep drawing current from the 4.2 only and leave the battery untouched */ BF_SET(POWER_CHARGE, PWD_BATTCHRG); charge_state = CHARGE_STATE_DISABLED; } #endif }
// . delete a collection // . this uses blocking unlinks, may make non-blocking later bool Collectiondb::deleteRec ( char *coll , bool deleteTurkdb ) { // force on for now deleteTurkdb = true; // no spiders can be out. they may be referencing the CollectionRec // in XmlDoc.cpp... quite likely. if ( g_conf.m_spideringEnabled || g_spiderLoop.m_numSpidersOut > 0 ) { log("admin: Can not delete collection while " "spiders are enabled or active."); return false; } // do not allow this if in repair mode if ( g_repairMode > 0 ) { log("admin: Can not delete collection while in repair mode."); return false; } // ensure it's not NULL if ( ! coll ) { log(LOG_LOGIC,"admin: Collection name to delete is NULL."); return false; } // find the rec for this collection collnum_t collnum = getCollnum ( coll ); // bitch if not found if ( collnum < 0 ) { g_errno = ENOTFOUND; return log(LOG_LOGIC,"admin: Collection \"%s\" not found, " "delete failed.",coll); } CollectionRec *cr = m_recs [ collnum ]; if ( ! cr ) return log("admin: Collection id problem. Delete failed."); // we need a save m_needsSave = true; // nuke it on disk char oldname[1024]; sprintf(oldname, "%scoll.%s.%li/",g_hostdb.m_dir,cr->m_coll, (long)cr->m_collnum); char newname[1024]; sprintf(newname, "%strash/coll.%s.%li.%lli/",g_hostdb.m_dir,cr->m_coll, (long)cr->m_collnum,gettimeofdayInMilliseconds()); //Dir d; d.set ( dname ); // ensure ./trash dir is there char trash[1024]; sprintf(trash, "%strash/",g_hostdb.m_dir); ::mkdir ( trash, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH ) ; // move into that dir ::rename ( oldname , newname ); // debug message logf ( LOG_INFO, "admin: deleted collection \"%s\" (%li).", coll,(long)collnum ); // nuke doleiptable and waintree and waitingtable /* SpiderColl *sc = g_spiderCache.getSpiderColl ( collnum ); sc->m_waitingTree.clear(); sc->m_waitingTable.clear(); sc->m_doleIpTable.clear(); g_spiderLoop.m_lockTable.clear(); g_spiderLoop.m_lockCache.clear(0); sc->m_lastDownloadCache.clear(collnum); */ // remove from spider cache, tell it to sync up with collectiondb //g_spiderCache.reset1(); // . TODO: remove from g_sync // . remove from all rdbs //g_indexdb.getRdb()->delColl ( coll ); g_posdb.getRdb()->delColl ( coll ); //g_datedb.getRdb()->delColl ( coll ); g_titledb.getRdb()->delColl ( coll ); //g_revdb.getRdb()->delColl ( coll ); //g_sectiondb.getRdb()->delColl ( coll ); g_tagdb.getRdb()->delColl ( coll ); // let's preserve the tags... they have all the turk votes in them if ( deleteTurkdb ) { } //g_catdb.getRdb()->delColl ( coll ); //g_checksumdb.getRdb()->delColl ( coll ); g_spiderdb.getRdb()->delColl ( coll ); g_doledb.getRdb()->delColl ( coll ); //g_tfndb.getRdb()->delColl ( coll ); g_clusterdb.getRdb()->delColl ( coll ); g_linkdb.getRdb()->delColl ( coll ); // free it mdelete ( m_recs[(long)collnum], sizeof(CollectionRec), "CollectionRec" ); delete ( m_recs[(long)collnum] ); m_recs[(long)collnum] = NULL; // dec counts m_numRecsUsed--; while ( ! m_recs[m_numRecs-1] ) m_numRecs--; // update the time updateTime(); // done return true; }
inline float MathTrait<float>::log( const float val ) { return logf( val ) ; }
myIDirect3DViewport3::~myIDirect3DViewport3() { logf("myIDirect3DViewport3 dtor\n"); }
static int lumi_plg_frame(lumi_data_t *handle, xvid_plg_data_t *data) { int i, j; float global = 0.0f; const float DarkAmpl = 14 / 4; const float BrightAmpl = 10 / 3; float DarkThres = 90; float BrightThres = 200; const float GlobalDarkThres = 60; const float GlobalBrightThres = 170; /* Arbitrary centerpoint for variance-based AQ. Roughly the same as used in x264. */ float center = 14000.f; /* Arbitrary strength for variance-based AQ. */ float strength = 0.2f; if (data->type == XVID_TYPE_BVOP) return 0; /* Do this for all macroblocks individually */ for (j = 0; j < data->mb_height; j++) { for (i = 0; i < data->mb_width; i++) { int k, l, sum = 0, sum_of_squares = 0; unsigned char *ptr; /* Initialize the current quant value to the frame quant */ handle->quant[j*data->mb_width + i] = (float)data->quant; /* Next steps compute the luminance-masking */ /* Get the MB address */ ptr = data->current.plane[0]; ptr += 16*j*data->current.stride[0] + 16*i; if (handle->method) { /* Variance masking mode */ int variance = 0; /* Accumulate sum and sum of squares over the MB */ for (k = 0; k < 16; k++) { for (l = 0; l < 16; l++) { int val = ptr[k*data->current.stride[0] + l]; sum += val; sum_of_squares += val * val; } } /* Variance = SSD - SAD^2 / (numpixels) */ variance = sum_of_squares - sum * sum / 256; handle->val[j*data->mb_width + i] = (float)variance; } else { /* Luminance masking mode */ /* Accumulate luminance */ for (k = 0; k < 16; k++) for (l = 0; l < 16; l++) sum += ptr[k*data->current.stride[0] + l]; handle->val[j*data->mb_width + i] = (float)sum/256.0f; /* Accumulate the global frame luminance */ global += (float)sum/256.0f; } } } if (handle->method) { /* Variance masking */ /* Apply the variance masking formula to all MBs */ for (i = 0; i < data->mb_height; i++) { for (j = 0; j < data->mb_width; j++) { float value = handle->val[i*data->mb_width + j]; float qscale_diff = strength * logf(value / center); handle->quant[i*data->mb_width + j] *= (1.0f + qscale_diff); } } } else { /* Luminance masking */ /* Normalize the global luminance accumulator */ global /= data->mb_width*data->mb_height; DarkThres = DarkThres*global/127.0f; BrightThres = BrightThres*global/127.0f; /* Apply luminance masking only to frames where the global luminance is * higher than DarkThreshold and lower than Bright Threshold */ if ((global < GlobalBrightThres) && (global > GlobalDarkThres)) { /* Apply the luminance masking formulas to all MBs */ for (i = 0; i < data->mb_height; i++) { for (j = 0; j < data->mb_width; j++) { if (handle->val[i*data->mb_width + j] < DarkThres) handle->quant[i*data->mb_width + j] *= 1 + DarkAmpl * (DarkThres - handle->val[i*data->mb_width + j]) / DarkThres; else if (handle->val[i*data->mb_width + j] > BrightThres) handle->quant[i*data->mb_width + j] *= 1 + BrightAmpl * (handle->val[i*data->mb_width + j] - BrightThres) / (255 - BrightThres); } } } } /* Normalize the quantizer field */ data->quant = normalize_quantizer_field(handle->quant, data->dquant, data->mb_width*data->mb_height, data->quant, MAX(2,data->quant + data->quant/2)); /* Plugin job finished */ return(0); }
myIDirect3DViewport3::myIDirect3DViewport3(IDirect3DViewport3 * aOriginal) { logf("myIDirect3DViewport3 ctor\n"); mOriginal = aOriginal; }
int main(int argc, char **argv) { int rv; int width = 256; int height = 256; int padded_width, padded_height; fb_info fb; rv = fb_open(0, &fb); if(rv!=0) { exit(1); } width = fb.fb_var.xres; height = fb.fb_var.yres; padded_width = etna_align_up(width, 64); padded_height = etna_align_up(height, 64); printf("padded_width %i padded_height %i\n", padded_width, padded_height); rv = viv_open(); if(rv!=0) { fprintf(stderr, "Error opening device\n"); exit(1); } printf("Succesfully opened device\n"); etna_ctx *ctx = 0; if(etna_create(&ctx) != ETNA_OK) { printf("Unable to create context\n"); exit(1); } /* Initialize buffers synchronization structure */ etna_bswap_buffers *buffers = 0; if(etna_bswap_create(ctx, &buffers, (int (*)(void *, int))&fb_set_buffer, NULL, &fb) < 0) { fprintf(stderr, "Error creating buffer swapper\n"); exit(1); } /* Allocate video memory */ etna_vidmem *rt = 0; /* main render target */ etna_vidmem *rt_ts = 0; /* tile status for main render target */ etna_vidmem *z = 0; /* depth for main render target */ etna_vidmem *z_ts = 0; /* depth ts for main render target */ etna_vidmem *vtx = 0; /* vertex buffer */ etna_vidmem *aux_rt = 0; /* auxilary render target */ etna_vidmem *aux_rt_ts = 0; /* tile status for auxilary render target */ etna_vidmem *tex = 0; /* texture */ size_t rt_size = padded_width * padded_height * 4; size_t rt_ts_size = etna_align_up((padded_width * padded_height * 4)/0x100, 0x100); size_t z_size = padded_width * padded_height * 2; size_t z_ts_size = etna_align_up((padded_width * padded_height * 2)/0x100, 0x100); dds_texture *dds = 0; if(argc<2 || !dds_load(argv[1], &dds)) { printf("Error loading texture\n"); exit(1); } if(etna_vidmem_alloc_linear(&rt, rt_size, gcvSURF_RENDER_TARGET, gcvPOOL_DEFAULT, true)!=ETNA_OK || etna_vidmem_alloc_linear(&rt_ts, rt_ts_size, gcvSURF_TILE_STATUS, gcvPOOL_DEFAULT, true)!=ETNA_OK || etna_vidmem_alloc_linear(&z, z_size, gcvSURF_DEPTH, gcvPOOL_DEFAULT, true)!=ETNA_OK || etna_vidmem_alloc_linear(&z_ts, z_ts_size, gcvSURF_TILE_STATUS, gcvPOOL_DEFAULT, true)!=ETNA_OK || etna_vidmem_alloc_linear(&vtx, VERTEX_BUFFER_SIZE, gcvSURF_VERTEX, gcvPOOL_DEFAULT, true)!=ETNA_OK || etna_vidmem_alloc_linear(&aux_rt, 0x4000, gcvSURF_RENDER_TARGET, gcvPOOL_SYSTEM, true)!=ETNA_OK || etna_vidmem_alloc_linear(&aux_rt_ts, 0x100, gcvSURF_TILE_STATUS, gcvPOOL_DEFAULT, true)!=ETNA_OK || etna_vidmem_alloc_linear(&tex, dds->size, gcvSURF_TEXTURE, gcvPOOL_DEFAULT, true)!=ETNA_OK ) { fprintf(stderr, "Error allocating video memory\n"); exit(1); } uint32_t tex_format = 0; uint32_t tex_base_width = dds->slices[0][0].width; uint32_t tex_base_height = dds->slices[0][0].height; uint32_t tex_base_log_width = (int)(logf(tex_base_width) * RCPLOG2 * 32.0f + 0.5f); uint32_t tex_base_log_height = (int)(logf(tex_base_height) * RCPLOG2 * 32.0f + 0.5f); printf("Loading compressed texture (format %i, %ix%i) log_width=%i log_height=%i\n", dds->fmt, tex_base_width, tex_base_height, tex_base_log_width, tex_base_log_height); if(dds->fmt == FMT_X8R8G8B8 || dds->fmt == FMT_A8R8G8B8) { for(int ix=0; ix<dds->num_mipmaps; ++ix) { printf("%08x: Tiling mipmap %i (%ix%i)\n", dds->slices[0][ix].offset, ix, dds->slices[0][ix].width, dds->slices[0][ix].height); etna_texture_tile((void*)((size_t)tex->logical + dds->slices[0][ix].offset), dds->slices[0][ix].data, dds->slices[0][ix].width, dds->slices[0][ix].height, dds->slices[0][ix].stride, 4); } tex_format = TEXTURE_FORMAT_X8R8G8B8; } else if(dds->fmt == FMT_DXT1 || dds->fmt == FMT_DXT3 || dds->fmt == FMT_DXT5 || dds->fmt == FMT_ETC1) { printf("Uploading compressed texture\n"); memcpy(tex->logical, dds->data, dds->size); switch(dds->fmt) { case FMT_DXT1: tex_format = TEXTURE_FORMAT_DXT1; break; case FMT_DXT3: tex_format = TEXTURE_FORMAT_DXT2_DXT3; break; case FMT_DXT5: tex_format = TEXTURE_FORMAT_DXT4_DXT5; break; case FMT_ETC1: tex_format = TEXTURE_FORMAT_ETC1; break; } } else { printf("Unknown texture format\n"); exit(1); } /* Phew, now we got all the memory we need. * Write interleaved attribute vertex stream. * Unlike the GL example we only do this once, not every time glDrawArrays is called, the same would be accomplished * from GL by using a vertex buffer object. */ for(int vert=0; vert<NUM_VERTICES; ++vert) { int dest_idx = vert * (3 + 3 + 2); for(int comp=0; comp<3; ++comp) ((float*)vtx->logical)[dest_idx+comp+0] = vVertices[vert*3 + comp]; /* 0 */ for(int comp=0; comp<3; ++comp) ((float*)vtx->logical)[dest_idx+comp+3] = vNormals[vert*3 + comp]; /* 1 */ for(int comp=0; comp<2; ++comp) ((float*)vtx->logical)[dest_idx+comp+6] = vTexCoords[vert*2 + comp]; /* 2 */ } for(int frame=0; frame<1000; ++frame) { if(frame%50 == 0) printf("*** FRAME %i ****\n", frame); /* Compute transform matrices in the same way as cube egl demo */ ESMatrix modelview, projection, modelviewprojection; ESMatrix inverse, normal; esMatrixLoadIdentity(&modelview); esTranslate(&modelview, 0.0f, 0.0f, -8.0f); esRotate(&modelview, 45.0f, 1.0f, 0.0f, 0.0f); esRotate(&modelview, 45.0f, 0.0f, 1.0f, 0.0f); esRotate(&modelview, frame*0.5f, 0.0f, 0.0f, 1.0f); GLfloat aspect = (GLfloat)(height) / (GLfloat)(width); esMatrixLoadIdentity(&projection); esFrustum(&projection, -2.8f, +2.8f, -2.8f * aspect, +2.8f * aspect, 6.0f, 10.0f); esMatrixLoadIdentity(&modelviewprojection); esMatrixMultiply(&modelviewprojection, &modelview, &projection); esMatrixInverse3x3(&inverse, &modelview); esMatrixTranspose(&normal, &inverse); /* XXX part of this can be put outside the loop, but until we have usable context management * this is safest. */ etna_set_state(ctx, VIVS_RA_CONTROL, 0x3); etna_set_state(ctx, VIVS_GL_MULTI_SAMPLE_CONFIG, VIVS_GL_MULTI_SAMPLE_CONFIG_MSAA_SAMPLES_NONE | VIVS_GL_MULTI_SAMPLE_CONFIG_MSAA_ENABLES(0xf) /*| VIVS_GL_MULTI_SAMPLE_CONFIG_UNK12 | VIVS_GL_MULTI_SAMPLE_CONFIG_UNK16 */ ); etna_set_state(ctx, VIVS_GL_VERTEX_ELEMENT_CONFIG, 0x1); etna_set_state(ctx, VIVS_GL_VARYING_NUM_COMPONENTS, VIVS_GL_VARYING_NUM_COMPONENTS_VAR0(4)| /* position */ VIVS_GL_VARYING_NUM_COMPONENTS_VAR1(2) /* texture coordinate */ ); etna_set_state(ctx, VIVS_GL_VARYING_TOTAL_COMPONENTS, VIVS_GL_VARYING_TOTAL_COMPONENTS_NUM(4 + 2) ); etna_set_state_multi(ctx, VIVS_GL_VARYING_COMPONENT_USE(0), 2, (uint32_t[]){ VIVS_GL_VARYING_COMPONENT_USE_COMP0(VARYING_COMPONENT_USE_USED) | VIVS_GL_VARYING_COMPONENT_USE_COMP1(VARYING_COMPONENT_USE_USED) | VIVS_GL_VARYING_COMPONENT_USE_COMP2(VARYING_COMPONENT_USE_USED) | VIVS_GL_VARYING_COMPONENT_USE_COMP3(VARYING_COMPONENT_USE_USED) | VIVS_GL_VARYING_COMPONENT_USE_COMP4(VARYING_COMPONENT_USE_USED) | VIVS_GL_VARYING_COMPONENT_USE_COMP5(VARYING_COMPONENT_USE_USED) , 0 }); etna_set_state(ctx, VIVS_PA_W_CLIP_LIMIT, 0x34000001); etna_set_state(ctx, VIVS_PA_SYSTEM_MODE, 0x11); etna_set_state(ctx, VIVS_PA_CONFIG, /* VIVS_PA_CONFIG_UNK22 | */ VIVS_PA_CONFIG_CULL_FACE_MODE_CCW | VIVS_PA_CONFIG_FILL_MODE_SOLID | VIVS_PA_CONFIG_SHADE_MODEL_SMOOTH /* | VIVS_PA_CONFIG_POINT_SIZE_ENABLE | VIVS_PA_CONFIG_POINT_SPRITE_ENABLE*/); etna_set_state_f32(ctx, VIVS_PA_VIEWPORT_OFFSET_Z, 0.0); etna_set_state_f32(ctx, VIVS_PA_VIEWPORT_SCALE_Z, 1.0); etna_set_state_fixp(ctx, VIVS_PA_VIEWPORT_OFFSET_X, width << 15); etna_set_state_fixp(ctx, VIVS_PA_VIEWPORT_OFFSET_Y, height << 15); etna_set_state_fixp(ctx, VIVS_PA_VIEWPORT_SCALE_X, width << 15); etna_set_state_fixp(ctx, VIVS_PA_VIEWPORT_SCALE_Y, height << 15); etna_set_state(ctx, VIVS_PA_ATTRIBUTE_ELEMENT_COUNT, 0x200); etna_set_state(ctx, VIVS_PA_SHADER_ATTRIBUTES(0), 0x200); etna_set_state(ctx, VIVS_PA_SHADER_ATTRIBUTES(1), 0x200); etna_set_state(ctx, VIVS_SE_CONFIG, 0x0); etna_set_state(ctx, VIVS_SE_DEPTH_SCALE, 0x0); etna_set_state(ctx, VIVS_SE_DEPTH_BIAS, 0x0); etna_set_state_fixp(ctx, VIVS_SE_SCISSOR_LEFT, 0); etna_set_state_fixp(ctx, VIVS_SE_SCISSOR_TOP, 0); etna_set_state_fixp(ctx, VIVS_SE_SCISSOR_RIGHT, (width << 16) | 5); etna_set_state_fixp(ctx, VIVS_SE_SCISSOR_BOTTOM, (height << 16) | 5); etna_set_state(ctx, VIVS_PE_ALPHA_CONFIG, /* VIVS_PE_ALPHA_CONFIG_BLEND_ENABLE_COLOR | */ /* VIVS_PE_ALPHA_CONFIG_BLEND_ENABLE_ALPHA | */ VIVS_PE_ALPHA_CONFIG_SRC_FUNC_COLOR(BLEND_FUNC_ONE) | VIVS_PE_ALPHA_CONFIG_SRC_FUNC_ALPHA(BLEND_FUNC_ONE) | VIVS_PE_ALPHA_CONFIG_DST_FUNC_COLOR(BLEND_FUNC_ZERO) | VIVS_PE_ALPHA_CONFIG_DST_FUNC_ALPHA(BLEND_FUNC_ZERO) | VIVS_PE_ALPHA_CONFIG_EQ_COLOR(BLEND_EQ_ADD) | VIVS_PE_ALPHA_CONFIG_EQ_ALPHA(BLEND_EQ_ADD)); etna_set_state(ctx, VIVS_PE_ALPHA_BLEND_COLOR, VIVS_PE_ALPHA_BLEND_COLOR_B(0) | VIVS_PE_ALPHA_BLEND_COLOR_G(0) | VIVS_PE_ALPHA_BLEND_COLOR_R(0) | VIVS_PE_ALPHA_BLEND_COLOR_A(0)); etna_set_state(ctx, VIVS_PE_ALPHA_OP, /* VIVS_PE_ALPHA_OP_ALPHA_TEST */ 0); etna_set_state(ctx, VIVS_PE_STENCIL_CONFIG, VIVS_PE_STENCIL_CONFIG_REF_FRONT(0) | VIVS_PE_STENCIL_CONFIG_MASK_FRONT(0xff) | VIVS_PE_STENCIL_CONFIG_WRITE_MASK(0xff) | VIVS_PE_STENCIL_CONFIG_MODE_DISABLED); etna_set_state(ctx, VIVS_PE_STENCIL_OP, VIVS_PE_STENCIL_OP_FUNC_FRONT(COMPARE_FUNC_ALWAYS) | VIVS_PE_STENCIL_OP_FUNC_BACK(COMPARE_FUNC_ALWAYS) | VIVS_PE_STENCIL_OP_FAIL_FRONT(STENCIL_OP_KEEP) | VIVS_PE_STENCIL_OP_FAIL_BACK(STENCIL_OP_KEEP) | VIVS_PE_STENCIL_OP_DEPTH_FAIL_FRONT(STENCIL_OP_KEEP) | VIVS_PE_STENCIL_OP_DEPTH_FAIL_BACK(STENCIL_OP_KEEP) | VIVS_PE_STENCIL_OP_PASS_FRONT(STENCIL_OP_KEEP) | VIVS_PE_STENCIL_OP_PASS_BACK(STENCIL_OP_KEEP)); etna_set_state(ctx, VIVS_PE_COLOR_FORMAT, VIVS_PE_COLOR_FORMAT_COMPONENTS(0xf) | VIVS_PE_COLOR_FORMAT_FORMAT(RS_FORMAT_X8R8G8B8) | VIVS_PE_COLOR_FORMAT_SUPER_TILED | VIVS_PE_COLOR_FORMAT_OVERWRITE); etna_set_state(ctx, VIVS_PE_DEPTH_CONFIG, VIVS_PE_DEPTH_CONFIG_DEPTH_FORMAT_D16 | VIVS_PE_DEPTH_CONFIG_SUPER_TILED | VIVS_PE_DEPTH_CONFIG_EARLY_Z | /* VIVS_PE_DEPTH_CONFIG_WRITE_ENABLE | */ VIVS_PE_DEPTH_CONFIG_DEPTH_FUNC(COMPARE_FUNC_ALWAYS) | VIVS_PE_DEPTH_CONFIG_DEPTH_MODE_Z /* VIVS_PE_DEPTH_CONFIG_ONLY_DEPTH */ ); etna_set_state(ctx, VIVS_PE_DEPTH_ADDR, z->address); etna_set_state(ctx, VIVS_PE_DEPTH_STRIDE, padded_width * 2); etna_set_state(ctx, VIVS_PE_HDEPTH_CONTROL, VIVS_PE_HDEPTH_CONTROL_FORMAT_DISABLED); etna_set_state_f32(ctx, VIVS_PE_DEPTH_NORMALIZE, 65535.0); etna_set_state(ctx, VIVS_PE_COLOR_ADDR, rt->address); etna_set_state(ctx, VIVS_PE_COLOR_STRIDE, padded_width * 4); etna_set_state_f32(ctx, VIVS_PE_DEPTH_NEAR, 0.0); etna_set_state_f32(ctx, VIVS_PE_DEPTH_FAR, 1.0); etna_set_state_f32(ctx, VIVS_PE_DEPTH_NORMALIZE, 65535.0); etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR | VIVS_GL_FLUSH_CACHE_DEPTH); etna_set_state(ctx, VIVS_RS_FLUSH_CACHE, VIVS_RS_FLUSH_CACHE_FLUSH); etna_stall(ctx, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE); /* Set up the resolve to clear tile status for main render target * Regard the TS plane as an image of width 16 with 4 bytes per pixel (64 bytes per row) * XXX need to clear the depth ts too? we don't really use depth buffer in this sample * */ etna_set_state(ctx, VIVS_TS_MEM_CONFIG, 0); etna_set_state(ctx, VIVS_RS_CONFIG, VIVS_RS_CONFIG_SOURCE_FORMAT(RS_FORMAT_X8R8G8B8) | VIVS_RS_CONFIG_DEST_FORMAT(RS_FORMAT_X8R8G8B8) ); etna_set_state_multi(ctx, VIVS_RS_DITHER(0), 2, (uint32_t[]){0xffffffff, 0xffffffff}); etna_set_state(ctx, VIVS_RS_DEST_ADDR, rt_ts->address); /* ADDR_B */ etna_set_state(ctx, VIVS_RS_DEST_STRIDE, 0x40); etna_set_state(ctx, VIVS_RS_WINDOW_SIZE, ((rt_ts_size/0x40) << VIVS_RS_WINDOW_SIZE_HEIGHT__SHIFT) | (16 << VIVS_RS_WINDOW_SIZE_WIDTH__SHIFT)); etna_set_state(ctx, VIVS_RS_FILL_VALUE(0), 0x55555555); etna_set_state(ctx, VIVS_RS_CLEAR_CONTROL, VIVS_RS_CLEAR_CONTROL_MODE_ENABLED1 | (0xffff << VIVS_RS_CLEAR_CONTROL_BITS__SHIFT)); etna_set_state(ctx, VIVS_RS_EXTRA_CONFIG, 0); etna_set_state(ctx, VIVS_RS_KICKER, 0xbeebbeeb); /** Done */ /* Now set up TS */ etna_set_state(ctx, VIVS_TS_MEM_CONFIG, VIVS_TS_MEM_CONFIG_DEPTH_FAST_CLEAR | VIVS_TS_MEM_CONFIG_COLOR_FAST_CLEAR | VIVS_TS_MEM_CONFIG_DEPTH_16BPP | VIVS_TS_MEM_CONFIG_DEPTH_COMPRESSION); etna_set_state(ctx, VIVS_TS_DEPTH_CLEAR_VALUE, 0xffffffff); etna_set_state(ctx, VIVS_TS_DEPTH_STATUS_BASE, z_ts->address); etna_set_state(ctx, VIVS_TS_DEPTH_SURFACE_BASE, z->address); etna_set_state(ctx, VIVS_TS_COLOR_CLEAR_VALUE, 0xff303030); etna_set_state(ctx, VIVS_TS_COLOR_STATUS_BASE, rt_ts->address); etna_set_state(ctx, VIVS_TS_COLOR_SURFACE_BASE, rt->address); etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR | VIVS_GL_FLUSH_CACHE_DEPTH); /* set up texture unit */ etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_TEXTURE); etna_set_state(ctx, VIVS_TE_SAMPLER_SIZE(0), VIVS_TE_SAMPLER_SIZE_WIDTH(tex_base_width)| VIVS_TE_SAMPLER_SIZE_HEIGHT(tex_base_height)); etna_set_state(ctx, VIVS_TE_SAMPLER_LOG_SIZE(0), VIVS_TE_SAMPLER_LOG_SIZE_WIDTH(tex_base_log_width) | VIVS_TE_SAMPLER_LOG_SIZE_HEIGHT(tex_base_log_height)); for(int ix=0; ix<dds->num_mipmaps; ++ix) { etna_set_state(ctx, VIVS_TE_SAMPLER_LOD_ADDR(0,ix), tex->address + dds->slices[0][ix].offset); } etna_set_state(ctx, VIVS_TE_SAMPLER_CONFIG0(0), VIVS_TE_SAMPLER_CONFIG0_TYPE(TEXTURE_TYPE_2D)| VIVS_TE_SAMPLER_CONFIG0_UWRAP(TEXTURE_WRAPMODE_CLAMP_TO_EDGE)| VIVS_TE_SAMPLER_CONFIG0_VWRAP(TEXTURE_WRAPMODE_CLAMP_TO_EDGE)| VIVS_TE_SAMPLER_CONFIG0_MIN(TEXTURE_FILTER_LINEAR)| VIVS_TE_SAMPLER_CONFIG0_MIP(TEXTURE_FILTER_LINEAR)| VIVS_TE_SAMPLER_CONFIG0_MAG(TEXTURE_FILTER_LINEAR)| VIVS_TE_SAMPLER_CONFIG0_FORMAT(tex_format)); etna_set_state(ctx, VIVS_TE_SAMPLER_LOD_CONFIG(0), VIVS_TE_SAMPLER_LOD_CONFIG_MAX((dds->num_mipmaps - 1)<<5) | VIVS_TE_SAMPLER_LOD_CONFIG_MIN(0)); //etna_set_state(ctx, VIVS_TE_SAMPLER_UNK2100(0), 0); //etna_set_state(ctx, VIVS_TE_SAMPLER_UNK2140(0), 0); /* shader setup */ etna_set_state(ctx, VIVS_VS_START_PC, 0x0); etna_set_state(ctx, VIVS_VS_END_PC, vs_size/16); etna_set_state_multi(ctx, VIVS_VS_INPUT_COUNT, 3, (uint32_t[]){ /* VIVS_VS_INPUT_COUNT */ VIVS_VS_INPUT_COUNT_UNK8(1) | VIVS_VS_INPUT_COUNT_COUNT(3), /* VIVS_VS_TEMP_REGISTER_CONTROL */ VIVS_VS_TEMP_REGISTER_CONTROL_NUM_TEMPS(6), /* VIVS_VS_OUTPUT(0) */ VIVS_VS_OUTPUT_O0(4) | VIVS_VS_OUTPUT_O1(0) | VIVS_VS_OUTPUT_O2(1)}); etna_set_state_multi(ctx, VIVS_VS_INST_MEM(0), vs_size/4, vs); etna_set_state(ctx, VIVS_VS_OUTPUT_COUNT, 3); etna_set_state(ctx, VIVS_VS_LOAD_BALANCING, 0xf3f0542); /* depends on number of inputs/outputs/varyings? XXX how exactly */ etna_set_state_multi(ctx, VIVS_VS_UNIFORMS(0), 16, (uint32_t*)&modelviewprojection.m[0][0]); etna_set_state_multi(ctx, VIVS_VS_UNIFORMS(16), 3, (uint32_t*)&normal.m[0][0]); /* u4.xyz */ etna_set_state_multi(ctx, VIVS_VS_UNIFORMS(20), 3, (uint32_t*)&normal.m[1][0]); /* u5.xyz */ etna_set_state_multi(ctx, VIVS_VS_UNIFORMS(24), 3, (uint32_t*)&normal.m[2][0]); /* u6.xyz */ etna_set_state_multi(ctx, VIVS_VS_UNIFORMS(28), 16, (uint32_t*)&modelview.m[0][0]); etna_set_state_f32(ctx, VIVS_VS_UNIFORMS(19), 2.0); /* u4.w */ etna_set_state_f32(ctx, VIVS_VS_UNIFORMS(23), 20.0); /* u5.w */ etna_set_state_f32(ctx, VIVS_VS_UNIFORMS(27), 0.0); /* u6.w */ etna_set_state_f32(ctx, VIVS_VS_UNIFORMS(45), 0.5); /* u11.y */ etna_set_state_f32(ctx, VIVS_VS_UNIFORMS(44), 1.0); /* u11.x */ etna_set_state(ctx, VIVS_VS_INPUT(0), VIVS_VS_INPUT_I0(0) | VIVS_VS_INPUT_I1(1) | VIVS_VS_INPUT_I2(2)); etna_set_state(ctx, VIVS_PS_START_PC, 0x0); etna_set_state_multi(ctx, VIVS_PS_END_PC, 2, (uint32_t[]){ /* VIVS_PS_END_PC */ ps_size/16, /* VIVS_PS_OUTPUT_REG */ 0x1}); etna_set_state_multi(ctx, VIVS_PS_INST_MEM(0), ps_size/4, ps); etna_set_state(ctx, VIVS_PS_INPUT_COUNT, VIVS_PS_INPUT_COUNT_UNK8(31) | VIVS_PS_INPUT_COUNT_COUNT(3)); etna_set_state(ctx, VIVS_PS_TEMP_REGISTER_CONTROL, VIVS_PS_TEMP_REGISTER_CONTROL_NUM_TEMPS(3)); etna_set_state(ctx, VIVS_PS_CONTROL, VIVS_PS_CONTROL_UNK1); etna_set_state_f32(ctx, VIVS_PS_UNIFORMS(0), 1.0); /* u0.x */ etna_set_state(ctx, VIVS_FE_VERTEX_STREAM_BASE_ADDR, vtx->address); /* ADDR_E */ etna_set_state(ctx, VIVS_FE_VERTEX_STREAM_CONTROL, VIVS_FE_VERTEX_STREAM_CONTROL_VERTEX_STRIDE((3 + 3 + 2)*4)); etna_set_state(ctx, VIVS_FE_VERTEX_ELEMENT_CONFIG(0), VIVS_FE_VERTEX_ELEMENT_CONFIG_TYPE_FLOAT | (ENDIAN_MODE_NO_SWAP << VIVS_FE_VERTEX_ELEMENT_CONFIG_ENDIAN__SHIFT) | VIVS_FE_VERTEX_ELEMENT_CONFIG_STREAM(0) | VIVS_FE_VERTEX_ELEMENT_CONFIG_NUM(3) | VIVS_FE_VERTEX_ELEMENT_CONFIG_NORMALIZE_OFF | VIVS_FE_VERTEX_ELEMENT_CONFIG_START(0x0) | VIVS_FE_VERTEX_ELEMENT_CONFIG_END(0xc)); etna_set_state(ctx, VIVS_FE_VERTEX_ELEMENT_CONFIG(1), VIVS_FE_VERTEX_ELEMENT_CONFIG_TYPE_FLOAT | (ENDIAN_MODE_NO_SWAP << VIVS_FE_VERTEX_ELEMENT_CONFIG_ENDIAN__SHIFT) | VIVS_FE_VERTEX_ELEMENT_CONFIG_STREAM(0) | VIVS_FE_VERTEX_ELEMENT_CONFIG_NUM(3) | VIVS_FE_VERTEX_ELEMENT_CONFIG_NORMALIZE_OFF | VIVS_FE_VERTEX_ELEMENT_CONFIG_START(0xc) | VIVS_FE_VERTEX_ELEMENT_CONFIG_END(0x18)); etna_set_state(ctx, VIVS_FE_VERTEX_ELEMENT_CONFIG(2), VIVS_FE_VERTEX_ELEMENT_CONFIG_TYPE_FLOAT | (ENDIAN_MODE_NO_SWAP << VIVS_FE_VERTEX_ELEMENT_CONFIG_ENDIAN__SHIFT) | VIVS_FE_VERTEX_ELEMENT_CONFIG_NONCONSECUTIVE | VIVS_FE_VERTEX_ELEMENT_CONFIG_STREAM(0) | VIVS_FE_VERTEX_ELEMENT_CONFIG_NUM(2) | VIVS_FE_VERTEX_ELEMENT_CONFIG_NORMALIZE_OFF | VIVS_FE_VERTEX_ELEMENT_CONFIG_START(0x18) | VIVS_FE_VERTEX_ELEMENT_CONFIG_END(0x20)); for(int prim=0; prim<6; ++prim) { etna_draw_primitives(ctx, PRIMITIVE_TYPE_TRIANGLE_STRIP, prim*4, 2); } #if 0 /* resolve to self */ etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR | VIVS_GL_FLUSH_CACHE_DEPTH); etna_set_state(ctx, VIVS_RS_CONFIG, VIVS_RS_CONFIG_SOURCE_FORMAT(RS_FORMAT_X8R8G8B8) | VIVS_RS_CONFIG_SOURCE_TILED | VIVS_RS_CONFIG_DEST_FORMAT(RS_FORMAT_X8R8G8B8) | VIVS_RS_CONFIG_DEST_TILED); etna_set_state(ctx, VIVS_RS_SOURCE_STRIDE, (padded_width * 4 * 4) | VIVS_RS_SOURCE_STRIDE_TILING); etna_set_state(ctx, VIVS_RS_DEST_STRIDE, (padded_width * 4 * 4) | VIVS_RS_DEST_STRIDE_TILING); etna_set_state(ctx, VIVS_RS_DITHER(0), 0xffffffff); etna_set_state(ctx, VIVS_RS_DITHER(1), 0xffffffff); etna_set_state(ctx, VIVS_RS_CLEAR_CONTROL, VIVS_RS_CLEAR_CONTROL_MODE_DISABLED); etna_set_state(ctx, VIVS_RS_EXTRA_CONFIG, 0); /* no AA, no endian switch */ etna_set_state(ctx, VIVS_RS_SOURCE_ADDR, rt->address); /* ADDR_A */ etna_set_state(ctx, VIVS_RS_DEST_ADDR, rt->address); /* ADDR_A */ etna_set_state(ctx, VIVS_RS_WINDOW_SIZE, VIVS_RS_WINDOW_SIZE_HEIGHT(padded_height) | VIVS_RS_WINDOW_SIZE_WIDTH(padded_width)); etna_set_state(ctx, VIVS_RS_KICKER, 0xbeebbeeb); etna_set_state(ctx, VIVS_RS_FLUSH_CACHE, VIVS_RS_FLUSH_CACHE_FLUSH); etna_set_state(ctx, VIVS_TS_COLOR_STATUS_BASE, rt_ts->address); /* ADDR_B */ etna_set_state(ctx, VIVS_TS_COLOR_SURFACE_BASE, rt->address); /* ADDR_A */ etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR); etna_set_state(ctx, VIVS_TS_MEM_CONFIG, VIVS_TS_MEM_CONFIG_DEPTH_FAST_CLEAR | VIVS_TS_MEM_CONFIG_DEPTH_16BPP | VIVS_TS_MEM_CONFIG_DEPTH_COMPRESSION); etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR); #endif etna_stall(ctx, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); /* copy to screen */ etna_bswap_wait_available(buffers); etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR | VIVS_GL_FLUSH_CACHE_DEPTH); etna_set_state(ctx, VIVS_RS_CONFIG, VIVS_RS_CONFIG_SOURCE_FORMAT(RS_FORMAT_X8R8G8B8) | VIVS_RS_CONFIG_SOURCE_TILED | VIVS_RS_CONFIG_DEST_FORMAT(RS_FORMAT_X8R8G8B8) | VIVS_RS_CONFIG_SWAP_RB); etna_set_state(ctx, VIVS_RS_SOURCE_STRIDE, (padded_width * 4 * 4) | VIVS_RS_SOURCE_STRIDE_TILING); etna_set_state(ctx, VIVS_RS_DEST_STRIDE, fb.fb_fix.line_length); etna_set_state(ctx, VIVS_RS_DITHER(0), 0xffffffff); etna_set_state(ctx, VIVS_RS_DITHER(1), 0xffffffff); etna_set_state(ctx, VIVS_RS_CLEAR_CONTROL, VIVS_RS_CLEAR_CONTROL_MODE_DISABLED); etna_set_state(ctx, VIVS_RS_EXTRA_CONFIG, 0); /* no AA, no endian switch */ etna_set_state(ctx, VIVS_RS_SOURCE_ADDR, rt->address); /* ADDR_A */ etna_set_state(ctx, VIVS_RS_DEST_ADDR, fb.physical[buffers->backbuffer]); /* ADDR_J */ etna_set_state(ctx, VIVS_RS_WINDOW_SIZE, VIVS_RS_WINDOW_SIZE_HEIGHT(height) | VIVS_RS_WINDOW_SIZE_WIDTH(width)); etna_set_state(ctx, VIVS_RS_KICKER, 0xbeebbeeb); etna_flush(ctx); etna_bswap_queue_swap(buffers); } #ifdef DUMP bmp_dump32(fb.logical[1-backbuffer], width, height, false, "/mnt/sdcard/fb.bmp"); printf("Dump complete\n"); #endif etna_bswap_free(buffers); etna_free(ctx); viv_close(); return 0; }
void cheReactionUpdate() { framesSinceLastReset++; int i; if( Band_signalOmega != oldOmega ) { cheReactionReset(); } avgBuf[avgBufCount++] = (float)outputHits; if( avgBufCount == avgBufSize ) { float sum = 0.f; for( i=0; i<avgBufCount; i++ ) { sum += avgBuf[i]; } fftBuf[fftBufCount] = sum / (float)avgBufCount; fftBufCount++; avgBufCount = 0; if( fftBufCount == fftBufSize ) { FFT fft( fftBuf, fftBufSize ); fft.fft(); float *p = fft.computePowerSpectrum(); for( i=0; i<fftBufCount/2-1; i++ ) { cumPowerSpectrum[i] += p[i]; cumPowerSpectrumLog[i] = logf( 1.f + cumPowerSpectrum[i] ); } fftBufCount = 0; cumPowerSpectrumCount++; FILE *file = fopen( ZTmpStr("/transfer/fft/fft-diff-%d.txt",cumPowerSpectrumCount), "wt" ); for( i=1; i<100; i++ ) { fprintf( file, "%f\n", cumPowerSpectrum[i] / (float)cumPowerSpectrumCount ); } fclose( file ); } } if( !(simulationFrameNumber % 100 ) ) { spatialHistogramCount++; for( int x=0; x<DIMX; x++ ) { for( int y=0; y<DIMY; y++ ) { Part *p = partAt( IVec2(x,y) ); if( p && p->type == TYPE_CHEYP ) { spatialHistogram[x]++; } } } } outputHistory.setAvgWindow( Band_plotWindowRadius ); outputHistory.add( (float)outputHits ); // COMPUTE input signal signal = Band_signal; if( Band_useSinSignal ) { signal = (float)( Band_signalTop * 0.5*( 1.0+sin( Band_signalOmega * (double)simulationFrameNumber ) ) ); } inputHistory.add( signal ); // SETUP for next computation outputHits = 0; }
int main(int argc, char* argv[]) { int n12, i, i1, i2, rect, order, niter; float **img, **grad, **grad1, **grad2, *y, **x; float med, t, t2, tol[2], band; sf_eno2 g[2]; sf_file in, out; sf_init(argc,argv); in = sf_input("in"); out = sf_output("out"); if (!sf_histint(in,"n1",&n1)) sf_error("No n1= in input"); if (!sf_histint(in,"n2",&n2)) sf_error("No n2= in input"); n12 = n1*n2; if (!sf_getint("rect",&rect)) rect=3; /* smoothing radius */ t = (rect*rect-1)/6.0; sf_runge_init(2,1,t/2); if (!sf_getint("order",&order)) order=3; /* interpolation order */ if (!sf_getfloat("tol",&tol[0])) tol[0]=0.1; /* error tolerance */ tol[1]=tol[0]; if (!sf_getint("niter",&niter)) niter=100; /* number of iterations */ if (!sf_getfloat("band",&band)) band=1.; /* narrow band */ img = sf_floatalloc2(n1,n2); grad = sf_floatalloc2(n1,n2); grad1 = sf_floatalloc2(n1,n2); grad2 = sf_floatalloc2(n1,n2); y = sf_floatalloc(n12); x = sf_floatalloc2(2,n12); g[0] = sf_eno2_init (order, n1, n2); g[1] = sf_eno2_init (order, n1, n2); sf_floatread(img[0],n12,in); /* compute gradient squared */ sf_sobel2 (n1,n2,img,grad); /* normalize by median */ for (i=0; i < n12; i++) { y[i] = grad[0][i]; } med = sf_quantile(n12/2,n12,y); for (i=0; i < n12; i++) { grad[0][i] = -0.5*logf(1.+grad[0][i]/med); } /* compute gradient */ sf_sobel (n1,n2,grad,grad1,grad2); sf_eno2_set (g[0], grad1); sf_eno2_set (g[1], grad2); /* convection */ i=0; for (i2=0; i2 < n2; i2++) { for (i1=0; i1 < n1; i1++) { if (fabsf(img[i2][i1]) < band) { x[i][0] = i1; x[i][1] = i2; t2 = sf_ode23 (t,tol, x[i], g, rhs, term); if (t2 >= t) { y[i] = img[i2][i1]; i++; } } } } /* diffusion */ sf_int2_init (x, 0,0,1,1,n1,n2, sf_lin_int, 2, i); sf_triangle2_init(rect,rect, n1, n2, 1); sf_conjgrad_init(n12, n12, i, i, 1.0/i, 1.e-8, true, false); sf_conjgrad(NULL, sf_int2_lop, sf_triangle2_lop, grad[0], img[0], y, niter); sf_floatwrite(img[0],n12,out); exit(0); }
int postings_update(struct postings* post, struct postings_docstats* stats) { struct postings_node* node = post->update; unsigned int terms = 0, dterms = 0; float weight = 0, fdt_log; while (node) { /* calculate document weight */ fdt_log = (float) logf((float) node->offsets); weight += (1 + fdt_log) * (1 + fdt_log); assert(node->offsets); assert(node->last_count != node->vecmem); assert(node->last_count > node->vecmem); assert((post->docno > node->last_docno) || (node->last_docno == -1)); /* check if we have to correct the count that we wrote before (1) */ if (node->offsets > 1) { unsigned int len = vec_vbyte_len(node->offsets); struct vec offsetvec; /* check if the count will expand in size */ if (len > 1) { /* check if we need to resize the vector */ if ((VEC_LEN(&node->vec) < len - 1) /* resize it */ && !postings_node_expand(node)) { return 0; } /* move offsets up to make room for expanded count */ assert(node->vec.pos > node->last_count); assert(node->vecmem < node->last_count); memmove(node->last_count + len, node->last_count + 1, node->vec.pos - (node->last_count + 1)); node->vec.pos += len - 1; post->size += len - 1; } /* point offsetvec to the correct location to write the correct * count */ offsetvec.pos = node->last_count; offsetvec.end = node->vec.end; len = vec_vbyte_write(&offsetvec, node->offsets); assert(len); } /* watch for overflow */ assert(node->occurs + node->offsets > node->occurs); node->occurs += node->offsets; terms += node->offsets; dterms++; node->offsets = 0; node->last_docno = post->docno; node->last_offset = -1; node->last_count = node->vecmem; node->docs++; node = node->update; } post->update = NULL; /* reset update list */ post->update_required = 0; stats->weight = (float) sqrtf(weight); stats->terms = terms; stats->distinct = dterms; return 1; }
/*Greedy method for data association & false positive models*/ void TrackAssociation::FindMatch(std::vector<AffinityVal> &affinity_mat, const std::vector<cv::Rect> &evidence, std::vector<int> &assign_match, std::vector<bool> &evidence_used, std::vector<bool> &model_used) { const float default_th = 0.25f; //match threshold const float match_pos = 0.3f; const float match_scale = 0.7f; const float match_app = 0.52f; // range from [0,1] //w/o app model const float match_pos_no_app = 0.8f; const float match_scale_no_app = 0.9f; size_t model_size = subTrackVector.size(); // for each sub object size_t evidence_size = evidence.size(); // external detection assign_match.assign(evidence_size, -1); // assign list is for each detection evidence model_used.assign(model_size,false); evidence_used.assign(evidence_size,false); for(size_t i = 0; i < affinity_mat.size(); ++i) { AffinityVal &aff = affinity_mat[i]; float probScale = aff.probScale; float probPos = aff.probPos; int index = aff.index; size_t n = index/model_size;//index of evidence size_t m = index-n*model_size;//index of model ObjSubTrack *subTrack = subTrackVector[m]; size_t missing_count = subTrack->missing_count; float missing_discount = 1; float missing_discount_scale = 1; // upper limit for relaxation if(missing_count >= 4) { missing_count = 4; missing_discount = logf(1+missing_count/2.0f)+1; } float scale_th; float pos_th; if (subTrack->appModel.valid) { scale_th = match_scale; pos_th = match_pos; }else {//for tracks without appearance model scale_th = match_scale_no_app; pos_th = match_pos_no_app; if (missing_count >= 1) { missing_discount = 1.09f; } } bool space_scale_match; //for tracked lost objs if (subTrack->appModel.valid && subTrack->appModel.tracker.tracking_lost) { //loose positional threshold bool pos_fall; pos_fall = ((subTrack->appModel.tracker.searchRegion & evidence[n]).area() / float(evidence[n].area())) > 0.0f; space_scale_match = pos_fall && probScale >= scale_th; } else { space_scale_match = probScale >= scale_th && probPos>= pos_th/missing_discount; } if(space_scale_match) { bool featureSupport = subTrack->TestFeatureSupport(objSeg,objSeg->frameNO,evidence[n]); if (featureSupport) { if(subTrack->appModel.valid) { float probApp = subTrack->appModel.TestHistSimi(this->frame_pool.back(),evidence[n]); float probHarr = subTrack->appModel.TestSimi(this->frame_pool.back(),evidence[n],true); probHarr = (probHarr + 1)/2;// to [0,1] aff.proApp = probApp + probHarr; }else //no valid appearance { aff.proApp = default_th; //default value } }else { aff.proApp = 0; } }else { aff.proApp = 0; } } //sort by appearance values std::sort(affinity_mat.begin(),affinity_mat.end(),MyCompareFunc); for (size_t i = 0; i < affinity_mat.size(); ++i) { AffinityVal &aff = affinity_mat[i]; int index = aff.index; int n = index/model_size;//index of evidence int m = index-n*model_size;//index of model float appVal = aff.proApp; if (appVal >= default_th)//above the threshold { if (!model_used[m] && !evidence_used[n])//both unused { assign_match[n] = m; model_used[m] = true; evidence_used[n] = true; } } } }
INLINE float log_f32(float x) {return logf(x);}
void immediate_options (int argc, char** argv) { if (get_env ("TEXMACS_HOME_PATH") == "") #ifdef __MINGW32__ if (get_env ("HOME") == "") set_env ("HOME", get_env("USERPROFILE")); set_env ("TEXMACS_HOME_PATH", get_env ("APPDATA") * "\\TeXmacs"); #else set_env ("TEXMACS_HOME_PATH", get_env ("HOME") * "/.TeXmacs"); #endif if (get_env ("TEXMACS_HOME_PATH") == "") return; for (int i=1; i<argc; i++) { string s= argv[i]; if ((N(s)>=2) && (s(0,2)=="--")) s= s (1, N(s)); if ((s == "-S") || (s == "-setup")) { remove (url ("$TEXMACS_HOME_PATH/system/settings.scm")); remove (url ("$TEXMACS_HOME_PATH/system/setup.scm")); remove (url ("$TEXMACS_HOME_PATH/system/cache") * url_wildcard ("*")); remove (url ("$TEXMACS_HOME_PATH/fonts/font-database.scm")); remove (url ("$TEXMACS_HOME_PATH/fonts/font-features.scm")); remove (url ("$TEXMACS_HOME_PATH/fonts/font-characteristics.scm")); remove (url ("$TEXMACS_HOME_PATH/fonts/error") * url_wildcard ("*")); } else if (s == "-delete-cache") remove (url ("$TEXMACS_HOME_PATH/system/cache") * url_wildcard ("*")); else if (s == "-delete-style-cache") remove (url ("$TEXMACS_HOME_PATH/system/cache") * url_wildcard ("__*")); else if (s == "-delete-font-cache") { remove (url ("$TEXMACS_HOME_PATH/system/cache/font_cache.scm")); remove (url ("$TEXMACS_HOME_PATH/fonts/font-database.scm")); remove (url ("$TEXMACS_HOME_PATH/fonts/font-features.scm")); remove (url ("$TEXMACS_HOME_PATH/fonts/font-characteristics.scm")); remove (url ("$TEXMACS_HOME_PATH/fonts/error") * url_wildcard ("*")); } else if (s == "-delete-doc-cache") { remove (url ("$TEXMACS_HOME_PATH/system/cache/doc_cache")); remove (url ("$TEXMACS_HOME_PATH/system/cache/dir_cache.scm")); remove (url ("$TEXMACS_HOME_PATH/system/cache/stat_cache.scm")); } else if (s == "-delete-file-cache") { remove (url ("$TEXMACS_HOME_PATH/system/cache/doc_cache")); remove (url ("$TEXMACS_HOME_PATH/system/cache/file_cache")); remove (url ("$TEXMACS_HOME_PATH/system/cache/dir_cache.scm")); remove (url ("$TEXMACS_HOME_PATH/system/cache/stat_cache.scm")); } else if (s == "-delete-plugin-cache") remove (url ("$TEXMACS_HOME_PATH/system/cache/plugin_cache.scm")); else if (s == "-delete-server-data") system ("rm -rf", url ("$TEXMACS_HOME_PATH/server")); else if (s == "-delete-databases") { system ("rm -rf", url ("$TEXMACS_HOME_PATH/system/database")); system ("rm -rf", url ("$TEXMACS_HOME_PATH/users")); } else if (s == "-log-file" && i + 1 < argc) { i++; char* log_file = argv[i]; tm_ostream logf (log_file); if (!logf->is_writable ()) cerr << "TeXmacs] Error: could not open " << log_file << "\n"; cout.redirect (logf); cerr.redirect (logf); } } }
float log2f(float x) { return logf(x) / 0.69314718246459960938f; }
//-------------------------------------------------------------------------------------- // Handle key presses //-------------------------------------------------------------------------------------- void CALLBACK OnKeyboard( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext ) { if( !bKeyDown || g_bDrawTerrain ) { return; } const FLOAT LogMoveSpeed = 0.05f; FLOAT CameraY = g_CameraPos.y; FLOAT CameraYMoved = expf( logf( CameraY ) + LogMoveSpeed ); FLOAT LinearMoveSpeed = CameraYMoved - CameraY; switch( nChar ) { case 'S': { float LogYPos = logf( CameraY ); LogYPos -= LogMoveSpeed; g_CameraPos.y = max( 0.001f, expf( LogYPos ) ); break; } case 'W': { float LogYPos = logf( CameraY ); LogYPos += LogMoveSpeed; g_CameraPos.y = expf( LogYPos ); break; } case VK_LEFT: g_CameraPos.x += LinearMoveSpeed; break; case VK_RIGHT: g_CameraPos.x -= LinearMoveSpeed; break; case VK_UP: g_CameraPos.z -= LinearMoveSpeed; break; case VK_DOWN: g_CameraPos.z += LinearMoveSpeed; break; case VK_BACK: g_pInspectionTexture = NULL; break; case VK_PRIOR: if( g_InspectionSliceIndex > 0 ) { --g_InspectionSliceIndex; } break; case VK_NEXT: if( g_pInspectionTexture != NULL ) { D3D11_TILED_TEXTURE2D_DESC TexDesc; g_pInspectionTexture->GetDesc( &TexDesc ); g_InspectionSliceIndex = min( (INT)TexDesc.ArraySize - 1, g_InspectionSliceIndex + 1 ); } break; } UpdateViewMatrix(); }
float MessageLog::performUnaryOperation(float input) { return (input <= 0.0f) ? 0.0f : logf(input); }
} rayseg_t; /* turn those verbose intrinsics into something readable. */ #define loadps(mem) _mm_load_ps((const float * const)(mem)) #define storess(ss,mem) _mm_store_ss((float * const)(mem),(ss)) #define minss _mm_min_ss #define maxss _mm_max_ss #define minps _mm_min_ps #define maxps _mm_max_ps #define mulps _mm_mul_ps #define subps _mm_sub_ps #define rotatelps(ps) _mm_shuffle_ps((ps),(ps), 0x39) /* a,b,c,d -> b,c,d,a */ #define muxhps(low,high) _mm_movehl_ps((low),(high)) /* low{a,b,c,d}|high{e,f,g,h} = {c,d,g,h} */ static const float float_plus_inf = -logf(0); /* let's keep C and C++ compilers happy. */ static const float _MM_ALIGN16 ps_cst_plus_inf[4] = { float_plus_inf, float_plus_inf, float_plus_inf, float_plus_inf }, ps_cst_minus_inf[4] = { -float_plus_inf, -float_plus_inf, -float_plus_inf, -float_plus_inf}; inline bool ray_box_intersect(const box_t & b, const ray_t & ray, rayseg_t & rs) { /* you may already have those values hanging around somewhere */ const __m128 plus_inf = loadps(ps_cst_plus_inf), minus_inf = loadps(ps_cst_minus_inf); /* use whatever's apropriate to load. */ const __m128 box_min = loadps(&b.min), box_max = loadps(&b.max), pos = loadps(&ray.pos), inv_dir = loadps(&ray.inv_dir);
myIDirectDraw2::myIDirectDraw2(IDirectDraw2 * aOriginal) { logf("myIDirectDraw2 ctor\n"); mOriginal = aOriginal; }
int main (int argc, char* argv[]) { int n, n1, n2, i1, i2; float g, s, v0, v, x, z, a, d1, d2, o1, o2; float **vel, **time; bool intime; sf_file out; sf_init (argc,argv); out = sf_output("out"); if (!sf_getint("n1",&n1)) { /* vertical samples */ if (!sf_getint("n",&n)) sf_error("Need n="); /* number of samples */ n1 = n+1; } if (!sf_getint("n2",&n2)) { /* horizontal samples */ if (!sf_getint("n",&n)) sf_error("Need n="); /* number of samples */ n2 = 2*n+1; } if (!sf_getfloat("g",&g)) g = 1.; /* velocity gradient */ if (!sf_getfloat("v0",&v0)) v0 = 0.5; /* initial velocity */ if (!sf_getfloat("s",&s)) s = 0.5; /* shot location at the surface */ if (!sf_getfloat("d1",&d1)) d1 = 0.5/(n1-1); /* vertical sampling */ if (!sf_getfloat("d2",&d2)) d2 = 1./(n2-1); /* horizontal sampling */ if (!sf_getfloat("o1",&o1)) o1 = 0.; /* vertical origin */ if (!sf_getfloat("o2",&o2)) o2 = 0.; /* horizontal origin */ if (!sf_getbool("intime",&intime)) intime = false; /* if in vertical time coordinates */ a = 0.5*g*g/v0; sf_putint(out,"n1",n1); sf_putfloat(out,"d1",d1); sf_putfloat(out,"o1",0.); sf_putint(out,"n2",n2); sf_putfloat(out,"d2",d2); sf_putfloat(out,"o2",0.); sf_putint(out,"n3",2); sf_setformat(out,"native_float"); vel = sf_floatalloc2 (n1,n2); time = sf_floatalloc2 (n1,n2); for (i2 = 0; i2 < n2; i2++) { x = o2+i2*d2 - s; x = x*x; for (i1 = 0; i1 < n1; i1++) { z = o1+i1*d1; if (intime) z = v0*(expf(g*z)-1.)/g; v = v0 + g*z; z = 1. + a*(z*z+x)/v; vel[i2][i1] = v; time[i2][i1] = fabsf(logf(z + sqrtf(z*z-1.))/g); } } sf_floatwrite(vel[0], n1*n2,out); sf_floatwrite(time[0],n1*n2,out); exit (0); }
myIDirectDraw2::~myIDirectDraw2() { logf("myIDirectDraw2 dtor\n"); }
float log2f( float n ) { // logb (x) = (loga(x)) / (loga(B)) return logf(n) / logf(2); }
float jnf(int n, float x) { uint32_t ix; int nm1, sign, i; float a, b, temp; GET_FLOAT_WORD(ix, x); sign = ix >> 31; ix &= 0x7fffffff; if (ix > 0x7f800000) /* nan */ return x; /* J(-n,x) = J(n,-x), use |n|-1 to avoid overflow in -n */ if (n == 0) return j0f(x); if (n < 0) { nm1 = -(n + 1); x = -x; sign ^= 1; } else nm1 = n - 1; if (nm1 == 0) return j1f(x); sign &= n; /* even n: 0, odd n: signbit(x) */ x = fabsf(x); if (ix == 0 || ix == 0x7f800000) /* if x is 0 or inf */ b = 0.0f; else if (nm1 < x) { /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */ a = j0f(x); b = j1f(x); for (i = 0; i < nm1;) { i++; temp = b; b = b * (2.0f * i / x) - a; a = temp; } } else { if (ix < 0x35800000) { /* x < 2**-20 */ /* x is tiny, return the first Taylor expansion of J(n,x) * J(n,x) = 1/n!*(x/2)^n - ... */ if (nm1 > 8) /* underflow */ nm1 = 8; temp = 0.5f * x; b = temp; a = 1.0f; for (i = 2; i <= nm1 + 1; i++) { a *= (float)i; /* a = n! */ b *= temp; /* b = (x/2)^n */ } b = b / a; } else { /* use backward recurrence */ /* x x^2 x^2 * J(n,x)/J(n-1,x) = ---- ------ ------ ..... * 2n - 2(n+1) - 2(n+2) * * 1 1 1 * (for large x) = ---- ------ ------ ..... * 2n 2(n+1) 2(n+2) * -- - ------ - ------ - * x x x * * Let w = 2n/x and h=2/x, then the above quotient * is equal to the continued fraction: * 1 * = ----------------------- * 1 * w - ----------------- * 1 * w+h - --------- * w+2h - ... * * To determine how many terms needed, let * Q(0) = w, Q(1) = w(w+h) - 1, * Q(k) = (w+k*h)*Q(k-1) - Q(k-2), * When Q(k) > 1e4 good for single * When Q(k) > 1e9 good for double * When Q(k) > 1e17 good for quadruple */ /* determine k */ float t, q0, q1, w, h, z, tmp, nf; int k; nf = nm1 + 1.0f; w = 2 * nf / x; h = 2 / x; z = w + h; q0 = w; q1 = w * z - 1.0f; k = 1; while (q1 < 1.0e4f) { k += 1; z += h; tmp = z * q1 - q0; q0 = q1; q1 = tmp; } for (t = 0.0f, i = k; i >= 0; i--) t = 1.0f / (2 * (i + nf) / x - t); a = t; b = 1.0f; /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n) * Hence, if n*(log(2n/x)) > ... * single 8.8722839355e+01 * double 7.09782712893383973096e+02 * long double 1.1356523406294143949491931077970765006170e+04 * then recurrent value may overflow and the result is * likely underflow to zero */ tmp = nf * logf(fabsf(w)); if (tmp < 88.721679688f) { for (i = nm1; i > 0; i--) { temp = b; b = 2.0f * i * b / x - a; a = temp; } } else { for (i = nm1; i > 0; i--) { temp = b; b = 2.0f * i * b / x - a; a = temp; /* scale b to avoid spurious overflow */ if (b > 0x1p60f) { a /= b; t /= b; b = 1.0f; } } } z = j0f(x); w = j1f(x); if (fabsf(z) >= fabsf(w)) b = t * z / b; else b = t * w / a; } } return sign ? -b : b; }
inline float operator()(const float& x, const float& y) const { return logf(x)/logf(y); }
// returns false and sets g_errno on error bool Title::setTitle ( Xml *xml, Words *words, int32_t maxTitleLen, Query *query, LinkInfo *linkInfo, Url *firstUrl, const char *filteredRootTitleBuf, int32_t filteredRootTitleBufSize, uint8_t contentType, uint8_t langId, int32_t niceness ) { // make Msg20.cpp faster if it is just has // Msg20Request::m_setForLinkInfo set to true, no need to extricate a title. if ( maxTitleLen <= 0 ) { return true; } m_niceness = niceness; m_maxTitleLen = maxTitleLen; // if this is too big the "first line" algo can be huge!!! // and really slow everything way down with a huge title candidate int32_t maxTitleWords = 128; // assume no title reset(); int32_t NW = words->getNumWords(); // // now get all the candidates // // . allow up to 100 title CANDIDATES // . "as" is the word # of the first word in the candidate // . "bs" is the word # of the last word IN the candidate PLUS ONE int32_t n = 0; int32_t as[MAX_TIT_CANDIDATES]; int32_t bs[MAX_TIT_CANDIDATES]; float scores[MAX_TIT_CANDIDATES]; Words *cptrs[MAX_TIT_CANDIDATES]; int32_t types[MAX_TIT_CANDIDATES]; int32_t parent[MAX_TIT_CANDIDATES]; // record the scoring algos effects float baseScore [MAX_TIT_CANDIDATES]; float noCapsBoost [MAX_TIT_CANDIDATES]; float qtermsBoost [MAX_TIT_CANDIDATES]; float inCommonCandBoost[MAX_TIT_CANDIDATES]; // reset these for ( int32_t i = 0 ; i < MAX_TIT_CANDIDATES ; i++ ) { // assume no parent parent[i] = -1; } // xml and words class for each link info, rss item Xml tx[MAX_TIT_CANDIDATES]; Words tw[MAX_TIT_CANDIDATES]; int32_t ti = 0; // restrict how many link texts and rss blobs we check for titles // because title recs like www.google.com have hundreds and can // really slow things down to like 50ms for title generation int32_t kcount = 0; int32_t rcount = 0; //int64_t x = gettimeofdayInMilliseconds(); // . get every link text // . TODO: repeat for linkInfo2, the imported link text for ( Inlink *k = NULL; linkInfo && (k = linkInfo->getNextInlink(k)) ; ) { // breathe QUICKPOLL(m_niceness); // fast skip check for link text if ( k->size_linkText >= 3 && ++kcount >= 20 ) continue; // fast skip check for rss item if ( k->size_rssItem > 10 && ++rcount >= 20 ) continue; // set Url Url u; u.set( k->getUrl(), k->size_urlBuf ); // is it the same host as us? bool sh = true; // skip if not from same host and should be if ( firstUrl->getHostLen() != u.getHostLen() ) { sh = false; } // skip if not from same host and should be if ( strncmp( firstUrl->getHost(), u.getHost(), u.getHostLen() ) ) { sh = false; } // get the link text if ( k->size_linkText >= 3 ) { char *p = k->getLinkText(); int32_t plen = k->size_linkText - 1; if ( ! verifyUtf8 ( p , plen ) ) { log("title: set4 bad link text from url=%s", k->getUrl()); continue; } // now the words. if ( !tw[ti].set( k->getLinkText(), k->size_linkText - 1, true, 0 ) ) { return false; } // set the bookends, it is the whole thing cptrs [n] = &tw[ti]; as [n] = 0; bs [n] = tw[ti].getNumWords(); // score higher if same host if ( sh ) scores[n] = 1.05; // do not count so high if remote! else scores[n] = 0.80; // set the type if ( sh ) types [n] = TT_LINKTEXTLOCAL; else types [n] = TT_LINKTEXTREMOTE; // another candidate n++; // use xml and words ti++; // break out if too many already. save some for below. if ( n + 30 >= MAX_TIT_CANDIDATES ) break; } // get the rss item if ( k->size_rssItem <= 10 ) continue; // . returns false and sets g_errno on error // . use a 0 for niceness if ( ! k->setXmlFromRSS ( &tx[ti] , 0 ) ) return false; // get the word range int32_t tslen; bool isHtmlEnc; char *ts = tx[ti].getRSSTitle ( &tslen , &isHtmlEnc ); // skip if not in the rss if ( ! ts ) continue; // skip if empty if ( tslen <= 0 ) continue; // now set words to that if ( !tw[ti].set( ts, tslen, true, 0 ) ) { return false; } // point to that cptrs [n] = &tw[ti]; as [n] = 0; bs [n] = tw[ti].getNumWords(); // increment since we are using it ti++; // base score for rss title if ( sh ) scores[n] = 5.0; // if not same host, treat like link text else scores[n] = 2.0; // set the type if ( sh ) types [n] = TT_RSSITEMLOCAL; else types [n] = TT_RSSITEMREMOTE; // advance n++; // break out if too many already. save some for below. if ( n + 30 >= MAX_TIT_CANDIDATES ) break; } //logf(LOG_DEBUG,"title: took1=%" PRId64,gettimeofdayInMilliseconds()-x); //x = gettimeofdayInMilliseconds(); // . set the flags array // . indicates what words are in title candidates already, but // that is set below // . up here we set words that are not allowed to be in candidates, // like words that are in a link that is not a self link // . alloc for it char *flags = NULL; char localBuf[10000]; int32_t need = words->getNumWords(); if ( need <= 10000 ) { flags = (char *)localBuf; } else { flags = (char *)mmalloc(need,"TITLEflags"); } if ( ! flags ) { return false; } // clear it memset ( flags , 0 , need ); // check tags in body nodeid_t *tids = words->getTagIds(); // scan to set link text flags // loop over all "words" in the html body char inLink = false; char selfLink = false; for ( int32_t i = 0 ; i < NW ; i++ ) { // breathe QUICKPOLL(m_niceness); // if in a link that is not self link, cannot be in a candidate if ( inLink && ! selfLink ) { flags[i] |= 0x02; } // out of a link if ( tids[i] == (TAG_A | BACKBIT) ) { inLink = false; } // if not start of <a> tag, skip it if ( tids[i] != TAG_A ) { continue; } // flag it inLink = true; // get the node in the xml int32_t xn = words->getNodes()[i]; // is it a self link? int32_t len; char *link = xml->getString(xn,"href",&len); // . set the url class to this // . TODO: use the base url in the doc Url u; u.set( link, len, true, false ); // compare selfLink = u.equals ( firstUrl ); // skip if not selfLink if ( ! selfLink ) { continue; } // if it is a selflink , check for an "onClick" tag in the // anchor tag to fix that Mixx issue for: // http://www.npr.org/templates/story/story.php?storyId=5417137 int32_t oclen; char *oc = xml->getString(xn,"onclick",&oclen); if ( ! oc ) { oc = xml->getString(xn,"onClick",&oclen); } // assume not a self link if we see that... if ( oc ) { selfLink = false; } // if this <a href> link has a "title" attribute, use that // instead! that thing is solid gold. int32_t atlen; char *atitle = xml->getString(xn,"title",&atlen); // stop and use that, this thing is gold! if ( ! atitle || atlen <= 0 ) { continue; } // craziness? ignore it... if ( atlen > 400 ) { continue; } // if it contains permanent, permalink or share, ignore it! if ( strncasestr ( atitle, "permalink", atlen ) || strncasestr ( atitle,"permanent", atlen) || strncasestr ( atitle,"share", atlen) ) { continue; } // do not count the link text as viable selfLink = false; // aw, dammit if ( ti >= MAX_TIT_CANDIDATES ) { continue; } // other dammit if ( n >= MAX_TIT_CANDIDATES ) { break; } // ok, process it if ( ! tw[ti].set ( atitle, atlen, true, 0 )) { return false; } // set the bookends, it is the whole thing cptrs [n] = &tw[ti]; as [n] = 0; bs [n] = tw[ti].getNumWords(); scores [n] = 3.0; // not ALWAYS solid gold! types [n] = TT_TITLEATT; // we are using the words class ti++; // advance n++; // break out if too many already. save some for below. if ( n + 20 >= MAX_TIT_CANDIDATES ) { break; } } //logf(LOG_DEBUG,"title: took2=%" PRId64,gettimeofdayInMilliseconds()-x); //x = gettimeofdayInMilliseconds(); //int64_t *wids = WW->getWordIds(); // . find the last positive scoring guy // . do not consider title candidates after "r" if "r" is non-zero // . FIXES http://larvatusprodeo.net/2009/01/07/partisanship-politics-and-participation/ // the candidate # of the title tag int32_t tti = -1; // allow up to 4 tags from each type char table[512]; // sanity check if ( getNumXmlNodes() > 512 ) { g_process.shutdownAbort(true); } // clear table counts memset ( table , 0 , 512 ); // the first word char *wstart = NULL; if ( NW > 0 ) { wstart = words->getWord(0); } // loop over all "words" in the html body for ( int32_t i = 0 ; i < NW ; i++ ) { // come back up here if we encounter another "title-ish" tag // within our first alleged "title-ish" tag subloop: // stop after 30k of text if ( words->getWord(i) - wstart > 200000 ) { break; // 1106 } // get the tag id minus the back tag bit nodeid_t tid = tids[i] & BACKBITCOMP; // pen up and pen down for these comment like tags if ( tid == TAG_SCRIPT || tid == TAG_STYLE ) { // ignore "titles" in script or style tags if ( ! (tids[i] & BACKBIT) ) { continue; } } /// @todo ALC we should allow more tags than just link // skip if not a good tag. we're already checking for title tag in Title::setTitleFromTags if (tid != TAG_A) { continue; } // must NOT be a back tag if ( tids[i] & BACKBIT ) { continue; } // skip if we hit our limit if ( table[tid] >= 4 ) { continue; } // skip over tag/word #i i++; // no words in links, unless it is a self link if ( i < NW && (flags[i] & 0x02) ) { continue; } // the start should be here int32_t start = -1; // do not go too far int32_t max = i + 200; // find the corresponding back tag for it for ( ; i < NW && i < max ; i++ ) { // hey we got it, BUT we got no alnum word first // so the thing was empty, so loop back to subloop if ( (tids[i] & BACKBITCOMP) == tid && (tids[i] & BACKBIT ) && start == -1 ) { goto subloop; } // if we hit another title-ish tag, loop back up if ( (tids[i] & BACKBITCOMP) == TAG_TITLE || (tids[i] & BACKBITCOMP) == TAG_A ) { // if no alnum text, restart at the top if ( start == -1 ) { goto subloop; } // otherwise, break out and see if title works break; } // if we hit a breaking tag... if ( isBreakingTagId ( tids[i] & BACKBITCOMP ) && // do not consider <span> tags breaking for // our purposes. i saw a <h1><span> setup before. tids[i] != TAG_SPAN ) { break; } // skip if not alnum word if ( ! words->isAlnum(i) ) { continue; } // if we hit an alnum word, break out if ( start == -1 ) { start = i; } } // if no start was found, must have had a 0 score in there if ( start == -1 ) { continue; } // if we exhausted the doc, we are done if ( i >= NW ) { break; } // skip if way too big! if ( i >= max ) { continue; } // if was too long do not consider a title if ( i - start > 300 ) { continue; } // . skip if too many bytes // . this does not include the length of word #i, but #(i-1) if ( words->getStringSize ( start , i ) > 1000 ) { continue; } // count it table[tid]++; // max it out if we are positive scoring. stop after the // first positive scoring guy in a section. this might // hurt the "Hamlet" thing though... // store a point to the title tag guy. Msg20.cpp needs this // because the zak's proximity algo uses it in Summary.cpp // and in Msg20.cpp // only get the first one! often the 2nd on is in an iframe!! which we now expand into here. if ( tid == TAG_TITLE && m_titleTagStart == -1 ) { m_titleTagStart = start; m_titleTagEnd = i; // save the candidate # because we always use this // as the title if we are a root if ( tti < 0 ) { tti = n; } } // point to words class of the body that was passed in to us cptrs[n] = words; as[n] = start; bs[n] = i; if ( tid == TAG_B ) { types[n] = TT_BOLDTAG; scores[n] = 1.0; } else if ( tid == TAG_H1 ) { types[n] = TT_HTAG; scores[n] = 1.8; } else if ( tid == TAG_H2 ) { types[n] = TT_HTAG; scores[n] = 1.7; } else if ( tid == TAG_H3 ) { types[n] = TT_HTAG; scores[n] = 1.6; } else if ( tid == TAG_TITLE ) { types[n] = TT_TITLETAG; scores[n] = 3.0; } else if ( tid == TAG_DIV ) { types[n] = TT_DIVTAG; scores[n] = 1.0; } else if ( tid == TAG_TD ) { types[n] = TT_TDTAG; scores[n] = 1.0; } else if ( tid == TAG_P ) { types[n] = TT_PTAG; scores[n] = 1.0; } else if ( tid == TAG_FONT ) { types[n] = TT_FONTTAG; scores[n] = 1.0; } else if ( tid == TAG_A ) { types[n] = TT_ATAG; // . self link is very powerful BUT // http://www.npr.org/templates/story/story.php?storyId=5417137 // doesn't use it right! so use // 1.3 instead of 3.0. that has an "onClick" thing in the // <a> tag, so check for that! // this was bad for // http://www.spiritualwoman.net/?cat=191 // so i am demoting from 3.0 to 1.5 scores[n] = 1.5; } // count it n++; // start loop over at tag #i, for loop does an i++, so negate // that so this will work i--; // break out if too many already. save some for below. if ( n + 10 >= MAX_TIT_CANDIDATES ) { break; } } //logf(LOG_DEBUG,"title: took3=%" PRId64,gettimeofdayInMilliseconds()-x); //x = gettimeofdayInMilliseconds(); // to handle text documents, throw in the first line of text // as a title candidate, just make the score really low bool textDoc = (contentType == CT_UNKNOWN || contentType == CT_TEXT); if (textDoc) { // make "i" point to first alphabetical word in the document int32_t i ; for ( i = 0 ; i < NW && !words->isAlpha(i) ; i++); // if we got a first alphabetical word, then assume that to be the start of our title if ( i < NW && n < MAX_TIT_CANDIDATES ) { // first word in title is "t0" int32_t t0 = i; // find end of first line int32_t numWords = 0; // set i to the end now. we MUST find a \n to terminate the // title, otherwise we will not have a valid title while (i < NW && numWords < maxTitleWords && (words->isAlnum(i) || !words->hasChar(i, '\n'))) { if(words->isAlnum(i)) { numWords++; } ++i; } // "t1" is the end int32_t t1 = -1; // we must have found our \n in order to set "t1" if (i <= NW && numWords < maxTitleWords ) { t1 = i; } // set the ptrs cptrs [n] = words; // this is the last resort i guess... scores [n] = 0.5; types [n] = TT_FIRSTLINE; as [n] = t0; bs [n] = t1; // add it as a candidate if t0 and t1 were valid if (t0 >= 0 && t1 > t0) { n++; } } } //logf(LOG_DEBUG,"title: took4=%" PRId64,gettimeofdayInMilliseconds()-x); //x = gettimeofdayInMilliseconds(); { // now add the last url path to contain underscores or hyphens char *pstart = firstUrl->getPath(); // get first url Url *fu = firstUrl; // start at the end char *p = fu->getUrl() + fu->getUrlLen(); // end pointer char *pend = NULL; // come up here for each path component while ( p >= pstart ) { // save end pend = p; // skip over / if ( *p == '/' ) { p--; } // now go back to next / int32_t count = 0; for ( ; p >= pstart && *p !='/' ; p-- ) { if ( *p == '_' || *p == '-' ) { count++; } } // did we get it? if ( count > 0 ) { break; } } // did we get any? if ( p > pstart && n < MAX_TIT_CANDIDATES ) { // now set words to that if ( ! tw[ti].set ( p, (pend - p), true, 0 )) { return false; } // point to that cptrs [n] = &tw[ti]; as [n] = 0; bs [n] = tw[ti].getNumWords(); scores [n] = 1.0; types [n] = TT_URLPATH; // increment since we are using it ti++; // advance n++; } } // save old n int32_t oldn = n; // . do not split titles if we are a root url maps.yahoo.com was getting "Maps" for the title if ( firstUrl->isRoot() ) { oldn = -2; } // point to list of \0 separated titles const char *rootTitleBuf = NULL; const char *rootTitleBufEnd = NULL; // get the root title if we are not root! if (filteredRootTitleBuf) { #ifdef _VALGRIND_ VALGRIND_CHECK_MEM_IS_DEFINED(filteredRootTitleBuf,filteredRootTitleBufSize); #endif // point to list of \0 separated titles rootTitleBuf = filteredRootTitleBuf; rootTitleBufEnd = filteredRootTitleBuf + filteredRootTitleBufSize; } { // convert into an array int32_t nr = 0; const char *pr = rootTitleBuf; const char *rootTitles[20]; int32_t rootTitleLens[20]; // loop over each root title segment for ( ; pr && pr < rootTitleBufEnd ; pr += strnlen(pr,rootTitleBufEnd-pr) + 1 ) { // if we had a query... if ( query ) { Matches m; m.setQuery ( query ); // see if root title segment has query terms in it m.addMatches ( const_cast<char*>(pr), strnlen(pr,rootTitleBufEnd-pr), MF_TITLEGEN, m_niceness ); // if matches query, do NOT add it, we only add it for // removing from the title of the page... if ( m.getNumMatches() ) { continue; } } // point to it. it should start with an alnum already // since it is the "filtered" list of root titles... // if not, fix it in xmldoc then. rootTitles [nr] = pr; rootTitleLens[nr] = strlen(pr); // advance nr++; // no breaching if ( nr >= 20 ) break; } // now split up candidates in children candidates by tokenizing // using :, | and - as delimters. // the hyphen must have a space on at least one side, so "cd-rom" does // not create a pair of tokens... // FIX: for the title: // Best Careers 2009: Librarian - US News and World Report // we need to recognize "Best Careers 2009: Librarian" as a subtitle // otherwise we don't get it as the title. so my question is are we // going to have to do all the permutations at some point? for now // let's just add in pairs... for ( int32_t i = 0 ; i < oldn && n + 3 < MAX_TIT_CANDIDATES ; i++ ) { // stop if no root title segments if ( nr <= 0 ) break; // get the word info Words *w = cptrs[i]; int32_t a = as[i]; int32_t b = bs[i]; // init int32_t lasta = a; char prev = false; // char length in bytes //int32_t charlen = 1; // see how many we add int32_t added = 0; char *skipTo = NULL; bool qualified = true; // . scan the words looking for a token // . sometimes the candidates end in ": " so put in "k < b-1" // . made this from k<b-1 to k<b to fix // "Hot Tub Time Machine (2010) - IMDb" to strip IMDb for ( int32_t k = a ; k < b && n + 3 < MAX_TIT_CANDIDATES; k++){ // get word char *wp = w->getWord(k); // skip if not alnum if ( ! w->isAlnum(k) ) { // in order for next alnum word to // qualify for "clipping" if it matches // the root title, there has to be more // than just spaces here, some punct. // otherwise title // "T. D. Jakes: Biography from Answers.com" // becomes // "T. D. Jakes: Biography from" qualified=isWordQualified(wp,w->getWordLen(k)); continue; } // gotta be qualified! if ( ! qualified ) continue; // skip if in root title if ( skipTo && wp < skipTo ) continue; // does this match any root page title segments? int32_t j; for ( j = 0 ; j < nr ; j++ ) { // . compare to root title // . break out if we matched! if ( ! strncmp( wp, rootTitles[j], rootTitleLens[j] ) ) { break; } } // if we did not match a root title segment, // keep on chugging if ( j >= nr ) continue; // . we got a root title match! // . skip over skipTo = wp + rootTitleLens[j]; // must land on qualified punct then!! int32_t e = k+1; for ( ; e<b && w->getWord(e)<skipTo ; e++ ); // ok, word #e must be a qualified punct if ( e<b && ! isWordQualified(w->getWord(e),w->getWordLen(e))) // assume no match then!! continue; // if we had a previous guy, reset the end of the // previous candidate if ( prev ) { bs[n-2] = k; bs[n-1] = k; } // . ok, we got two more candidates // . well, only one more if this is not the 1st time if ( ! prev ) { cptrs [n] = cptrs [i]; scores [n] = scores [i]; types [n] = types [i]; as [n] = lasta; bs [n] = k; parent [n] = i; n++; added++; } // the 2nd one cptrs [n] = cptrs [i]; scores [n] = scores [i]; types [n] = types [i]; as [n] = e + 1; bs [n] = bs [i]; parent [n] = i; n++; added++; // now add in the last pair as a whole token cptrs [n] = cptrs [i]; scores [n] = scores [i]; types [n] = types [i]; as [n] = lasta; bs [n] = bs [i]; parent [n] = i; n++; added++; // nuke the current candidate then since it got // split up to not contain the root title... //cptrs[i] = NULL; // update this lasta = k+1; // if we encounter another delimeter we will have to revise bs[n-1], so note that prev = true; } // nuke the current candidate then since it got // split up to not contain the root title... if ( added ) { scores[i] = 0.001; //cptrs[i] = NULL; } // erase the pair if that there was only one token if ( added == 3 ) n--; } } for ( int32_t i = 0 ; i < n ; i++ ) baseScore[i] = scores[i]; // // . now punish by 0.85 for every lower case non-stop word it has // . reward by 1.1 if has a non-stopword in the query // for ( int32_t i = 0 ; i < n ; i++ ) { // point to the words Words *w = cptrs[i]; // skip if got nuked above if ( ! w ) { continue; } // the word ptrs char **wptrs = w->getWordPtrs(); // skip if empty if ( w->getNumWords() <= 0 ) { continue; } // get the word boundaries int32_t a = as[i]; int32_t b = bs[i]; // record the boosts float ncb = 1.0; float qtb = 1.0; // a flag char uncapped = false; // scan the words in this title candidate for ( int32_t j = a ; j < b ; j++ ) { // skip stop words if ( w->isQueryStopWord( j, langId ) ) { continue; } // punish if uncapitalized non-stopword if ( ! w->isCapitalized(j) ) { uncapped = true; } // skip if no query if ( ! query ) { continue; } int64_t wid = w->getWordId(j); // reward if in the query if ( query->getWordNum(wid) >= 0 ) { qtb *= 1.5; scores[i] *= 1.5; } } // . only punish once if missing a capitalized word hurts us for: // http://content-uk.cricinfo.com/ausvrsa2008_09/engine/current/match/351682.html if ( uncapped ) { ncb *= 1.00; scores[i] *= 1.00; } // punish if a http:// title thingy char *s = wptrs[a]; int32_t size = w->getStringSize(a,b); if ( size > 9 && memcmp("http://", s, 7) == 0 ) { ncb *= .10; } if ( size > 14 && memcmp("h\0t\0t\0p\0:\0/\0/", s, 14) == 0 ) { ncb *= .10; } // set these guys scores[i] *= ncb; noCapsBoost[i] = ncb; qtermsBoost[i] = qtb; } // . now compare each candidate to the other candidates // . give a boost if matches for ( int32_t i = 0 ; i < n ; i++ ) { // point to the words Words *w1 = cptrs[i]; // skip if got nuked above if ( ! w1 ) { continue; } int32_t a1 = as[i]; int32_t b1 = bs[i]; // reset some flags char localFlag1 = 0; char localFlag2 = 0; // record the boost float iccb = 1.0; // total boost float total = 1.0; // to each other candidate for ( int32_t j = 0 ; j < n ; j++ ) { // not to ourselves if ( j == i ) { continue; } // or our derivatives if ( parent[j] == i ) { continue; } // or derivates to their parent if ( parent[i] == j ) { continue; } // only check parents now. do not check kids. // this was only for when doing percent contained // not getSimilarity() per se //if ( parent[j] != -1 ) continue; // TODO: do not accumulate boosts from a parent // and its kids, subtitles... // // do not compare type X to type Y if ( types[i] == TT_TITLETAG ) { if ( types[j] == TT_TITLETAG ) { continue; } } // do not compare a div candidate to another div cand // http://friendfeed.com/foxiewire?start=30 // likewise, a TD to another TD // http://content-uk.cricinfo.com/ausvrsa2008_09/engine/match/351681.html // ... etc. if ( types[i] == TT_BOLDTAG || types[i] == TT_HTAG || types[i] == TT_DIVTAG || types[i] == TT_TDTAG || types[i] == TT_FONTTAG ) { if ( types[j] == types[i] ) continue; } // . do not compare one kid to another kid // . i.e. if we got "x | y" as a title and "x | z" // as a link text, it will emphasize "x" too much // http://content-uk.cricinfo.com/ausvrsa2008_09/engine/current/match/351682.html if ( parent[j] != -1 && parent[i] != -1 ) continue; // . body type tags are mostly mutually exclusive // . for the legacy.com url mentioned below, we have // good stuff in <td> tags, so this hurts us... // . but for the sake of // http://larvatusprodeo.net/2009/01/07/partisanship-politics-and-participation/ // i put bold tags back if ( types[i] == TT_LINKTEXTLOCAL ) { if ( types[j] == TT_LINKTEXTLOCAL ) continue; } if ( types[i] == TT_RSSITEMLOCAL ) { if ( types[j] == TT_RSSITEMLOCAL ) continue; } // only compare to one local link text for each i if ( types[j] == TT_LINKTEXTLOCAL && localFlag1 ) { continue; } if ( types[j] == TT_RSSITEMLOCAL && localFlag2 ) { continue; } if ( types[j] == TT_LINKTEXTLOCAL ) { localFlag1 = 1; } if ( types[j] == TT_RSSITEMLOCAL ) { localFlag2 = 1; } // not link title attr to link title attr either // fixes http://www.spiritualwoman.net/?cat=191 if ( types[i] == TT_TITLEATT && types[j] == TT_TITLEATT ) continue; // get our words Words *w2 = cptrs[j]; // skip if got nuked above if ( ! w2 ) continue; int32_t a2 = as [j]; int32_t b2 = bs [j]; // how similar is title #i to title #j ? float fp = getSimilarity ( w2 , a2 , b2 , w1 , a1 , b1 ); // error? if ( fp == -1.0 ) return false; // custom boosting... float boost = 1.0; if ( fp >= .95 ) boost = 3.0; else if ( fp >= .90 ) boost = 2.0; else if ( fp >= .85 ) boost = 1.5; else if ( fp >= .80 ) boost = 1.4; else if ( fp >= .75 ) boost = 1.3; else if ( fp >= .70 ) boost = 1.2; else if ( fp >= .60 ) boost = 1.1; else if ( fp >= .50 ) boost = 1.08; else if ( fp >= .40 ) boost = 1.04; // limit total total *= boost; if ( total > 100.0 ) break; // if you are matching the url path, that is pretty // good so give more! // actually, that would hurt: // http://michellemalkin.com/2008/12/29/gag-worthy/ // custom boosting! if ( fp > 0.0 && g_conf.m_logDebugTitle ) logf(LOG_DEBUG,"title: i=%" PRId32" j=%" PRId32" fp=%.02f " "b=%.02f", i,j,fp,boost); // apply it scores[i] *= boost; iccb *= boost; } inCommonCandBoost[i] = iccb; } //logf(LOG_DEBUG,"title: took7=%" PRId64,gettimeofdayInMilliseconds()-x); //x = gettimeofdayInMilliseconds(); // loop over all n candidates for ( int32_t i = 0 ; i < n ; i++ ) { // skip if not in the document body if ( cptrs[i] != words ) continue; // point to the words int32_t a1 = as [i]; int32_t b1 = bs [i]; // . loop through this candidates words // . TODO: use memset here? for ( int32_t j = a1 ; j <= b1 && j < NW ; j++ ) { // flag it flags[j] |= 0x01; } } // free our stuff if ( flags!=localBuf ) { mfree (flags, need, "TITLEflags"); } // now get the highest scoring candidate title float max = -1.0; int32_t winner = -1; for ( int32_t i = 0 ; i < n ; i++ ) { // skip if got nuked if ( ! cptrs[i] ) { continue; } if ( winner != -1 && scores[i] <= max ) { continue; } // url path's cannot be titles in and of themselves if ( types[i] == TT_URLPATH ) { continue; } // skip if empty basically, like if title was exact // copy of root, then the whole thing got nuked and // some empty string added, where a > b if ( as[i] >= bs[i] ) { continue; } // got one max = scores[i]; // save it winner = i; } // if we are a root, always pick the title tag as the title if ( oldn == -2 && tti >= 0 ) { winner = tti; } // if no winner, all done. no title if ( winner == -1 ) { // last resort use file name if ((contentType == CT_PDF) && (firstUrl->getFilenameLen() != 0)) { Words w; w.set(firstUrl->getFilename(), firstUrl->getFilenameLen(), true); if (!copyTitle(&w, 0, w.getNumWords())) { return false; } } return true; } // point to the words class of the winner Words *w = cptrs[winner]; // skip if got nuked above if ( ! w ) { g_process.shutdownAbort(true); } // need to make our own Pos class if title not from body Pos tp; if ( w != words ) { // set "Scores" ptr to NULL. we assume all are positive scores if ( ! tp.set ( w ) ) { return false; } } // the string ranges from word #a up to and including word #b int32_t a = as[winner]; int32_t b = bs[winner]; // sanity check if ( a < 0 || b > w->getNumWords() ) { g_process.shutdownAbort(true); } // save the title if ( ! copyTitle(w, a, b) ) { return false; } /* // debug logging SafeBuf sb; SafeBuf *pbuf = &sb; log("title: candidates for %s",xd->getFirstUrl()->getUrl() ); pbuf->safePrintf("<div stype=\"border:1px solid black\">"); pbuf->safePrintf("<b>***Finding Title***</b><br>\n"); pbuf->safePrintf("<table cellpadding=5 border=2><tr>" "<td colspan=20><center><b>Title Generation</b>" "</center></td>" "</tr>\n<tr>" "<td>#</td>" "<td>type</td>" "<td>parent</td>" "<td>base score</td>" "<td>format penalty</td>" "<td>query term boost</td>" "<td>candidate intersection boost</td>" "<td>FINAL SCORE</td>" "<td>title</td>" "</tr>\n" ); // print out all candidates for ( int32_t i = 0 ; i < n ; i++ ) { char *ts = "unknown"; if ( types[i] == TT_LINKTEXTLOCAL ) ts = "local inlink text"; if ( types[i] == TT_LINKTEXTREMOTE ) ts = "remote inlink text"; if ( types[i] == TT_RSSITEMLOCAL ) ts = "local rss title"; if ( types[i] == TT_RSSITEMREMOTE ) ts = "remote rss title"; if ( types[i] == TT_BOLDTAG ) ts = "bold tag"; if ( types[i] == TT_HTAG ) ts = "header tag"; if ( types[i] == TT_TITLETAG ) ts = "title tag"; if ( types[i] == TT_FIRSTLINE ) ts = "first line in text"; if ( types[i] == TT_FONTTAG ) ts = "font tag"; if ( types[i] == TT_ATAG ) ts = "anchor tag"; if ( types[i] == TT_DIVTAG ) ts = "div tag"; if ( types[i] == TT_TDTAG ) ts = "td tag"; if ( types[i] == TT_PTAG ) ts = "p tag"; if ( types[i] == TT_URLPATH ) ts = "url path"; if ( types[i] == TT_TITLEATT ) ts = "title attribute"; // get the title pbuf->safePrintf( "<tr>" "<td>#%" PRId32"</td>" "<td><nobr>%s</nobr></td>" "<td>%" PRId32"</td>" "<td>%0.2f</td>" // baseScore "<td>%0.2f</td>" "<td>%0.2f</td>" "<td>%0.2f</td>" "<td>%0.2f</td>" "<td>", i, ts , parent[i], baseScore[i], noCapsBoost[i], qtermsBoost[i], inCommonCandBoost[i], scores[i]); // ptrs Words *w = cptrs[i]; int32_t a = as[i]; int32_t b = bs[i]; // skip if no words if ( w->getNumWords() <= 0 ) continue; // the word ptrs char **wptrs = w->getWordPtrs(); // string ptrs char *ptr = wptrs[a];//w->getWord(a); int32_t size = w->getStringSize(a,b); // it is utf8 pbuf->safeMemcpy ( ptr , size ); // end the line pbuf->safePrintf("</td></tr>\n"); } pbuf->safePrintf("</table>\n<br>\n"); // log these for now log("title: %s",sb.getBufStart()); */ return true; }