⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int_fuzz.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: Int_fuzz.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:32:23  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.12 * PRODUCTION * =========================================================================== *//* $Id: Int_fuzz.cpp,v 1000.2 2004/06/01 19:32:23 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Author:  ....... * * File Description: *   ....... * * Remark: *   This code was originally generated by application DATATOOL *   using specifications from the ASN data definition file *   'general.asn'. * * =========================================================================== */// standard includes// generated includes#include <ncbi_pch.hpp>#include <objects/general/Int_fuzz.hpp>#include <algorithm>#include <set>#include <math.h>// generated classesBEGIN_NCBI_SCOPEBEGIN_objects_SCOPE // namespace ncbi::objects::// destructorCInt_fuzz::~CInt_fuzz(void){}void CInt_fuzz::GetLabel(string* label, TSeqPos pos, bool right) const{    char lim = 0;    switch (Which()) {    case CInt_fuzz::e_P_m:        (*label) += "<+-" + NStr::IntToString(GetP_m()) + ">";        break;    case CInt_fuzz::e_Range:        (*label) += "<" + NStr::IntToString(GetRange().GetMin()) +            "." + NStr::IntToString(GetRange().GetMax()) + ">";        break;    case CInt_fuzz::e_Pct:        (*label) += "<" + NStr::IntToString(GetPct()) + "%>";        break;    case CInt_fuzz::e_Lim:        switch (GetLim()) {        case eLim_unk:        case eLim_other:            (*label) += "<?>";            break;        case eLim_gt:            lim = '>';            break;        case eLim_lt:            lim = '<';            break;        case eLim_tr:            lim = 'r';            break;        case eLim_tl:            lim = '^';            break;        default:            break;        }        break;    default:        break;    }    if (lim  &&  lim != 'r') {        (*label) += lim;        lim = 0;    }    if (right) {        (*label) += NStr::IntToString(pos + 1);    }    if (lim == 'r') {        (*label) += '^';    }    if (!right) {        (*label) += NStr::IntToString(pos + 1);    }}void CInt_fuzz::AssignTranslated(const CInt_fuzz& f2, TSeqPos n1, TSeqPos n2){    switch (f2.Which()) {    case e_Range:        SetRange().SetMin(f2.GetRange().GetMin() + n1 - n2);        SetRange().SetMax(f2.GetRange().GetMax() + n1 - n2);        break;    case e_Pct:        // use double to avoid overflow        SetPct((TSeqPos)((double)f2.GetPct() * n1 / n2));        break;    case e_Alt:        ITERATE (TAlt, it, f2.GetAlt()) {            SetAlt().push_back(*it + n1 - n2);        }        break;    default:        Assign(f2);        break;    }}void CInt_fuzz::Add(const CInt_fuzz& f2, TSeqPos& n1, TSeqPos n2,                    ECombine mode){    static const double kInfinity = 1.0e20;    bool                hit_pct = false, hit_unk = false, hit_circle = false;    double              min_delta = 0.0, max_delta = 0.0;    set<TSignedSeqPos>  offsets;    for (int i = 0;  i < 2;  ++i) {        const CInt_fuzz& f = i ? f2 : *this;        TSeqPos          n = i ? n2 : n1;        switch (f.Which()) {        case e_P_m:            min_delta -= f.GetP_m();            max_delta += f.GetP_m();            break;        case e_Range:            min_delta -= n - f.GetRange().GetMin();            max_delta += f.GetRange().GetMax() - n;            break;        case e_Pct:            min_delta -= 0.001 * n * f.GetPct();            max_delta += 0.001 * n * f.GetPct();            hit_pct = true;            break;        case e_Lim:            switch (f.GetLim()) {            case eLim_unk:                hit_unk   = (!hit_unk  ||  mode != eReduce);                min_delta = -kInfinity;                // fall through            case eLim_gt:                max_delta = kInfinity;                break;            case eLim_lt:                min_delta = -kInfinity;                break;            case eLim_tr:                min_delta += 0.5;                max_delta += 0.5;                break;            case eLim_tl:                min_delta -= 0.5;                max_delta -= 0.5;                break;            case eLim_circle:                hit_circle = (!hit_circle  ||  mode != eReduce);                break;            default:                break;            }            break;        case e_Alt:        {            if (f.GetAlt().empty()) {                break;            }            if (offsets.empty()) {                ITERATE (TAlt, it, f.GetAlt()) {                    offsets.insert(*it - n);                }            } else if (mode == eReduce) {                // possibly too optimistic; endpoints may balance better                // than interior points                min_delta = max_delta = f.GetAlt().front();                ITERATE (TAlt, it, f.GetAlt()) {                    if (*it < min_delta) {                        min_delta = *it;                    } else if (*it > max_delta) {                        max_delta = *it;                    }                }                min_delta += *offsets.rbegin();                max_delta += *offsets.begin();                offsets.clear();            } else {                set<TSignedSeqPos> offsets0(offsets);                offsets.clear();                ITERATE (set<TSignedSeqPos>, it, offsets0) {                    ITERATE (TAlt, it2, f.GetAlt()) {                        offsets.insert(*it + *it2 - n);                    }                }            }            break;        }        default:            break;        }        if (mode == eReduce  &&  max_delta - min_delta < kInfinity / 2) {            swap(min_delta, max_delta);        }    }    if (min_delta > max_delta) {        swap(min_delta, max_delta);    }    TSignedSeqPos min_delta_sp = TSignedSeqPos(floor(min_delta + 0.5));    TSignedSeqPos max_delta_sp = TSignedSeqPos(floor(max_delta + 0.5));    if (min_delta < -kInfinity / 2) {        if (max_delta > kInfinity / 2) {            if ( /* mode == eReduce  && */ !hit_unk ) {                // assume cancellation                SetP_m(0);            } else {                SetLim(eLim_unk);            }        } else {            if ( !offsets.empty() ) {                n1 += *offsets.rbegin();            }            n1 += max_delta_sp;            SetLim(eLim_lt);        }    } else if (max_delta > kInfinity / 2) {        if ( !offsets.empty() ) {            n1 += *offsets.begin();        }        n1 += min_delta_sp;        SetLim(eLim_gt);    } else if ( !offsets.empty() ) {        if (max_delta - min_delta < 0.5) {            TAlt& alt = SetAlt();            alt.clear();            ITERATE(set<TSignedSeqPos>, it, offsets) {                alt.push_back(n1 + *it + min_delta_sp);                }        } else if (mode == eReduce) {            TRange& r = SetRange();            min_delta += *offsets.rbegin();            max_delta += *offsets.begin();            if (min_delta > max_delta) {                swap(min_delta, max_delta);            }            r.SetMin(n1 + min_delta_sp);            r.SetMax(n1 + max_delta_sp);        } else {            // assume there's enough spread to cover any gaps                TRange& r = SetRange();                r.SetMin(n1 + min_delta_sp + *offsets.begin());                r.SetMax(n1 + max_delta_sp + *offsets.rbegin());        }    } else if (max_delta - min_delta < 0.5) { // single point identified        double delta  = 0.5 * (min_delta + max_delta);        double rdelta = floor(delta + 0.5);        n1 += (TSignedSeqPos)rdelta;        if (delta - rdelta > 0.25) {            SetLim(eLim_tr);        } else if (delta - rdelta < -0.25) {            SetLim(eLim_tl);        } else if (hit_circle) {            SetLim(eLim_circle);        } else {            SetP_m(0);        }    } else if (hit_pct) {        n1 += (TSignedSeqPos)floor(0.5 * (min_delta + max_delta + 1));        SetPct((TSeqPos)floor(500.0 * (max_delta - min_delta) / n1 + 0.5));    } else if (min_delta + max_delta < 0.5) { // symmetric        SetP_m(max_delta_sp);    } else {        TRange& r = SetRange();        r.SetMin(n1 + min_delta_sp);        r.SetMax(n1 + max_delta_sp);    }}void CInt_fuzz::Negate(TSeqPos n){    switch (Which()) {    case e_P_m:    case e_Pct:        break; // already symmetric    case e_Range:    {        TRange& r       = SetRange();        TSeqPos old_max = r.GetMax();        r.SetMax(n + n - r.GetMin());        r.SetMin(n + n - old_max);        break;    }    case e_Lim:        switch (GetLim()) {        case eLim_gt:  SetLim(eLim_lt);  break;        case eLim_lt:  SetLim(eLim_gt);  break;        case eLim_tr:  SetLim(eLim_tl);  break;        case eLim_tl:  SetLim(eLim_tr);  break;        default:       break;        }        break;    case e_Alt:        NON_CONST_ITERATE(TAlt, it, SetAlt()) {            *it = n + n - *it;        }        break;    default:        break;    }}END_objects_SCOPE // namespace ncbi::objects::END_NCBI_SCOPE/* * =========================================================================== * * $Log: Int_fuzz.cpp,v $ * Revision 1000.2  2004/06/01 19:32:23  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.12 * * Revision 6.12  2004/05/19 17:21:39  gorelenk * Added include of PCH - ncbi_pch.hpp * * Revision 6.11  2004/04/12 16:51:46  vasilche * Fixed conversion warnings. * * Revision 6.10  2004/01/06 14:36:06  dicuccio * Removed unnecessary #include of ncbiapp.hpp and ncbireg.hpp.  Added <set> where * needed. * * Revision 6.9  2003/10/15 19:07:09  ucko * Fix some logic errors with lt/gt limits in CInt_fuzz::Add * * Revision 6.8  2003/10/15 17:37:15  ucko * Fix a couple of instances of unintentional fall-through. * * Revision 6.7  2003/10/15 16:22:24  ucko * Sigh, add missing parenthesis. * * Revision 6.6  2003/10/15 16:20:09  ucko * portability fixes to use of double in CInt_fuzz::Add * * Revision 6.5  2003/10/15 15:43:07  ucko * Add more operations: AssignTranslated, Add, Subtract, and Negate/Negative. * * Revision 6.4  2002/12/26 12:46:37  dicuccio * Removed spurious dependency on Seq_point.hpp * * Revision 6.3  2002/10/08 18:52:21  clausen * Changed TSeqPos from 0 based to 1 based in GetLabel() * * Revision 6.2  2002/10/03 19:11:02  clausen * Removed extra whitespace * * Revision 6.1  2002/10/03 16:47:26  clausen * Added GetLabel() * * =========================================================================== *//* Original file checksum: lines: 61, chars: 1885, CRC32: bf6aceba */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -