void Foam::binaryTree<CompType, ThermoType>::binaryTreeSearch ( const scalarField& phiq, bn* node, chP*& nearest ) { if (size_ > 1) { scalar vPhi=0.0; const scalarField& v = node->v(); const scalar& a = node->a(); // compute v*phi for (label i=0; i<phiq.size(); i++) vPhi += phiq[i]*v[i]; if (vPhi > a) // on right side (side of the newly added point) { if (node->nodeRight()!=nullptr) { binaryTreeSearch(phiq, node->nodeRight(), nearest); } else // the terminal node is reached, store leaf on the right { nearest = node->leafRight(); return; } } else // on left side (side of the previously stored point) { if (node->nodeLeft()!=nullptr) { binaryTreeSearch(phiq, node->nodeLeft(), nearest); } else // the terminal node is reached, return element on right { nearest = node->leafLeft(); return; } } } // only one point stored (left element of the root) else if (size_ == 1) { nearest = root_->leafLeft(); } else // no point stored { nearest = nullptr; } }
int Dictionnary::findFirstIndexOfPrefix(const string & prefix) const { //int index = linearSearch(prefix); //int index = binarySearch(prefix); int index = binaryTreeSearch(prefix); /* if (index != index2) { cout << "index / index2 " << index << "/" << index2 << endl; exit(0); } */ return index; }
void Foam::binaryTree<CompType, ThermoType>::insertNewLeaf ( const scalarField& phiq, const scalarField& Rphiq, const scalarSquareMatrix& A, const scalarField& scaleFactor, const scalar& epsTol, const label nCols, chP*& phi0 ) { if (size_ == 0) // no points are stored { // create an empty binary node and point root_ to it root_ = new bn(); // create the new chemPoint which holds the composition point // phiq and the data to initialize the EOA chP* newChemPoint = new chP ( chemistry_, phiq, Rphiq, A, scaleFactor, epsTol, nCols, coeffsDict_, root_ ); root_->leafLeft()=newChemPoint; } else // at least one point stored { // no reference chemPoint, a BT search is required if (phi0 == nullptr) { binaryTreeSearch(phiq, root_,phi0); } // access to the parent node of the chemPoint bn* parentNode = phi0->node(); // create the new chemPoint which holds the composition point // phiq and the data to initialize the EOA chP* newChemPoint = new chP ( chemistry_, phiq, Rphiq, A, scaleFactor, epsTol, nCols, coeffsDict_ ); // insert new node on the parent node in the position of the // previously stored leaf (phi0) // the new node contains phi0 on the left and phiq on the right // the hyper plane is computed in the binaryNode constructor bn* newNode; if (size_>1) { newNode = new bn(phi0, newChemPoint, parentNode); // make the parent of phi0 point to the newly created node insertNode(phi0, newNode); } else // size_ == 1 (because not equal to 0) { // when size is 1, the binaryNode is without hyperplane deleteDemandDrivenData(root_); newNode = new bn(phi0, newChemPoint, nullptr); root_ = newNode; } phi0->node() = newNode; newChemPoint->node()=newNode; } size_++; }