From: Bo P. <be...@gm...> - 2011-10-20 21:44:49
|
So you are gradually removing special handling of compressed vector? Bo On Thu, Oct 20, 2011 at 4:37 PM, <ti...@us...> wrote: > Revision: 4323 > http://simupop.svn.sourceforge.net/simupop/?rev=4323&view=rev > Author: tiwcpe8 > Date: 2011-10-20 21:37:23 +0000 (Thu, 20 Oct 2011) > Log Message: > ----------- > print(pop.genotype()) > print( > > Modified Paths: > -------------- > branches/mutant_new/setup.py > branches/mutant_new/src/mutant_vector.h > branches/mutant_new/src/population.cpp > branches/mutant_new/src/population.h > branches/mutant_new/src/simuPOP_common.i > > Modified: branches/mutant_new/setup.py > =================================================================== > --- branches/mutant_new/setup.py 2011-10-19 18:58:15 UTC (rev 4322) > +++ branches/mutant_new/setup.py 2011-10-20 21:37:23 UTC (rev 4323) > @@ -200,8 +200,8 @@ > 'population.h', > # 'simulator.h', > # 'mating.h', > -# 'operator.h', > -# 'initializer.h', > + 'operator.h', > + 'initializer.h', > # 'migrator.h', > # 'outputer.h', > # 'selector.h', > @@ -223,8 +223,8 @@ > 'population.cpp', > # 'simulator.cpp', > # 'mating.cpp', > -# 'operator.cpp', > -# 'initializer.cpp', > + 'operator.cpp', > + 'initializer.cpp', > # 'migrator.cpp', > # 'outputer.cpp', > # 'selector.cpp', > > Modified: branches/mutant_new/src/mutant_vector.h > =================================================================== > --- branches/mutant_new/src/mutant_vector.h 2011-10-19 18:58:15 UTC (rev 4322) > +++ branches/mutant_new/src/mutant_vector.h 2011-10-20 21:37:23 UTC (rev 4323) > @@ -25,6 +25,17 @@ > m_container.resize(size); > } > > + mutant_vector(size_t size, const T& value) > + { > + if (value == 0) > + m_container.resize(size, value); > + else { > + m_container.resize(size,size); > + for ( size_t i = 0; i < size; i++) > + m_container.push_back(i, value); > + } > + } > + > void resize (size_t size) > { > m_container.resize(size); > @@ -59,7 +70,10 @@ > return mutant_vector<T>::iterator(const_cast<compressed_vector<T> *>(&m_container), m_container.size()); > } > > - > + typename compressed_vector<T>::reference operator [] (size_t i) > + { > + return m_container[i]; > + } > > void swap(mutant_vector<T> & vec) > { > @@ -67,6 +81,7 @@ > > } > > + > compressed_vector<T> & getContainer() > { > return m_container; > @@ -160,7 +175,7 @@ > > typename compressed_vector<T>::reference operator [] (const size_t i) > { > - return (*m_container)[i]; > + return (*m_container)[m_index + i]; > } > > /// CPPONLY pre-incrment return by-reference > > Modified: branches/mutant_new/src/population.cpp > =================================================================== > --- branches/mutant_new/src/population.cpp 2011-10-19 18:58:15 UTC (rev 4322) > +++ branches/mutant_new/src/population.cpp 2011-10-20 21:37:23 UTC (rev 4323) > @@ -550,7 +550,7 @@ > #endif > } > */ > -/* > + > PyObject * Population::genotype(vspID subPopID) > { > > @@ -569,25 +569,17 @@ > syncIndPointers(); > if (!vsp.valid()) { > // directly expose values. Do not copy data over. > -#ifdef MUTANTALLELE > - return Allele_Vec_As_NumArray(&m_genotype, 0, m_genotype.size()); > -#else > return Allele_Vec_As_NumArray(m_genotype.begin(), m_genotype.end()); > -#endif > } else { > size_t subPop = vsp.subPop(); > CHECKRANGESUBPOP(subPop); > // directly expose values. Do not copy data over. > -#ifdef MUTANTALLELE > - return Allele_Vec_As_NumArray(&m_genotype, genoBegin(subPop,true), genoEnd(subPop, true)); > -#else > return Allele_Vec_As_NumArray(genoBegin(subPop, true), genoEnd(subPop, true)); > -#endif > } > return NULL; > } > -*/ > > + > void Population::setGenotype(const uintList & genoList, vspID subPopID) > { > const vectoru & geno = genoList.elems(); > @@ -1087,7 +1079,7 @@ > } > } > > -/* > + > void Population::removeMarkedIndividuals() > { > syncIndPointers(); > @@ -1099,13 +1091,8 @@ > RawIndIterator newInd = m_inds.begin(); > InfoIterator oldInfoPtr = m_info.begin(); > InfoIterator newInfoPtr = m_info.begin(); > -#ifdef MUTANTALLELE > - size_t oldPtr = 0; > - size_t newPtr = 0; > -#else > GenoIterator oldPtr = m_genotype.begin(); > GenoIterator newPtr = m_genotype.begin(); > -#endif > // > for (size_t sp = 0; sp < numSubPop(); ++sp) { > size_t newSize = 0; > @@ -1117,7 +1104,7 @@ > if (oldInd != newInd) { > *newInd = *oldInd; > #ifdef MUTANTALLELE > - copyGenotype(m_genotype, oldPtr, oldPtr + step, m_genotype, newPtr); > + simuPOP::copy(oldPtr, oldPtr + step, newPtr); > #else > copy(oldPtr, oldPtr + step, newPtr); > #endif > @@ -1135,30 +1122,20 @@ > } > // > m_inds.erase(newInd, m_inds.end()); > -#ifdef MUTANTALLELE > - eraseGenotype(m_genotype, newPtr, m_genotype.size()); > -#else > m_genotype.erase(newPtr, m_genotype.end()); > -#endif > m_info.erase(newInfoPtr, m_info.end()); > m_popSize = std::accumulate(new_size.begin(), new_size.end(), size_t(0)); > setSubPopStru(new_size, m_subPopNames); > // > InfoIterator infoPtr = m_info.begin(); > -#ifdef MUTANTALLELE > - size_t idx = 0; > - for (size_t i = 0; i < m_popSize; ++i, idx += step, infoPtr += infoStep) { > - m_inds[i].setGenoPtr(&m_genotype, idx); > -#else > GenoIterator ptr = m_genotype.begin(); > for (size_t i = 0; i < m_popSize; ++i, ptr += step, infoPtr += infoStep) { > m_inds[i].setGenoPtr(ptr); > -#endif > m_inds[i].setInfoPtr(infoPtr); > } > } > -*/ > -/* > + > + > void Population::removeIndividuals(const uintList & indexList, const floatList & IDList, > const string & idField, PyObject * filter) > { > @@ -1241,7 +1218,6 @@ > } > useAncestralGen(curGen); > } > -*/ > > > size_t Population::mergeSubPops(const uintList & subPops, const string & name) > @@ -1351,7 +1327,7 @@ > return sps[0]; > } > > -/* > + > void Population::addChromFrom(const Population & pop) > { > size_t numLoci1 = totNumLoci(); > @@ -1369,55 +1345,39 @@ > // > DBG_FAILIF(m_subPopSize != pop.m_subPopSize, ValueError, > "Can not add chromosomes from a population with different subpopulation sizes"); > -#ifdef MUTANTALLELE > - compressed_vectora newGenotype(genoSize() * m_popSize); > - // append pop2 chromosomes to the first one > - size_t idx = 0; > -#else > vectora newGenotype(genoSize() * m_popSize); > // append pop2 chromosomes to the first one > GenoIterator ptr = newGenotype.begin(); > -#endif > > size_t pEnd = ploidy(); > for (size_t i = 0; i < m_popSize; ++i) { > // set new geno structure > m_inds[i].setGenoStruIdx(genoStruIdx()); > -#ifdef MUTANTALLELE > - size_t idx1 = m_inds[i].genoIdx(); > - size_t idx2 = pop.m_inds[i].genoIdx(); > - for (size_t p = 0; p < pEnd; ++p) { > - for (size_t j = 0; j < numLoci1; ++j) > - assignGenotype(newGenotype, idx++, m_genotype, idx1++); > - for (size_t j = 0; j < numLoci2; ++j) > - assignGenotype(newGenotype, idx++, pop.m_genotype, idx2++); > - } > - > -#else > GenoIterator ptr1 = m_inds[i].genoPtr(); > GenoIterator ptr2 = pop.m_inds[i].genoPtr(); > m_inds[i].setGenoPtr(ptr); > for (size_t p = 0; p < pEnd; ++p) { > for (size_t j = 0; j < numLoci1; ++j) > - *(ptr++) = *(ptr1++); > + *(ptr++) = *(ptr1++); //assignGenotype > for (size_t j = 0; j < numLoci2; ++j) > - *(ptr++) = *(ptr2++); > + *(ptr++) = *(ptr2++); //assignGenotype > } > -#endif > + > } > m_genotype.swap(newGenotype); > #ifdef MUTANTALLELE > // compressed_vectora must be setGenoPtr after swap > - for (size_t i = 0, idx = 0; i < m_popSize; idx += genoSize(), ++i) > - m_inds[i].setGenoPtr(&m_genotype, idx); > + ptr = m_genotype.begin(); > + for (size_t i = 0; i < m_popSize; ++i, ptr += genoSize()) > + m_inds[i].setGenoPtr(ptr); > #endif > } > if (!indOrdered()) > // sort information only > syncIndPointers(true); > } > -*/ > > + > /* > void Population::addIndFrom(const Population & pop) > { > @@ -1484,7 +1444,7 @@ > "subpopulation names can either be empty, or be specified for all subpopulations."); > } > */ > -/* > + > void Population::addLociFrom(const Population & pop) > { > DBG_FAILIF(ancestralGens() != pop.ancestralGens(), ValueError, > @@ -1505,32 +1465,14 @@ > DBG_FAILIF(m_subPopSize != pop.m_subPopSize, ValueError, > "Can not add chromosomes from a population with different subpopulation sizes"); > // > -#ifdef MUTANTALLELE > - compressed_vectora newGenotype(genoSize() * m_popSize); > - // merge chromosome by chromosome > - size_t idx = 0; > -#else > vectora newGenotype(genoSize() * m_popSize); > // merge chromosome by chromosome > GenoIterator ptr = newGenotype.begin(); > -#endif > size_t pEnd = ploidy(); > size_t newSize = totNumLoci(); > for (size_t i = 0; i < m_popSize; ++i) { > // set new geno structure > m_inds[i].setGenoStruIdx(genoStruIdx()); > -#ifdef MUTANTALLELE > - size_t idx1 = m_inds[i].genoIdx(); > - size_t idx2 = pop.m_inds[i].genoIdx(); > - // copy each allele > - for (size_t p = 0; p < pEnd; ++p) { > - for (size_t i = 0; i < size1; ++i) > - assignGenotype(newGenotype, idx + indexes1[i], m_genotype, idx1++); > - for (size_t i = 0; i < size2; ++i) > - assignGenotype(newGenotype, idx + indexes2[i], pop.m_genotype, idx2++); > - idx += newSize; > - } > -#else > GenoIterator ptr1 = m_inds[i].genoPtr(); > GenoIterator ptr2 = pop.m_inds[i].genoPtr(); > // new genotype > @@ -1538,27 +1480,26 @@ > // copy each allele > for (size_t p = 0; p < pEnd; ++p) { > for (size_t i = 0; i < size1; ++i) > - ptr[indexes1[i]] = *(ptr1++); > + ptr[indexes1[i]] = *(ptr1++); //assignGenotype > for (size_t i = 0; i < size2; ++i) > - ptr[indexes2[i]] = *(ptr2++); > + ptr[indexes2[i]] = *(ptr2++); //assignGenotype > ptr += newSize; > } > -#endif > } > m_genotype.swap(newGenotype); > #ifdef MUTANTALLELE > // compressed_vectora must be setGenoPtr after swap > - for (size_t i = 0, idx = 0; i < m_popSize; idx += genoSize(), ++i) > - m_inds[i].setGenoPtr(&m_genotype, idx); > + ptr = m_genotype.begin(); > + for (size_t i = 0; i < m_popSize; ++i, ptr += genoSize()) > + m_inds[i].setGenoPtr(ptr); > #endif > } > > // sort information only > syncIndPointers(true); > } > -*/ > > -/* > + > void Population::addChrom(const floatList & lociPosList, const stringList & lociNameList, > const string & chromName, const stringMatrix & alleleNames, > size_t chromType) > @@ -1579,32 +1520,17 @@ > for (int depth = ancestralGens(); depth >= 0; --depth) { > useAncestralGen(depth); > size_t newPopGenoSize = genoSize() * m_popSize; > -#ifdef MUTANTALLELE > - compressed_vectora newGenotype(newPopGenoSize, 0); > - > - // copy data over > - size_t newIdx = 0; > -#else > vectora newGenotype(newPopGenoSize, 0); > > // copy data over > GenoIterator newPtr = newGenotype.begin(); > -#endif > > size_t pEnd = ploidy(); > size_t gap = totNumLoci() - oldNumLoci; > for (size_t i = 0; i < m_popSize; ++i) { > // set new geno structure > m_inds[i].setGenoStruIdx(genoStruIdx()); > -#ifdef MUTANTALLELE > - size_t oldIdx = m_inds[i].genoIdx(); > - // copy each chromosome > - for (size_t p = 0; p < pEnd; ++p) { > - for (size_t i = 0; i < oldNumLoci; ++i) > - assignGenotype(newGenotype, newIdx++, m_genotype, oldIdx++); > - newIdx += gap; > - } > -#else > + > GenoIterator oldPtr = m_inds[i].genoPtr(); > // new genotype > m_inds[i].setGenoPtr(newPtr); > @@ -1614,13 +1540,14 @@ > *(newPtr++) = *(oldPtr++); > newPtr += gap; > } > -#endif > + > } > m_genotype.swap(newGenotype); > #ifdef MUTANTALLELE > // compressed_vectora must be setGenoPtr after swap > - for (size_t i = 0, idx = 0; i < m_popSize; idx += genoSize(), ++i) > - m_inds[i].setGenoPtr(&m_genotype, idx); > + GenoIterator ptr = m_genotype.begin(); > + for (size_t i = 0; i < m_popSize; ++i, ptr += genoSize()) > + m_inds[i].setGenoPtr(ptr); > #endif > > } > @@ -1630,8 +1557,8 @@ > // so that the order is set to True. > syncIndPointers(true); > } > -*/ > -/* > + > + > vectoru Population::addLoci(const uintList & chromList, const floatList & posList, > const stringList & lociNameList, const stringMatrix & alleleNamesMatrix) > { > @@ -1662,29 +1589,13 @@ > useAncestralGen(depth); > // > size_t newPopGenoSize = genoSize() * m_popSize; > -#ifdef MUTANTALLELE > - compressed_vectora newGenotype(newPopGenoSize, 0); > - // copy data over > - size_t newIdx = 0; > -#else > vectora newGenotype(newPopGenoSize, 0); > // copy data over > GenoIterator newPtr = newGenotype.begin(); > -#endif > size_t pEnd = ploidy(); > for (size_t i = 0; i < m_popSize; ++i) { > // set new geno structure > m_inds[i].setGenoStruIdx(genoStruIdx()); > -#ifdef MUTANTALLELE > - size_t oldIdx = m_inds[i].genoIdx(); > - // copy each chromosome > - for (size_t p = 0; p < pEnd; ++p) { > - vectoru::iterator loc = loci.begin(); > - for (; loc != loci.end(); ++loc) > - assignGenotype(newGenotype, newIdx + *loc, m_genotype, oldIdx++); > - newIdx += totNumLoci(); > - } > -#else > GenoIterator oldPtr = m_inds[i].genoPtr(); > // new genotype > m_inds[i].setGenoPtr(newPtr); > @@ -1692,16 +1603,16 @@ > for (size_t p = 0; p < pEnd; ++p) { > vectoru::iterator loc = loci.begin(); > for (; loc != loci.end(); ++loc) > - newPtr[*loc] = *(oldPtr++); > + newPtr[*loc] = *(oldPtr++); //assignGenotype > newPtr += totNumLoci(); > } > -#endif > } > m_genotype.swap(newGenotype); > #ifdef MUTANTALLELE > // compressed_vectora must be setGenoPtr after swap > - for (size_t i = 0, idx = 0; i < m_popSize; idx += genoSize(), ++i) > - m_inds[i].setGenoPtr(&m_genotype, idx); > + GenoIterator ptr = m_genotype.begin(); > + for (size_t i = 0; i < m_popSize; ++i, ptr += genoSize()) > + m_inds[i].setGenoPtr(ptr); > #endif > } > // if indOrdered is false: > @@ -1711,7 +1622,7 @@ > syncIndPointers(true); > return newIndex; > } > -*/ > + > /* > void Population::resize(const uintList & sizeList, bool propagate) > { > @@ -2461,7 +2372,7 @@ > return pop; > } > */ > -/* > + > void Population::removeLoci(const lociList & removeList, const lociList & keepList) > { > if (removeList.unspecified() && keepList.unspecified()) > @@ -2497,29 +2408,13 @@ > for (int depth = ancestralGens(); depth >= 0; --depth) { > useAncestralGen(depth); > // > -#ifdef MUTANTALLELE > - compressed_vectora newGenotype(genoSize() * m_popSize); > - // copy data over > - size_t newIdx = 0; > -#else > vectora newGenotype(genoSize() * m_popSize); > // copy data over > GenoIterator newPtr = newGenotype.begin(); > -#endif > size_t pEnd = ploidy(); > for (size_t i = 0; i < m_popSize; ++i) { > // set new geno structure > m_inds[i].setGenoStruIdx(genoStruIdx()); > -#ifdef MUTANTALLELE > - size_t oldIdx = m_inds[i].genoIdx(); > - for (size_t p = 0; p < pEnd; ++p) { > - vectoru::iterator loc = kept.begin(); > - for (; loc != kept.end(); ++loc) > - // this line needs ordered kept array > - assignGenotype(newGenotype, newIdx++, m_genotype, oldIdx + *loc); > - oldIdx += oldTotNumLoci; > - } > -#else > GenoIterator oldPtr = m_inds[i].genoPtr(); > // new genotype > m_inds[i].setGenoPtr(newPtr); > @@ -2527,21 +2422,21 @@ > vectoru::iterator loc = kept.begin(); > for (; loc != kept.end(); ++loc) > // this line needs ordered kept array > - *(newPtr++) = oldPtr[*loc]; > + *(newPtr++) = oldPtr[*loc]; //assginGenotype > oldPtr += oldTotNumLoci; > } > -#endif > } > m_genotype.swap(newGenotype); > #ifdef MUTANTALLELE > // compressed_vectora must be setGenoPtr after swap > - for (size_t i = 0, idx = 0; i < m_popSize; idx += genoSize(), ++i) > - m_inds[i].setGenoPtr(&m_genotype, idx); > + GenoIterator ptr = m_genotype.begin(); > + for (size_t i = 0; i < m_popSize; ++i, ptr += genoSize()) > + m_inds[i].setGenoPtr(ptr); > #endif > } > setIndOrdered(true); > } > -*/ > + > /* > void Population::recodeAlleles(const uintListFunc & newAlleles, const lociList & loci_, > const stringMatrix & alleleNamesMatrix) > > Modified: branches/mutant_new/src/population.h > =================================================================== > --- branches/mutant_new/src/population.h 2011-10-19 18:58:15 UTC (rev 4322) > +++ branches/mutant_new/src/population.h 2011-10-20 21:37:23 UTC (rev 4323) > @@ -973,7 +973,7 @@ > * subpopulation \e subPop. Virtual subpopulation is unsupported. > * <group>5-genotype</group> > */ > -// PyObject * genotype(vspID subPop = vspID()); > + PyObject * genotype(vspID subPop = vspID()); > > /** Fill the genotype of all individuals in a population (if > * <tt>subPop=[]</tt>) or in a (virtual) subpopulation \e subPop (if > @@ -1029,7 +1029,7 @@ > void removeSubPops(const subPopList & subPops); > > /// CPPONLY > -// void removeMarkedIndividuals(); > + void removeMarkedIndividuals(); > > /** remove individual(s) by absolute indexes (parameter \e index) or > * their IDs (parameter \e IDs), or using a filter function (paramter > @@ -1050,9 +1050,9 @@ > * kept even if all individuals from it are removed. > * <group>7-manipulate</group> > */ > -// void removeIndividuals(const uintList & indexes = vectoru(), > -// const floatList & IDs = vectorf(), const string & idField = "ind_id", > -// PyObject * filter = NULL); > + void removeIndividuals(const uintList & indexes = vectoru(), > + const floatList & IDs = vectorf(), const string & idField = "ind_id", > + PyObject * filter = NULL); > > /** Merge subpopulations \e subPops. If \e subPops is \c ALL_AVAIL (default), > * all subpopulations will be merged. \e subPops do not have to be adjacent > @@ -1080,7 +1080,7 @@ > * new chromosomes from population \c pop individual by individual. > * <group>7-manipulate</group> > */ > -// void addChromFrom(const Population & pop); > + void addChromFrom(const Population & pop); > > /** Add loci from population \e pop, chromosome by chromosome. Added > * loci will be inserted according to their position. Their position > @@ -1089,7 +1089,7 @@ > * current population in the current and all ancestral generations. > * <group>7-manipulate</group> > */ > -// void addLociFrom(const Population & pop); > + void addLociFrom(const Population & pop); > > /** Add chromosome \e chromName with given type \e chromType to a > * population, with loci \e lociNames inserted at position \e lociPos. > @@ -1100,9 +1100,9 @@ > * be used if \e lociNames is not specified. > * <group>7-manipulate</group> > */ > -// void addChrom(const floatList & lociPos, const stringList & lociNames = vectorstr(), > -// const string & chromName = string(), const stringMatrix & alleleNames = stringMatrix(), > -// size_t chromType = AUTOSOME); > + void addChrom(const floatList & lociPos, const stringList & lociNames = vectorstr(), > + const string & chromName = string(), const stringMatrix & alleleNames = stringMatrix(), > + size_t chromType = AUTOSOME); > > /** Insert loci \e lociNames at positions \e pos on chromosome \e chrom. > * These parameters should be lists of the same length, although > @@ -1116,8 +1116,8 @@ > * function returns indexes of the inserted loci. > * <group>7-manipulate</group> > */ > -// vectoru addLoci(const uintList & chrom, const floatList & pos, > -// const stringList & lociNames = vectorstr(), const stringMatrix & alleleNames = stringMatrix()); > + vectoru addLoci(const uintList & chrom, const floatList & pos, > + const stringList & lociNames = vectorstr(), const stringMatrix & alleleNames = stringMatrix()); > > /** Resize population by giving new subpopulation sizes \e sizes. > * individuals at the end of some subpopulations will be removed if the > @@ -1203,7 +1203,7 @@ > * used to specify loci that will not be removed. > * <group>7-manipulate</group> > */ > -// void removeLoci(const lociList & loci = lociList(NULL), const lociList & keep = lociList(NULL)); > + void removeLoci(const lociList & loci = lociList(NULL), const lociList & keep = lociList(NULL)); > > /** Recode alleles at \e loci (can be a list of loci indexes or names, or > * all loci in a population (\c ALL_AVAIL)) to other values according to > > Modified: branches/mutant_new/src/simuPOP_common.i > =================================================================== > --- branches/mutant_new/src/simuPOP_common.i 2011-10-19 18:58:15 UTC (rev 4322) > +++ branches/mutant_new/src/simuPOP_common.i 2011-10-20 21:37:23 UTC (rev 4323) > @@ -37,12 +37,12 @@ > #include "population.h" > //#include "pedigree.h" > #include "virtualSubPop.h" > -//#include "operator.h" > +#include "operator.h" > //#include "simulator.h" > > #include "utility.h" > //#include "pedigree.h" > -//#include "initializer.h" > +#include "initializer.h" > //#include "outputer.h" > //#include "mating.h" > //#include "tagger.h" > @@ -284,7 +284,7 @@ > %template() vector<simuPOP::BaseOperator * >; > } > > -///%include "operator.h" > +%include "operator.h" > > namespace std > { > @@ -299,7 +299,7 @@ > ///%include "simulator.h" > ///%include "stator.h" > ///%include "outputer.h" > -///%include "initializer.h" > +%include "initializer.h" > ///%include "tagger.h" > ///%include "migrator.h" > ///%include "mutator.h" > > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. > > > ------------------------------------------------------------------------------ > The demand for IT networking professionals continues to grow, and the > demand for specialized networking skills is growing even more rapidly. > Take a complimentary Learning@Cisco Self-Assessment and learn > about Cisco certifications, training, and career opportunities. > http://p.sf.net/sfu/cisco-dev2dev > _______________________________________________ > simuPOP-devel mailing list > sim...@li... > https://lists.sourceforge.net/lists/listinfo/simupop-devel > |