Patch compilation of binaries
Former-commit-id: 688670c339643a282bdeabafafff3b451be83cb6 Former-commit-id: 60d3e42d2af73515fea50d9c97dc4eacda9c8abb
This commit is contained in:
506
src/sumaclust/sumaclust_v1.0.10/Licence_CeCILL_V2-en.txt
Normal file
506
src/sumaclust/sumaclust_v1.0.10/Licence_CeCILL_V2-en.txt
Normal file
@ -0,0 +1,506 @@
|
||||
|
||||
CeCILL FREE SOFTWARE LICENSE AGREEMENT
|
||||
|
||||
|
||||
Notice
|
||||
|
||||
This Agreement is a Free Software license agreement that is the result
|
||||
of discussions between its authors in order to ensure compliance with
|
||||
the two main principles guiding its drafting:
|
||||
|
||||
* firstly, compliance with the principles governing the distribution
|
||||
of Free Software: access to source code, broad rights granted to
|
||||
users,
|
||||
* secondly, the election of a governing law, French law, with which
|
||||
it is conformant, both as regards the law of torts and
|
||||
intellectual property law, and the protection that it offers to
|
||||
both authors and holders of the economic rights over software.
|
||||
|
||||
The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
|
||||
license are:
|
||||
|
||||
Commissariat <20> l'Energie Atomique - CEA, a public scientific, technical
|
||||
and industrial research establishment, having its principal place of
|
||||
business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
|
||||
|
||||
Centre National de la Recherche Scientifique - CNRS, a public scientific
|
||||
and technological establishment, having its principal place of business
|
||||
at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
|
||||
|
||||
Institut National de Recherche en Informatique et en Automatique -
|
||||
INRIA, a public scientific and technological establishment, having its
|
||||
principal place of business at Domaine de Voluceau, Rocquencourt, BP
|
||||
105, 78153 Le Chesnay cedex, France.
|
||||
|
||||
|
||||
Preamble
|
||||
|
||||
The purpose of this Free Software license agreement is to grant users
|
||||
the right to modify and redistribute the software governed by this
|
||||
license within the framework of an open source distribution model.
|
||||
|
||||
The exercising of these rights is conditional upon certain obligations
|
||||
for users so as to preserve this status for all subsequent redistributions.
|
||||
|
||||
In consideration of access to the source code and the rights to copy,
|
||||
modify and redistribute granted by the license, users are provided only
|
||||
with a limited warranty and the software's author, the holder of the
|
||||
economic rights, and the successive licensors only have limited liability.
|
||||
|
||||
In this respect, the risks associated with loading, using, modifying
|
||||
and/or developing or reproducing the software by the user are brought to
|
||||
the user's attention, given its Free Software status, which may make it
|
||||
complicated to use, with the result that its use is reserved for
|
||||
developers and experienced professionals having in-depth computer
|
||||
knowledge. Users are therefore encouraged to load and test the
|
||||
suitability of the software as regards their requirements in conditions
|
||||
enabling the security of their systems and/or data to be ensured and,
|
||||
more generally, to use and operate it in the same conditions of
|
||||
security. This Agreement may be freely reproduced and published,
|
||||
provided it is not altered, and that no provisions are either added or
|
||||
removed herefrom.
|
||||
|
||||
This Agreement may apply to any or all software for which the holder of
|
||||
the economic rights decides to submit the use thereof to its provisions.
|
||||
|
||||
|
||||
Article 1 - DEFINITIONS
|
||||
|
||||
For the purpose of this Agreement, when the following expressions
|
||||
commence with a capital letter, they shall have the following meaning:
|
||||
|
||||
Agreement: means this license agreement, and its possible subsequent
|
||||
versions and annexes.
|
||||
|
||||
Software: means the software in its Object Code and/or Source Code form
|
||||
and, where applicable, its documentation, "as is" when the Licensee
|
||||
accepts the Agreement.
|
||||
|
||||
Initial Software: means the Software in its Source Code and possibly its
|
||||
Object Code form and, where applicable, its documentation, "as is" when
|
||||
it is first distributed under the terms and conditions of the Agreement.
|
||||
|
||||
Modified Software: means the Software modified by at least one
|
||||
Contribution.
|
||||
|
||||
Source Code: means all the Software's instructions and program lines to
|
||||
which access is required so as to modify the Software.
|
||||
|
||||
Object Code: means the binary files originating from the compilation of
|
||||
the Source Code.
|
||||
|
||||
Holder: means the holder(s) of the economic rights over the Initial
|
||||
Software.
|
||||
|
||||
Licensee: means the Software user(s) having accepted the Agreement.
|
||||
|
||||
Contributor: means a Licensee having made at least one Contribution.
|
||||
|
||||
Licensor: means the Holder, or any other individual or legal entity, who
|
||||
distributes the Software under the Agreement.
|
||||
|
||||
Contribution: means any or all modifications, corrections, translations,
|
||||
adaptations and/or new functions integrated into the Software by any or
|
||||
all Contributors, as well as any or all Internal Modules.
|
||||
|
||||
Module: means a set of sources files including their documentation that
|
||||
enables supplementary functions or services in addition to those offered
|
||||
by the Software.
|
||||
|
||||
External Module: means any or all Modules, not derived from the
|
||||
Software, so that this Module and the Software run in separate address
|
||||
spaces, with one calling the other when they are run.
|
||||
|
||||
Internal Module: means any or all Module, connected to the Software so
|
||||
that they both execute in the same address space.
|
||||
|
||||
GNU GPL: means the GNU General Public License version 2 or any
|
||||
subsequent version, as published by the Free Software Foundation Inc.
|
||||
|
||||
Parties: mean both the Licensee and the Licensor.
|
||||
|
||||
These expressions may be used both in singular and plural form.
|
||||
|
||||
|
||||
Article 2 - PURPOSE
|
||||
|
||||
The purpose of the Agreement is the grant by the Licensor to the
|
||||
Licensee of a non-exclusive, transferable and worldwide license for the
|
||||
Software as set forth in Article 5 hereinafter for the whole term of the
|
||||
protection granted by the rights over said Software.
|
||||
|
||||
|
||||
Article 3 - ACCEPTANCE
|
||||
|
||||
3.1 The Licensee shall be deemed as having accepted the terms and
|
||||
conditions of this Agreement upon the occurrence of the first of the
|
||||
following events:
|
||||
|
||||
* (i) loading the Software by any or all means, notably, by
|
||||
downloading from a remote server, or by loading from a physical
|
||||
medium;
|
||||
* (ii) the first time the Licensee exercises any of the rights
|
||||
granted hereunder.
|
||||
|
||||
3.2 One copy of the Agreement, containing a notice relating to the
|
||||
characteristics of the Software, to the limited warranty, and to the
|
||||
fact that its use is restricted to experienced users has been provided
|
||||
to the Licensee prior to its acceptance as set forth in Article 3.1
|
||||
hereinabove, and the Licensee hereby acknowledges that it has read and
|
||||
understood it.
|
||||
|
||||
|
||||
Article 4 - EFFECTIVE DATE AND TERM
|
||||
|
||||
|
||||
4.1 EFFECTIVE DATE
|
||||
|
||||
The Agreement shall become effective on the date when it is accepted by
|
||||
the Licensee as set forth in Article 3.1.
|
||||
|
||||
|
||||
4.2 TERM
|
||||
|
||||
The Agreement shall remain in force for the entire legal term of
|
||||
protection of the economic rights over the Software.
|
||||
|
||||
|
||||
Article 5 - SCOPE OF RIGHTS GRANTED
|
||||
|
||||
The Licensor hereby grants to the Licensee, who accepts, the following
|
||||
rights over the Software for any or all use, and for the term of the
|
||||
Agreement, on the basis of the terms and conditions set forth hereinafter.
|
||||
|
||||
Besides, if the Licensor owns or comes to own one or more patents
|
||||
protecting all or part of the functions of the Software or of its
|
||||
components, the Licensor undertakes not to enforce the rights granted by
|
||||
these patents against successive Licensees using, exploiting or
|
||||
modifying the Software. If these patents are transferred, the Licensor
|
||||
undertakes to have the transferees subscribe to the obligations set
|
||||
forth in this paragraph.
|
||||
|
||||
|
||||
5.1 RIGHT OF USE
|
||||
|
||||
The Licensee is authorized to use the Software, without any limitation
|
||||
as to its fields of application, with it being hereinafter specified
|
||||
that this comprises:
|
||||
|
||||
1. permanent or temporary reproduction of all or part of the Software
|
||||
by any or all means and in any or all form.
|
||||
|
||||
2. loading, displaying, running, or storing the Software on any or
|
||||
all medium.
|
||||
|
||||
3. entitlement to observe, study or test its operation so as to
|
||||
determine the ideas and principles behind any or all constituent
|
||||
elements of said Software. This shall apply when the Licensee
|
||||
carries out any or all loading, displaying, running, transmission
|
||||
or storage operation as regards the Software, that it is entitled
|
||||
to carry out hereunder.
|
||||
|
||||
|
||||
5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS
|
||||
|
||||
The right to make Contributions includes the right to translate, adapt,
|
||||
arrange, or make any or all modifications to the Software, and the right
|
||||
to reproduce the resulting software.
|
||||
|
||||
The Licensee is authorized to make any or all Contributions to the
|
||||
Software provided that it includes an explicit notice that it is the
|
||||
author of said Contribution and indicates the date of the creation thereof.
|
||||
|
||||
|
||||
5.3 RIGHT OF DISTRIBUTION
|
||||
|
||||
In particular, the right of distribution includes the right to publish,
|
||||
transmit and communicate the Software to the general public on any or
|
||||
all medium, and by any or all means, and the right to market, either in
|
||||
consideration of a fee, or free of charge, one or more copies of the
|
||||
Software by any means.
|
||||
|
||||
The Licensee is further authorized to distribute copies of the modified
|
||||
or unmodified Software to third parties according to the terms and
|
||||
conditions set forth hereinafter.
|
||||
|
||||
|
||||
5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
|
||||
|
||||
The Licensee is authorized to distribute true copies of the Software in
|
||||
Source Code or Object Code form, provided that said distribution
|
||||
complies with all the provisions of the Agreement and is accompanied by:
|
||||
|
||||
1. a copy of the Agreement,
|
||||
|
||||
2. a notice relating to the limitation of both the Licensor's
|
||||
warranty and liability as set forth in Articles 8 and 9,
|
||||
|
||||
and that, in the event that only the Object Code of the Software is
|
||||
redistributed, the Licensee allows future Licensees unhindered access to
|
||||
the full Source Code of the Software by indicating how to access it, it
|
||||
being understood that the additional cost of acquiring the Source Code
|
||||
shall not exceed the cost of transferring the data.
|
||||
|
||||
|
||||
5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
|
||||
|
||||
When the Licensee makes a Contribution to the Software, the terms and
|
||||
conditions for the distribution of the resulting Modified Software
|
||||
become subject to all the provisions of this Agreement.
|
||||
|
||||
The Licensee is authorized to distribute the Modified Software, in
|
||||
source code or object code form, provided that said distribution
|
||||
complies with all the provisions of the Agreement and is accompanied by:
|
||||
|
||||
1. a copy of the Agreement,
|
||||
|
||||
2. a notice relating to the limitation of both the Licensor's
|
||||
warranty and liability as set forth in Articles 8 and 9,
|
||||
|
||||
and that, in the event that only the object code of the Modified
|
||||
Software is redistributed, the Licensee allows future Licensees
|
||||
unhindered access to the full source code of the Modified Software by
|
||||
indicating how to access it, it being understood that the additional
|
||||
cost of acquiring the source code shall not exceed the cost of
|
||||
transferring the data.
|
||||
|
||||
|
||||
5.3.3 DISTRIBUTION OF EXTERNAL MODULES
|
||||
|
||||
When the Licensee has developed an External Module, the terms and
|
||||
conditions of this Agreement do not apply to said External Module, that
|
||||
may be distributed under a separate license agreement.
|
||||
|
||||
|
||||
5.3.4 COMPATIBILITY WITH THE GNU GPL
|
||||
|
||||
The Licensee can include a code that is subject to the provisions of one
|
||||
of the versions of the GNU GPL in the Modified or unmodified Software,
|
||||
and distribute that entire code under the terms of the same version of
|
||||
the GNU GPL.
|
||||
|
||||
The Licensee can include the Modified or unmodified Software in a code
|
||||
that is subject to the provisions of one of the versions of the GNU GPL,
|
||||
and distribute that entire code under the terms of the same version of
|
||||
the GNU GPL.
|
||||
|
||||
|
||||
Article 6 - INTELLECTUAL PROPERTY
|
||||
|
||||
|
||||
6.1 OVER THE INITIAL SOFTWARE
|
||||
|
||||
The Holder owns the economic rights over the Initial Software. Any or
|
||||
all use of the Initial Software is subject to compliance with the terms
|
||||
and conditions under which the Holder has elected to distribute its work
|
||||
and no one shall be entitled to modify the terms and conditions for the
|
||||
distribution of said Initial Software.
|
||||
|
||||
The Holder undertakes that the Initial Software will remain ruled at
|
||||
least by this Agreement, for the duration set forth in Article 4.2.
|
||||
|
||||
|
||||
6.2 OVER THE CONTRIBUTIONS
|
||||
|
||||
The Licensee who develops a Contribution is the owner of the
|
||||
intellectual property rights over this Contribution as defined by
|
||||
applicable law.
|
||||
|
||||
|
||||
6.3 OVER THE EXTERNAL MODULES
|
||||
|
||||
The Licensee who develops an External Module is the owner of the
|
||||
intellectual property rights over this External Module as defined by
|
||||
applicable law and is free to choose the type of agreement that shall
|
||||
govern its distribution.
|
||||
|
||||
|
||||
6.4 JOINT PROVISIONS
|
||||
|
||||
The Licensee expressly undertakes:
|
||||
|
||||
1. not to remove, or modify, in any manner, the intellectual property
|
||||
notices attached to the Software;
|
||||
|
||||
2. to reproduce said notices, in an identical manner, in the copies
|
||||
of the Software modified or not.
|
||||
|
||||
The Licensee undertakes not to directly or indirectly infringe the
|
||||
intellectual property rights of the Holder and/or Contributors on the
|
||||
Software and to take, where applicable, vis-<2D>-vis its staff, any and all
|
||||
measures required to ensure respect of said intellectual property rights
|
||||
of the Holder and/or Contributors.
|
||||
|
||||
|
||||
Article 7 - RELATED SERVICES
|
||||
|
||||
7.1 Under no circumstances shall the Agreement oblige the Licensor to
|
||||
provide technical assistance or maintenance services for the Software.
|
||||
|
||||
However, the Licensor is entitled to offer this type of services. The
|
||||
terms and conditions of such technical assistance, and/or such
|
||||
maintenance, shall be set forth in a separate instrument. Only the
|
||||
Licensor offering said maintenance and/or technical assistance services
|
||||
shall incur liability therefor.
|
||||
|
||||
7.2 Similarly, any Licensor is entitled to offer to its licensees, under
|
||||
its sole responsibility, a warranty, that shall only be binding upon
|
||||
itself, for the redistribution of the Software and/or the Modified
|
||||
Software, under terms and conditions that it is free to decide. Said
|
||||
warranty, and the financial terms and conditions of its application,
|
||||
shall be subject of a separate instrument executed between the Licensor
|
||||
and the Licensee.
|
||||
|
||||
|
||||
Article 8 - LIABILITY
|
||||
|
||||
8.1 Subject to the provisions of Article 8.2, the Licensee shall be
|
||||
entitled to claim compensation for any direct loss it may have suffered
|
||||
from the Software as a result of a fault on the part of the relevant
|
||||
Licensor, subject to providing evidence thereof.
|
||||
|
||||
8.2 The Licensor's liability is limited to the commitments made under
|
||||
this Agreement and shall not be incurred as a result of in particular:
|
||||
(i) loss due the Licensee's total or partial failure to fulfill its
|
||||
obligations, (ii) direct or consequential loss that is suffered by the
|
||||
Licensee due to the use or performance of the Software, and (iii) more
|
||||
generally, any consequential loss. In particular the Parties expressly
|
||||
agree that any or all pecuniary or business loss (i.e. loss of data,
|
||||
loss of profits, operating loss, loss of customers or orders,
|
||||
opportunity cost, any disturbance to business activities) or any or all
|
||||
legal proceedings instituted against the Licensee by a third party,
|
||||
shall constitute consequential loss and shall not provide entitlement to
|
||||
any or all compensation from the Licensor.
|
||||
|
||||
|
||||
Article 9 - WARRANTY
|
||||
|
||||
9.1 The Licensee acknowledges that the scientific and technical
|
||||
state-of-the-art when the Software was distributed did not enable all
|
||||
possible uses to be tested and verified, nor for the presence of
|
||||
possible defects to be detected. In this respect, the Licensee's
|
||||
attention has been drawn to the risks associated with loading, using,
|
||||
modifying and/or developing and reproducing the Software which are
|
||||
reserved for experienced users.
|
||||
|
||||
The Licensee shall be responsible for verifying, by any or all means,
|
||||
the suitability of the product for its requirements, its good working
|
||||
order, and for ensuring that it shall not cause damage to either persons
|
||||
or properties.
|
||||
|
||||
9.2 The Licensor hereby represents, in good faith, that it is entitled
|
||||
to grant all the rights over the Software (including in particular the
|
||||
rights set forth in Article 5).
|
||||
|
||||
9.3 The Licensee acknowledges that the Software is supplied "as is" by
|
||||
the Licensor without any other express or tacit warranty, other than
|
||||
that provided for in Article 9.2 and, in particular, without any warranty
|
||||
as to its commercial value, its secured, safe, innovative or relevant
|
||||
nature.
|
||||
|
||||
Specifically, the Licensor does not warrant that the Software is free
|
||||
from any error, that it will operate without interruption, that it will
|
||||
be compatible with the Licensee's own equipment and software
|
||||
configuration, nor that it will meet the Licensee's requirements.
|
||||
|
||||
9.4 The Licensor does not either expressly or tacitly warrant that the
|
||||
Software does not infringe any third party intellectual property right
|
||||
relating to a patent, software or any other property right. Therefore,
|
||||
the Licensor disclaims any and all liability towards the Licensee
|
||||
arising out of any or all proceedings for infringement that may be
|
||||
instituted in respect of the use, modification and redistribution of the
|
||||
Software. Nevertheless, should such proceedings be instituted against
|
||||
the Licensee, the Licensor shall provide it with technical and legal
|
||||
assistance for its defense. Such technical and legal assistance shall be
|
||||
decided on a case-by-case basis between the relevant Licensor and the
|
||||
Licensee pursuant to a memorandum of understanding. The Licensor
|
||||
disclaims any and all liability as regards the Licensee's use of the
|
||||
name of the Software. No warranty is given as regards the existence of
|
||||
prior rights over the name of the Software or as regards the existence
|
||||
of a trademark.
|
||||
|
||||
|
||||
Article 10 - TERMINATION
|
||||
|
||||
10.1 In the event of a breach by the Licensee of its obligations
|
||||
hereunder, the Licensor may automatically terminate this Agreement
|
||||
thirty (30) days after notice has been sent to the Licensee and has
|
||||
remained ineffective.
|
||||
|
||||
10.2 A Licensee whose Agreement is terminated shall no longer be
|
||||
authorized to use, modify or distribute the Software. However, any
|
||||
licenses that it may have granted prior to termination of the Agreement
|
||||
shall remain valid subject to their having been granted in compliance
|
||||
with the terms and conditions hereof.
|
||||
|
||||
|
||||
Article 11 - MISCELLANEOUS
|
||||
|
||||
|
||||
11.1 EXCUSABLE EVENTS
|
||||
|
||||
Neither Party shall be liable for any or all delay, or failure to
|
||||
perform the Agreement, that may be attributable to an event of force
|
||||
majeure, an act of God or an outside cause, such as defective
|
||||
functioning or interruptions of the electricity or telecommunications
|
||||
networks, network paralysis following a virus attack, intervention by
|
||||
government authorities, natural disasters, water damage, earthquakes,
|
||||
fire, explosions, strikes and labor unrest, war, etc.
|
||||
|
||||
11.2 Any failure by either Party, on one or more occasions, to invoke
|
||||
one or more of the provisions hereof, shall under no circumstances be
|
||||
interpreted as being a waiver by the interested Party of its right to
|
||||
invoke said provision(s) subsequently.
|
||||
|
||||
11.3 The Agreement cancels and replaces any or all previous agreements,
|
||||
whether written or oral, between the Parties and having the same
|
||||
purpose, and constitutes the entirety of the agreement between said
|
||||
Parties concerning said purpose. No supplement or modification to the
|
||||
terms and conditions hereof shall be effective as between the Parties
|
||||
unless it is made in writing and signed by their duly authorized
|
||||
representatives.
|
||||
|
||||
11.4 In the event that one or more of the provisions hereof were to
|
||||
conflict with a current or future applicable act or legislative text,
|
||||
said act or legislative text shall prevail, and the Parties shall make
|
||||
the necessary amendments so as to comply with said act or legislative
|
||||
text. All other provisions shall remain effective. Similarly, invalidity
|
||||
of a provision of the Agreement, for any reason whatsoever, shall not
|
||||
cause the Agreement as a whole to be invalid.
|
||||
|
||||
|
||||
11.5 LANGUAGE
|
||||
|
||||
The Agreement is drafted in both French and English and both versions
|
||||
are deemed authentic.
|
||||
|
||||
|
||||
Article 12 - NEW VERSIONS OF THE AGREEMENT
|
||||
|
||||
12.1 Any person is authorized to duplicate and distribute copies of this
|
||||
Agreement.
|
||||
|
||||
12.2 So as to ensure coherence, the wording of this Agreement is
|
||||
protected and may only be modified by the authors of the License, who
|
||||
reserve the right to periodically publish updates or new versions of the
|
||||
Agreement, each with a separate number. These subsequent versions may
|
||||
address new issues encountered by Free Software.
|
||||
|
||||
12.3 Any Software distributed under a given version of the Agreement may
|
||||
only be subsequently distributed under the same version of the Agreement
|
||||
or a subsequent version, subject to the provisions of Article 5.3.4.
|
||||
|
||||
|
||||
Article 13 - GOVERNING LAW AND JURISDICTION
|
||||
|
||||
13.1 The Agreement is governed by French law. The Parties agree to
|
||||
endeavor to seek an amicable solution to any disagreements or disputes
|
||||
that may arise during the performance of the Agreement.
|
||||
|
||||
13.2 Failing an amicable solution within two (2) months as from their
|
||||
occurrence, and unless emergency proceedings are necessary, the
|
||||
disagreements or disputes shall be referred to the Paris Courts having
|
||||
jurisdiction, by the more diligent Party.
|
||||
|
||||
|
||||
Version 2.0 dated 2006-09-05.
|
512
src/sumaclust/sumaclust_v1.0.10/Licence_CeCILL_V2-fr.txt
Normal file
512
src/sumaclust/sumaclust_v1.0.10/Licence_CeCILL_V2-fr.txt
Normal file
@ -0,0 +1,512 @@
|
||||
|
||||
CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL
|
||||
|
||||
|
||||
Avertissement
|
||||
|
||||
Ce contrat est une licence de logiciel libre issue d'une concertation
|
||||
entre ses auteurs afin que le respect de deux grands principes pr<70>side <20>
|
||||
sa r<>daction:
|
||||
|
||||
* d'une part, le respect des principes de diffusion des logiciels
|
||||
libres: acc<63>s au code source, droits <20>tendus conf<6E>r<EFBFBD>s aux
|
||||
utilisateurs,
|
||||
* d'autre part, la d<>signation d'un droit applicable, le droit
|
||||
fran<61>ais, auquel elle est conforme, tant au regard du droit de la
|
||||
responsabilit<69> civile que du droit de la propri<72>t<EFBFBD> intellectuelle
|
||||
et de la protection qu'il offre aux auteurs et titulaires des
|
||||
droits patrimoniaux sur un logiciel.
|
||||
|
||||
Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel]
|
||||
L[ibre]) sont:
|
||||
|
||||
Commissariat <20> l'Energie Atomique - CEA, <20>tablissement public de
|
||||
recherche <20> caract<63>re scientifique, technique et industriel, dont le
|
||||
si<EFBFBD>ge est situ<74> 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris.
|
||||
|
||||
Centre National de la Recherche Scientifique - CNRS, <20>tablissement
|
||||
public <20> caract<63>re scientifique et technologique, dont le si<73>ge est
|
||||
situ<EFBFBD> 3 rue Michel-Ange, 75794 Paris cedex 16.
|
||||
|
||||
Institut National de Recherche en Informatique et en Automatique -
|
||||
INRIA, <20>tablissement public <20> caract<63>re scientifique et technologique,
|
||||
dont le si<73>ge est situ<74> Domaine de Voluceau, Rocquencourt, BP 105, 78153
|
||||
Le Chesnay cedex.
|
||||
|
||||
|
||||
Pr<50>ambule
|
||||
|
||||
Ce contrat est une licence de logiciel libre dont l'objectif est de
|
||||
conf<EFBFBD>rer aux utilisateurs la libert<72> de modification et de
|
||||
redistribution du logiciel r<>gi par cette licence dans le cadre d'un
|
||||
mod<EFBFBD>le de diffusion en logiciel libre.
|
||||
|
||||
L'exercice de ces libert<72>s est assorti de certains devoirs <20> la charge
|
||||
des utilisateurs afin de pr<70>server ce statut au cours des
|
||||
redistributions ult<6C>rieures.
|
||||
|
||||
L'accessibilit<69> au code source et les droits de copie, de modification
|
||||
et de redistribution qui en d<>coulent ont pour contrepartie de n'offrir
|
||||
aux utilisateurs qu'une garantie limit<69>e et de ne faire peser sur
|
||||
l'auteur du logiciel, le titulaire des droits patrimoniaux et les
|
||||
conc<EFBFBD>dants successifs qu'une responsabilit<69> restreinte.
|
||||
|
||||
A cet <20>gard l'attention de l'utilisateur est attir<69>e sur les risques
|
||||
associ<EFBFBD>s au chargement, <20> l'utilisation, <20> la modification et/ou au
|
||||
d<EFBFBD>veloppement et <20> la reproduction du logiciel par l'utilisateur <20>tant
|
||||
donn<EFBFBD> sa sp<73>cificit<69> de logiciel libre, qui peut le rendre complexe <20>
|
||||
manipuler et qui le r<>serve donc <20> des d<>veloppeurs ou des
|
||||
professionnels avertis poss<73>dant des connaissances informatiques
|
||||
approfondies. Les utilisateurs sont donc invit<69>s <20> charger et tester
|
||||
l'ad<61>quation du logiciel <20> leurs besoins dans des conditions permettant
|
||||
d'assurer la s<>curit<69> de leurs syst<73>mes et/ou de leurs donn<6E>es et, plus
|
||||
g<EFBFBD>n<EFBFBD>ralement, <20> l'utiliser et l'exploiter dans les m<>mes conditions de
|
||||
s<EFBFBD>curit<EFBFBD>. Ce contrat peut <20>tre reproduit et diffus<75> librement, sous
|
||||
r<EFBFBD>serve de le conserver en l'<27>tat, sans ajout ni suppression de clauses.
|
||||
|
||||
Ce contrat est susceptible de s'appliquer <20> tout logiciel dont le
|
||||
titulaire des droits patrimoniaux d<>cide de soumettre l'exploitation aux
|
||||
dispositions qu'il contient.
|
||||
|
||||
|
||||
Article 1 - DEFINITIONS
|
||||
|
||||
Dans ce contrat, les termes suivants, lorsqu'ils seront <20>crits avec une
|
||||
lettre capitale, auront la signification suivante:
|
||||
|
||||
Contrat: d<>signe le pr<70>sent contrat de licence, ses <20>ventuelles versions
|
||||
post<EFBFBD>rieures et annexes.
|
||||
|
||||
Logiciel: d<>signe le logiciel sous sa forme de Code Objet et/ou de Code
|
||||
Source et le cas <20>ch<63>ant sa documentation, dans leur <20>tat au moment de
|
||||
l'acceptation du Contrat par le Licenci<63>.
|
||||
|
||||
Logiciel Initial: d<>signe le Logiciel sous sa forme de Code Source et
|
||||
<EFBFBD>ventuellement de Code Objet et le cas <20>ch<63>ant sa documentation, dans
|
||||
leur <20>tat au moment de leur premi<6D>re diffusion sous les termes du Contrat.
|
||||
|
||||
Logiciel Modifi<66>: d<>signe le Logiciel modifi<66> par au moins une
|
||||
Contribution.
|
||||
|
||||
Code Source: d<>signe l'ensemble des instructions et des lignes de
|
||||
programme du Logiciel et auquel l'acc<63>s est n<>cessaire en vue de
|
||||
modifier le Logiciel.
|
||||
|
||||
Code Objet: d<>signe les fichiers binaires issus de la compilation du
|
||||
Code Source.
|
||||
|
||||
Titulaire: d<>signe le ou les d<>tenteurs des droits patrimoniaux d'auteur
|
||||
sur le Logiciel Initial.
|
||||
|
||||
Licenci<EFBFBD>: d<>signe le ou les utilisateurs du Logiciel ayant accept<70> le
|
||||
Contrat.
|
||||
|
||||
Contributeur: d<>signe le Licenci<63> auteur d'au moins une Contribution.
|
||||
|
||||
Conc<EFBFBD>dant: d<>signe le Titulaire ou toute personne physique ou morale
|
||||
distribuant le Logiciel sous le Contrat.
|
||||
|
||||
Contribution: d<>signe l'ensemble des modifications, corrections,
|
||||
traductions, adaptations et/ou nouvelles fonctionnalit<69>s int<6E>gr<67>es dans
|
||||
le Logiciel par tout Contributeur, ainsi que tout Module Interne.
|
||||
|
||||
Module: d<>signe un ensemble de fichiers sources y compris leur
|
||||
documentation qui permet de r<>aliser des fonctionnalit<69>s ou services
|
||||
suppl<EFBFBD>mentaires <20> ceux fournis par le Logiciel.
|
||||
|
||||
Module Externe: d<>signe tout Module, non d<>riv<69> du Logiciel, tel que ce
|
||||
Module et le Logiciel s'ex<65>cutent dans des espaces d'adressage
|
||||
diff<EFBFBD>rents, l'un appelant l'autre au moment de leur ex<65>cution.
|
||||
|
||||
Module Interne: d<>signe tout Module li<6C> au Logiciel de telle sorte
|
||||
qu'ils s'ex<65>cutent dans le m<>me espace d'adressage.
|
||||
|
||||
GNU GPL: d<>signe la GNU General Public License dans sa version 2 ou
|
||||
toute version ult<6C>rieure, telle que publi<6C>e par Free Software Foundation
|
||||
Inc.
|
||||
|
||||
Parties: d<>signe collectivement le Licenci<63> et le Conc<6E>dant.
|
||||
|
||||
Ces termes s'entendent au singulier comme au pluriel.
|
||||
|
||||
|
||||
Article 2 - OBJET
|
||||
|
||||
Le Contrat a pour objet la concession par le Conc<6E>dant au Licenci<63> d'une
|
||||
licence non exclusive, cessible et mondiale du Logiciel telle que
|
||||
d<EFBFBD>finie ci-apr<70>s <20> l'article 5 pour toute la dur<75>e de protection des droits
|
||||
portant sur ce Logiciel.
|
||||
|
||||
|
||||
Article 3 - ACCEPTATION
|
||||
|
||||
3.1 L'acceptation par le Licenci<63> des termes du Contrat est r<>put<75>e
|
||||
acquise du fait du premier des faits suivants:
|
||||
|
||||
* (i) le chargement du Logiciel par tout moyen notamment par
|
||||
t<>l<EFBFBD>chargement <20> partir d'un serveur distant ou par chargement <20>
|
||||
partir d'un support physique;
|
||||
* (ii) le premier exercice par le Licenci<63> de l'un quelconque des
|
||||
droits conc<6E>d<EFBFBD>s par le Contrat.
|
||||
|
||||
3.2 Un exemplaire du Contrat, contenant notamment un avertissement
|
||||
relatif aux sp<73>cificit<69>s du Logiciel, <20> la restriction de garantie et <20>
|
||||
la limitation <20> un usage par des utilisateurs exp<78>riment<6E>s a <20>t<EFBFBD> mis <20>
|
||||
disposition du Licenci<63> pr<70>alablement <20> son acceptation telle que
|
||||
d<EFBFBD>finie <20> l'article 3.1 ci dessus et le Licenci<63> reconna<6E>t en avoir pris
|
||||
connaissance.
|
||||
|
||||
|
||||
Article 4 - ENTREE EN VIGUEUR ET DUREE
|
||||
|
||||
|
||||
4.1 ENTREE EN VIGUEUR
|
||||
|
||||
Le Contrat entre en vigueur <20> la date de son acceptation par le Licenci<63>
|
||||
telle que d<>finie en 3.1.
|
||||
|
||||
|
||||
4.2 DUREE
|
||||
|
||||
Le Contrat produira ses effets pendant toute la dur<75>e l<>gale de
|
||||
protection des droits patrimoniaux portant sur le Logiciel.
|
||||
|
||||
|
||||
Article 5 - ETENDUE DES DROITS CONCEDES
|
||||
|
||||
Le Conc<6E>dant conc<6E>de au Licenci<63>, qui accepte, les droits suivants sur
|
||||
le Logiciel pour toutes destinations et pour la dur<75>e du Contrat dans
|
||||
les conditions ci-apr<70>s d<>taill<6C>es.
|
||||
|
||||
Par ailleurs, si le Conc<6E>dant d<>tient ou venait <20> d<>tenir un ou
|
||||
plusieurs brevets d'invention prot<6F>geant tout ou partie des
|
||||
fonctionnalit<EFBFBD>s du Logiciel ou de ses composants, il s'engage <20> ne pas
|
||||
opposer les <20>ventuels droits conf<6E>r<EFBFBD>s par ces brevets aux Licenci<63>s
|
||||
successifs qui utiliseraient, exploiteraient ou modifieraient le
|
||||
Logiciel. En cas de cession de ces brevets, le Conc<6E>dant s'engage <20>
|
||||
faire reprendre les obligations du pr<70>sent alin<69>a aux cessionnaires.
|
||||
|
||||
|
||||
5.1 DROIT D'UTILISATION
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> utiliser le Logiciel, sans restriction quant
|
||||
aux domaines d'application, <20>tant ci-apr<70>s pr<70>cis<69> que cela comporte:
|
||||
|
||||
1. la reproduction permanente ou provisoire du Logiciel en tout ou
|
||||
partie par tout moyen et sous toute forme.
|
||||
|
||||
2. le chargement, l'affichage, l'ex<65>cution, ou le stockage du
|
||||
Logiciel sur tout support.
|
||||
|
||||
3. la possibilit<69> d'en observer, d'en <20>tudier, ou d'en tester le
|
||||
fonctionnement afin de d<>terminer les id<69>es et principes qui sont
|
||||
<20> la base de n'importe quel <20>l<EFBFBD>ment de ce Logiciel; et ceci,
|
||||
lorsque le Licenci<63> effectue toute op<6F>ration de chargement,
|
||||
d'affichage, d'ex<65>cution, de transmission ou de stockage du
|
||||
Logiciel qu'il est en droit d'effectuer en vertu du Contrat.
|
||||
|
||||
|
||||
5.2 DROIT D'APPORTER DES CONTRIBUTIONS
|
||||
|
||||
Le droit d'apporter des Contributions comporte le droit de traduire,
|
||||
d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel
|
||||
et le droit de reproduire le logiciel en r<>sultant.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> apporter toute Contribution au Logiciel sous
|
||||
r<EFBFBD>serve de mentionner, de fa<66>on explicite, son nom en tant qu'auteur de
|
||||
cette Contribution et la date de cr<63>ation de celle-ci.
|
||||
|
||||
|
||||
5.3 DROIT DE DISTRIBUTION
|
||||
|
||||
Le droit de distribution comporte notamment le droit de diffuser, de
|
||||
transmettre et de communiquer le Logiciel au public sur tout support et
|
||||
par tout moyen ainsi que le droit de mettre sur le march<63> <20> titre
|
||||
on<EFBFBD>reux ou gratuit, un ou des exemplaires du Logiciel par tout proc<6F>d<EFBFBD>.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer des copies du Logiciel, modifi<66> ou
|
||||
non, <20> des tiers dans les conditions ci-apr<70>s d<>taill<6C>es.
|
||||
|
||||
|
||||
5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer des copies conformes du Logiciel,
|
||||
sous forme de Code Source ou de Code Objet, <20> condition que cette
|
||||
distribution respecte les dispositions du Contrat dans leur totalit<69> et
|
||||
soit accompagn<67>e:
|
||||
|
||||
1. d'un exemplaire du Contrat,
|
||||
|
||||
2. d'un avertissement relatif <20> la restriction de garantie et de
|
||||
responsabilit<69> du Conc<6E>dant telle que pr<70>vue aux articles 8
|
||||
et 9,
|
||||
|
||||
et que, dans le cas o<> seul le Code Objet du Logiciel est redistribu<62>,
|
||||
le Licenci<63> permette aux futurs Licenci<63>s d'acc<63>der facilement au Code
|
||||
Source complet du Logiciel en indiquant les modalit<69>s d'acc<63>s, <20>tant
|
||||
entendu que le co<63>t additionnel d'acquisition du Code Source ne devra
|
||||
pas exc<78>der le simple co<63>t de transfert des donn<6E>es.
|
||||
|
||||
|
||||
5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE
|
||||
|
||||
Lorsque le Licenci<63> apporte une Contribution au Logiciel, les conditions
|
||||
de distribution du Logiciel Modifi<66> en r<>sultant sont alors soumises <20>
|
||||
l'int<6E>gralit<69> des dispositions du Contrat.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer le Logiciel Modifi<66>, sous forme de
|
||||
code source ou de code objet, <20> condition que cette distribution
|
||||
respecte les dispositions du Contrat dans leur totalit<69> et soit
|
||||
accompagn<EFBFBD>e:
|
||||
|
||||
1. d'un exemplaire du Contrat,
|
||||
|
||||
2. d'un avertissement relatif <20> la restriction de garantie et de
|
||||
responsabilit<69> du Conc<6E>dant telle que pr<70>vue aux articles 8
|
||||
et 9,
|
||||
|
||||
et que, dans le cas o<> seul le code objet du Logiciel Modifi<66> est
|
||||
redistribu<EFBFBD>, le Licenci<63> permette aux futurs Licenci<63>s d'acc<63>der
|
||||
facilement au code source complet du Logiciel Modifi<66> en indiquant les
|
||||
modalit<EFBFBD>s d'acc<63>s, <20>tant entendu que le co<63>t additionnel d'acquisition
|
||||
du code source ne devra pas exc<78>der le simple co<63>t de transfert des donn<6E>es.
|
||||
|
||||
|
||||
5.3.3 DISTRIBUTION DES MODULES EXTERNES
|
||||
|
||||
Lorsque le Licenci<63> a d<>velopp<70> un Module Externe les conditions du
|
||||
Contrat ne s'appliquent pas <20> ce Module Externe, qui peut <20>tre distribu<62>
|
||||
sous un contrat de licence diff<66>rent.
|
||||
|
||||
|
||||
5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL
|
||||
|
||||
Le Licenci<63> peut inclure un code soumis aux dispositions d'une des
|
||||
versions de la licence GNU GPL dans le Logiciel modifi<66> ou non et
|
||||
distribuer l'ensemble sous les conditions de la m<>me version de la
|
||||
licence GNU GPL.
|
||||
|
||||
Le Licenci<63> peut inclure le Logiciel modifi<66> ou non dans un code soumis
|
||||
aux dispositions d'une des versions de la licence GNU GPL et distribuer
|
||||
l'ensemble sous les conditions de la m<>me version de la licence GNU GPL.
|
||||
|
||||
|
||||
Article 6 - PROPRIETE INTELLECTUELLE
|
||||
|
||||
|
||||
6.1 SUR LE LOGICIEL INITIAL
|
||||
|
||||
Le Titulaire est d<>tenteur des droits patrimoniaux sur le Logiciel
|
||||
Initial. Toute utilisation du Logiciel Initial est soumise au respect
|
||||
des conditions dans lesquelles le Titulaire a choisi de diffuser son
|
||||
oeuvre et nul autre n'a la facult<6C> de modifier les conditions de
|
||||
diffusion de ce Logiciel Initial.
|
||||
|
||||
Le Titulaire s'engage <20> ce que le Logiciel Initial reste au moins r<>gi
|
||||
par le Contrat et ce, pour la dur<75>e vis<69>e <20> l'article 4.2.
|
||||
|
||||
|
||||
6.2 SUR LES CONTRIBUTIONS
|
||||
|
||||
Le Licenci<63> qui a d<>velopp<70> une Contribution est titulaire sur celle-ci
|
||||
des droits de propri<72>t<EFBFBD> intellectuelle dans les conditions d<>finies par
|
||||
la l<>gislation applicable.
|
||||
|
||||
|
||||
6.3 SUR LES MODULES EXTERNES
|
||||
|
||||
Le Licenci<63> qui a d<>velopp<70> un Module Externe est titulaire sur celui-ci
|
||||
des droits de propri<72>t<EFBFBD> intellectuelle dans les conditions d<>finies par
|
||||
la l<>gislation applicable et reste libre du choix du contrat r<>gissant
|
||||
sa diffusion.
|
||||
|
||||
|
||||
6.4 DISPOSITIONS COMMUNES
|
||||
|
||||
Le Licenci<63> s'engage express<73>ment:
|
||||
|
||||
1. <20> ne pas supprimer ou modifier de quelque mani<6E>re que ce soit les
|
||||
mentions de propri<72>t<EFBFBD> intellectuelle appos<6F>es sur le Logiciel;
|
||||
|
||||
2. <20> reproduire <20> l'identique lesdites mentions de propri<72>t<EFBFBD>
|
||||
intellectuelle sur les copies du Logiciel modifi<66> ou non.
|
||||
|
||||
Le Licenci<63> s'engage <20> ne pas porter atteinte, directement ou
|
||||
indirectement, aux droits de propri<72>t<EFBFBD> intellectuelle du Titulaire et/ou
|
||||
des Contributeurs sur le Logiciel et <20> prendre, le cas <20>ch<63>ant, <20>
|
||||
l'<27>gard de son personnel toutes les mesures n<>cessaires pour assurer le
|
||||
respect des dits droits de propri<72>t<EFBFBD> intellectuelle du Titulaire et/ou
|
||||
des Contributeurs.
|
||||
|
||||
|
||||
Article 7 - SERVICES ASSOCIES
|
||||
|
||||
7.1 Le Contrat n'oblige en aucun cas le Conc<6E>dant <20> la r<>alisation de
|
||||
prestations d'assistance technique ou de maintenance du Logiciel.
|
||||
|
||||
Cependant le Conc<6E>dant reste libre de proposer ce type de services. Les
|
||||
termes et conditions d'une telle assistance technique et/ou d'une telle
|
||||
maintenance seront alors d<>termin<69>s dans un acte s<>par<61>. Ces actes de
|
||||
maintenance et/ou assistance technique n'engageront que la seule
|
||||
responsabilit<EFBFBD> du Conc<6E>dant qui les propose.
|
||||
|
||||
7.2 De m<>me, tout Conc<6E>dant est libre de proposer, sous sa seule
|
||||
responsabilit<EFBFBD>, <20> ses licenci<63>s une garantie, qui n'engagera que lui,
|
||||
lors de la redistribution du Logiciel et/ou du Logiciel Modifi<66> et ce,
|
||||
dans les conditions qu'il souhaite. Cette garantie et les modalit<69>s
|
||||
financi<EFBFBD>res de son application feront l'objet d'un acte s<>par<61> entre le
|
||||
Conc<EFBFBD>dant et le Licenci<63>.
|
||||
|
||||
|
||||
Article 8 - RESPONSABILITE
|
||||
|
||||
8.1 Sous r<>serve des dispositions de l'article 8.2, le Licenci<63> a la
|
||||
facult<EFBFBD>, sous r<>serve de prouver la faute du Conc<6E>dant concern<72>, de
|
||||
solliciter la r<>paration du pr<70>judice direct qu'il subirait du fait du
|
||||
Logiciel et dont il apportera la preuve.
|
||||
|
||||
8.2 La responsabilit<69> du Conc<6E>dant est limit<69>e aux engagements pris en
|
||||
application du Contrat et ne saurait <20>tre engag<61>e en raison notamment:
|
||||
(i) des dommages dus <20> l'inex<65>cution, totale ou partielle, de ses
|
||||
obligations par le Licenci<63>, (ii) des dommages directs ou indirects
|
||||
d<EFBFBD>coulant de l'utilisation ou des performances du Logiciel subis par le
|
||||
Licenci<EFBFBD> et (iii) plus g<>n<EFBFBD>ralement d'un quelconque dommage indirect. En
|
||||
particulier, les Parties conviennent express<73>ment que tout pr<70>judice
|
||||
financier ou commercial (par exemple perte de donn<6E>es, perte de
|
||||
b<EFBFBD>n<EFBFBD>fices, perte d'exploitation, perte de client<6E>le ou de commandes,
|
||||
manque <20> gagner, trouble commercial quelconque) ou toute action dirig<69>e
|
||||
contre le Licenci<63> par un tiers, constitue un dommage indirect et
|
||||
n'ouvre pas droit <20> r<>paration par le Conc<6E>dant.
|
||||
|
||||
|
||||
Article 9 - GARANTIE
|
||||
|
||||
9.1 Le Licenci<63> reconna<6E>t que l'<27>tat actuel des connaissances
|
||||
scientifiques et techniques au moment de la mise en circulation du
|
||||
Logiciel ne permet pas d'en tester et d'en v<>rifier toutes les
|
||||
utilisations ni de d<>tecter l'existence d'<27>ventuels d<>fauts. L'attention
|
||||
du Licenci<63> a <20>t<EFBFBD> attir<69>e sur ce point sur les risques associ<63>s au
|
||||
chargement, <20> l'utilisation, la modification et/ou au d<>veloppement et <20>
|
||||
la reproduction du Logiciel qui sont r<>serv<72>s <20> des utilisateurs avertis.
|
||||
|
||||
Il rel<65>ve de la responsabilit<69> du Licenci<63> de contr<74>ler, par tous
|
||||
moyens, l'ad<61>quation du produit <20> ses besoins, son bon fonctionnement et
|
||||
de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens.
|
||||
|
||||
9.2 Le Conc<6E>dant d<>clare de bonne foi <20>tre en droit de conc<6E>der
|
||||
l'ensemble des droits attach<63>s au Logiciel (comprenant notamment les
|
||||
droits vis<69>s <20> l'article 5).
|
||||
|
||||
9.3 Le Licenci<63> reconna<6E>t que le Logiciel est fourni "en l'<27>tat" par le
|
||||
Conc<EFBFBD>dant sans autre garantie, expresse ou tacite, que celle pr<70>vue <20>
|
||||
l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale,
|
||||
son caract<63>re s<>curis<69>, innovant ou pertinent.
|
||||
|
||||
En particulier, le Conc<6E>dant ne garantit pas que le Logiciel est exempt
|
||||
d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible
|
||||
avec l'<27>quipement du Licenci<63> et sa configuration logicielle ni qu'il
|
||||
remplira les besoins du Licenci<63>.
|
||||
|
||||
9.4 Le Conc<6E>dant ne garantit pas, de mani<6E>re expresse ou tacite, que le
|
||||
Logiciel ne porte pas atteinte <20> un quelconque droit de propri<72>t<EFBFBD>
|
||||
intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout
|
||||
autre droit de propri<72>t<EFBFBD>. Ainsi, le Conc<6E>dant exclut toute garantie au
|
||||
profit du Licenci<63> contre les actions en contrefa<66>on qui pourraient <20>tre
|
||||
diligent<EFBFBD>es au titre de l'utilisation, de la modification, et de la
|
||||
redistribution du Logiciel. N<>anmoins, si de telles actions sont
|
||||
exerc<EFBFBD>es contre le Licenci<63>, le Conc<6E>dant lui apportera son aide
|
||||
technique et juridique pour sa d<>fense. Cette aide technique et
|
||||
juridique est d<>termin<69>e au cas par cas entre le Conc<6E>dant concern<72> et
|
||||
le Licenci<63> dans le cadre d'un protocole d'accord. Le Conc<6E>dant d<>gage
|
||||
toute responsabilit<69> quant <20> l'utilisation de la d<>nomination du
|
||||
Logiciel par le Licenci<63>. Aucune garantie n'est apport<72>e quant <20>
|
||||
l'existence de droits ant<6E>rieurs sur le nom du Logiciel et sur
|
||||
l'existence d'une marque.
|
||||
|
||||
|
||||
Article 10 - RESILIATION
|
||||
|
||||
10.1 En cas de manquement par le Licenci<63> aux obligations mises <20> sa
|
||||
charge par le Contrat, le Conc<6E>dant pourra r<>silier de plein droit le
|
||||
Contrat trente (30) jours apr<70>s notification adress<73>e au Licenci<63> et
|
||||
rest<EFBFBD>e sans effet.
|
||||
|
||||
10.2 Le Licenci<63> dont le Contrat est r<>sili<6C> n'est plus autoris<69> <20>
|
||||
utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les
|
||||
licences qu'il aura conc<6E>d<EFBFBD>es ant<6E>rieurement <20> la r<>siliation du Contrat
|
||||
resteront valides sous r<>serve qu'elles aient <20>t<EFBFBD> effectu<74>es en
|
||||
conformit<EFBFBD> avec le Contrat.
|
||||
|
||||
|
||||
Article 11 - DISPOSITIONS DIVERSES
|
||||
|
||||
|
||||
11.1 CAUSE EXTERIEURE
|
||||
|
||||
Aucune des Parties ne sera responsable d'un retard ou d'une d<>faillance
|
||||
d'ex<65>cution du Contrat qui serait d<> <20> un cas de force majeure, un cas
|
||||
fortuit ou une cause ext<78>rieure, telle que, notamment, le mauvais
|
||||
fonctionnement ou les interruptions du r<>seau <20>lectrique ou de
|
||||
t<EFBFBD>l<EFBFBD>communication, la paralysie du r<>seau li<6C>e <20> une attaque
|
||||
informatique, l'intervention des autorit<69>s gouvernementales, les
|
||||
catastrophes naturelles, les d<>g<EFBFBD>ts des eaux, les tremblements de terre,
|
||||
le feu, les explosions, les gr<67>ves et les conflits sociaux, l'<27>tat de
|
||||
guerre...
|
||||
|
||||
11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou
|
||||
plusieurs occasions de se pr<70>valoir d'une ou plusieurs dispositions du
|
||||
Contrat, ne pourra en aucun cas impliquer renonciation par la Partie
|
||||
int<EFBFBD>ress<EFBFBD>e <20> s'en pr<70>valoir ult<6C>rieurement.
|
||||
|
||||
11.3 Le Contrat annule et remplace toute convention ant<6E>rieure, <20>crite
|
||||
ou orale, entre les Parties sur le m<>me objet et constitue l'accord
|
||||
entier entre les Parties sur cet objet. Aucune addition ou modification
|
||||
aux termes du Contrat n'aura d'effet <20> l'<27>gard des Parties <20> moins
|
||||
d'<27>tre faite par <20>crit et sign<67>e par leurs repr<70>sentants d<>ment habilit<69>s.
|
||||
|
||||
11.4 Dans l'hypoth<74>se o<> une ou plusieurs des dispositions du Contrat
|
||||
s'av<61>rerait contraire <20> une loi ou <20> un texte applicable, existants ou
|
||||
futurs, cette loi ou ce texte pr<70>vaudrait, et les Parties feraient les
|
||||
amendements n<>cessaires pour se conformer <20> cette loi ou <20> ce texte.
|
||||
Toutes les autres dispositions resteront en vigueur. De m<>me, la
|
||||
nullit<EFBFBD>, pour quelque raison que ce soit, d'une des dispositions du
|
||||
Contrat ne saurait entra<72>ner la nullit<69> de l'ensemble du Contrat.
|
||||
|
||||
|
||||
11.5 LANGUE
|
||||
|
||||
Le Contrat est r<>dig<69> en langue fran<61>aise et en langue anglaise, ces
|
||||
deux versions faisant <20>galement foi.
|
||||
|
||||
|
||||
Article 12 - NOUVELLES VERSIONS DU CONTRAT
|
||||
|
||||
12.1 Toute personne est autoris<69>e <20> copier et distribuer des copies de
|
||||
ce Contrat.
|
||||
|
||||
12.2 Afin d'en pr<70>server la coh<6F>rence, le texte du Contrat est prot<6F>g<EFBFBD>
|
||||
et ne peut <20>tre modifi<66> que par les auteurs de la licence, lesquels se
|
||||
r<EFBFBD>servent le droit de publier p<>riodiquement des mises <20> jour ou de
|
||||
nouvelles versions du Contrat, qui poss<73>deront chacune un num<75>ro
|
||||
distinct. Ces versions ult<6C>rieures seront susceptibles de prendre en
|
||||
compte de nouvelles probl<62>matiques rencontr<74>es par les logiciels libres.
|
||||
|
||||
12.3 Tout Logiciel diffus<75> sous une version donn<6E>e du Contrat ne pourra
|
||||
faire l'objet d'une diffusion ult<6C>rieure que sous la m<>me version du
|
||||
Contrat ou une version post<73>rieure, sous r<>serve des dispositions de
|
||||
l'article 5.3.4.
|
||||
|
||||
|
||||
Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE
|
||||
|
||||
13.1 Le Contrat est r<>gi par la loi fran<61>aise. Les Parties conviennent
|
||||
de tenter de r<>gler <20> l'amiable les diff<66>rends ou litiges qui
|
||||
viendraient <20> se produire par suite ou <20> l'occasion du Contrat.
|
||||
|
||||
13.2 A d<>faut d'accord amiable dans un d<>lai de deux (2) mois <20> compter
|
||||
de leur survenance et sauf situation relevant d'une proc<6F>dure d'urgence,
|
||||
les diff<66>rends ou litiges seront port<72>s par la Partie la plus diligente
|
||||
devant les Tribunaux comp<6D>tents de Paris.
|
||||
|
||||
|
||||
Version 2.0 du 2006-09-05.
|
55
src/sumaclust/sumaclust_v1.0.10/Makefile
Normal file
55
src/sumaclust/sumaclust_v1.0.10/Makefile
Normal file
@ -0,0 +1,55 @@
|
||||
EXEC=sumaclust
|
||||
|
||||
SUMACLUST_SRC= sumaclust.c \
|
||||
mtcompare_sumaclust.c
|
||||
|
||||
|
||||
SUMACLUST_OBJ= $(patsubst %.c,%.o,$(SUMACLUST_SRC))
|
||||
|
||||
|
||||
SRCS= $(SUMACLUST_SRC)
|
||||
|
||||
LIB= -lfasta -llcs -lfile -lutils -lm #-ll
|
||||
|
||||
|
||||
include ./global.mk
|
||||
|
||||
all: $(EXEC) install
|
||||
|
||||
|
||||
########
|
||||
#
|
||||
# sumaclust compilation
|
||||
#
|
||||
########
|
||||
|
||||
# executable compilation and link
|
||||
|
||||
#ifeq ($(CC),gcc)
|
||||
# LFLAGS = -fopenmp
|
||||
#else
|
||||
# LFLAGS =
|
||||
#endif
|
||||
|
||||
sumaclust: $(SUMACLUST_OBJ) $(LIBFASTA) $(LIBLCS) $(LIBFILE) $(LIBUTILS)
|
||||
$(CC) $(LIBFASTAPATH) $(LIBLCSPATH) $(LIBFILEPATH) $(LIBUTILSPATH) $(LDFLAGS) -o $@ $(LFLAGS) $(SUMACLUST_OBJ) $(LIB)
|
||||
|
||||
########
|
||||
#
|
||||
# project management
|
||||
#
|
||||
########
|
||||
|
||||
clean:
|
||||
rm -f *.o
|
||||
rm -f *.P
|
||||
rm -f $(EXEC)
|
||||
$(MAKE) -C ./sumalibs/libfasta clean
|
||||
$(MAKE) -C ./sumalibs/liblcs clean
|
||||
$(MAKE) -C ./sumalibs/libfile clean
|
||||
$(MAKE) -C ./sumalibs/libutils clean
|
||||
|
||||
install:
|
||||
cp $(EXEC) $(BINDIR)
|
||||
|
||||
|
45
src/sumaclust/sumaclust_v1.0.10/global.mk
Normal file
45
src/sumaclust/sumaclust_v1.0.10/global.mk
Normal file
@ -0,0 +1,45 @@
|
||||
include ../../../config/auto.conf
|
||||
|
||||
LIBFASTAPATH = -L./sumalibs/libfasta
|
||||
LIBLCSPATH = -L./sumalibs/liblcs
|
||||
LIBFILEPATH = -L./sumalibs/libfile
|
||||
LIBUTILSPATH = -L./sumalibs/libutils
|
||||
|
||||
LIBFASTA = ./sumalibs/libfasta/libfasta.a
|
||||
LIBLCS = ./sumalibs/liblcs/liblcs.a
|
||||
LIBFILE = ./sumalibs/libfile/libfile.a
|
||||
LIBUTILS = ./sumalibs/libutils/libutils.a
|
||||
|
||||
|
||||
|
||||
#ifeq ($(CC),gcc)
|
||||
# CFLAGS = -O3 -s -DOMP_SUPPORT -fopenmp -w
|
||||
#else
|
||||
# CFLAGS = -O3 -w
|
||||
#endif
|
||||
|
||||
|
||||
default: all
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
|
||||
########
|
||||
#
|
||||
# libraries compilation
|
||||
#
|
||||
########
|
||||
|
||||
./sumalibs/libfasta/libfasta.a:
|
||||
$(MAKE) -C ./sumalibs/libfasta
|
||||
|
||||
./sumalibs/liblcs/liblcs.a:
|
||||
$(MAKE) -C ./sumalibs/liblcs
|
||||
|
||||
./sumalibs/libfile/libfile.a:
|
||||
$(MAKE) -C ./sumalibs/libfile
|
||||
|
||||
./sumalibs/libutils/libutils.a:
|
||||
$(MAKE) -C ./sumalibs/libutils
|
||||
|
334
src/sumaclust/sumaclust_v1.0.10/mtcompare_sumaclust.c
Normal file
334
src/sumaclust/sumaclust_v1.0.10/mtcompare_sumaclust.c
Normal file
@ -0,0 +1,334 @@
|
||||
/*
|
||||
* mtcompare_cumaclust.c
|
||||
*
|
||||
* Author: Celine Mercier
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifdef OMP_SUPPORT
|
||||
#include <omp.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "./sumalibs/libfasta/sequence.h"
|
||||
#include "./sumalibs/libutils/utilities.h"
|
||||
#include "./sumalibs/liblcs/upperband.h"
|
||||
#include "./sumalibs/liblcs/sse_banded_LCS_alignment.h"
|
||||
|
||||
#include "sumaclust.h"
|
||||
|
||||
|
||||
|
||||
static double computeScore(void* c, int32_t seed_number, int32_t i, int thread_number,int32_t maxcount)
|
||||
{
|
||||
thread_control_t *control=(thread_control_t*)c;
|
||||
fastaSeqPtr* db = control->db;
|
||||
fastaSeqPtr db_i = db[i];
|
||||
fastaSeqPtr db_seed_number = db[seed_number];
|
||||
int LCSmin;
|
||||
double score;
|
||||
|
||||
score = control->worstscore;
|
||||
|
||||
if (db_i->count <= maxcount)
|
||||
filters(db_i, db_seed_number,
|
||||
control->threshold,
|
||||
control->normalize,
|
||||
control->reference,
|
||||
control->lcsmode,
|
||||
&score,
|
||||
&LCSmin);
|
||||
|
||||
if (score == -1.0)
|
||||
score = alignForSumathings(db_seed_number->sequence, control->iseqs1[thread_number],
|
||||
db_i->sequence, control->iseqs2[thread_number],
|
||||
db_seed_number->length, db_i->length,
|
||||
control->normalize, control->reference,
|
||||
control->lcsmode, control->addresses[thread_number],
|
||||
control->sizeForSeqs, LCSmin);
|
||||
|
||||
return score;
|
||||
}
|
||||
|
||||
|
||||
inline void putSeqInClusterMT(void *c, int32_t center_idx, int32_t seq, double score)
|
||||
{
|
||||
// saves a sequence as belonging to a cluster and its score with the seed
|
||||
|
||||
thread_control_t *control=(thread_control_t*)c;
|
||||
fastaSeqPtr* db = control->db;
|
||||
fastaSeqPtr pseq = db[seq];
|
||||
|
||||
|
||||
pseq->center = db+center_idx;
|
||||
pseq->center_index = center_idx; // saves cluster
|
||||
pseq->score = score; // saves score with the seed
|
||||
pseq->cluster_center = FALSE;
|
||||
}
|
||||
|
||||
|
||||
int64_t timevaldiff(struct timeval *starttime, struct timeval *finishtime)
|
||||
{
|
||||
int64_t msec;
|
||||
msec=(finishtime->tv_sec-starttime->tv_sec)*1000000;
|
||||
msec+=(finishtime->tv_usec-starttime->tv_usec)/1000000;
|
||||
return msec;
|
||||
}
|
||||
|
||||
void computeOneSeed(void* c)
|
||||
{
|
||||
thread_control_t *control=(thread_control_t*)c;
|
||||
BOOL found;
|
||||
int32_t seed_number;
|
||||
int32_t nextone=control->n;
|
||||
int64_t elapsedtime;
|
||||
struct timeval current;
|
||||
struct timeval start;
|
||||
|
||||
seed_number = control->next;
|
||||
found = FALSE;
|
||||
|
||||
//printf("\n seed = %d, n = %d", seed_number, control->n);
|
||||
|
||||
#ifdef OMP_SUPPORT
|
||||
omp_set_num_threads(control->threads_number);
|
||||
#endif
|
||||
|
||||
gettimeofday(&start,NULL);
|
||||
|
||||
#ifdef OMP_SUPPORT
|
||||
#pragma omp parallel default(none) \
|
||||
firstprivate(found) \
|
||||
firstprivate(seed_number) \
|
||||
firstprivate(control) \
|
||||
shared(nextone)
|
||||
#endif
|
||||
|
||||
{
|
||||
int32_t i;
|
||||
double score;
|
||||
int32_t current_seed;
|
||||
#ifdef OMP_SUPPORT
|
||||
int thread_id=omp_get_thread_num();
|
||||
#else
|
||||
int thread_id=0;
|
||||
#endif
|
||||
int nseq = control->n;
|
||||
BOOL fast = control->fast;
|
||||
BOOL lcsmode = control->lcsmode;
|
||||
int normalize = control->normalize;
|
||||
double threshold = control->threshold;
|
||||
BOOL first = TRUE;
|
||||
BOOL not_already_in_a_cluster;
|
||||
BOOL threshold_bad;
|
||||
int32_t priv_nextone=control->n;
|
||||
int32_t maxcount = (double)(control->db[seed_number]->count) * control->max_ratio;
|
||||
|
||||
fastaSeqPtr* db = control->db;
|
||||
|
||||
#ifdef OMP_SUPPORT
|
||||
#pragma omp for schedule(dynamic,10)
|
||||
#endif
|
||||
|
||||
for (i=seed_number+1; \
|
||||
i < nseq; \
|
||||
i++)
|
||||
{
|
||||
|
||||
current_seed = db[i]->center_index;
|
||||
not_already_in_a_cluster = current_seed == i; // At the beginning all the sequences are their own center
|
||||
|
||||
if ((! fast) || not_already_in_a_cluster)
|
||||
{
|
||||
score = computeScore((void*)control, seed_number, i, thread_id,maxcount); // computes LCS score or 0 if k-mer filter not passed
|
||||
|
||||
if (lcsmode || normalize)
|
||||
threshold_bad = (score < threshold);
|
||||
else
|
||||
threshold_bad = (score > threshold);
|
||||
|
||||
if (threshold_bad) // similarity under threshold
|
||||
{
|
||||
if (!found && not_already_in_a_cluster && (i < priv_nextone))
|
||||
{
|
||||
priv_nextone=i; // saves potential next seed
|
||||
// *potential_nexts_list = i;
|
||||
|
||||
found = TRUE; // saves the fact that a next seed
|
||||
// has been found for this thread
|
||||
}
|
||||
}
|
||||
else if (not_already_in_a_cluster || \
|
||||
((! fast) && \
|
||||
(db[i]->score < score)))
|
||||
{ // if seq matching with current seed :
|
||||
// clustering with seed if seq doesn't belong to any cluster yet
|
||||
// OR in exact mode and the score is better with this seed
|
||||
if (! lcsmode && normalize)
|
||||
score = 1.0 - score;
|
||||
putSeqInClusterMT((void*)control, seed_number, i, score); // saves new seed for this seq
|
||||
}
|
||||
} // if ((! fast) || on_current_seed)
|
||||
|
||||
} // for (i=seed_number+1;...
|
||||
|
||||
#ifdef OMP_SUPPORT
|
||||
#pragma omp flush(nextone)
|
||||
#endif
|
||||
if (priv_nextone < nextone)
|
||||
#ifdef OMP_SUPPORT
|
||||
#pragma omp critical
|
||||
#endif
|
||||
if (priv_nextone < nextone)
|
||||
nextone=priv_nextone;
|
||||
|
||||
}
|
||||
|
||||
gettimeofday(¤t,NULL);
|
||||
elapsedtime = timevaldiff(&start,¤t);
|
||||
control->elapsedtime+=elapsedtime;
|
||||
|
||||
control->next=nextone;
|
||||
|
||||
if (control->next < (control->n)-1)
|
||||
(control->seeds_counter)++;
|
||||
else if (control->next == (control->n)-1)
|
||||
{
|
||||
control->stop = TRUE;
|
||||
(control->seeds_counter)++;
|
||||
}
|
||||
else if (control->next == control->n)
|
||||
control->stop = TRUE;
|
||||
}
|
||||
|
||||
|
||||
void initializeCentersAndScores(void *c)
|
||||
{
|
||||
// Initializing the scores table for each seq :
|
||||
|
||||
thread_control_t *control = (thread_control_t*) c;
|
||||
int32_t i;
|
||||
fastaSeqPtr *db_i;
|
||||
int scoremax;
|
||||
|
||||
if (control->normalize && control->lcsmode)
|
||||
scoremax = 1.0;
|
||||
else if (!control->lcsmode)
|
||||
scoremax = 0.0;
|
||||
else
|
||||
scoremax = (*(control->db))->length;
|
||||
|
||||
for (i=0, db_i = control->db;
|
||||
i <= control->n-1;
|
||||
i++,db_i++)
|
||||
{
|
||||
(*db_i)->center = (control->db)+i;
|
||||
(*db_i)->center_index = i;
|
||||
(*db_i)->score = scoremax;
|
||||
(*db_i)->cluster_center = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void freeEverything(void *c)
|
||||
{
|
||||
thread_control_t *control=(thread_control_t*)c;
|
||||
int i;
|
||||
|
||||
// free(control->potential_nexts_list);
|
||||
if ((control->reference == ALILEN) && (control->normalize || !control->lcsmode))
|
||||
{
|
||||
for (i=0; i < control->threads_number; i++)
|
||||
free(control->addresses[i]);
|
||||
free(control->addresses);
|
||||
}
|
||||
free(control->iseqs1);
|
||||
free(control->iseqs2);
|
||||
}
|
||||
|
||||
|
||||
int mt_compare_sumaclust(fastaSeqPtr* db, int n, BOOL fast, double threshold, BOOL normalize,
|
||||
int reference, BOOL lcsmode, int threads_number, double max_ratio)
|
||||
{
|
||||
thread_control_t control;
|
||||
int32_t i;
|
||||
int lmax, lmin;
|
||||
|
||||
if (lcsmode || normalize)
|
||||
fprintf(stderr,"Clustering sequences when similarity >= %lf\n", threshold);
|
||||
else
|
||||
fprintf(stderr,"Clustering sequences when distance <= %lf\n", threshold);
|
||||
|
||||
fprintf(stderr,"Aligning and clustering... \n");
|
||||
|
||||
#ifdef OMP_SUPPORT
|
||||
control.threads_number = omp_get_max_threads();
|
||||
#else
|
||||
control.threads_number = 1;
|
||||
#endif
|
||||
if (threads_number < control.threads_number)
|
||||
control.threads_number = threads_number;
|
||||
|
||||
calculateMaxAndMinLen(db, n, &lmax, &lmin);
|
||||
|
||||
control.addresses = (int16_t**) malloc(control.threads_number*sizeof(int16_t*));
|
||||
control.iseqs1 = (int16_t**) malloc(control.threads_number*sizeof(int16_t*));
|
||||
control.iseqs2 = (int16_t**) malloc(control.threads_number*sizeof(int16_t*));
|
||||
|
||||
for (i=0; i < control.threads_number; i++)
|
||||
control.sizeForSeqs = prepareTablesForSumathings(lmax, lmin, threshold, normalize, reference, lcsmode, (control.addresses)+i, (control.iseqs1)+i, (control.iseqs2)+i);
|
||||
|
||||
control.db = db;
|
||||
control.next = 0;
|
||||
control.normalize = normalize;
|
||||
control.reference = reference;
|
||||
control.threshold = threshold;
|
||||
control.max_ratio = max_ratio;
|
||||
control.lcsmode = lcsmode;
|
||||
control.stop = FALSE;
|
||||
control.fast = fast;
|
||||
control.seeds_counter = 1;
|
||||
// control.potential_nexts_list = (int*) calloc(control.threads_number, sizeof(int));
|
||||
control.n = n;
|
||||
|
||||
if (lcsmode || normalize)
|
||||
control.worstscore = 0.0;
|
||||
else
|
||||
control.worstscore = lmax;
|
||||
|
||||
control.elapsedtime=0;
|
||||
|
||||
fprintf(stderr, "%d threads running\n", control.threads_number);
|
||||
|
||||
// initialize scores table :
|
||||
initializeCentersAndScores(&control);
|
||||
|
||||
while (control.stop == FALSE)
|
||||
{
|
||||
if ((control.next)%100 == 0)
|
||||
{
|
||||
float p = ((float)(control.next)/(float)n)*100;
|
||||
fprintf(stderr,"\rDone : %f %% ",p);
|
||||
}
|
||||
computeOneSeed(&control);
|
||||
|
||||
}
|
||||
|
||||
for (i=0; i < control.threads_number; i++)
|
||||
{
|
||||
free((*((control.iseqs1)+i))-(control.sizeForSeqs)+lmax);
|
||||
free((*((control.iseqs2)+i))-(control.sizeForSeqs)+lmax);
|
||||
}
|
||||
|
||||
freeEverything(&control);
|
||||
fprintf(stderr,"\rDone : 100 %% %d clusters created. \n\n", control.seeds_counter);
|
||||
fprintf(stderr,"Pure computation time %f \n\n", (double)control.elapsedtime/1000000.);
|
||||
|
||||
|
||||
return(control.seeds_counter);
|
||||
}
|
15
src/sumaclust/sumaclust_v1.0.10/mtcompare_sumaclust.h
Normal file
15
src/sumaclust/sumaclust_v1.0.10/mtcompare_sumaclust.h
Normal file
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* mtcompare.h
|
||||
*
|
||||
* Created on: 12 mars 2013
|
||||
* Author: celinemercier
|
||||
*/
|
||||
|
||||
#ifndef MTCOMPARE_H_
|
||||
#define MTCOMPARE_H_
|
||||
|
||||
int mt_compare_sumaclust(fastaSeqPtr* db, int n, BOOL fast, double threshold, BOOL normalize,
|
||||
int reference, BOOL lcsmode, int threads_number, double max_ratio);
|
||||
|
||||
|
||||
#endif /* MTCOMPARE_H_ */
|
1086
src/sumaclust/sumaclust_v1.0.10/sumaclust.c
Normal file
1086
src/sumaclust/sumaclust_v1.0.10/sumaclust.c
Normal file
File diff suppressed because it is too large
Load Diff
34
src/sumaclust/sumaclust_v1.0.10/sumaclust.h
Normal file
34
src/sumaclust/sumaclust_v1.0.10/sumaclust.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* sumaclust.h
|
||||
*
|
||||
* Created on: april 2, 2012
|
||||
* Author: mercier
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SUMACLUST_H_
|
||||
#define SUMACLUST_H_
|
||||
|
||||
typedef struct {
|
||||
int32_t next;
|
||||
int32_t threads_number;
|
||||
int* potential_nexts_list;
|
||||
fastaSeqPtr* db;
|
||||
int n;
|
||||
int normalize;
|
||||
int reference;
|
||||
BOOL lcsmode;
|
||||
BOOL fast;
|
||||
double threshold;
|
||||
BOOL stop;
|
||||
int sizeForSeqs;
|
||||
int16_t** addresses;
|
||||
int16_t** iseqs1;
|
||||
int16_t** iseqs2;
|
||||
int seeds_counter;
|
||||
double worstscore;
|
||||
double max_ratio;
|
||||
int64_t elapsedtime;
|
||||
} thread_control_t;
|
||||
|
||||
#endif /* SUMACLUST_H_ */
|
143
src/sumaclust/sumaclust_v1.0.10/sumaclust_user_manual.md
Normal file
143
src/sumaclust/sumaclust_v1.0.10/sumaclust_user_manual.md
Normal file
@ -0,0 +1,143 @@
|
||||
# Sumaclust: fast and exact clustering of sequences
|
||||
|
||||
[metabarcoding.org/sumaclust](metabarcoding.org/sumaclust)
|
||||
|
||||
|
||||
## Introduction
|
||||
|
||||
With the development of next-generation sequencing, efficient tools are needed to handle millions of sequences in reasonable amounts of time.
|
||||
Sumaclust is a program developed by the [LECA](http://www-leca.ujf-grenoble.fr/?lang=en).
|
||||
Sumaclust aims to cluster sequences in a way that is fast and exact at the same time. This tool has been developed to be adapted to the type of data generated by DNA metabarcoding, i.e. entirely sequenced, short markers.
|
||||
Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. This algorithm is mainly useful to detect the 'erroneous' sequences created during amplification and sequencing protocols, deriving from 'true' sequences.
|
||||
Currently, Sumaclust is available as a program that you can download and install on Unix-like machines.
|
||||
|
||||
## Download and installation of Sumaclust
|
||||
|
||||
### Download
|
||||
|
||||
Sumaclust can be downloaded from the metabarcoding.org GitLab.
|
||||
The archive of the latest tagged version can be downloaded on the GitLab wiki page:
|
||||
|
||||
[https://git.metabarcoding.org/obitools/sumaclust/wikis/home](https://git.metabarcoding.org/obitools/sumaclust/wikis/home)
|
||||
|
||||
The versions downloaded this way are for Unix-like systems compatible with SIMD SSE2 instructions and POSIX threads. Pre-compiled versions of GCC for OS X can be found [here](http://hpc.sourceforge.net/), that might be helpful if you encounter problems compiling the programs. Send an email at <celine.mercier@metabarcoding.org> for other versions, or if you have any inquiries.
|
||||
|
||||
### Installation
|
||||
|
||||
Untar the archive, go into the newly created directory and compile:
|
||||
|
||||
```
|
||||
tar –zxvf sumaclust_v[x.x.xx].tar.gz
|
||||
cd sumaclust_v[x.x.xx]
|
||||
make
|
||||
```
|
||||
|
||||
You can compile Sumaclust with `clang`, which deactivates `OpenMP`, with:
|
||||
|
||||
```
|
||||
make CC=clang
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. This algorithm is mainly useful to detect the "erroneous" sequences created during amplification and sequencing protocols, deriving from "true" sequences.
|
||||
|
||||
### Using Sumaclust
|
||||
|
||||
#### Input
|
||||
|
||||
Input file must be in FASTA format.
|
||||
|
||||
#### Usage
|
||||
|
||||
```
|
||||
sumaclust [-l|L|a|n|r|d|e|o|g|f] [-t threshold_value] [-s sorting_key] [-R maximum_ratio] [-p number_of_threads] [-B file_name_for_BIOM-formatted_output] [-O file_name_for_OTU_table-formatted_output] [-F file_name_for_FASTA-formatted_output] dataset
|
||||
```
|
||||
|
||||
Argument: the sequence dataset to cluster.
|
||||
|
||||
For help :
|
||||
|
||||
```
|
||||
sumaclust -h
|
||||
```
|
||||
|
||||
#### Examples
|
||||
|
||||
```
|
||||
sumaclust -t 0.97 my_dataset.fasta > clusters_of_seqs_with_similarity_>_97%.fasta
|
||||
```
|
||||
|
||||
```
|
||||
sumaclust -d -r -t 2 my_dataset.fasta > clusters_of_seqs_with_distance_<=_2_differences.fasta
|
||||
```
|
||||
|
||||
#### Options
|
||||
|
||||
```
|
||||
-h : [H]elp - print the help
|
||||
-l : Reference sequence length is the shortest.
|
||||
-L : Reference sequence length is the largest.
|
||||
-a : Reference sequence length is the alignment length (default).
|
||||
-n : Score is normalized by reference sequence length (default).
|
||||
-r : Raw score, not normalized.
|
||||
-d : Score is expressed in distance (default : score is expressed in similarity).
|
||||
-t ##.## : Score threshold for clustering. If the score is normalized and expressed in similarity (default), it is an identity, e.g. 0.95 for an identity of 95%. If the score is normalized and expressed in distance, it is (1.0 - identity), e.g. 0.05 for an identity of 95%. If the score is not normalized and expressed in similarity, it is the length of the Longest Common Subsequence. If the score is not normalized and expressed in distance, it is (reference length - LCS length). Only sequences with a similarity above ##.## with the representative sequence of a cluster are assigned to that cluster. Default: 0.97.
|
||||
-e : Exact option : A sequence is assigned to the cluster with the representative sequence presenting the highest similarity score > threshold, as opposed to the default 'fast' option where a sequence is assigned to the first cluster found with a representative sequence presenting a score > threshold.
|
||||
-R ## : Maximum ratio between the counts of two sequences so that the less abundant one can be considered as a variant of the more abundant one. Default: 1.0.
|
||||
-p ## : Multithreading with ## threads using openMP.
|
||||
-s #### : Sorting by ####. Must be 'None' for no sorting, or a key in the fasta header of each sequence, except for the count that can be computed (default : sorting by count).
|
||||
-o : Sorting is in ascending order (default: descending).
|
||||
-g : n's are replaced with a's (default: sequences with n's are discarded).
|
||||
-B ### : Output of the OTU table in BIOM format is activated, and written to file ###.
|
||||
-O ### : Output of the OTU map (observation map) is activated, and written to file ###.
|
||||
-F ### : Output in FASTA format is written to file ### instead of standard output.
|
||||
-f : Output in FASTA format is deactivated.
|
||||
```
|
||||
|
||||
#### Output
|
||||
|
||||
Sumaclust's default output is in fasta format. There are four fields added in the headers of all sequences. Those fields are of the form [key=value;]. The four keys are `cluster`, `cluster_score`, `cluster_center` and `cluster_weight` and their values correspond respectively to the identifier of the center of the sequence's cluster, the similarity score of the sequence with this center, a boolean indicating whether the sequence is the center of its cluster, and the total number of sequences in the cluster to which the sequence belongs.
|
||||
|
||||
Example where `seq_1` is a cluster center and `seq_2` is clustered with `seq_1`:
|
||||
|
||||
```
|
||||
>seq_1 species=Heracleum maximum; count=3; cluster=seq_1; cluster_score=1.0; cluster_center=True; cluster_weight=5; atcctattttccaaaaacaaacaaaggcccagaaggtgaaaaaag
|
||||
>seq_2 species=Cnidium cnidiifolium; count=2; cluster=seq_1; cluster_score=0.955556; cluster_center=False; cluster_weight=5; atcctattttccaaaaacaacaaaggcccataaggtgaaaaaag
|
||||
```
|
||||
|
||||
There is a possibility to print the clusters in BIOM format with the `–B` option, and/or in OTU map (observation map) format with the `–O` option. The FASTA output can then be deactivated with the `–f` option. The FASTA output is written to the standard output by default, but can be written to a file using the `–F` option.
|
||||
In the following examples, the first one prints results in FASTA and BIOM formats, and the second one prints results in BIOM and OTU map formats:
|
||||
|
||||
```
|
||||
sumaclust -B clusters_of_seqs_with_similarity_>_97%.biom my_dataset.fasta > clusters_of_seqs_with_similarity_>_97%.fasta
|
||||
```
|
||||
```
|
||||
sumaclust -F -B clusters_of_seqs_with_similarity_>_97%.biom -O clusters_of_seqs_with_similarity_>_97%.txt my_dataset.fasta
|
||||
```
|
||||
|
||||
### How SUMACLUST works
|
||||
|
||||
#### Clustering algorithm
|
||||
|
||||
Sumaclust clusters sequences using the same clustering algorithm as UCLUST and CD-HIT. The problem is defined as follows:
|
||||
|
||||
Sumaclust browses through the dataset, in the order in which the sequences have been sorted with the -s option. By default, sequences are sorted by decreasing abundance, because this enables to identify 'true' and 'erroneous' sequences the best, as 'true' sequences tend to end up as cluster centers. The first sequence of the ordered list is considered the center of the first cluster. Each sequence, following the ordered list, is compared with the centers of the existing clusters, respecting the initial list's order. If the similarity of the query sequence with a center is above a chosen threshold, and their abundance ratio is below the maximum ratio chosen, the sequence is grouped in the cluster of this center. Otherwise, a new cluster is created with the query sequence as the center.
|
||||
|
||||
#### About the abundance ratio
|
||||
|
||||
An edge is created between a query sequence and a center sequence only if their abundance ratio, i.e. the query sequence’s count divided by the center sequence’s count, is below the maximum ratio chosen with the `–R` option. This can prevent sequences that are very abundant, and therefore likely true sequences, to be considered a variant of another true sequence that is only a little more abundant and very close to them.
|
||||
|
||||
#### Similarity computation
|
||||
|
||||
##### Similarity indice
|
||||
|
||||
A good way to evaluate the similarities between full-length sequences is to use indices based on the length of the Longest Common Subsequence (LCS), and in particular, a good similarity indice is the length of the LCS divided by the length of the shortest alignment representing this LCS, giving an identity percentage. This is the similarity indice used by Sumatra by default. Other similarity indices are available through the options.
|
||||
|
||||
##### Fast computation of the similarity
|
||||
|
||||
*Lossless k-mer filter.* Since we are usually interested in higly similar sequences, Sumatra uses similarity thresholds under which similarities are not reported. A lossless filtering step enables to only align couples of sequences that potentially have an identity greater than the chosen threshold. This filter is based on the number of overlapping k-mers that the sequences must share in order to have an identity at least equal to the threshold. With typical DNA metabarcoding datasets (a few millions sequences of 50-300 bp and threshold around 90-95% id), we empirically determined that the most efficient filtering was achieved with 4-mers and 5-mers.
|
||||
|
||||
*Alignment within a diagonal band.* Alignments are computed using a Needleman-Wunsch algorithm. In the scoring system used, matches are rewarded by one point, and mismatches and insertions/deletions are not penalised. The computation of the length of the LCS and the length of the alignment by the NWS algorithm has a quadratic complexity in time. It is responsible for most of the computation time. At high identity thresholds, the alignment computation can be done only in a diagonal band of the alignment matrix, gaining a considerable amount of time depending on the threshold.
|
||||
|
||||
*Parallelization.* There are two levels of parallelization implemented in Sumatra. Both the filtering and the alignments steps are optimized with the use of Simple Instruction Multiple Data instructions (SIMD). Since 4-mers enable to work easily with SIMD instructions, we implemented a 4-mer filter. Moreover, the program can be run on multiple threads.
|
BIN
src/sumaclust/sumaclust_v1.0.10/sumaclust_user_manual.pdf
Normal file
BIN
src/sumaclust/sumaclust_v1.0.10/sumaclust_user_manual.pdf
Normal file
Binary file not shown.
@ -0,0 +1,506 @@
|
||||
|
||||
CeCILL FREE SOFTWARE LICENSE AGREEMENT
|
||||
|
||||
|
||||
Notice
|
||||
|
||||
This Agreement is a Free Software license agreement that is the result
|
||||
of discussions between its authors in order to ensure compliance with
|
||||
the two main principles guiding its drafting:
|
||||
|
||||
* firstly, compliance with the principles governing the distribution
|
||||
of Free Software: access to source code, broad rights granted to
|
||||
users,
|
||||
* secondly, the election of a governing law, French law, with which
|
||||
it is conformant, both as regards the law of torts and
|
||||
intellectual property law, and the protection that it offers to
|
||||
both authors and holders of the economic rights over software.
|
||||
|
||||
The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
|
||||
license are:
|
||||
|
||||
Commissariat <20> l'Energie Atomique - CEA, a public scientific, technical
|
||||
and industrial research establishment, having its principal place of
|
||||
business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
|
||||
|
||||
Centre National de la Recherche Scientifique - CNRS, a public scientific
|
||||
and technological establishment, having its principal place of business
|
||||
at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
|
||||
|
||||
Institut National de Recherche en Informatique et en Automatique -
|
||||
INRIA, a public scientific and technological establishment, having its
|
||||
principal place of business at Domaine de Voluceau, Rocquencourt, BP
|
||||
105, 78153 Le Chesnay cedex, France.
|
||||
|
||||
|
||||
Preamble
|
||||
|
||||
The purpose of this Free Software license agreement is to grant users
|
||||
the right to modify and redistribute the software governed by this
|
||||
license within the framework of an open source distribution model.
|
||||
|
||||
The exercising of these rights is conditional upon certain obligations
|
||||
for users so as to preserve this status for all subsequent redistributions.
|
||||
|
||||
In consideration of access to the source code and the rights to copy,
|
||||
modify and redistribute granted by the license, users are provided only
|
||||
with a limited warranty and the software's author, the holder of the
|
||||
economic rights, and the successive licensors only have limited liability.
|
||||
|
||||
In this respect, the risks associated with loading, using, modifying
|
||||
and/or developing or reproducing the software by the user are brought to
|
||||
the user's attention, given its Free Software status, which may make it
|
||||
complicated to use, with the result that its use is reserved for
|
||||
developers and experienced professionals having in-depth computer
|
||||
knowledge. Users are therefore encouraged to load and test the
|
||||
suitability of the software as regards their requirements in conditions
|
||||
enabling the security of their systems and/or data to be ensured and,
|
||||
more generally, to use and operate it in the same conditions of
|
||||
security. This Agreement may be freely reproduced and published,
|
||||
provided it is not altered, and that no provisions are either added or
|
||||
removed herefrom.
|
||||
|
||||
This Agreement may apply to any or all software for which the holder of
|
||||
the economic rights decides to submit the use thereof to its provisions.
|
||||
|
||||
|
||||
Article 1 - DEFINITIONS
|
||||
|
||||
For the purpose of this Agreement, when the following expressions
|
||||
commence with a capital letter, they shall have the following meaning:
|
||||
|
||||
Agreement: means this license agreement, and its possible subsequent
|
||||
versions and annexes.
|
||||
|
||||
Software: means the software in its Object Code and/or Source Code form
|
||||
and, where applicable, its documentation, "as is" when the Licensee
|
||||
accepts the Agreement.
|
||||
|
||||
Initial Software: means the Software in its Source Code and possibly its
|
||||
Object Code form and, where applicable, its documentation, "as is" when
|
||||
it is first distributed under the terms and conditions of the Agreement.
|
||||
|
||||
Modified Software: means the Software modified by at least one
|
||||
Contribution.
|
||||
|
||||
Source Code: means all the Software's instructions and program lines to
|
||||
which access is required so as to modify the Software.
|
||||
|
||||
Object Code: means the binary files originating from the compilation of
|
||||
the Source Code.
|
||||
|
||||
Holder: means the holder(s) of the economic rights over the Initial
|
||||
Software.
|
||||
|
||||
Licensee: means the Software user(s) having accepted the Agreement.
|
||||
|
||||
Contributor: means a Licensee having made at least one Contribution.
|
||||
|
||||
Licensor: means the Holder, or any other individual or legal entity, who
|
||||
distributes the Software under the Agreement.
|
||||
|
||||
Contribution: means any or all modifications, corrections, translations,
|
||||
adaptations and/or new functions integrated into the Software by any or
|
||||
all Contributors, as well as any or all Internal Modules.
|
||||
|
||||
Module: means a set of sources files including their documentation that
|
||||
enables supplementary functions or services in addition to those offered
|
||||
by the Software.
|
||||
|
||||
External Module: means any or all Modules, not derived from the
|
||||
Software, so that this Module and the Software run in separate address
|
||||
spaces, with one calling the other when they are run.
|
||||
|
||||
Internal Module: means any or all Module, connected to the Software so
|
||||
that they both execute in the same address space.
|
||||
|
||||
GNU GPL: means the GNU General Public License version 2 or any
|
||||
subsequent version, as published by the Free Software Foundation Inc.
|
||||
|
||||
Parties: mean both the Licensee and the Licensor.
|
||||
|
||||
These expressions may be used both in singular and plural form.
|
||||
|
||||
|
||||
Article 2 - PURPOSE
|
||||
|
||||
The purpose of the Agreement is the grant by the Licensor to the
|
||||
Licensee of a non-exclusive, transferable and worldwide license for the
|
||||
Software as set forth in Article 5 hereinafter for the whole term of the
|
||||
protection granted by the rights over said Software.
|
||||
|
||||
|
||||
Article 3 - ACCEPTANCE
|
||||
|
||||
3.1 The Licensee shall be deemed as having accepted the terms and
|
||||
conditions of this Agreement upon the occurrence of the first of the
|
||||
following events:
|
||||
|
||||
* (i) loading the Software by any or all means, notably, by
|
||||
downloading from a remote server, or by loading from a physical
|
||||
medium;
|
||||
* (ii) the first time the Licensee exercises any of the rights
|
||||
granted hereunder.
|
||||
|
||||
3.2 One copy of the Agreement, containing a notice relating to the
|
||||
characteristics of the Software, to the limited warranty, and to the
|
||||
fact that its use is restricted to experienced users has been provided
|
||||
to the Licensee prior to its acceptance as set forth in Article 3.1
|
||||
hereinabove, and the Licensee hereby acknowledges that it has read and
|
||||
understood it.
|
||||
|
||||
|
||||
Article 4 - EFFECTIVE DATE AND TERM
|
||||
|
||||
|
||||
4.1 EFFECTIVE DATE
|
||||
|
||||
The Agreement shall become effective on the date when it is accepted by
|
||||
the Licensee as set forth in Article 3.1.
|
||||
|
||||
|
||||
4.2 TERM
|
||||
|
||||
The Agreement shall remain in force for the entire legal term of
|
||||
protection of the economic rights over the Software.
|
||||
|
||||
|
||||
Article 5 - SCOPE OF RIGHTS GRANTED
|
||||
|
||||
The Licensor hereby grants to the Licensee, who accepts, the following
|
||||
rights over the Software for any or all use, and for the term of the
|
||||
Agreement, on the basis of the terms and conditions set forth hereinafter.
|
||||
|
||||
Besides, if the Licensor owns or comes to own one or more patents
|
||||
protecting all or part of the functions of the Software or of its
|
||||
components, the Licensor undertakes not to enforce the rights granted by
|
||||
these patents against successive Licensees using, exploiting or
|
||||
modifying the Software. If these patents are transferred, the Licensor
|
||||
undertakes to have the transferees subscribe to the obligations set
|
||||
forth in this paragraph.
|
||||
|
||||
|
||||
5.1 RIGHT OF USE
|
||||
|
||||
The Licensee is authorized to use the Software, without any limitation
|
||||
as to its fields of application, with it being hereinafter specified
|
||||
that this comprises:
|
||||
|
||||
1. permanent or temporary reproduction of all or part of the Software
|
||||
by any or all means and in any or all form.
|
||||
|
||||
2. loading, displaying, running, or storing the Software on any or
|
||||
all medium.
|
||||
|
||||
3. entitlement to observe, study or test its operation so as to
|
||||
determine the ideas and principles behind any or all constituent
|
||||
elements of said Software. This shall apply when the Licensee
|
||||
carries out any or all loading, displaying, running, transmission
|
||||
or storage operation as regards the Software, that it is entitled
|
||||
to carry out hereunder.
|
||||
|
||||
|
||||
5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS
|
||||
|
||||
The right to make Contributions includes the right to translate, adapt,
|
||||
arrange, or make any or all modifications to the Software, and the right
|
||||
to reproduce the resulting software.
|
||||
|
||||
The Licensee is authorized to make any or all Contributions to the
|
||||
Software provided that it includes an explicit notice that it is the
|
||||
author of said Contribution and indicates the date of the creation thereof.
|
||||
|
||||
|
||||
5.3 RIGHT OF DISTRIBUTION
|
||||
|
||||
In particular, the right of distribution includes the right to publish,
|
||||
transmit and communicate the Software to the general public on any or
|
||||
all medium, and by any or all means, and the right to market, either in
|
||||
consideration of a fee, or free of charge, one or more copies of the
|
||||
Software by any means.
|
||||
|
||||
The Licensee is further authorized to distribute copies of the modified
|
||||
or unmodified Software to third parties according to the terms and
|
||||
conditions set forth hereinafter.
|
||||
|
||||
|
||||
5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
|
||||
|
||||
The Licensee is authorized to distribute true copies of the Software in
|
||||
Source Code or Object Code form, provided that said distribution
|
||||
complies with all the provisions of the Agreement and is accompanied by:
|
||||
|
||||
1. a copy of the Agreement,
|
||||
|
||||
2. a notice relating to the limitation of both the Licensor's
|
||||
warranty and liability as set forth in Articles 8 and 9,
|
||||
|
||||
and that, in the event that only the Object Code of the Software is
|
||||
redistributed, the Licensee allows future Licensees unhindered access to
|
||||
the full Source Code of the Software by indicating how to access it, it
|
||||
being understood that the additional cost of acquiring the Source Code
|
||||
shall not exceed the cost of transferring the data.
|
||||
|
||||
|
||||
5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
|
||||
|
||||
When the Licensee makes a Contribution to the Software, the terms and
|
||||
conditions for the distribution of the resulting Modified Software
|
||||
become subject to all the provisions of this Agreement.
|
||||
|
||||
The Licensee is authorized to distribute the Modified Software, in
|
||||
source code or object code form, provided that said distribution
|
||||
complies with all the provisions of the Agreement and is accompanied by:
|
||||
|
||||
1. a copy of the Agreement,
|
||||
|
||||
2. a notice relating to the limitation of both the Licensor's
|
||||
warranty and liability as set forth in Articles 8 and 9,
|
||||
|
||||
and that, in the event that only the object code of the Modified
|
||||
Software is redistributed, the Licensee allows future Licensees
|
||||
unhindered access to the full source code of the Modified Software by
|
||||
indicating how to access it, it being understood that the additional
|
||||
cost of acquiring the source code shall not exceed the cost of
|
||||
transferring the data.
|
||||
|
||||
|
||||
5.3.3 DISTRIBUTION OF EXTERNAL MODULES
|
||||
|
||||
When the Licensee has developed an External Module, the terms and
|
||||
conditions of this Agreement do not apply to said External Module, that
|
||||
may be distributed under a separate license agreement.
|
||||
|
||||
|
||||
5.3.4 COMPATIBILITY WITH THE GNU GPL
|
||||
|
||||
The Licensee can include a code that is subject to the provisions of one
|
||||
of the versions of the GNU GPL in the Modified or unmodified Software,
|
||||
and distribute that entire code under the terms of the same version of
|
||||
the GNU GPL.
|
||||
|
||||
The Licensee can include the Modified or unmodified Software in a code
|
||||
that is subject to the provisions of one of the versions of the GNU GPL,
|
||||
and distribute that entire code under the terms of the same version of
|
||||
the GNU GPL.
|
||||
|
||||
|
||||
Article 6 - INTELLECTUAL PROPERTY
|
||||
|
||||
|
||||
6.1 OVER THE INITIAL SOFTWARE
|
||||
|
||||
The Holder owns the economic rights over the Initial Software. Any or
|
||||
all use of the Initial Software is subject to compliance with the terms
|
||||
and conditions under which the Holder has elected to distribute its work
|
||||
and no one shall be entitled to modify the terms and conditions for the
|
||||
distribution of said Initial Software.
|
||||
|
||||
The Holder undertakes that the Initial Software will remain ruled at
|
||||
least by this Agreement, for the duration set forth in Article 4.2.
|
||||
|
||||
|
||||
6.2 OVER THE CONTRIBUTIONS
|
||||
|
||||
The Licensee who develops a Contribution is the owner of the
|
||||
intellectual property rights over this Contribution as defined by
|
||||
applicable law.
|
||||
|
||||
|
||||
6.3 OVER THE EXTERNAL MODULES
|
||||
|
||||
The Licensee who develops an External Module is the owner of the
|
||||
intellectual property rights over this External Module as defined by
|
||||
applicable law and is free to choose the type of agreement that shall
|
||||
govern its distribution.
|
||||
|
||||
|
||||
6.4 JOINT PROVISIONS
|
||||
|
||||
The Licensee expressly undertakes:
|
||||
|
||||
1. not to remove, or modify, in any manner, the intellectual property
|
||||
notices attached to the Software;
|
||||
|
||||
2. to reproduce said notices, in an identical manner, in the copies
|
||||
of the Software modified or not.
|
||||
|
||||
The Licensee undertakes not to directly or indirectly infringe the
|
||||
intellectual property rights of the Holder and/or Contributors on the
|
||||
Software and to take, where applicable, vis-<2D>-vis its staff, any and all
|
||||
measures required to ensure respect of said intellectual property rights
|
||||
of the Holder and/or Contributors.
|
||||
|
||||
|
||||
Article 7 - RELATED SERVICES
|
||||
|
||||
7.1 Under no circumstances shall the Agreement oblige the Licensor to
|
||||
provide technical assistance or maintenance services for the Software.
|
||||
|
||||
However, the Licensor is entitled to offer this type of services. The
|
||||
terms and conditions of such technical assistance, and/or such
|
||||
maintenance, shall be set forth in a separate instrument. Only the
|
||||
Licensor offering said maintenance and/or technical assistance services
|
||||
shall incur liability therefor.
|
||||
|
||||
7.2 Similarly, any Licensor is entitled to offer to its licensees, under
|
||||
its sole responsibility, a warranty, that shall only be binding upon
|
||||
itself, for the redistribution of the Software and/or the Modified
|
||||
Software, under terms and conditions that it is free to decide. Said
|
||||
warranty, and the financial terms and conditions of its application,
|
||||
shall be subject of a separate instrument executed between the Licensor
|
||||
and the Licensee.
|
||||
|
||||
|
||||
Article 8 - LIABILITY
|
||||
|
||||
8.1 Subject to the provisions of Article 8.2, the Licensee shall be
|
||||
entitled to claim compensation for any direct loss it may have suffered
|
||||
from the Software as a result of a fault on the part of the relevant
|
||||
Licensor, subject to providing evidence thereof.
|
||||
|
||||
8.2 The Licensor's liability is limited to the commitments made under
|
||||
this Agreement and shall not be incurred as a result of in particular:
|
||||
(i) loss due the Licensee's total or partial failure to fulfill its
|
||||
obligations, (ii) direct or consequential loss that is suffered by the
|
||||
Licensee due to the use or performance of the Software, and (iii) more
|
||||
generally, any consequential loss. In particular the Parties expressly
|
||||
agree that any or all pecuniary or business loss (i.e. loss of data,
|
||||
loss of profits, operating loss, loss of customers or orders,
|
||||
opportunity cost, any disturbance to business activities) or any or all
|
||||
legal proceedings instituted against the Licensee by a third party,
|
||||
shall constitute consequential loss and shall not provide entitlement to
|
||||
any or all compensation from the Licensor.
|
||||
|
||||
|
||||
Article 9 - WARRANTY
|
||||
|
||||
9.1 The Licensee acknowledges that the scientific and technical
|
||||
state-of-the-art when the Software was distributed did not enable all
|
||||
possible uses to be tested and verified, nor for the presence of
|
||||
possible defects to be detected. In this respect, the Licensee's
|
||||
attention has been drawn to the risks associated with loading, using,
|
||||
modifying and/or developing and reproducing the Software which are
|
||||
reserved for experienced users.
|
||||
|
||||
The Licensee shall be responsible for verifying, by any or all means,
|
||||
the suitability of the product for its requirements, its good working
|
||||
order, and for ensuring that it shall not cause damage to either persons
|
||||
or properties.
|
||||
|
||||
9.2 The Licensor hereby represents, in good faith, that it is entitled
|
||||
to grant all the rights over the Software (including in particular the
|
||||
rights set forth in Article 5).
|
||||
|
||||
9.3 The Licensee acknowledges that the Software is supplied "as is" by
|
||||
the Licensor without any other express or tacit warranty, other than
|
||||
that provided for in Article 9.2 and, in particular, without any warranty
|
||||
as to its commercial value, its secured, safe, innovative or relevant
|
||||
nature.
|
||||
|
||||
Specifically, the Licensor does not warrant that the Software is free
|
||||
from any error, that it will operate without interruption, that it will
|
||||
be compatible with the Licensee's own equipment and software
|
||||
configuration, nor that it will meet the Licensee's requirements.
|
||||
|
||||
9.4 The Licensor does not either expressly or tacitly warrant that the
|
||||
Software does not infringe any third party intellectual property right
|
||||
relating to a patent, software or any other property right. Therefore,
|
||||
the Licensor disclaims any and all liability towards the Licensee
|
||||
arising out of any or all proceedings for infringement that may be
|
||||
instituted in respect of the use, modification and redistribution of the
|
||||
Software. Nevertheless, should such proceedings be instituted against
|
||||
the Licensee, the Licensor shall provide it with technical and legal
|
||||
assistance for its defense. Such technical and legal assistance shall be
|
||||
decided on a case-by-case basis between the relevant Licensor and the
|
||||
Licensee pursuant to a memorandum of understanding. The Licensor
|
||||
disclaims any and all liability as regards the Licensee's use of the
|
||||
name of the Software. No warranty is given as regards the existence of
|
||||
prior rights over the name of the Software or as regards the existence
|
||||
of a trademark.
|
||||
|
||||
|
||||
Article 10 - TERMINATION
|
||||
|
||||
10.1 In the event of a breach by the Licensee of its obligations
|
||||
hereunder, the Licensor may automatically terminate this Agreement
|
||||
thirty (30) days after notice has been sent to the Licensee and has
|
||||
remained ineffective.
|
||||
|
||||
10.2 A Licensee whose Agreement is terminated shall no longer be
|
||||
authorized to use, modify or distribute the Software. However, any
|
||||
licenses that it may have granted prior to termination of the Agreement
|
||||
shall remain valid subject to their having been granted in compliance
|
||||
with the terms and conditions hereof.
|
||||
|
||||
|
||||
Article 11 - MISCELLANEOUS
|
||||
|
||||
|
||||
11.1 EXCUSABLE EVENTS
|
||||
|
||||
Neither Party shall be liable for any or all delay, or failure to
|
||||
perform the Agreement, that may be attributable to an event of force
|
||||
majeure, an act of God or an outside cause, such as defective
|
||||
functioning or interruptions of the electricity or telecommunications
|
||||
networks, network paralysis following a virus attack, intervention by
|
||||
government authorities, natural disasters, water damage, earthquakes,
|
||||
fire, explosions, strikes and labor unrest, war, etc.
|
||||
|
||||
11.2 Any failure by either Party, on one or more occasions, to invoke
|
||||
one or more of the provisions hereof, shall under no circumstances be
|
||||
interpreted as being a waiver by the interested Party of its right to
|
||||
invoke said provision(s) subsequently.
|
||||
|
||||
11.3 The Agreement cancels and replaces any or all previous agreements,
|
||||
whether written or oral, between the Parties and having the same
|
||||
purpose, and constitutes the entirety of the agreement between said
|
||||
Parties concerning said purpose. No supplement or modification to the
|
||||
terms and conditions hereof shall be effective as between the Parties
|
||||
unless it is made in writing and signed by their duly authorized
|
||||
representatives.
|
||||
|
||||
11.4 In the event that one or more of the provisions hereof were to
|
||||
conflict with a current or future applicable act or legislative text,
|
||||
said act or legislative text shall prevail, and the Parties shall make
|
||||
the necessary amendments so as to comply with said act or legislative
|
||||
text. All other provisions shall remain effective. Similarly, invalidity
|
||||
of a provision of the Agreement, for any reason whatsoever, shall not
|
||||
cause the Agreement as a whole to be invalid.
|
||||
|
||||
|
||||
11.5 LANGUAGE
|
||||
|
||||
The Agreement is drafted in both French and English and both versions
|
||||
are deemed authentic.
|
||||
|
||||
|
||||
Article 12 - NEW VERSIONS OF THE AGREEMENT
|
||||
|
||||
12.1 Any person is authorized to duplicate and distribute copies of this
|
||||
Agreement.
|
||||
|
||||
12.2 So as to ensure coherence, the wording of this Agreement is
|
||||
protected and may only be modified by the authors of the License, who
|
||||
reserve the right to periodically publish updates or new versions of the
|
||||
Agreement, each with a separate number. These subsequent versions may
|
||||
address new issues encountered by Free Software.
|
||||
|
||||
12.3 Any Software distributed under a given version of the Agreement may
|
||||
only be subsequently distributed under the same version of the Agreement
|
||||
or a subsequent version, subject to the provisions of Article 5.3.4.
|
||||
|
||||
|
||||
Article 13 - GOVERNING LAW AND JURISDICTION
|
||||
|
||||
13.1 The Agreement is governed by French law. The Parties agree to
|
||||
endeavor to seek an amicable solution to any disagreements or disputes
|
||||
that may arise during the performance of the Agreement.
|
||||
|
||||
13.2 Failing an amicable solution within two (2) months as from their
|
||||
occurrence, and unless emergency proceedings are necessary, the
|
||||
disagreements or disputes shall be referred to the Paris Courts having
|
||||
jurisdiction, by the more diligent Party.
|
||||
|
||||
|
||||
Version 2.0 dated 2006-09-05.
|
@ -0,0 +1,512 @@
|
||||
|
||||
CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL
|
||||
|
||||
|
||||
Avertissement
|
||||
|
||||
Ce contrat est une licence de logiciel libre issue d'une concertation
|
||||
entre ses auteurs afin que le respect de deux grands principes pr<70>side <20>
|
||||
sa r<>daction:
|
||||
|
||||
* d'une part, le respect des principes de diffusion des logiciels
|
||||
libres: acc<63>s au code source, droits <20>tendus conf<6E>r<EFBFBD>s aux
|
||||
utilisateurs,
|
||||
* d'autre part, la d<>signation d'un droit applicable, le droit
|
||||
fran<61>ais, auquel elle est conforme, tant au regard du droit de la
|
||||
responsabilit<69> civile que du droit de la propri<72>t<EFBFBD> intellectuelle
|
||||
et de la protection qu'il offre aux auteurs et titulaires des
|
||||
droits patrimoniaux sur un logiciel.
|
||||
|
||||
Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel]
|
||||
L[ibre]) sont:
|
||||
|
||||
Commissariat <20> l'Energie Atomique - CEA, <20>tablissement public de
|
||||
recherche <20> caract<63>re scientifique, technique et industriel, dont le
|
||||
si<EFBFBD>ge est situ<74> 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris.
|
||||
|
||||
Centre National de la Recherche Scientifique - CNRS, <20>tablissement
|
||||
public <20> caract<63>re scientifique et technologique, dont le si<73>ge est
|
||||
situ<EFBFBD> 3 rue Michel-Ange, 75794 Paris cedex 16.
|
||||
|
||||
Institut National de Recherche en Informatique et en Automatique -
|
||||
INRIA, <20>tablissement public <20> caract<63>re scientifique et technologique,
|
||||
dont le si<73>ge est situ<74> Domaine de Voluceau, Rocquencourt, BP 105, 78153
|
||||
Le Chesnay cedex.
|
||||
|
||||
|
||||
Pr<50>ambule
|
||||
|
||||
Ce contrat est une licence de logiciel libre dont l'objectif est de
|
||||
conf<EFBFBD>rer aux utilisateurs la libert<72> de modification et de
|
||||
redistribution du logiciel r<>gi par cette licence dans le cadre d'un
|
||||
mod<EFBFBD>le de diffusion en logiciel libre.
|
||||
|
||||
L'exercice de ces libert<72>s est assorti de certains devoirs <20> la charge
|
||||
des utilisateurs afin de pr<70>server ce statut au cours des
|
||||
redistributions ult<6C>rieures.
|
||||
|
||||
L'accessibilit<69> au code source et les droits de copie, de modification
|
||||
et de redistribution qui en d<>coulent ont pour contrepartie de n'offrir
|
||||
aux utilisateurs qu'une garantie limit<69>e et de ne faire peser sur
|
||||
l'auteur du logiciel, le titulaire des droits patrimoniaux et les
|
||||
conc<EFBFBD>dants successifs qu'une responsabilit<69> restreinte.
|
||||
|
||||
A cet <20>gard l'attention de l'utilisateur est attir<69>e sur les risques
|
||||
associ<EFBFBD>s au chargement, <20> l'utilisation, <20> la modification et/ou au
|
||||
d<EFBFBD>veloppement et <20> la reproduction du logiciel par l'utilisateur <20>tant
|
||||
donn<EFBFBD> sa sp<73>cificit<69> de logiciel libre, qui peut le rendre complexe <20>
|
||||
manipuler et qui le r<>serve donc <20> des d<>veloppeurs ou des
|
||||
professionnels avertis poss<73>dant des connaissances informatiques
|
||||
approfondies. Les utilisateurs sont donc invit<69>s <20> charger et tester
|
||||
l'ad<61>quation du logiciel <20> leurs besoins dans des conditions permettant
|
||||
d'assurer la s<>curit<69> de leurs syst<73>mes et/ou de leurs donn<6E>es et, plus
|
||||
g<EFBFBD>n<EFBFBD>ralement, <20> l'utiliser et l'exploiter dans les m<>mes conditions de
|
||||
s<EFBFBD>curit<EFBFBD>. Ce contrat peut <20>tre reproduit et diffus<75> librement, sous
|
||||
r<EFBFBD>serve de le conserver en l'<27>tat, sans ajout ni suppression de clauses.
|
||||
|
||||
Ce contrat est susceptible de s'appliquer <20> tout logiciel dont le
|
||||
titulaire des droits patrimoniaux d<>cide de soumettre l'exploitation aux
|
||||
dispositions qu'il contient.
|
||||
|
||||
|
||||
Article 1 - DEFINITIONS
|
||||
|
||||
Dans ce contrat, les termes suivants, lorsqu'ils seront <20>crits avec une
|
||||
lettre capitale, auront la signification suivante:
|
||||
|
||||
Contrat: d<>signe le pr<70>sent contrat de licence, ses <20>ventuelles versions
|
||||
post<EFBFBD>rieures et annexes.
|
||||
|
||||
Logiciel: d<>signe le logiciel sous sa forme de Code Objet et/ou de Code
|
||||
Source et le cas <20>ch<63>ant sa documentation, dans leur <20>tat au moment de
|
||||
l'acceptation du Contrat par le Licenci<63>.
|
||||
|
||||
Logiciel Initial: d<>signe le Logiciel sous sa forme de Code Source et
|
||||
<EFBFBD>ventuellement de Code Objet et le cas <20>ch<63>ant sa documentation, dans
|
||||
leur <20>tat au moment de leur premi<6D>re diffusion sous les termes du Contrat.
|
||||
|
||||
Logiciel Modifi<66>: d<>signe le Logiciel modifi<66> par au moins une
|
||||
Contribution.
|
||||
|
||||
Code Source: d<>signe l'ensemble des instructions et des lignes de
|
||||
programme du Logiciel et auquel l'acc<63>s est n<>cessaire en vue de
|
||||
modifier le Logiciel.
|
||||
|
||||
Code Objet: d<>signe les fichiers binaires issus de la compilation du
|
||||
Code Source.
|
||||
|
||||
Titulaire: d<>signe le ou les d<>tenteurs des droits patrimoniaux d'auteur
|
||||
sur le Logiciel Initial.
|
||||
|
||||
Licenci<EFBFBD>: d<>signe le ou les utilisateurs du Logiciel ayant accept<70> le
|
||||
Contrat.
|
||||
|
||||
Contributeur: d<>signe le Licenci<63> auteur d'au moins une Contribution.
|
||||
|
||||
Conc<EFBFBD>dant: d<>signe le Titulaire ou toute personne physique ou morale
|
||||
distribuant le Logiciel sous le Contrat.
|
||||
|
||||
Contribution: d<>signe l'ensemble des modifications, corrections,
|
||||
traductions, adaptations et/ou nouvelles fonctionnalit<69>s int<6E>gr<67>es dans
|
||||
le Logiciel par tout Contributeur, ainsi que tout Module Interne.
|
||||
|
||||
Module: d<>signe un ensemble de fichiers sources y compris leur
|
||||
documentation qui permet de r<>aliser des fonctionnalit<69>s ou services
|
||||
suppl<EFBFBD>mentaires <20> ceux fournis par le Logiciel.
|
||||
|
||||
Module Externe: d<>signe tout Module, non d<>riv<69> du Logiciel, tel que ce
|
||||
Module et le Logiciel s'ex<65>cutent dans des espaces d'adressage
|
||||
diff<EFBFBD>rents, l'un appelant l'autre au moment de leur ex<65>cution.
|
||||
|
||||
Module Interne: d<>signe tout Module li<6C> au Logiciel de telle sorte
|
||||
qu'ils s'ex<65>cutent dans le m<>me espace d'adressage.
|
||||
|
||||
GNU GPL: d<>signe la GNU General Public License dans sa version 2 ou
|
||||
toute version ult<6C>rieure, telle que publi<6C>e par Free Software Foundation
|
||||
Inc.
|
||||
|
||||
Parties: d<>signe collectivement le Licenci<63> et le Conc<6E>dant.
|
||||
|
||||
Ces termes s'entendent au singulier comme au pluriel.
|
||||
|
||||
|
||||
Article 2 - OBJET
|
||||
|
||||
Le Contrat a pour objet la concession par le Conc<6E>dant au Licenci<63> d'une
|
||||
licence non exclusive, cessible et mondiale du Logiciel telle que
|
||||
d<EFBFBD>finie ci-apr<70>s <20> l'article 5 pour toute la dur<75>e de protection des droits
|
||||
portant sur ce Logiciel.
|
||||
|
||||
|
||||
Article 3 - ACCEPTATION
|
||||
|
||||
3.1 L'acceptation par le Licenci<63> des termes du Contrat est r<>put<75>e
|
||||
acquise du fait du premier des faits suivants:
|
||||
|
||||
* (i) le chargement du Logiciel par tout moyen notamment par
|
||||
t<>l<EFBFBD>chargement <20> partir d'un serveur distant ou par chargement <20>
|
||||
partir d'un support physique;
|
||||
* (ii) le premier exercice par le Licenci<63> de l'un quelconque des
|
||||
droits conc<6E>d<EFBFBD>s par le Contrat.
|
||||
|
||||
3.2 Un exemplaire du Contrat, contenant notamment un avertissement
|
||||
relatif aux sp<73>cificit<69>s du Logiciel, <20> la restriction de garantie et <20>
|
||||
la limitation <20> un usage par des utilisateurs exp<78>riment<6E>s a <20>t<EFBFBD> mis <20>
|
||||
disposition du Licenci<63> pr<70>alablement <20> son acceptation telle que
|
||||
d<EFBFBD>finie <20> l'article 3.1 ci dessus et le Licenci<63> reconna<6E>t en avoir pris
|
||||
connaissance.
|
||||
|
||||
|
||||
Article 4 - ENTREE EN VIGUEUR ET DUREE
|
||||
|
||||
|
||||
4.1 ENTREE EN VIGUEUR
|
||||
|
||||
Le Contrat entre en vigueur <20> la date de son acceptation par le Licenci<63>
|
||||
telle que d<>finie en 3.1.
|
||||
|
||||
|
||||
4.2 DUREE
|
||||
|
||||
Le Contrat produira ses effets pendant toute la dur<75>e l<>gale de
|
||||
protection des droits patrimoniaux portant sur le Logiciel.
|
||||
|
||||
|
||||
Article 5 - ETENDUE DES DROITS CONCEDES
|
||||
|
||||
Le Conc<6E>dant conc<6E>de au Licenci<63>, qui accepte, les droits suivants sur
|
||||
le Logiciel pour toutes destinations et pour la dur<75>e du Contrat dans
|
||||
les conditions ci-apr<70>s d<>taill<6C>es.
|
||||
|
||||
Par ailleurs, si le Conc<6E>dant d<>tient ou venait <20> d<>tenir un ou
|
||||
plusieurs brevets d'invention prot<6F>geant tout ou partie des
|
||||
fonctionnalit<EFBFBD>s du Logiciel ou de ses composants, il s'engage <20> ne pas
|
||||
opposer les <20>ventuels droits conf<6E>r<EFBFBD>s par ces brevets aux Licenci<63>s
|
||||
successifs qui utiliseraient, exploiteraient ou modifieraient le
|
||||
Logiciel. En cas de cession de ces brevets, le Conc<6E>dant s'engage <20>
|
||||
faire reprendre les obligations du pr<70>sent alin<69>a aux cessionnaires.
|
||||
|
||||
|
||||
5.1 DROIT D'UTILISATION
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> utiliser le Logiciel, sans restriction quant
|
||||
aux domaines d'application, <20>tant ci-apr<70>s pr<70>cis<69> que cela comporte:
|
||||
|
||||
1. la reproduction permanente ou provisoire du Logiciel en tout ou
|
||||
partie par tout moyen et sous toute forme.
|
||||
|
||||
2. le chargement, l'affichage, l'ex<65>cution, ou le stockage du
|
||||
Logiciel sur tout support.
|
||||
|
||||
3. la possibilit<69> d'en observer, d'en <20>tudier, ou d'en tester le
|
||||
fonctionnement afin de d<>terminer les id<69>es et principes qui sont
|
||||
<20> la base de n'importe quel <20>l<EFBFBD>ment de ce Logiciel; et ceci,
|
||||
lorsque le Licenci<63> effectue toute op<6F>ration de chargement,
|
||||
d'affichage, d'ex<65>cution, de transmission ou de stockage du
|
||||
Logiciel qu'il est en droit d'effectuer en vertu du Contrat.
|
||||
|
||||
|
||||
5.2 DROIT D'APPORTER DES CONTRIBUTIONS
|
||||
|
||||
Le droit d'apporter des Contributions comporte le droit de traduire,
|
||||
d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel
|
||||
et le droit de reproduire le logiciel en r<>sultant.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> apporter toute Contribution au Logiciel sous
|
||||
r<EFBFBD>serve de mentionner, de fa<66>on explicite, son nom en tant qu'auteur de
|
||||
cette Contribution et la date de cr<63>ation de celle-ci.
|
||||
|
||||
|
||||
5.3 DROIT DE DISTRIBUTION
|
||||
|
||||
Le droit de distribution comporte notamment le droit de diffuser, de
|
||||
transmettre et de communiquer le Logiciel au public sur tout support et
|
||||
par tout moyen ainsi que le droit de mettre sur le march<63> <20> titre
|
||||
on<EFBFBD>reux ou gratuit, un ou des exemplaires du Logiciel par tout proc<6F>d<EFBFBD>.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer des copies du Logiciel, modifi<66> ou
|
||||
non, <20> des tiers dans les conditions ci-apr<70>s d<>taill<6C>es.
|
||||
|
||||
|
||||
5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer des copies conformes du Logiciel,
|
||||
sous forme de Code Source ou de Code Objet, <20> condition que cette
|
||||
distribution respecte les dispositions du Contrat dans leur totalit<69> et
|
||||
soit accompagn<67>e:
|
||||
|
||||
1. d'un exemplaire du Contrat,
|
||||
|
||||
2. d'un avertissement relatif <20> la restriction de garantie et de
|
||||
responsabilit<69> du Conc<6E>dant telle que pr<70>vue aux articles 8
|
||||
et 9,
|
||||
|
||||
et que, dans le cas o<> seul le Code Objet du Logiciel est redistribu<62>,
|
||||
le Licenci<63> permette aux futurs Licenci<63>s d'acc<63>der facilement au Code
|
||||
Source complet du Logiciel en indiquant les modalit<69>s d'acc<63>s, <20>tant
|
||||
entendu que le co<63>t additionnel d'acquisition du Code Source ne devra
|
||||
pas exc<78>der le simple co<63>t de transfert des donn<6E>es.
|
||||
|
||||
|
||||
5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE
|
||||
|
||||
Lorsque le Licenci<63> apporte une Contribution au Logiciel, les conditions
|
||||
de distribution du Logiciel Modifi<66> en r<>sultant sont alors soumises <20>
|
||||
l'int<6E>gralit<69> des dispositions du Contrat.
|
||||
|
||||
Le Licenci<63> est autoris<69> <20> distribuer le Logiciel Modifi<66>, sous forme de
|
||||
code source ou de code objet, <20> condition que cette distribution
|
||||
respecte les dispositions du Contrat dans leur totalit<69> et soit
|
||||
accompagn<EFBFBD>e:
|
||||
|
||||
1. d'un exemplaire du Contrat,
|
||||
|
||||
2. d'un avertissement relatif <20> la restriction de garantie et de
|
||||
responsabilit<69> du Conc<6E>dant telle que pr<70>vue aux articles 8
|
||||
et 9,
|
||||
|
||||
et que, dans le cas o<> seul le code objet du Logiciel Modifi<66> est
|
||||
redistribu<EFBFBD>, le Licenci<63> permette aux futurs Licenci<63>s d'acc<63>der
|
||||
facilement au code source complet du Logiciel Modifi<66> en indiquant les
|
||||
modalit<EFBFBD>s d'acc<63>s, <20>tant entendu que le co<63>t additionnel d'acquisition
|
||||
du code source ne devra pas exc<78>der le simple co<63>t de transfert des donn<6E>es.
|
||||
|
||||
|
||||
5.3.3 DISTRIBUTION DES MODULES EXTERNES
|
||||
|
||||
Lorsque le Licenci<63> a d<>velopp<70> un Module Externe les conditions du
|
||||
Contrat ne s'appliquent pas <20> ce Module Externe, qui peut <20>tre distribu<62>
|
||||
sous un contrat de licence diff<66>rent.
|
||||
|
||||
|
||||
5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL
|
||||
|
||||
Le Licenci<63> peut inclure un code soumis aux dispositions d'une des
|
||||
versions de la licence GNU GPL dans le Logiciel modifi<66> ou non et
|
||||
distribuer l'ensemble sous les conditions de la m<>me version de la
|
||||
licence GNU GPL.
|
||||
|
||||
Le Licenci<63> peut inclure le Logiciel modifi<66> ou non dans un code soumis
|
||||
aux dispositions d'une des versions de la licence GNU GPL et distribuer
|
||||
l'ensemble sous les conditions de la m<>me version de la licence GNU GPL.
|
||||
|
||||
|
||||
Article 6 - PROPRIETE INTELLECTUELLE
|
||||
|
||||
|
||||
6.1 SUR LE LOGICIEL INITIAL
|
||||
|
||||
Le Titulaire est d<>tenteur des droits patrimoniaux sur le Logiciel
|
||||
Initial. Toute utilisation du Logiciel Initial est soumise au respect
|
||||
des conditions dans lesquelles le Titulaire a choisi de diffuser son
|
||||
oeuvre et nul autre n'a la facult<6C> de modifier les conditions de
|
||||
diffusion de ce Logiciel Initial.
|
||||
|
||||
Le Titulaire s'engage <20> ce que le Logiciel Initial reste au moins r<>gi
|
||||
par le Contrat et ce, pour la dur<75>e vis<69>e <20> l'article 4.2.
|
||||
|
||||
|
||||
6.2 SUR LES CONTRIBUTIONS
|
||||
|
||||
Le Licenci<63> qui a d<>velopp<70> une Contribution est titulaire sur celle-ci
|
||||
des droits de propri<72>t<EFBFBD> intellectuelle dans les conditions d<>finies par
|
||||
la l<>gislation applicable.
|
||||
|
||||
|
||||
6.3 SUR LES MODULES EXTERNES
|
||||
|
||||
Le Licenci<63> qui a d<>velopp<70> un Module Externe est titulaire sur celui-ci
|
||||
des droits de propri<72>t<EFBFBD> intellectuelle dans les conditions d<>finies par
|
||||
la l<>gislation applicable et reste libre du choix du contrat r<>gissant
|
||||
sa diffusion.
|
||||
|
||||
|
||||
6.4 DISPOSITIONS COMMUNES
|
||||
|
||||
Le Licenci<63> s'engage express<73>ment:
|
||||
|
||||
1. <20> ne pas supprimer ou modifier de quelque mani<6E>re que ce soit les
|
||||
mentions de propri<72>t<EFBFBD> intellectuelle appos<6F>es sur le Logiciel;
|
||||
|
||||
2. <20> reproduire <20> l'identique lesdites mentions de propri<72>t<EFBFBD>
|
||||
intellectuelle sur les copies du Logiciel modifi<66> ou non.
|
||||
|
||||
Le Licenci<63> s'engage <20> ne pas porter atteinte, directement ou
|
||||
indirectement, aux droits de propri<72>t<EFBFBD> intellectuelle du Titulaire et/ou
|
||||
des Contributeurs sur le Logiciel et <20> prendre, le cas <20>ch<63>ant, <20>
|
||||
l'<27>gard de son personnel toutes les mesures n<>cessaires pour assurer le
|
||||
respect des dits droits de propri<72>t<EFBFBD> intellectuelle du Titulaire et/ou
|
||||
des Contributeurs.
|
||||
|
||||
|
||||
Article 7 - SERVICES ASSOCIES
|
||||
|
||||
7.1 Le Contrat n'oblige en aucun cas le Conc<6E>dant <20> la r<>alisation de
|
||||
prestations d'assistance technique ou de maintenance du Logiciel.
|
||||
|
||||
Cependant le Conc<6E>dant reste libre de proposer ce type de services. Les
|
||||
termes et conditions d'une telle assistance technique et/ou d'une telle
|
||||
maintenance seront alors d<>termin<69>s dans un acte s<>par<61>. Ces actes de
|
||||
maintenance et/ou assistance technique n'engageront que la seule
|
||||
responsabilit<EFBFBD> du Conc<6E>dant qui les propose.
|
||||
|
||||
7.2 De m<>me, tout Conc<6E>dant est libre de proposer, sous sa seule
|
||||
responsabilit<EFBFBD>, <20> ses licenci<63>s une garantie, qui n'engagera que lui,
|
||||
lors de la redistribution du Logiciel et/ou du Logiciel Modifi<66> et ce,
|
||||
dans les conditions qu'il souhaite. Cette garantie et les modalit<69>s
|
||||
financi<EFBFBD>res de son application feront l'objet d'un acte s<>par<61> entre le
|
||||
Conc<EFBFBD>dant et le Licenci<63>.
|
||||
|
||||
|
||||
Article 8 - RESPONSABILITE
|
||||
|
||||
8.1 Sous r<>serve des dispositions de l'article 8.2, le Licenci<63> a la
|
||||
facult<EFBFBD>, sous r<>serve de prouver la faute du Conc<6E>dant concern<72>, de
|
||||
solliciter la r<>paration du pr<70>judice direct qu'il subirait du fait du
|
||||
Logiciel et dont il apportera la preuve.
|
||||
|
||||
8.2 La responsabilit<69> du Conc<6E>dant est limit<69>e aux engagements pris en
|
||||
application du Contrat et ne saurait <20>tre engag<61>e en raison notamment:
|
||||
(i) des dommages dus <20> l'inex<65>cution, totale ou partielle, de ses
|
||||
obligations par le Licenci<63>, (ii) des dommages directs ou indirects
|
||||
d<EFBFBD>coulant de l'utilisation ou des performances du Logiciel subis par le
|
||||
Licenci<EFBFBD> et (iii) plus g<>n<EFBFBD>ralement d'un quelconque dommage indirect. En
|
||||
particulier, les Parties conviennent express<73>ment que tout pr<70>judice
|
||||
financier ou commercial (par exemple perte de donn<6E>es, perte de
|
||||
b<EFBFBD>n<EFBFBD>fices, perte d'exploitation, perte de client<6E>le ou de commandes,
|
||||
manque <20> gagner, trouble commercial quelconque) ou toute action dirig<69>e
|
||||
contre le Licenci<63> par un tiers, constitue un dommage indirect et
|
||||
n'ouvre pas droit <20> r<>paration par le Conc<6E>dant.
|
||||
|
||||
|
||||
Article 9 - GARANTIE
|
||||
|
||||
9.1 Le Licenci<63> reconna<6E>t que l'<27>tat actuel des connaissances
|
||||
scientifiques et techniques au moment de la mise en circulation du
|
||||
Logiciel ne permet pas d'en tester et d'en v<>rifier toutes les
|
||||
utilisations ni de d<>tecter l'existence d'<27>ventuels d<>fauts. L'attention
|
||||
du Licenci<63> a <20>t<EFBFBD> attir<69>e sur ce point sur les risques associ<63>s au
|
||||
chargement, <20> l'utilisation, la modification et/ou au d<>veloppement et <20>
|
||||
la reproduction du Logiciel qui sont r<>serv<72>s <20> des utilisateurs avertis.
|
||||
|
||||
Il rel<65>ve de la responsabilit<69> du Licenci<63> de contr<74>ler, par tous
|
||||
moyens, l'ad<61>quation du produit <20> ses besoins, son bon fonctionnement et
|
||||
de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens.
|
||||
|
||||
9.2 Le Conc<6E>dant d<>clare de bonne foi <20>tre en droit de conc<6E>der
|
||||
l'ensemble des droits attach<63>s au Logiciel (comprenant notamment les
|
||||
droits vis<69>s <20> l'article 5).
|
||||
|
||||
9.3 Le Licenci<63> reconna<6E>t que le Logiciel est fourni "en l'<27>tat" par le
|
||||
Conc<EFBFBD>dant sans autre garantie, expresse ou tacite, que celle pr<70>vue <20>
|
||||
l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale,
|
||||
son caract<63>re s<>curis<69>, innovant ou pertinent.
|
||||
|
||||
En particulier, le Conc<6E>dant ne garantit pas que le Logiciel est exempt
|
||||
d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible
|
||||
avec l'<27>quipement du Licenci<63> et sa configuration logicielle ni qu'il
|
||||
remplira les besoins du Licenci<63>.
|
||||
|
||||
9.4 Le Conc<6E>dant ne garantit pas, de mani<6E>re expresse ou tacite, que le
|
||||
Logiciel ne porte pas atteinte <20> un quelconque droit de propri<72>t<EFBFBD>
|
||||
intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout
|
||||
autre droit de propri<72>t<EFBFBD>. Ainsi, le Conc<6E>dant exclut toute garantie au
|
||||
profit du Licenci<63> contre les actions en contrefa<66>on qui pourraient <20>tre
|
||||
diligent<EFBFBD>es au titre de l'utilisation, de la modification, et de la
|
||||
redistribution du Logiciel. N<>anmoins, si de telles actions sont
|
||||
exerc<EFBFBD>es contre le Licenci<63>, le Conc<6E>dant lui apportera son aide
|
||||
technique et juridique pour sa d<>fense. Cette aide technique et
|
||||
juridique est d<>termin<69>e au cas par cas entre le Conc<6E>dant concern<72> et
|
||||
le Licenci<63> dans le cadre d'un protocole d'accord. Le Conc<6E>dant d<>gage
|
||||
toute responsabilit<69> quant <20> l'utilisation de la d<>nomination du
|
||||
Logiciel par le Licenci<63>. Aucune garantie n'est apport<72>e quant <20>
|
||||
l'existence de droits ant<6E>rieurs sur le nom du Logiciel et sur
|
||||
l'existence d'une marque.
|
||||
|
||||
|
||||
Article 10 - RESILIATION
|
||||
|
||||
10.1 En cas de manquement par le Licenci<63> aux obligations mises <20> sa
|
||||
charge par le Contrat, le Conc<6E>dant pourra r<>silier de plein droit le
|
||||
Contrat trente (30) jours apr<70>s notification adress<73>e au Licenci<63> et
|
||||
rest<EFBFBD>e sans effet.
|
||||
|
||||
10.2 Le Licenci<63> dont le Contrat est r<>sili<6C> n'est plus autoris<69> <20>
|
||||
utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les
|
||||
licences qu'il aura conc<6E>d<EFBFBD>es ant<6E>rieurement <20> la r<>siliation du Contrat
|
||||
resteront valides sous r<>serve qu'elles aient <20>t<EFBFBD> effectu<74>es en
|
||||
conformit<EFBFBD> avec le Contrat.
|
||||
|
||||
|
||||
Article 11 - DISPOSITIONS DIVERSES
|
||||
|
||||
|
||||
11.1 CAUSE EXTERIEURE
|
||||
|
||||
Aucune des Parties ne sera responsable d'un retard ou d'une d<>faillance
|
||||
d'ex<65>cution du Contrat qui serait d<> <20> un cas de force majeure, un cas
|
||||
fortuit ou une cause ext<78>rieure, telle que, notamment, le mauvais
|
||||
fonctionnement ou les interruptions du r<>seau <20>lectrique ou de
|
||||
t<EFBFBD>l<EFBFBD>communication, la paralysie du r<>seau li<6C>e <20> une attaque
|
||||
informatique, l'intervention des autorit<69>s gouvernementales, les
|
||||
catastrophes naturelles, les d<>g<EFBFBD>ts des eaux, les tremblements de terre,
|
||||
le feu, les explosions, les gr<67>ves et les conflits sociaux, l'<27>tat de
|
||||
guerre...
|
||||
|
||||
11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou
|
||||
plusieurs occasions de se pr<70>valoir d'une ou plusieurs dispositions du
|
||||
Contrat, ne pourra en aucun cas impliquer renonciation par la Partie
|
||||
int<EFBFBD>ress<EFBFBD>e <20> s'en pr<70>valoir ult<6C>rieurement.
|
||||
|
||||
11.3 Le Contrat annule et remplace toute convention ant<6E>rieure, <20>crite
|
||||
ou orale, entre les Parties sur le m<>me objet et constitue l'accord
|
||||
entier entre les Parties sur cet objet. Aucune addition ou modification
|
||||
aux termes du Contrat n'aura d'effet <20> l'<27>gard des Parties <20> moins
|
||||
d'<27>tre faite par <20>crit et sign<67>e par leurs repr<70>sentants d<>ment habilit<69>s.
|
||||
|
||||
11.4 Dans l'hypoth<74>se o<> une ou plusieurs des dispositions du Contrat
|
||||
s'av<61>rerait contraire <20> une loi ou <20> un texte applicable, existants ou
|
||||
futurs, cette loi ou ce texte pr<70>vaudrait, et les Parties feraient les
|
||||
amendements n<>cessaires pour se conformer <20> cette loi ou <20> ce texte.
|
||||
Toutes les autres dispositions resteront en vigueur. De m<>me, la
|
||||
nullit<EFBFBD>, pour quelque raison que ce soit, d'une des dispositions du
|
||||
Contrat ne saurait entra<72>ner la nullit<69> de l'ensemble du Contrat.
|
||||
|
||||
|
||||
11.5 LANGUE
|
||||
|
||||
Le Contrat est r<>dig<69> en langue fran<61>aise et en langue anglaise, ces
|
||||
deux versions faisant <20>galement foi.
|
||||
|
||||
|
||||
Article 12 - NOUVELLES VERSIONS DU CONTRAT
|
||||
|
||||
12.1 Toute personne est autoris<69>e <20> copier et distribuer des copies de
|
||||
ce Contrat.
|
||||
|
||||
12.2 Afin d'en pr<70>server la coh<6F>rence, le texte du Contrat est prot<6F>g<EFBFBD>
|
||||
et ne peut <20>tre modifi<66> que par les auteurs de la licence, lesquels se
|
||||
r<EFBFBD>servent le droit de publier p<>riodiquement des mises <20> jour ou de
|
||||
nouvelles versions du Contrat, qui poss<73>deront chacune un num<75>ro
|
||||
distinct. Ces versions ult<6C>rieures seront susceptibles de prendre en
|
||||
compte de nouvelles probl<62>matiques rencontr<74>es par les logiciels libres.
|
||||
|
||||
12.3 Tout Logiciel diffus<75> sous une version donn<6E>e du Contrat ne pourra
|
||||
faire l'objet d'une diffusion ult<6C>rieure que sous la m<>me version du
|
||||
Contrat ou une version post<73>rieure, sous r<>serve des dispositions de
|
||||
l'article 5.3.4.
|
||||
|
||||
|
||||
Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE
|
||||
|
||||
13.1 Le Contrat est r<>gi par la loi fran<61>aise. Les Parties conviennent
|
||||
de tenter de r<>gler <20> l'amiable les diff<66>rends ou litiges qui
|
||||
viendraient <20> se produire par suite ou <20> l'occasion du Contrat.
|
||||
|
||||
13.2 A d<>faut d'accord amiable dans un d<>lai de deux (2) mois <20> compter
|
||||
de leur survenance et sauf situation relevant d'une proc<6F>dure d'urgence,
|
||||
les diff<66>rends ou litiges seront port<72>s par la Partie la plus diligente
|
||||
devant les Tribunaux comp<6D>tents de Paris.
|
||||
|
||||
|
||||
Version 2.0 du 2006-09-05.
|
7
src/sumaclust/sumaclust_v1.0.10/sumalibs/global.mk
Normal file
7
src/sumaclust/sumaclust_v1.0.10/sumalibs/global.mk
Normal file
@ -0,0 +1,7 @@
|
||||
include ../../../../../config/auto.conf
|
||||
|
||||
|
||||
default: all
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
33
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfasta/Makefile
Normal file
33
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfasta/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
|
||||
SOURCES = fasta_header_parser.c \
|
||||
fasta_seq_writer.c \
|
||||
fasta_header_handler.c \
|
||||
header_mem_handler.c \
|
||||
sequence.c
|
||||
|
||||
SRCS=$(SOURCES)
|
||||
|
||||
|
||||
OBJECTS= $(patsubst %.c,%.o,$(SOURCES))
|
||||
|
||||
LIBFILE = libfasta.a
|
||||
RANLIB = ranlib
|
||||
|
||||
|
||||
include ../global.mk
|
||||
|
||||
all: $(LIBFILE)
|
||||
|
||||
fasta_header_parser.c: fasta_header_parser.l
|
||||
flex -Pheader_yy -t $< > $@
|
||||
|
||||
dic_parser.c: dic_parser.l
|
||||
lex -Phashtable_yy -t $< > $@
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJECTS) $(LIBFILE)
|
||||
rm -f *.a
|
||||
|
||||
$(LIBFILE): $(OBJECTS)
|
||||
ar -cr $@ $?
|
||||
$(RANLIB) $@
|
@ -0,0 +1,126 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "sequence.h"
|
||||
#include "fasta_header_parser.h"
|
||||
#include "fasta_header_handler.h"
|
||||
|
||||
|
||||
char* char_header_add_field(char* header, char* name, char* value)
|
||||
{
|
||||
int lheader = strlen(header);
|
||||
header = (char*) realloc(header, (lheader+strlen(name)+strlen(value)+4)*sizeof(char));
|
||||
if (header[lheader-1] == '.')
|
||||
{
|
||||
strcpy(header+lheader-1,";");
|
||||
strcpy(header+lheader," ");
|
||||
strcpy(header+lheader+1,name);
|
||||
strcpy(header+lheader+1+strlen(name),"=");
|
||||
strcpy(header+lheader+1+strlen(name)+1,value);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(header+lheader,";");
|
||||
strcpy(header+lheader+1," ");
|
||||
strcpy(header+lheader+2,name);
|
||||
strcpy(header+lheader+2+strlen(name),"=");
|
||||
strcpy(header+lheader+2+strlen(name)+1,value);
|
||||
}
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
char* fastaSeqPtr_header_add_field(fastaSeqPtr seq, char* name, char* value)
|
||||
{
|
||||
int lheader = strlen(seq->rawheader);
|
||||
int i;
|
||||
char* buffer;
|
||||
char* rawheader;
|
||||
|
||||
rawheader = (char*) malloc((lheader+strlen(name)+strlen(value)+5)*sizeof(char));
|
||||
strcpy(rawheader, seq->rawheader);
|
||||
|
||||
buffer = calloc(lheader, sizeof(char));
|
||||
|
||||
i=0;
|
||||
|
||||
while ((rawheader[i] != ' ') && (rawheader[i] != 0))
|
||||
i++;
|
||||
|
||||
if (rawheader[i] == ' ')
|
||||
strcpy(buffer, rawheader+i);
|
||||
else
|
||||
strcpy(rawheader+i, " ");
|
||||
|
||||
i++;
|
||||
|
||||
strcpy(rawheader+i,name);
|
||||
strcpy(rawheader+i+strlen(name),"=");
|
||||
strcpy(rawheader+i+strlen(name)+1,value);
|
||||
strcpy(rawheader+i+strlen(name)+1+strlen(value),";");
|
||||
strcpy(rawheader+i+strlen(name)+1+strlen(value)+1, buffer);
|
||||
|
||||
free(buffer);
|
||||
|
||||
return(rawheader);
|
||||
}
|
||||
|
||||
|
||||
element_from_header* table_header_add_field(element_from_header* header, char* name, char* value)
|
||||
{
|
||||
int nbf;
|
||||
nbf = atoi(header[0].value);
|
||||
nbf++;
|
||||
header = (element_from_header*) realloc(header, (nbf+1)*sizeof(element_from_header));
|
||||
header[nbf].name = (char*) malloc((1+strlen(name))*sizeof(char));
|
||||
strcpy(header[nbf].name, name);
|
||||
header[nbf].value = (char*) malloc((1+strlen(value))*sizeof(char));
|
||||
strcpy(header[nbf].value, value);
|
||||
sprintf(header[0].value, "%d", nbf);
|
||||
return(header);
|
||||
}
|
||||
|
||||
|
||||
void free_header_table(element_from_header* header)
|
||||
{
|
||||
int i;
|
||||
int nbf = atoi(header[0].value);
|
||||
|
||||
for (i = 0; i <= nbf; i++)
|
||||
{
|
||||
free((header[i]).name);
|
||||
free((header[i]).value);
|
||||
}
|
||||
free(header);
|
||||
}
|
||||
|
||||
|
||||
char* getItemFromHeader(char* name, element_from_header* header)
|
||||
{
|
||||
char* value = 0;
|
||||
int nbf;
|
||||
int i;
|
||||
nbf = atoi(header[0].value);
|
||||
for (i = 1; i <= nbf; i++)
|
||||
{
|
||||
if (strcmp(header[i].name,name)==0)
|
||||
value = header[i].value;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
void changeValue(element_from_header* header, char* name, char* newValue)
|
||||
{
|
||||
int i;
|
||||
int nbf = atoi(header[0].value);
|
||||
|
||||
for (i = 1; i <= nbf; i++)
|
||||
{
|
||||
if (strcmp(header[i].name, name)==0)
|
||||
{
|
||||
header[i].value = realloc(header[i].value, (1+strlen(newValue))*sizeof(char));
|
||||
strcpy(header[i].value, newValue);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
|
||||
#ifndef FASTA_HEADER_HANDLER_H_
|
||||
#define FASTA_HEADER_HANDLER_H_
|
||||
|
||||
|
||||
#include "sequence.h"
|
||||
|
||||
|
||||
char* char_header_add_field(char*,char*,char*);
|
||||
|
||||
char* fastaSeqPtr_header_add_field(fastaSeqPtr seq, char* name, char* value);
|
||||
|
||||
element_from_header* table_header_add_dic(element_from_header* header, char* name, struct hashtable *hashtab);
|
||||
|
||||
element_from_header* table_header_add_field(element_from_header* header, char* name, char* value);
|
||||
|
||||
void free_header_table(element_from_header*);
|
||||
|
||||
char* getItemFromHeader(char*, element_from_header*);
|
||||
|
||||
void changeValue(element_from_header* header, char* name, char* newValue);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,13 @@
|
||||
|
||||
#ifndef FASTA_HEADER_PARSER_H_
|
||||
#define FASTA_HEADER_PARSER_H_
|
||||
|
||||
typedef struct {
|
||||
char *name;
|
||||
void *value;
|
||||
}element_from_header;
|
||||
|
||||
element_from_header* header_parser_main(char*);
|
||||
|
||||
|
||||
#endif
|
@ -0,0 +1,178 @@
|
||||
/*
|
||||
* Add -ll in Makefile if you modify this file to convert to .c
|
||||
*/
|
||||
|
||||
%x REGID
|
||||
%x REGNAME
|
||||
%x REGVAL
|
||||
|
||||
%{
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "header_mem_handler.h"
|
||||
#include "fasta_header_handler.h"
|
||||
|
||||
#define MEMALLOCATED 10
|
||||
#define BUFFER 5
|
||||
|
||||
#define YY_DECL int header_parser(int *nbf, int *memory_allocated, element_from_header **p_header)
|
||||
|
||||
|
||||
%}
|
||||
|
||||
WORD [[:alnum:]:\-.{},'_()\#\[\]\|\&\"\'\/\%\+]+
|
||||
WORDID [[:alnum:]:\-.{},'_()\#\[\]\|\&\"\'\/\%\+=;]+
|
||||
SUP >
|
||||
EOL \n
|
||||
SEP ;
|
||||
SPACE [[:blank:]]+
|
||||
EQUAL =
|
||||
|
||||
%%
|
||||
|
||||
int i;
|
||||
int size_needed;
|
||||
int free_size;
|
||||
char* field;
|
||||
|
||||
|
||||
<INITIAL>{SUP} {
|
||||
/*printf("\n<INITIAL>{SUP},%s",yytext);*/
|
||||
BEGIN(REGID);
|
||||
}
|
||||
|
||||
<INITIAL,REGID>{WORDID} {
|
||||
i=0;
|
||||
|
||||
field = malloc_field(&free_size);
|
||||
(*p_header)[*nbf].name = (char*) malloc(3*sizeof(char));
|
||||
strcpy(((*p_header)[*nbf]).name,"id");
|
||||
|
||||
size_needed = strlen(yytext)+1;
|
||||
(*p_header)[*nbf].value = (char*) malloc(sizeof(char)*size_needed);
|
||||
strcpy(((*p_header)[*nbf]).value,yytext);
|
||||
|
||||
(*nbf)++;
|
||||
}
|
||||
|
||||
|
||||
<INITIAL,REGID>{SPACE} {
|
||||
BEGIN(REGNAME);
|
||||
}
|
||||
|
||||
<REGNAME>{WORD} {
|
||||
/*fprintf(stderr,"\n<REGNAME>{WORD} **%s**",yytext);*/
|
||||
field = store_in_field(field,yytext,&free_size,&i);
|
||||
}
|
||||
|
||||
<REGNAME>{SPACE} {
|
||||
/*fprintf(stderr,"\n<REGNAME>{SPACE} **%s**",yytext);*/
|
||||
if (i != 0)
|
||||
field = store_in_field(field,yytext,&free_size,&i);
|
||||
}
|
||||
|
||||
<REGNAME>{EQUAL} {
|
||||
/*fprintf(stderr,"\n<REGNAME>{EQUAL},%s",yytext);*/
|
||||
field = store_in_header_table(field, &((*p_header)[*nbf].name), &free_size, &i);
|
||||
BEGIN(REGVAL);
|
||||
}
|
||||
|
||||
<REGNAME>{SEP} {
|
||||
/*fprintf(stderr,"\n<REGNAME>{SEP},%s",yytext);*/
|
||||
(*p_header)[*nbf].name = (char*) malloc(19*sizeof(char));
|
||||
strcpy((*p_header)[*nbf].name,"definition");
|
||||
field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i);
|
||||
p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated);
|
||||
BEGIN(REGNAME);
|
||||
}
|
||||
|
||||
<REGVAL>{WORD} {
|
||||
/*fprintf(stderr,"\n<REGVAL>{WORD} **%s**\n",yytext);*/
|
||||
field = store_in_field(field,yytext,&free_size,&i);
|
||||
}
|
||||
|
||||
<REGVAL>{SPACE} {
|
||||
/*fprintf(stderr,"\n<REGVAL>{SPACE} **%s**\n",yytext);*/
|
||||
field = store_in_field(field,yytext,&free_size,&i);
|
||||
}
|
||||
|
||||
<REGVAL>{SEP} {
|
||||
/*fprintf(stderr,"\n<REGVAL>{SEP},%s\n",yytext);*/
|
||||
|
||||
field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i);
|
||||
p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated);
|
||||
BEGIN(REGNAME);
|
||||
}
|
||||
|
||||
|
||||
<REGVAL>{EQUAL} {
|
||||
/*fprintf(stderr, "\nWarning : separator ';' probably missing in header after %s",(*p_header)[*nbf].name);*/
|
||||
}
|
||||
|
||||
<REGVAL><<EOF>> {
|
||||
field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i);
|
||||
p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated);
|
||||
end_header_table(p_header, *nbf);
|
||||
|
||||
free(field);
|
||||
BEGIN(INITIAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
<REGNAME><<EOF>> {
|
||||
/*(*p_header)[*nbf].name = (char*) malloc(sizeof(char)*19);
|
||||
strcpy((*p_header)[*nbf].name,"other_informations");
|
||||
field = store_in_header_table(field, &((*p_header)[*nbf].value), &free_size, &i);
|
||||
p_header = check_and_realloc_mem_in_header_table(p_header, nbf, memory_allocated);
|
||||
*/
|
||||
end_header_table(p_header, *nbf);
|
||||
|
||||
free(field);
|
||||
BEGIN(INITIAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
%%
|
||||
|
||||
int header_yywrap()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
element_from_header* header_parser_main(char *h)
|
||||
{
|
||||
int nbfields,memory_allocated;
|
||||
element_from_header* header;
|
||||
char* nbfields_n;
|
||||
char* nbfields_v;
|
||||
|
||||
nbfields_n = (char*) malloc(9*sizeof(char));
|
||||
nbfields_v = (char*) malloc(5*sizeof(char));
|
||||
|
||||
memory_allocated=MEMALLOCATED;
|
||||
|
||||
nbfields=1;
|
||||
|
||||
strcpy(nbfields_n, "nbfields");
|
||||
strcpy(nbfields_v, "1");
|
||||
|
||||
header = (element_from_header*) malloc(memory_allocated * sizeof(element_from_header));
|
||||
|
||||
header[0].name = nbfields_n;
|
||||
header[0].value = nbfields_v;
|
||||
|
||||
YY_BUFFER_STATE state;
|
||||
|
||||
state=yy_scan_string(h);
|
||||
|
||||
header_parser(&nbfields, &memory_allocated, &header);
|
||||
|
||||
yy_delete_buffer(state);
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,76 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "sequence.h"
|
||||
#include "fasta_header_parser.h"
|
||||
|
||||
|
||||
void printOnlySeqFromFastaSeqPtr(fastaSeqPtr seq, FILE* output)
|
||||
{
|
||||
char nuc;
|
||||
int n=60;
|
||||
int l = strlen(seq->sequence);
|
||||
for (n=60; n<l; n+=60)
|
||||
{
|
||||
nuc = seq->sequence[n];
|
||||
seq->sequence[n]=0;
|
||||
fprintf(output,"%s\n",seq->sequence+n-60);
|
||||
seq->sequence[n]=nuc;
|
||||
}
|
||||
fprintf(output,"%s\n",seq->sequence+n-60);
|
||||
}
|
||||
|
||||
|
||||
void printOnlySeqFromChar(char* seq, FILE* output)
|
||||
{
|
||||
char nuc;
|
||||
int n=60;
|
||||
int l = strlen(seq);
|
||||
for (n=60; n<l; n+=60)
|
||||
{
|
||||
nuc = seq[n];
|
||||
seq[n]=0;
|
||||
fprintf(output,"%s\n",seq+n-60);
|
||||
seq[n]=nuc;
|
||||
}
|
||||
fprintf(output,"%s\n",seq+n-60);
|
||||
}
|
||||
|
||||
|
||||
void printOnlyHeaderFromFastaSeqPtr(fastaSeqPtr seq, FILE* output)
|
||||
{
|
||||
fprintf(output,">%s\n",seq->rawheader);
|
||||
}
|
||||
|
||||
|
||||
void printOnlyHeaderFromTable(element_from_header* header, FILE* output)
|
||||
{
|
||||
int i;
|
||||
int nbf;
|
||||
|
||||
nbf = atoi(header[0].value);
|
||||
|
||||
fprintf(output,">%s ",header[1].value);
|
||||
|
||||
for (i = 2; i <= nbf; i++)
|
||||
{
|
||||
if (strcmp(header[i].name, "definition") != 0)
|
||||
{
|
||||
fprintf(output,"%s",header[i].name);
|
||||
fprintf(output,"=");
|
||||
fprintf(output,"%s; ",header[i].value);
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(header[nbf].name, "definition") == 0)
|
||||
fprintf(output,"%s; ",header[nbf].value);
|
||||
|
||||
fprintf(output,"\n");
|
||||
}
|
||||
|
||||
|
||||
void printHeaderAndSeqFromFastaSeqPtr(fastaSeqPtr seq, FILE* output)
|
||||
{
|
||||
printOnlyHeaderFromFastaSeqPtr(seq, output);
|
||||
printOnlySeqFromFastaSeqPtr(seq, output);
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
|
||||
#ifndef FASTA_SEQ_WRITER_H_
|
||||
#define FASTA_SEQ_WRITER_H_
|
||||
|
||||
#include "sequence.h"
|
||||
|
||||
|
||||
void printOnlySeqFromFastaSeqPtr(fastaSeqPtr, FILE*);
|
||||
|
||||
void printOnlySeqFromChar(char*, FILE*);
|
||||
|
||||
void printOnlyHeaderFromFastaSeqPtr(fastaSeqPtr, FILE*);
|
||||
|
||||
void printOnlyHeaderFromTable(element_from_header*, FILE*);
|
||||
|
||||
void printHeaderAndSeqFromFastaSeqPtr(fastaSeqPtr, FILE*);
|
||||
|
||||
|
||||
#endif
|
@ -0,0 +1,93 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "header_mem_handler.h"
|
||||
#include <string.h>
|
||||
|
||||
#define FIELD_BUFFER 1024
|
||||
|
||||
|
||||
char* malloc_field(int *free_size)
|
||||
{
|
||||
char* field = (char*) malloc(sizeof(char) * FIELD_BUFFER);
|
||||
field[0] = 0;
|
||||
(*free_size) = FIELD_BUFFER;
|
||||
return field;
|
||||
}
|
||||
|
||||
int check_mem_field(int size_needed)
|
||||
{
|
||||
int number_of_chunks_to_alloc;
|
||||
number_of_chunks_to_alloc = size_needed / FIELD_BUFFER + 1;
|
||||
return number_of_chunks_to_alloc;
|
||||
}
|
||||
|
||||
char* realloc_field(int number_of_chunks_to_alloc, char* field)
|
||||
{
|
||||
int size_needed;
|
||||
size_needed = number_of_chunks_to_alloc * FIELD_BUFFER;
|
||||
field = realloc(field, (size_needed)*sizeof(char));
|
||||
return field;
|
||||
}
|
||||
|
||||
char* check_and_realloc_field(char* field, int size_needed, int* free_size)
|
||||
{
|
||||
size_needed = size_needed + strlen(field);
|
||||
int number_of_chunks_to_alloc = check_mem_field(size_needed);
|
||||
if (strlen(field)>0)
|
||||
field = realloc_field(number_of_chunks_to_alloc, field);
|
||||
else
|
||||
{
|
||||
free(field);
|
||||
field = malloc(number_of_chunks_to_alloc * FIELD_BUFFER);
|
||||
}
|
||||
(*free_size) = number_of_chunks_to_alloc*FIELD_BUFFER - size_needed + 1;
|
||||
return field;
|
||||
}
|
||||
|
||||
|
||||
char* store_in_field(char* field, char* yytext, int* free_size, int* i)
|
||||
{
|
||||
int size_needed;
|
||||
size_needed = strlen(yytext)+1;
|
||||
if (size_needed > (*free_size))
|
||||
field = check_and_realloc_field(field, size_needed, free_size);
|
||||
else
|
||||
(*free_size) = (*free_size) - size_needed + 1;
|
||||
strcpy(&(field[(*i)]),yytext);
|
||||
(*i) = (*i)+size_needed-1;
|
||||
return field;
|
||||
}
|
||||
|
||||
|
||||
char* store_in_header_table(char* field, char** storing_place, int* free_size, int* i)
|
||||
{
|
||||
int size_needed;
|
||||
size_needed = strlen(field)+1;
|
||||
*storing_place = (char*) malloc(size_needed*sizeof(char));
|
||||
strcpy(*storing_place,field);
|
||||
(*i)=0;
|
||||
free(field);
|
||||
field = malloc_field(free_size);
|
||||
return field;
|
||||
}
|
||||
|
||||
|
||||
element_from_header** check_and_realloc_mem_in_header_table(element_from_header** p_header, int* nbf, int* memory_allocated)
|
||||
{
|
||||
(*nbf)++;
|
||||
|
||||
if (*nbf == *memory_allocated)
|
||||
{
|
||||
(*memory_allocated)++;
|
||||
*p_header = (element_from_header*) realloc(*p_header, (*memory_allocated) * sizeof(element_from_header));
|
||||
}
|
||||
|
||||
return p_header;
|
||||
}
|
||||
|
||||
void end_header_table(element_from_header** p_header, int nbf)
|
||||
{
|
||||
nbf = nbf - 1;
|
||||
//fprintf(stderr, "nbf = %d", nbf);
|
||||
sprintf((*p_header)->value, "%d", nbf);
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
#ifndef HEADER_MEM_HANDLER_H_
|
||||
#define HEADER_MEM_HANDLER_H_
|
||||
|
||||
#include "fasta_header_parser.h"
|
||||
|
||||
char* malloc_field(int*);
|
||||
|
||||
int check_mem_field(int);
|
||||
|
||||
char* realloc_field(int, char*);
|
||||
|
||||
char* check_and_realloc_field(char*, int, int*);
|
||||
|
||||
char* store_in_field(char*, char*, int*, int*);
|
||||
|
||||
char* store_in_header_table(char*, char**, int*, int*);
|
||||
|
||||
element_from_header** check_and_realloc_mem_in_header_table(element_from_header**, int*, int*);
|
||||
|
||||
void end_header_table(element_from_header** p_header, int nbf);
|
||||
|
||||
#endif
|
450
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfasta/sequence.c
Normal file
450
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfasta/sequence.c
Normal file
@ -0,0 +1,450 @@
|
||||
/**
|
||||
* FileName: sequence.c
|
||||
* Authors: Tiayyba Riaz, Celine Mercier
|
||||
* Description: C file for sequence reading and parsing
|
||||
* **/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "../libutils/utilities.h"
|
||||
#include "sequence.h"
|
||||
#include "../libfile/fileHandling.h"
|
||||
#include "fasta_header_handler.h"
|
||||
#include "fasta_header_parser.h"
|
||||
|
||||
|
||||
/*
|
||||
* Function Name: seq_getNext(FILE *fp, char *fieldDelim)
|
||||
* Description: Gets the next sequence from file by calling another function, passes the sequence
|
||||
* to other function to get the header elements and nucleotide suquence into a strcuture of
|
||||
* type fastaSeq and returns a pointer to this newly populated structure.
|
||||
*/
|
||||
|
||||
fastaSeqPtr seq_getNext(FILE *fp, char *fieldDelim, BOOL isStandardSeq, BOOL onlyATGC)
|
||||
{
|
||||
char *seq;
|
||||
char *header;
|
||||
char *strTemp;
|
||||
fastaSeqPtr seqElem;
|
||||
int seqLen;
|
||||
|
||||
seq = seq_readNextFromFilebyLine(fp);
|
||||
if (seq == NULL) return NULL;
|
||||
|
||||
/* Find header separator \n, if not found return NULL */
|
||||
strTemp = strchr(seq, '\n');
|
||||
if(strTemp == NULL)
|
||||
return NULL;
|
||||
|
||||
seqLen = strlen(strTemp);
|
||||
header = (char*) util_malloc(1+(strlen(seq) - seqLen)*sizeof(char), __FILE__, __LINE__);
|
||||
|
||||
/* Separate header in header variable */
|
||||
strncpy(header, seq, strTemp - seq);
|
||||
header[strTemp - seq] = '\0';
|
||||
/* Get memory for new sequence structure element */
|
||||
seqElem = (fastaSeqPtr) util_malloc(sizeof(fastaSeq), __FILE__, __LINE__);
|
||||
/* Parse header and assign values to structure fields */
|
||||
seq_fillHeader(header, fieldDelim, seqElem);
|
||||
/* Get clean sequence and assign to structure field */
|
||||
if (isStandardSeq)
|
||||
if (onlyATGC)
|
||||
seq_fillSeqOnlyATGC(strTemp, seqElem, seqLen);
|
||||
else
|
||||
seq_fillSeq(strTemp, seqElem, seqLen);
|
||||
else
|
||||
seq_fillDigitSeq(strTemp, seqElem, seqLen);
|
||||
/* Type cast the char * seq to void pointer and deallocate the memory pointed by this */
|
||||
util_free((void *)seq);
|
||||
/* Return new sequence structure element */
|
||||
return seqElem;
|
||||
}
|
||||
|
||||
|
||||
char *seq_readNextFromFilebyLine(FILE* fp)
|
||||
{
|
||||
char newc = '\0';
|
||||
BOOL seqCompleted = FALSE;
|
||||
int length = 500;
|
||||
int32_t len;
|
||||
char tempstr[length];
|
||||
char* buffer;
|
||||
|
||||
if (feof(fp)) return NULL;
|
||||
newc = file_nextChar(fp);
|
||||
if (newc != '>') ungetc(newc, fp);
|
||||
|
||||
buffer = util_malloc(1*sizeof(char), __FILE__, __LINE__);
|
||||
buffer[0] = '\0';
|
||||
|
||||
while(!seqCompleted)
|
||||
{
|
||||
newc = file_nextChar(fp);
|
||||
if(newc == '>' || newc == '\0')
|
||||
{
|
||||
seqCompleted = TRUE;
|
||||
if (newc == '>')
|
||||
ungetc(newc, fp); // Make sure next time we start from sequence delimiter >
|
||||
}
|
||||
else
|
||||
{
|
||||
ungetc(newc, fp);
|
||||
if(file_nextLine( fp, tempstr, length) != NULL)
|
||||
{
|
||||
len = strlen(tempstr) + strlen(buffer) + 1;
|
||||
buffer = util_realloc(buffer, len, __FILE__, __LINE__);
|
||||
strcat(buffer, tempstr);
|
||||
}
|
||||
else
|
||||
{
|
||||
seqCompleted = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Function Name: seq_fillHeader(char* header, char *fieldDelim, fastaSeqPtr seqElem)
|
||||
*/
|
||||
void seq_fillHeader(char* header, char *fieldDelim, fastaSeqPtr seqElem)
|
||||
{
|
||||
char* IdEnd;
|
||||
int IdSize;
|
||||
|
||||
seqElem->rawheader = strdup(header);
|
||||
|
||||
IdEnd = strchr(header, ' ');
|
||||
if (IdEnd == NULL)
|
||||
IdSize = strlen(header);
|
||||
else
|
||||
IdSize = strlen(header) - strlen(IdEnd);
|
||||
|
||||
seqElem->accession_id = (char*) util_malloc(1+IdSize*sizeof(char), __FILE__, __LINE__);
|
||||
|
||||
strncpy(seqElem->accession_id, header, IdSize);
|
||||
|
||||
(seqElem->accession_id)[IdSize] = '\0';
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Function Name: seq_fillSeq(char *seq, fastaSeqPtr seqElem)
|
||||
* Description: Parses the whole sequences for actual nucleotide sequences and stores that
|
||||
* sequence in the field of structure 'seqElem' .
|
||||
*/
|
||||
void seq_fillSeq(char *seq, fastaSeqPtr seqElem, int seqLen)
|
||||
{
|
||||
char* seqTemp;
|
||||
char c;
|
||||
int32_t index = 0, seqIndex = 0, len = strlen(seq);
|
||||
char* seqAlphabets = "acgtACGT-nN";
|
||||
|
||||
seqTemp = (char*) util_malloc(seqLen*sizeof(char), __FILE__, __LINE__);
|
||||
|
||||
while (index < len)
|
||||
{
|
||||
c = seq[index++];
|
||||
if (strchr(seqAlphabets, c) != NULL)
|
||||
seqTemp[seqIndex++] = tolower(c);
|
||||
}
|
||||
seqTemp[seqIndex] = '\0';
|
||||
seqElem->length=seqIndex;
|
||||
seqElem->sequence = strdup(seqTemp);
|
||||
}
|
||||
|
||||
|
||||
void seq_fillSeqOnlyATGC(char *seq, fastaSeqPtr seqElem, int seqLen)
|
||||
{
|
||||
char* seqTemp;
|
||||
char c;
|
||||
int32_t index = 0, seqIndex = 0, len = strlen(seq);
|
||||
char* seqAlphabets = "acgtACGT";
|
||||
int notAllATGC = 0;
|
||||
|
||||
seqTemp = (char*) util_malloc(seqLen*sizeof(char), __FILE__, __LINE__);
|
||||
|
||||
while (index < len)
|
||||
{
|
||||
c = seq[index++];
|
||||
if (strchr(seqAlphabets, c) != NULL)
|
||||
seqTemp[seqIndex++] = tolower(c);
|
||||
else if (c != '\n')
|
||||
notAllATGC = 1;
|
||||
}
|
||||
|
||||
if (notAllATGC)
|
||||
seqTemp[0] = '\0';
|
||||
else
|
||||
{
|
||||
seqTemp[seqIndex] = '\0';
|
||||
seqElem->length=seqIndex;
|
||||
}
|
||||
seqElem->sequence = strdup(seqTemp);
|
||||
}
|
||||
|
||||
|
||||
void seq_fillDigitSeq(char *seq, fastaSeqPtr seqElem, int seqLen)
|
||||
{
|
||||
char* seqTemp;
|
||||
char c;
|
||||
int32_t index = 0, seqIndex = 0, len = strlen(seq);
|
||||
|
||||
seqTemp = (char*) util_malloc(seqLen*sizeof(char), __FILE__, __LINE__);
|
||||
|
||||
while (index < len)
|
||||
{
|
||||
c = seq[index++];
|
||||
if ((c >= '0' && c <= '9') || c == ' ')
|
||||
seqTemp[seqIndex++] = c;
|
||||
/*else
|
||||
{
|
||||
printf("Error in input file");
|
||||
exit(0);
|
||||
}*/
|
||||
}
|
||||
seqTemp[seqIndex] = '\0';
|
||||
seqElem->sequence = strdup(seqTemp);
|
||||
}
|
||||
|
||||
|
||||
fastaSeqCount seq_readAllSeq2(char *fileName, BOOL isStandardSeq, BOOL onlyATGC)
|
||||
{
|
||||
FILE* fp;
|
||||
fastaSeqPtr seqPtr;
|
||||
fastaSeqPtr seqPtrAr;
|
||||
|
||||
int32_t counter = 0;
|
||||
int32_t slots = 1000;
|
||||
fastaSeqCount allseqs;
|
||||
int32_t discarded=0;
|
||||
|
||||
fp = file_open(fileName, TRUE);
|
||||
|
||||
if (fp == NULL)
|
||||
{
|
||||
fprintf(stderr, "\nCould not open file.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
exitIfEmptyFile(fp);
|
||||
|
||||
seqPtrAr = (fastaSeqPtr) util_malloc(slots*sizeof(fastaSeq), __FILE__, __LINE__);
|
||||
|
||||
seqPtr = seq_getNext(fp, " ", isStandardSeq, onlyATGC);
|
||||
|
||||
while (seqPtr != NULL)
|
||||
{
|
||||
if (counter == slots)
|
||||
{
|
||||
slots += 1000;
|
||||
seqPtrAr = (fastaSeqPtr)util_realloc(seqPtrAr, slots*sizeof(fastaSeq), __FILE__, __LINE__);
|
||||
}
|
||||
|
||||
if ((seqPtr->sequence)[0] != '\0')
|
||||
seqPtrAr[counter++] = *seqPtr;
|
||||
else
|
||||
discarded++;
|
||||
|
||||
util_free((void *)seqPtr);
|
||||
seqPtr = seq_getNext(fp, " ", isStandardSeq, onlyATGC);
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
if (counter != slots)
|
||||
seqPtrAr = (fastaSeqPtr)util_realloc(seqPtrAr, counter*sizeof(fastaSeq), __FILE__, __LINE__);
|
||||
|
||||
allseqs.count = counter;
|
||||
allseqs.fastaSeqs = seqPtrAr;
|
||||
|
||||
if (discarded)
|
||||
fprintf(stderr, "\nDiscarded %d sequences that did not contain only 'AaTtGgCc' characters.", discarded);
|
||||
|
||||
return allseqs;
|
||||
}
|
||||
|
||||
|
||||
int32_t seq_findSeqByAccId (char *accid, fastaSeqCountPtr allseqs)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
for (i = 0; i < allseqs->count; i++)
|
||||
{
|
||||
if (strcmp (accid, allseqs->fastaSeqs[i].accession_id) == 0)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void seq_printSeqs (fastaSeqCountPtr allseq)
|
||||
{
|
||||
int32_t i;
|
||||
|
||||
for (i = 0; i < allseq->count; i++)
|
||||
//for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (allseq->fastaSeqs[i].sequence == NULL) continue;
|
||||
if (allseq->fastaSeqs[i].rawheader)
|
||||
printf (">%s\n", allseq->fastaSeqs[i].rawheader);
|
||||
else
|
||||
printf (">%s\n", allseq->fastaSeqs[i].accession_id);
|
||||
printf ("%s\n", allseq->fastaSeqs[i].sequence);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int cleanDB(fastaSeqCount db) // replace not a/t/g/c with a's
|
||||
{
|
||||
int32_t i;
|
||||
char *seq;
|
||||
BOOL changed;
|
||||
int32_t seqchanged=0;
|
||||
int32_t nucchanged=0;
|
||||
|
||||
fprintf(stderr,"Cleaning dataset...");
|
||||
|
||||
for (i=0; i < db.count;i++)
|
||||
{
|
||||
|
||||
changed=FALSE;
|
||||
for (seq = db.fastaSeqs[i].sequence; *seq!=0; seq++)
|
||||
{
|
||||
if (*seq!='a' && *seq!='c' && *seq!='g' && *seq!='t')
|
||||
{
|
||||
changed=TRUE;
|
||||
nucchanged++;
|
||||
*seq='a';
|
||||
}
|
||||
}
|
||||
if (changed)
|
||||
seqchanged++;
|
||||
}
|
||||
|
||||
if (seqchanged)
|
||||
fprintf(stderr," : %d nucleotides substituted in %d sequences\n",nucchanged,seqchanged);
|
||||
else
|
||||
fprintf(stderr," : Done\n");
|
||||
|
||||
return(db.count);
|
||||
}
|
||||
|
||||
|
||||
void addCounts(fastaSeqCount* db)
|
||||
{
|
||||
int s;
|
||||
char* count;
|
||||
element_from_header* header;
|
||||
char* count_n;
|
||||
char* count_v;
|
||||
|
||||
count_n = (char*) malloc(6*sizeof(char));
|
||||
count_v = (char*) malloc(2*sizeof(char));
|
||||
|
||||
strcpy(count_n, "count");
|
||||
strcpy(count_v, "1");
|
||||
|
||||
for (s=0; s < db->count; s++)
|
||||
{
|
||||
header = header_parser_main(db->fastaSeqs[s].rawheader);
|
||||
count = getItemFromHeader("count", header);
|
||||
if (count == 0) // no count field
|
||||
{
|
||||
header = table_header_add_field(header, count_n, count_v);
|
||||
db->fastaSeqs[s].count = 1;
|
||||
}
|
||||
else
|
||||
db->fastaSeqs[s].count = atoi(count);
|
||||
db->fastaSeqs[s].header = header;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int uniqSeqsVector(fastaSeqCount* db, fastaSeqPtr** uniqSeqs)
|
||||
{
|
||||
int i, j, k;
|
||||
*(*(uniqSeqs)) = db->fastaSeqs;
|
||||
db->fastaSeqs[0].uniqHead = TRUE;
|
||||
|
||||
i = 0;
|
||||
k = 1;
|
||||
|
||||
for (j=1; j < db->count; j++)
|
||||
{
|
||||
if (strcmp(db->fastaSeqs[i].sequence, db->fastaSeqs[j].sequence) == 0)
|
||||
{
|
||||
db->fastaSeqs[i].count += db->fastaSeqs[j].count;
|
||||
db->fastaSeqs[j].uniqHead = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
db->fastaSeqs[j].uniqHead = TRUE;
|
||||
*(*(uniqSeqs)+k) = (db->fastaSeqs)+j;
|
||||
k++;
|
||||
i = j;
|
||||
}
|
||||
}
|
||||
return(k);
|
||||
}
|
||||
|
||||
|
||||
void calculateMaxAndMinLen(fastaSeqPtr* db, int n, int* lmax, int* lmin)
|
||||
{
|
||||
int i;
|
||||
int l;
|
||||
|
||||
*lmax = 0;
|
||||
for (i=0; i < n; i++)
|
||||
{
|
||||
l = (*(db+i))->length;
|
||||
if (l > *lmax)
|
||||
*lmax = l;
|
||||
}
|
||||
|
||||
*lmin = *lmax;
|
||||
for (i=0; i < n; i++)
|
||||
{
|
||||
l = (*(db+i))->length;
|
||||
if (l < *lmin)
|
||||
*lmin = l;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void calculateMaxAndMinLenDB(fastaSeqCount db, int* lmax, int* lmin)
|
||||
{
|
||||
int i;
|
||||
int l;
|
||||
|
||||
*lmax = 0;
|
||||
for (i=0; i < db.count; i++)
|
||||
{
|
||||
l = ((db.fastaSeqs)+i)->length;
|
||||
if (l > *lmax)
|
||||
*lmax = l;
|
||||
}
|
||||
|
||||
*lmin = *lmax;
|
||||
for (i=0; i < db.count; i++)
|
||||
{
|
||||
l = ((db.fastaSeqs)+i)->length;;
|
||||
if (l < *lmin)
|
||||
*lmin = l;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int sortSeqsWithCounts(const void **s1, const void **s2)
|
||||
{
|
||||
return(((fastaSeqPtr) *s2)->count - ((fastaSeqPtr) *s1)->count);
|
||||
}
|
||||
|
||||
|
||||
int reverseSortSeqsWithCounts(const void **s1, const void **s2)
|
||||
{
|
||||
return(((fastaSeqPtr) *s1)->count - ((fastaSeqPtr) *s2)->count);
|
||||
}
|
64
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfasta/sequence.h
Normal file
64
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfasta/sequence.h
Normal file
@ -0,0 +1,64 @@
|
||||
/**
|
||||
* FileName: sequence.h
|
||||
* Authors: Tiayyba Riaz, Celine Mercier
|
||||
* Description: Prototypes and other declarations for sequences
|
||||
* **/
|
||||
#ifndef SEQUENCE_H_
|
||||
#define SEQUENCE_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include "../libutils/utilities.h"
|
||||
#include "fasta_header_parser.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
char* accession_id; // identifier
|
||||
char *rawheader; // not parsed header
|
||||
element_from_header* header; // parsed header
|
||||
char *sequence; // DNA sequence itself
|
||||
int32_t length; // DNA sequence's length
|
||||
int32_t count; // abundance of the sequence
|
||||
unsigned char *table; // 4mer occurrence table build using function buildTable
|
||||
int32_t over; // count of 4mer with occurrences greater than 255 (overflow)
|
||||
struct fastaSeqPtr* next; // next unique sequence for example
|
||||
BOOL cluster_center; // whether the sequence is a cluster center or not
|
||||
int32_t cluster_weight; // cluster weight when sequence is cluster center
|
||||
int32_t cluster_weight_unique_ids; // cluster weight when sequence is cluster center, counting the number sequence records
|
||||
double score; // score with cluster center for example
|
||||
struct fastaSeqPtr* center; // pointer to the sequence's cluster center
|
||||
int32_t center_index; // index of the sequence's cluster center
|
||||
BOOL uniqHead; // whether the sequence is a unique head or not
|
||||
char* columns_BIOM; // to print in BIOM format
|
||||
int columns_BIOM_size; // size allocated for columns_BIOM
|
||||
char* line_OTU_table; // to print in OTU table format
|
||||
int line_OTU_table_size; // size allocated for line_OTU_table
|
||||
struct hashtable *sample_counts; // sample counts for sumaclean
|
||||
}fastaSeq,*fastaSeqPtr;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int32_t count;
|
||||
fastaSeqPtr fastaSeqs;
|
||||
}fastaSeqCount, *fastaSeqCountPtr;
|
||||
|
||||
|
||||
fastaSeqPtr seq_getNext(FILE *fp, char *fieldDelim, BOOL isStandardSeq, BOOL onlyATGC);
|
||||
char *seq_readNextFromFilebyLine(FILE* fp);
|
||||
void seq_fillSeq(char *seq, fastaSeqPtr seqElem, int seqLen);
|
||||
void seq_fillSeqOnlyATGC(char *seq, fastaSeqPtr seqElem, int seqLen);
|
||||
void seq_fillDigitSeq(char *seq, fastaSeqPtr seqElem, int seqLen);
|
||||
void seq_fillHeader(char* header, char *fieldDelim, fastaSeqPtr seqElem);
|
||||
fastaSeqCount seq_readAllSeq2(char *fileName, BOOL isStandardSeq, BOOL onlyATGC);
|
||||
int32_t seq_findSeqByAccId (char *accid, fastaSeqCountPtr allseqs);
|
||||
void seq_printSeqs (fastaSeqCountPtr allseq);
|
||||
int cleanDB(fastaSeqCount);
|
||||
void addCounts(fastaSeqCount* db);
|
||||
int uniqSeqsVector(fastaSeqCount* db, fastaSeqPtr** uniqSeqs);
|
||||
void calculateMaxAndMinLen(fastaSeqPtr* db, int n, int* lmax, int* lmin);
|
||||
void calculateMaxAndMinLenDB(fastaSeqCount db, int* lmax, int* lmin);
|
||||
int sortSeqsWithCounts(const void **s1, const void **s2);
|
||||
int reverseSortSeqsWithCounts(const void **s1, const void **s2);
|
||||
void readSampleCounts(fastaSeqCount* db, char* key_name);
|
||||
|
||||
#endif /*SEQUENCE_H_*/
|
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfile/Makefile
Normal file
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/libfile/Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
SOURCES = fileHandling.c
|
||||
|
||||
|
||||
SRCS=$(SOURCES)
|
||||
|
||||
|
||||
OBJECTS= $(patsubst %.c,%.o,$(SOURCES))
|
||||
|
||||
LIBFILE= libfile.a
|
||||
RANLIB=ranlib
|
||||
|
||||
|
||||
include ../global.mk
|
||||
|
||||
all: $(LIBFILE)
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJECTS) $(LIBFILE)
|
||||
rm -f *.P
|
||||
rm -f *.a
|
||||
|
||||
$(LIBFILE): $(OBJECTS)
|
||||
ar -cr $@ $?
|
||||
$(RANLIB) $@
|
@ -0,0 +1,88 @@
|
||||
/**
|
||||
* FileName: fileHandling.c
|
||||
* Authors: Tiayyba Riaz, Celine Mercier
|
||||
* Description: C file for file handling functions
|
||||
* **/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "../libutils/utilities.h"
|
||||
|
||||
/*
|
||||
* Function Name: fileOpen(char* fileName, BOOL abortOnError)
|
||||
* Description: Opens the file and returns the pointer to file object
|
||||
*/
|
||||
FILE *file_open(char* fileName, BOOL abortOnError)
|
||||
{
|
||||
FILE* fp;
|
||||
|
||||
if (fileName == NULL && abortOnError)
|
||||
ERRORABORT(FILE_OPENING_ERROR, "File name not given.");
|
||||
|
||||
if (fileName == NULL)
|
||||
return NULL;
|
||||
|
||||
fp = fopen(fileName, "r");
|
||||
return fp;
|
||||
}
|
||||
|
||||
FILE *file_openrw(char* fileName, BOOL abortOnError)
|
||||
{
|
||||
FILE* fp;
|
||||
|
||||
if (fileName == NULL && abortOnError)
|
||||
ERRORABORT(FILE_OPENING_ERROR, "File name not given.");
|
||||
|
||||
if (fileName == NULL)
|
||||
return NULL;
|
||||
|
||||
fp = fopen(fileName, "w+");
|
||||
return fp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function Name: fileNextChar(FILE* fp)
|
||||
* Description: Reads the file and returns next character, if file is null or its end of file, returns \<5C>.
|
||||
*/
|
||||
char file_nextChar(FILE* fp)
|
||||
{
|
||||
if (fp == NULL)
|
||||
return '\0';
|
||||
|
||||
if(feof(fp))
|
||||
return '\0';
|
||||
|
||||
return (char) fgetc(fp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Function Name: *fileNextLine(FILE *fp, char *buffer, int32_t bufferSize)
|
||||
* Description: Reads the file and returns next line, if file is null or its end of file, returns \<5C>.
|
||||
*/
|
||||
char *file_nextLine(FILE *fp, char *buffer, int32_t bufferSize)
|
||||
{
|
||||
if(fp == NULL)
|
||||
return NULL;
|
||||
|
||||
if(feof(fp))
|
||||
return NULL;
|
||||
|
||||
return fgets(buffer, bufferSize, fp);
|
||||
}
|
||||
|
||||
|
||||
void exitIfEmptyFile(FILE *file)
|
||||
{
|
||||
long savedOffset = ftell(file);
|
||||
fseek(file, 0, SEEK_END);
|
||||
|
||||
if (ftell(file) == 0)
|
||||
{
|
||||
fprintf(stderr, "\nInput file is empty.\n");
|
||||
exit(1);
|
||||
}
|
||||
fseek(file, savedOffset, SEEK_SET);
|
||||
}
|
||||
|
@ -0,0 +1,20 @@
|
||||
/**
|
||||
* FileName: fileHandling.h
|
||||
* Authors: Tiayyba Riaz, Celine Mercier
|
||||
* Description: Header file for file handling functions
|
||||
* **/
|
||||
|
||||
|
||||
#ifndef FILEHANDLING_H_
|
||||
#define FILEHANDLING_H_
|
||||
|
||||
#include "../libutils/utilities.h"
|
||||
/* Prototypes */
|
||||
|
||||
FILE *file_open(char* fileName, BOOL abortOnError);
|
||||
char file_nextChar(FILE* fp);
|
||||
char *file_nextLine(FILE *fp, char *buffer, int32_t bufferSize);
|
||||
FILE *file_openrw(char* fileName, BOOL abortOnError);
|
||||
void exitIfEmptyFile(FILE *file);
|
||||
|
||||
#endif /*FILEHANDLING_H_*/
|
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/Makefile
Normal file
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
SOURCES = sse_banded_LCS_alignment.c \
|
||||
upperband.c
|
||||
|
||||
SRCS=$(SOURCES)
|
||||
|
||||
|
||||
OBJECTS= $(patsubst %.c,%.o,$(SOURCES))
|
||||
|
||||
LIBFILE= liblcs.a
|
||||
RANLIB=ranlib
|
||||
|
||||
|
||||
include ../global.mk
|
||||
|
||||
all: $(LIBFILE)
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJECTS) $(LIBFILE)
|
||||
rm -f *.P
|
||||
rm -f *.a
|
||||
|
||||
$(LIBFILE): $(OBJECTS)
|
||||
ar -cr $@ $?
|
||||
$(RANLIB) $@
|
168
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.ext.1.c
Normal file
168
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.ext.1.c
Normal file
@ -0,0 +1,168 @@
|
||||
#include "_lcs.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
|
||||
// Allocate a band allowing to align sequences of length : 'length'
|
||||
|
||||
column_t* allocateColumn(int length,column_t *column, bool mode8bits)
|
||||
{
|
||||
int size;
|
||||
bool newc = false;
|
||||
|
||||
// The band length should be equal to the length
|
||||
// of the sequence + 7 for taking into account its
|
||||
// shape
|
||||
|
||||
size = (length+1) * ((mode8bits) ? sizeof(int8_t):sizeof(int16_t));
|
||||
|
||||
|
||||
// If the pointer to the old column is NULL we allocate
|
||||
// a new column
|
||||
|
||||
if (column==NULL)
|
||||
{
|
||||
|
||||
column = malloc(sizeof(column_t));
|
||||
if (!column)
|
||||
return NULL;
|
||||
|
||||
column->size = 0;
|
||||
column->data.shrt=NULL;
|
||||
column->score.shrt=NULL;
|
||||
newc = true;
|
||||
}
|
||||
|
||||
// Otherwise we check if its size is sufficient
|
||||
// or if it should be extended
|
||||
|
||||
if (size > column->size)
|
||||
{
|
||||
int16_t *old = column->data.shrt;
|
||||
int16_t *olds= column->score.shrt;
|
||||
|
||||
column->data.shrt = malloc(size);
|
||||
column->score.shrt= malloc(size);
|
||||
|
||||
if (column->data.shrt==NULL || column->score.shrt==NULL)
|
||||
{
|
||||
fprintf(stderr,"Allocation Error on column for a size of %d\n" , size);
|
||||
column->data.shrt = old;
|
||||
column->score.shrt= olds;
|
||||
|
||||
if (newc)
|
||||
{
|
||||
free(column);
|
||||
column=NULL;
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
column->size = size;
|
||||
}
|
||||
|
||||
return column;
|
||||
}
|
||||
|
||||
void freeColumn(column_p column)
|
||||
{
|
||||
if (column)
|
||||
{
|
||||
if (column->data.shrt)
|
||||
free(column->data.shrt);
|
||||
|
||||
if (column->score.shrt)
|
||||
free(column->score.shrt);
|
||||
|
||||
free(column);
|
||||
}
|
||||
}
|
||||
|
||||
int fastLCSScore(const char* seq1, const char* seq2,column_pp column,int32_t* lpath)
|
||||
{
|
||||
return fastLCSScore16(seq1,seq2,column,lpath);
|
||||
}
|
||||
|
||||
int simpleLCS(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath)
|
||||
{
|
||||
int lseq1,lseq2; // length of the both sequences
|
||||
int lcs;
|
||||
int itmp; // tmp variables for swap
|
||||
const char* stmp; //
|
||||
int32_t *score;
|
||||
int32_t *path;
|
||||
column_t *column;
|
||||
int32_t i,j;
|
||||
int32_t sl,su,sd;
|
||||
int32_t pl,pu,pd;
|
||||
|
||||
// Made seq1 the longest sequences
|
||||
lseq1=strlen(seq1);
|
||||
lseq2=strlen(seq2);
|
||||
|
||||
if (lseq1 < lseq2)
|
||||
{
|
||||
itmp=lseq1;
|
||||
lseq1=lseq2;
|
||||
lseq2=itmp;
|
||||
|
||||
stmp=seq1;
|
||||
seq1=seq2;
|
||||
seq2=stmp;
|
||||
}
|
||||
|
||||
lseq1++;
|
||||
lseq2++;
|
||||
|
||||
// a band sized to the smallest sequence is allocated
|
||||
|
||||
if (ppcolumn)
|
||||
column = *ppcolumn;
|
||||
else
|
||||
column=NULL;
|
||||
|
||||
column = allocateColumn(lseq1*2,column,0);
|
||||
score = (int32_t*) column->score.shrt;
|
||||
path = (int32_t*) column->data.shrt;
|
||||
|
||||
memset(score,0,lseq1 * sizeof(int32_t));
|
||||
|
||||
for (j=0; j < lseq1; j++)
|
||||
path[j]=j;
|
||||
|
||||
for (i=1; i< lseq2; i++)
|
||||
{
|
||||
sl=0;
|
||||
pl=i;
|
||||
for (j=1; j < lseq1; j++)
|
||||
{
|
||||
sd=score[j-1] + (seq2[i-1]==seq1[j-1] ? 1:0);
|
||||
pd=path[j-1] + 1;
|
||||
|
||||
su=score[j];
|
||||
pu=path[j] + 1;
|
||||
|
||||
score[j-1]=sl;
|
||||
|
||||
if (su > sl) sl=su, pl=pu;
|
||||
if (sd > sl) sl=sd, pl=pd;
|
||||
}
|
||||
}
|
||||
|
||||
lcs = sl;
|
||||
if(lpath) *lpath=pl;
|
||||
|
||||
if (ppcolumn)
|
||||
*ppcolumn=column;
|
||||
else
|
||||
freeColumn(column);
|
||||
|
||||
return lcs;
|
||||
}
|
||||
|
34
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.ext.2.c
Normal file
34
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.ext.2.c
Normal file
@ -0,0 +1,34 @@
|
||||
#include "_lcs.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
|
||||
|
||||
#define VSIZE (8)
|
||||
#define VTYPE vInt16
|
||||
#define STYPE int16_t
|
||||
#define CMENB shrt
|
||||
#define VMODE false
|
||||
#define FASTLCSSCORE fastLCSScore16
|
||||
#define INSERT_REG _MM_INSERT_EPI16
|
||||
#define EXTRACT_REG _MM_EXTRACT_EPI16
|
||||
#define EQUAL_REG _MM_CMPEQ_EPI16
|
||||
#define GREATER_REG _MM_CMPGT_EPI16
|
||||
#define SMALLER_REG _MM_CMPLT_EPI16
|
||||
#define ADD_REG _MM_ADD_EPI16
|
||||
#define SUB_REG _MM_SUB_EPI16
|
||||
#define AND_REG _MM_AND_SI128
|
||||
#define ANDNOT_REG _MM_ANDNOT_SI128
|
||||
#define OR_REG _MM_OR_SI128
|
||||
#define SET_CONST _MM_SET1_EPI16
|
||||
#define GET_MAX _MM_MAX_EPI16
|
||||
#define GET_MIN _MM_MIN_EPI16
|
||||
#define MIN_SCORE INT16_MIN
|
||||
#define MAX_SCORE 32000
|
||||
|
||||
#include "_lcs_fast.h"
|
34
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.ext.3.c
Normal file
34
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.ext.3.c
Normal file
@ -0,0 +1,34 @@
|
||||
#include "_lcs.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
|
||||
|
||||
#define VSIZE (16)
|
||||
#define VTYPE vInt8
|
||||
#define STYPE int8_t
|
||||
#define CMENB byte
|
||||
#define VMODE true
|
||||
#define FASTLCSSCORE fastLCSScore8
|
||||
#define INSERT_REG _MM_INSERT_EPI8
|
||||
#define EXTRACT_REG _MM_EXTRACT_EPI8
|
||||
#define EQUAL_REG _MM_CMPEQ_EPI8
|
||||
#define GREATER_REG _MM_CMPGT_EPI8
|
||||
#define SMALLER_REG _MM_CMPLT_EPI8
|
||||
#define ADD_REG _MM_ADD_EPI8
|
||||
#define SUB_REG _MM_SUB_EPI8
|
||||
#define AND_REG _MM_AND_SI128
|
||||
#define ANDNOT_REG _MM_ANDNOT_SI128
|
||||
#define OR_REG _MM_OR_SI128
|
||||
#define SET_CONST _MM_SET1_EPI8
|
||||
#define GET_MAX _MM_MAX_EPI8
|
||||
#define GET_MIN _MM_MIN_EPI8
|
||||
#define MIN_SCORE INT8_MIN
|
||||
#define MAX_SCORE 127
|
||||
|
||||
#include "_lcs_fast.h"
|
29
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.h
Normal file
29
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs.h
Normal file
@ -0,0 +1,29 @@
|
||||
#include "../libsse/_sse.h"
|
||||
|
||||
#define bool char
|
||||
#define false (1==0)
|
||||
#define true (1==1)
|
||||
|
||||
typedef struct {
|
||||
int16_t size;
|
||||
|
||||
union { int16_t *shrt;
|
||||
int8_t *byte;
|
||||
} data;
|
||||
|
||||
union { int16_t *shrt;
|
||||
int8_t *byte;
|
||||
} score;
|
||||
|
||||
|
||||
} column_t, **column_pp, *column_p;
|
||||
|
||||
column_p allocateColumn(int length,column_t *column, bool mode8bits);
|
||||
|
||||
void freeColumn(column_p column);
|
||||
|
||||
int fastLCSScore16(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath);
|
||||
int fastLCSScore8(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath);
|
||||
int simpleLCS(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath);
|
||||
|
||||
int fastLCSScore(const char* seq1, const char* seq2,column_pp column,int32_t* lpath);
|
597
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs_fast.h
Normal file
597
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/_lcs_fast.h
Normal file
@ -0,0 +1,597 @@
|
||||
|
||||
/*
|
||||
* Print a SSE register for debug purpose
|
||||
*/
|
||||
|
||||
#ifdef __SSE2__
|
||||
|
||||
static void printreg(VTYPE r)
|
||||
{
|
||||
STYPE a0,a1,a2,a3,a4,a5,a6,a7;
|
||||
#if VMODE
|
||||
STYPE a8,a9,a10,a11,a12,a13,a14,a15;
|
||||
#endif
|
||||
|
||||
a0= EXTRACT_REG(r,0);
|
||||
a1= EXTRACT_REG(r,1);
|
||||
a2= EXTRACT_REG(r,2);
|
||||
a3= EXTRACT_REG(r,3);
|
||||
a4= EXTRACT_REG(r,4);
|
||||
a5= EXTRACT_REG(r,5);
|
||||
a6= EXTRACT_REG(r,6);
|
||||
a7= EXTRACT_REG(r,7);
|
||||
#if VMODE
|
||||
a8= EXTRACT_REG(r,8);
|
||||
a9= EXTRACT_REG(r,9);
|
||||
a10= EXTRACT_REG(r,10);
|
||||
a11= EXTRACT_REG(r,11);
|
||||
a12= EXTRACT_REG(r,12);
|
||||
a13= EXTRACT_REG(r,13);
|
||||
a14= EXTRACT_REG(r,14);
|
||||
a15= EXTRACT_REG(r,15);
|
||||
#endif
|
||||
|
||||
printf( "a00 :-> %7d %7d %7d %7d "
|
||||
" %7d %7d %7d %7d "
|
||||
#if VMODE
|
||||
"%7d %7d %7d %7d "
|
||||
" %7d %7d %7d %7d "
|
||||
#endif
|
||||
"\n"
|
||||
, a0,a1,a2,a3,a4,a5,a6,a7
|
||||
#if VMODE
|
||||
, a8,a9,a10,a11,a12,a13,a14,a15
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
* set position p of a SSE register with the value v
|
||||
*/
|
||||
|
||||
static inline VTYPE insert_reg(VTYPE r, STYPE v, int p)
|
||||
{
|
||||
switch (p) {
|
||||
case 0: return INSERT_REG(r,v,0);
|
||||
case 1: return INSERT_REG(r,v,1);
|
||||
case 2: return INSERT_REG(r,v,2);
|
||||
case 3: return INSERT_REG(r,v,3);
|
||||
case 4: return INSERT_REG(r,v,4);
|
||||
case 5: return INSERT_REG(r,v,5);
|
||||
case 6: return INSERT_REG(r,v,6);
|
||||
case 7: return INSERT_REG(r,v,7);
|
||||
#if VMODE
|
||||
case 8: return INSERT_REG(r,v,8);
|
||||
case 9: return INSERT_REG(r,v,9);
|
||||
case 10: return INSERT_REG(r,v,10);
|
||||
case 11: return INSERT_REG(r,v,11);
|
||||
case 12: return INSERT_REG(r,v,12);
|
||||
case 13: return INSERT_REG(r,v,13);
|
||||
case 14: return INSERT_REG(r,v,14);
|
||||
case 15: return INSERT_REG(r,v,15);
|
||||
#endif
|
||||
}
|
||||
return _MM_SETZERO_SI128();
|
||||
}
|
||||
|
||||
static inline STYPE extract_reg(VTYPE r, int p)
|
||||
{
|
||||
switch (p) {
|
||||
case 0: return EXTRACT_REG(r,0);
|
||||
case 1: return EXTRACT_REG(r,1);
|
||||
case 2: return EXTRACT_REG(r,2);
|
||||
case 3: return EXTRACT_REG(r,3);
|
||||
case 4: return EXTRACT_REG(r,4);
|
||||
case 5: return EXTRACT_REG(r,5);
|
||||
case 6: return EXTRACT_REG(r,6);
|
||||
case 7: return EXTRACT_REG(r,7);
|
||||
#if VMODE
|
||||
case 8: return EXTRACT_REG(r,8);
|
||||
case 9: return EXTRACT_REG(r,9);
|
||||
case 10: return EXTRACT_REG(r,10);
|
||||
case 11: return EXTRACT_REG(r,11);
|
||||
case 12: return EXTRACT_REG(r,12);
|
||||
case 13: return EXTRACT_REG(r,13);
|
||||
case 14: return EXTRACT_REG(r,14);
|
||||
case 15: return EXTRACT_REG(r,15);
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define GET_H_SYMBOLE(s,p) ((p && p < lseq1) ? (s)[(p)-1]:255)
|
||||
#define GET_V_SYMBOLE(s,p) ((p && p < lseq2) ? (s)[(p)-1]:0)
|
||||
|
||||
#define LSHIFT_SCORE(r) { r = _MM_SLLI_SI128((r),sizeof(STYPE)); }
|
||||
#define SET_H_SYMBOLE(r,p,s) { r = insert_reg((r),(STYPE)GET_H_SYMBOLE(seq1,(s)),(p)); }
|
||||
#define PUSH_V_SYMBOLE(r,s) { r = insert_reg(_MM_SLLI_SI128((r),sizeof(STYPE)),(STYPE)GET_V_SYMBOLE(seq2,(s)),0); }
|
||||
#define EQUAL(f1,f2) _MM_AND_SI128(EQUAL_REG((f1),(f2)),SET_CONST(1))
|
||||
|
||||
int FASTLCSSCORE(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath)
|
||||
{
|
||||
int lseq1,lseq2; // length of the both sequences
|
||||
|
||||
int itmp; // tmp variables for swap
|
||||
const char* stmp; //
|
||||
|
||||
int nbands; // Number of bands of width eight in the score matrix
|
||||
int lastband; // width of the last band
|
||||
|
||||
// Register for scanning the score matrix
|
||||
VTYPE minus1;
|
||||
VTYPE minus2;
|
||||
VTYPE current;
|
||||
|
||||
VTYPE left;
|
||||
VTYPE top;
|
||||
VTYPE diag;
|
||||
|
||||
|
||||
VTYPE sminus1;
|
||||
VTYPE sminus2;
|
||||
VTYPE scurrent;
|
||||
|
||||
VTYPE sleft;
|
||||
VTYPE stop;
|
||||
VTYPE sdiag;
|
||||
|
||||
VTYPE way;
|
||||
VTYPE onevect;
|
||||
VTYPE maxvect;
|
||||
|
||||
VTYPE fhseq; // The fragment of the horizontal sequence
|
||||
// to consider for aligment
|
||||
VTYPE fvseq; // The fragment of the horizontal sequence
|
||||
// to consider for aligment
|
||||
VTYPE match;
|
||||
|
||||
int band;
|
||||
int line;
|
||||
int limit;
|
||||
|
||||
int lcs;
|
||||
|
||||
int h;
|
||||
int i;
|
||||
|
||||
column_t *column;
|
||||
|
||||
|
||||
// Made seq1 the longest sequences
|
||||
lseq1=strlen(seq1);
|
||||
lseq2=strlen(seq2);
|
||||
|
||||
if (lseq1 < 10 || lseq2 < 10)
|
||||
return simpleLCS(seq1,seq2,ppcolumn,lpath);
|
||||
|
||||
if (lseq1 < lseq2)
|
||||
{
|
||||
itmp=lseq1;
|
||||
lseq1=lseq2;
|
||||
lseq2=itmp;
|
||||
|
||||
stmp=seq1;
|
||||
seq1=seq2;
|
||||
seq2=stmp;
|
||||
}
|
||||
|
||||
// we add one to both lengths for taking into
|
||||
// account the extra line and column in the score
|
||||
// matrix
|
||||
|
||||
lseq1++;
|
||||
lseq2++;
|
||||
|
||||
// a band sized to the smallest sequence is allocated
|
||||
|
||||
if (ppcolumn)
|
||||
column = *ppcolumn;
|
||||
else
|
||||
column=NULL;
|
||||
|
||||
column = allocateColumn(lseq2,column,VMODE);
|
||||
|
||||
// Check memory allocation
|
||||
if (column == NULL)
|
||||
return -1;
|
||||
|
||||
for (i=0; i<lseq2;i++)
|
||||
{
|
||||
column->data.CMENB[i]=MIN_SCORE;
|
||||
column->score.CMENB[i]=-1;
|
||||
}
|
||||
|
||||
nbands = lseq1 / VSIZE; // You have VSIZE element in one SSE register
|
||||
// Alignment will be realized in nbands
|
||||
|
||||
lastband = lseq1 - (nbands * VSIZE); // plus one of width lastband except if
|
||||
// lastband==0
|
||||
|
||||
if (lastband) nbands++;
|
||||
else lastband=VSIZE;
|
||||
|
||||
lastband--;
|
||||
|
||||
// printf("seq1 : %s seq2 : %s\n",seq1,seq2);
|
||||
|
||||
|
||||
minus2 = SET_CONST(MIN_SCORE);
|
||||
minus1 = _MM_SETZERO_SI128();
|
||||
|
||||
sminus1= _MM_SETZERO_SI128();
|
||||
sminus2= _MM_SETZERO_SI128();
|
||||
onevect= SET_CONST(1);
|
||||
maxvect= SET_CONST(MAX_SCORE);
|
||||
|
||||
h=0;
|
||||
|
||||
fhseq = _MM_SETZERO_SI128();
|
||||
fvseq = _MM_SETZERO_SI128();
|
||||
|
||||
//
|
||||
// Beginning of the first band
|
||||
//
|
||||
|
||||
for (line = 0; line < VSIZE; line++,h++) // avant VSIZE - 1
|
||||
{
|
||||
// printf("line= %4d h= %4d\n",line,h);
|
||||
SET_H_SYMBOLE(fhseq,line,h)
|
||||
PUSH_V_SYMBOLE(fvseq,line)
|
||||
minus2 = insert_reg(minus2,0,h);
|
||||
minus1 = insert_reg(minus1,MIN_SCORE,line); // 0 avant
|
||||
match = EQUAL(fhseq,fvseq);
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
sminus2 = insert_reg(sminus2,line-1,line); // Je ne suis pas certain de l'initialisation
|
||||
sminus1 = insert_reg(sminus1,0,line);
|
||||
}
|
||||
|
||||
// printreg(fvseq);
|
||||
// printreg(fhseq);
|
||||
// printreg(match);
|
||||
// printf("================================\n");
|
||||
|
||||
current = minus1; // The best score is the upper one
|
||||
// It cannot be the best as set to MIN_SCORE
|
||||
|
||||
left = minus1;
|
||||
|
||||
// printf("Vert = "); printreg(current);
|
||||
|
||||
|
||||
LSHIFT_SCORE(minus1) // I shift minus1 so now I'll compare with the left position
|
||||
minus1=insert_reg(minus1,(column)->data.CMENB[line],0);
|
||||
|
||||
top=minus1;
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
sleft=sminus1; // I store the path length corresponding to the upper path
|
||||
LSHIFT_SCORE(sminus1) // I shift to prepare the score coming from the left side
|
||||
sminus1=insert_reg(sminus1,(column)->score.CMENB[line],0);
|
||||
stop=sminus1;
|
||||
sdiag=sminus2;
|
||||
|
||||
}
|
||||
|
||||
// printf("Horz = "); printreg(minus1);
|
||||
|
||||
current = GET_MAX(current,minus1); // Look for the best between upper and left
|
||||
|
||||
// printf("BstHV= "); printreg(current);
|
||||
//
|
||||
// printf("Diag = "); printreg(ADD_REG(minus2,match));
|
||||
|
||||
diag=minus2;
|
||||
|
||||
// minus2 = ; // Minus2 contains the diagonal score, so I add the match reward
|
||||
// Diag score are setup to 0 so this one will win on the first iteration
|
||||
current = GET_MAX(current,ADD_REG(minus2,match));
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
// printf("\n");
|
||||
// printf("current: ");
|
||||
// printreg(current);
|
||||
// printf("current: ");
|
||||
// printreg(SUB_REG(current,match));
|
||||
// printf("diag : ");
|
||||
// printreg(diag);
|
||||
// printf("left : ");
|
||||
// printreg(left);
|
||||
// printf("top : ");
|
||||
// printreg(top);
|
||||
|
||||
|
||||
way = EQUAL_REG(SUB_REG(current,match),diag);
|
||||
scurrent= OR_REG(AND_REG(way,sdiag),
|
||||
ANDNOT_REG(way,maxvect));
|
||||
// printf("sdiag : ");
|
||||
// printreg(scurrent);
|
||||
way = EQUAL_REG(current,left);
|
||||
scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,sleft),
|
||||
ANDNOT_REG(way,maxvect)));
|
||||
|
||||
// printf("sleft : ");
|
||||
// printreg(scurrent);
|
||||
way = EQUAL_REG(current,top);
|
||||
scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,stop),
|
||||
ANDNOT_REG(way,maxvect)));
|
||||
// printf("stop : ");
|
||||
// printreg(scurrent);
|
||||
|
||||
scurrent= ADD_REG(scurrent,onevect);
|
||||
|
||||
sminus2=sminus1;
|
||||
sminus1=scurrent;
|
||||
}
|
||||
// printf("line %d :Best = ",line); printreg(current);
|
||||
//
|
||||
// printf("================================\n");
|
||||
|
||||
minus2=minus1;
|
||||
minus1=current;
|
||||
|
||||
// printf("min2 = "); printreg(minus2);
|
||||
// printf("min1 = "); printreg(minus1);
|
||||
// printf("================================\n");
|
||||
|
||||
// printf("\n");
|
||||
// printf("sdiag : ");
|
||||
// printreg(sminus2);
|
||||
// printf("scur : ");
|
||||
// printreg(scurrent);
|
||||
// printf("current: ");
|
||||
// printreg(current);
|
||||
// printf("%8s\n",seq1);
|
||||
// printf("%8s\n",seq2);
|
||||
// printf("================================\n");
|
||||
|
||||
|
||||
} ///// <<<<<<<<------- Fin du debut de la premiere bande
|
||||
|
||||
|
||||
// printf("================================\n");
|
||||
|
||||
(column)->data.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(current,VSIZE-1);
|
||||
|
||||
|
||||
if (lpath)
|
||||
(column)->score.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(scurrent,VSIZE-1);
|
||||
|
||||
|
||||
|
||||
for (band=0; band < nbands; band++)
|
||||
{
|
||||
// SET_H_SYMBOLE(fhseq,line,h)
|
||||
// minus2 = insert_reg(minus2,0,line);
|
||||
// minus1 = insert_reg(minus1,MIN_SCORE,line); // 0 avant
|
||||
// h++;
|
||||
|
||||
for (; line < lseq2; line++)
|
||||
{
|
||||
// printf("Je tourne avec line= %d \n",line);
|
||||
PUSH_V_SYMBOLE(fvseq,line)
|
||||
|
||||
match = EQUAL(fhseq,fvseq);
|
||||
|
||||
// printreg(fvseq);
|
||||
// printreg(fhseq);
|
||||
// printreg(match);
|
||||
// printf("================================\n");
|
||||
|
||||
current = minus1;
|
||||
|
||||
left = minus1;
|
||||
|
||||
// Store the last current score in extra column
|
||||
(column)->data.CMENB[line-VSIZE]=EXTRACT_REG(current,VSIZE-1);
|
||||
LSHIFT_SCORE(minus1)
|
||||
minus1=insert_reg(minus1,(column)->data.CMENB[line],0);
|
||||
|
||||
top = minus1;
|
||||
|
||||
// printf("Vert = "); printreg(current);
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
sleft= sminus1;
|
||||
(column)->score.CMENB[line-VSIZE]=EXTRACT_REG(scurrent,VSIZE-1);
|
||||
LSHIFT_SCORE(sminus1)
|
||||
sminus1=insert_reg(sminus1,(column)->score.CMENB[line],0);
|
||||
stop=sminus1;
|
||||
sdiag=sminus2;
|
||||
}
|
||||
|
||||
// printf("line = %d --> get = %d\n",line,(column)->data.CMENB[line]);
|
||||
|
||||
// printf("Horz = "); printreg(minus1);
|
||||
|
||||
current = GET_MAX(current,minus1);
|
||||
|
||||
diag=minus2;
|
||||
|
||||
current = GET_MAX(current,ADD_REG(minus2,match));
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
// printf("\n");
|
||||
// printf("current: ");
|
||||
// printreg(current);
|
||||
// printf("current: ");
|
||||
// printreg(SUB_REG(current,match));
|
||||
// printf("diag : ");
|
||||
// printreg(diag);
|
||||
// printf("left : ");
|
||||
// printreg(left);
|
||||
// printf("top : ");
|
||||
// printreg(top);
|
||||
|
||||
way = EQUAL_REG(SUB_REG(current,match),diag);
|
||||
scurrent= OR_REG(AND_REG(way,sdiag),
|
||||
ANDNOT_REG(way,maxvect));
|
||||
|
||||
// printf("sdiag : ");
|
||||
// printreg(scurrent);
|
||||
|
||||
way = EQUAL_REG(current,left);
|
||||
scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,sleft),
|
||||
ANDNOT_REG(way,maxvect)));
|
||||
|
||||
// printf("sleft : ");
|
||||
// printreg(scurrent);
|
||||
|
||||
way = EQUAL_REG(current,top);
|
||||
scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,stop),
|
||||
ANDNOT_REG(way,maxvect)));
|
||||
|
||||
// printf("stop : ");
|
||||
// printreg(scurrent);
|
||||
|
||||
scurrent= ADD_REG(scurrent,onevect);
|
||||
|
||||
sminus2=sminus1;
|
||||
sminus1=scurrent;
|
||||
}
|
||||
|
||||
minus2=minus1;
|
||||
minus1=current;
|
||||
|
||||
// printf("\n");
|
||||
// printf("sdiag : ");
|
||||
// printreg(sminus2);
|
||||
// printf("scur : ");
|
||||
// printreg(scurrent);
|
||||
// printf("current: ");
|
||||
// printreg(current);
|
||||
// printf("%8s\n",seq1);
|
||||
// printf("%8s\n",seq2);
|
||||
}
|
||||
// printf("================================\n");
|
||||
|
||||
// end of the band and beginnig of the next one
|
||||
|
||||
limit=(band==(nbands-1)) ? lastband:VSIZE;
|
||||
|
||||
for (line = 0; line < limit; line++,h++)
|
||||
{
|
||||
// printf("Je fini avec line= %d \n",line);
|
||||
|
||||
SET_H_SYMBOLE(fhseq,line,h)
|
||||
PUSH_V_SYMBOLE(fvseq,line)
|
||||
|
||||
|
||||
minus2 = insert_reg(minus2,MIN_SCORE,line);
|
||||
minus1 = insert_reg(minus1,MIN_SCORE,line);
|
||||
current = minus1;
|
||||
left=minus1;
|
||||
|
||||
match = EQUAL(fhseq,fvseq);
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
sminus2 = insert_reg(sminus2,lseq2-VSIZE+line,line);
|
||||
sminus1 = insert_reg(sminus1,h,line);
|
||||
sleft= sminus1;
|
||||
}
|
||||
|
||||
|
||||
// printf("\n");
|
||||
// printf("fhseq = "); printreg(fhseq);
|
||||
// printf("fvseq = "); printreg(fvseq);
|
||||
// printf("----------------------------------------------------------------\n");
|
||||
// printf("match = "); printreg(match);
|
||||
|
||||
|
||||
(column)->data.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(current,VSIZE-1);
|
||||
LSHIFT_SCORE(minus1)
|
||||
minus1=insert_reg(minus1,(column)->data.CMENB[line],0);
|
||||
top=minus1;
|
||||
|
||||
current = GET_MAX(current,minus1);
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
(column)->score.CMENB[lseq2-VSIZE+line]=EXTRACT_REG(scurrent,VSIZE-1);
|
||||
LSHIFT_SCORE(sminus1)
|
||||
sminus1=insert_reg(sminus1,(column)->score.CMENB[line],0);
|
||||
stop=sminus1;
|
||||
sdiag=sminus2;
|
||||
|
||||
way = EQUAL_REG(current,minus1);
|
||||
|
||||
scurrent= OR_REG(AND_REG(way,sminus1),
|
||||
ANDNOT_REG(way,scurrent));
|
||||
}
|
||||
|
||||
|
||||
diag=minus2;
|
||||
|
||||
current = GET_MAX(current,ADD_REG(minus2,match));
|
||||
|
||||
if (lpath)
|
||||
{
|
||||
way = EQUAL_REG(SUB_REG(current,match),diag);
|
||||
scurrent= OR_REG(AND_REG(way,sdiag),
|
||||
ANDNOT_REG(way,maxvect));
|
||||
|
||||
way = EQUAL_REG(current,left);
|
||||
scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,sleft),
|
||||
ANDNOT_REG(way,maxvect)));
|
||||
|
||||
way = EQUAL_REG(current,top);
|
||||
scurrent= GET_MIN(scurrent,OR_REG(AND_REG(way,stop),
|
||||
ANDNOT_REG(way,maxvect)));
|
||||
|
||||
scurrent= ADD_REG(scurrent,onevect);
|
||||
|
||||
sminus2=sminus1;
|
||||
sminus1=scurrent;
|
||||
}
|
||||
|
||||
// printf("currt = "); printreg(current);
|
||||
|
||||
minus2=minus1;
|
||||
minus1=current;
|
||||
|
||||
// printf("\n");
|
||||
// printf("sdiag : ");
|
||||
// printreg(sminus2);
|
||||
// printf("scur : ");
|
||||
// printreg(scurrent);
|
||||
// printf("current: ");
|
||||
// printreg(current);
|
||||
// printf("%8s\n",seq1);
|
||||
// printf("%8s\n",seq2);
|
||||
|
||||
// printf("Je stocke line= %d la valeur %d\n",lseq2-VSIZE+line,(column)->data.CMENB[lseq2-VSIZE+line]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// printf("\n");
|
||||
// printf("line = %d, h= %d, lastband = %d\n",line,h,lastband);
|
||||
// printf("currt = "); printreg(current);
|
||||
lcs = extract_reg(current,lastband);
|
||||
|
||||
if(lpath)
|
||||
*lpath= extract_reg(scurrent,lastband);
|
||||
// printf("lastband = %d (%d) lcs = %d\n",lastband,lseq2,lcs);
|
||||
|
||||
if (ppcolumn)
|
||||
*ppcolumn=column;
|
||||
else
|
||||
freeColumn(column);
|
||||
|
||||
return lcs;
|
||||
}
|
||||
|
||||
#else
|
||||
int FASTLCSSCORE(const char* seq1, const char* seq2,column_pp ppcolumn,int32_t* lpath)
|
||||
{
|
||||
return simpleLCS(seq1,seq2,ppcolumn,lpath);
|
||||
}
|
||||
|
||||
#endif /* __SSE2__ */
|
||||
|
@ -0,0 +1,211 @@
|
||||
/*
|
||||
* banded_LCS_alignment.c
|
||||
*
|
||||
* Created on: 7 nov. 2012
|
||||
* Author: merciece
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include "../libutils/utilities.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
int score;
|
||||
int l_path;
|
||||
}infos;
|
||||
|
||||
|
||||
int calculateScore(char nuc1, char nuc2)
|
||||
{
|
||||
return(nuc1 == nuc2);
|
||||
}
|
||||
|
||||
infos** banded_align(char *seq1, char *seq2, int l1, int l2, int bandLengthRight, int bandLengthLeft)
|
||||
{
|
||||
int i, j;
|
||||
//int c;
|
||||
//double id;
|
||||
int start, end;
|
||||
int diag_score, delete, insert, mismatch;
|
||||
int l_path, l_path_i, l_path_d;
|
||||
int bestScore;
|
||||
int mismatch_margin;
|
||||
int stop;
|
||||
int diag_index;
|
||||
infos **matrix;
|
||||
|
||||
l1++;
|
||||
l2++;
|
||||
mismatch_margin = bandLengthLeft; // the biggest one
|
||||
diag_index = l1-l2; // diagonal index
|
||||
stop=0;
|
||||
|
||||
//fprintf(stderr,"\nseq1 = %s, seq2=%s, bandLengthR = %d, bandLengthL = %d", seq1, seq2, bandLengthRight, bandLengthLeft);
|
||||
|
||||
// Matrix initialization~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
matrix = (infos**) malloc(l1 * sizeof(infos*));
|
||||
for (i = 0; i < l1; i++)
|
||||
matrix[i] = (infos*) malloc(l2 * sizeof(infos));
|
||||
|
||||
for (i = 0; i < l1; i++)
|
||||
for (j = 0; j < l2; j++)
|
||||
{
|
||||
matrix[i][j].score = 0;
|
||||
matrix[i][j].l_path = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < l1; i++)
|
||||
matrix[i][0].l_path = i;
|
||||
|
||||
for (j = 0; j < l2; j++)
|
||||
matrix[0][j].l_path = j;
|
||||
|
||||
// Matrix initialized~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
for (i = 1; i < l1; i++)
|
||||
{
|
||||
start = i - bandLengthLeft;
|
||||
if (start < 1)
|
||||
start = 1;
|
||||
end = i+bandLengthRight+1;
|
||||
if (end > l2)
|
||||
end = l2;
|
||||
|
||||
for (j = start; j < end; j++)
|
||||
{
|
||||
delete = matrix[i-1][j].score;
|
||||
l_path_d = matrix[i-1][j].l_path + 1;
|
||||
insert = matrix[i][j-1].score;
|
||||
l_path_i = matrix[i][j-1].l_path + 1;
|
||||
mismatch = 0;
|
||||
|
||||
diag_score = calculateScore(seq1[i-1], seq2[j-1]);
|
||||
bestScore = matrix[i-1][j-1].score + diag_score;
|
||||
l_path = matrix[i-1][j-1].l_path + 1;
|
||||
if (diag_score == 0) // mismatch
|
||||
mismatch = 1;
|
||||
|
||||
if ((insert > bestScore) || ((insert == bestScore) && (l_path_i < l_path)))
|
||||
{
|
||||
bestScore = matrix[i][j-1].score;
|
||||
l_path = l_path_i;
|
||||
mismatch = 0;
|
||||
}
|
||||
|
||||
if ((delete > bestScore) || ((delete == bestScore) && (l_path_d < l_path)))
|
||||
{
|
||||
bestScore = delete;
|
||||
l_path = l_path_d;
|
||||
mismatch = 0;
|
||||
}
|
||||
|
||||
/*if (((i-j) - diag_index == 0) && (mismatch == 1))
|
||||
{
|
||||
//fprintf(stderr, "\nR = %d, L = %d\n", bandLengthRight, bandLengthLeft);
|
||||
if (bandLengthRight+bandLengthLeft == 0)
|
||||
{
|
||||
stop = 1;
|
||||
//fprintf(stderr, "\nBREAKING LOOPS\n");
|
||||
break;
|
||||
}
|
||||
if (bandLengthRight != 0)
|
||||
bandLengthRight = bandLengthRight - 1;
|
||||
if (bandLengthLeft != 0)
|
||||
bandLengthLeft = bandLengthLeft - 1;
|
||||
}*/
|
||||
|
||||
(matrix[i][j]).score = bestScore;
|
||||
(matrix[i][j]).l_path = l_path;
|
||||
}
|
||||
|
||||
//if ((bandLengthRight + bandLengthLeft == 0) && ((matrix[i][j].l_path - matrix[i][j].score) > mismatch_margin))
|
||||
if (stop==1)
|
||||
break;
|
||||
}
|
||||
return(matrix);
|
||||
}
|
||||
|
||||
|
||||
void calculateBandLength(int l1, int l2, double threshold, int* bandLengthRight, int* bandLengthLeft)
|
||||
{
|
||||
(*bandLengthLeft) = round(-l1 * threshold + l1);
|
||||
(*bandLengthRight) = round(-l1 * threshold + l2);
|
||||
|
||||
// fprintf(stderr,"\nR=%d, L=%d", (*bandLengthRight), (*bandLengthLeft));
|
||||
}
|
||||
|
||||
|
||||
double calculateId(infos** matrix, int len1, int len2)
|
||||
{
|
||||
double id;
|
||||
int l_ali;
|
||||
int l_lcs;
|
||||
|
||||
l_lcs = matrix[len1][len2].score;
|
||||
l_ali = matrix[len1][len2].l_path;
|
||||
|
||||
if (l_lcs == 0)
|
||||
id = 0.0;
|
||||
else
|
||||
id = (double) l_lcs / (double) l_ali;
|
||||
|
||||
//fprintf(stderr, "\n%d, %d\n", l_lcs, l_ali);
|
||||
return(id);
|
||||
}
|
||||
|
||||
|
||||
double banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, double threshold, BOOL n, int ref, BOOL lcsmode, int16_t* address)
|
||||
{
|
||||
double id;
|
||||
int bandLengthRight, bandLengthLeft;
|
||||
int i,j;
|
||||
|
||||
char* s1;
|
||||
char* s2;
|
||||
|
||||
s1 = (char*) malloc(l1*sizeof(char)+1);
|
||||
s2 = (char*) malloc(l2*sizeof(char)+1);
|
||||
|
||||
for (i=l1-1, j=0; i>=0, j<l1; i--, j++)
|
||||
*(s1+i) = (char) *(seq1+j);
|
||||
|
||||
for (i=0; i<l2; i++)
|
||||
*(s2+i) = (char) *(seq2+i);
|
||||
|
||||
*(s1+l1) = 0;
|
||||
*(s2+l2) = 0;
|
||||
|
||||
//fprintf(stderr, "\nl1=%d, %s\nl2=%d, %s\n", l1, s1, l2, s2);
|
||||
|
||||
infos** matrix;
|
||||
|
||||
calculateBandLength(l1, l2, threshold, &bandLengthRight, &bandLengthLeft);
|
||||
|
||||
matrix = banded_align(s1, s2, l1, l2, bandLengthRight, bandLengthLeft);
|
||||
|
||||
/*fprintf(stderr, "\n");
|
||||
for (i = 0; i <= l1; i++)
|
||||
{
|
||||
fprintf(stderr, "\n");
|
||||
for (j = 0; j <= l2; j++)
|
||||
fprintf(stderr, "%d/%d\t", matrix[i][j].score, matrix[i][j].l_path); //matrix[i][j].stop);
|
||||
}
|
||||
fprintf(stderr, "\n");*/
|
||||
|
||||
id = calculateId(matrix, l1, l2);
|
||||
|
||||
for (i = 0; i <= l1; i++)
|
||||
free(matrix[i]);
|
||||
|
||||
free(matrix);
|
||||
|
||||
free(s1);
|
||||
free(s2);
|
||||
|
||||
//fprintf(stderr, "\nscore = %lf\n", id);
|
||||
|
||||
return(id);
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
* banded_LCS_alignment.h
|
||||
*
|
||||
* Created on: november 8, 2012
|
||||
* Author: mercier
|
||||
*/
|
||||
|
||||
|
||||
double banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, double threshold, BOOL n, int ref, BOOL lcsmode, int16_t* address);
|
@ -0,0 +1,724 @@
|
||||
/*
|
||||
* sse_banded_LCS_alignment.c
|
||||
*
|
||||
* Created on: 7 nov. 2012
|
||||
* Author: celine mercier
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include "../libutils/utilities.h"
|
||||
#include "../libsse/_sse.h"
|
||||
|
||||
|
||||
|
||||
/*static void printreg(__m128i r)
|
||||
{
|
||||
int16_t a0,a1,a2,a3,a4,a5,a6,a7;
|
||||
|
||||
a0= _MM_EXTRACT_EPI16(r,0);
|
||||
a1= _MM_EXTRACT_EPI16(r,1);
|
||||
a2= _MM_EXTRACT_EPI16(r,2);
|
||||
a3= _MM_EXTRACT_EPI16(r,3);
|
||||
a4= _MM_EXTRACT_EPI16(r,4);
|
||||
a5= _MM_EXTRACT_EPI16(r,5);
|
||||
a6= _MM_EXTRACT_EPI16(r,6);
|
||||
a7= _MM_EXTRACT_EPI16(r,7);
|
||||
|
||||
fprintf(stderr, "a00 :-> %7d %7d %7d %7d "
|
||||
" %7d %7d %7d %7d "
|
||||
"\n"
|
||||
, a0,a1,a2,a3,a4,a5,a6,a7
|
||||
);
|
||||
}
|
||||
*/
|
||||
|
||||
static inline int extract_reg(__m128i r, int p)
|
||||
{
|
||||
switch (p) {
|
||||
case 0: return(_MM_EXTRACT_EPI16(r,0));
|
||||
case 1: return(_MM_EXTRACT_EPI16(r,1));
|
||||
case 2: return(_MM_EXTRACT_EPI16(r,2));
|
||||
case 3: return(_MM_EXTRACT_EPI16(r,3));
|
||||
case 4: return(_MM_EXTRACT_EPI16(r,4));
|
||||
case 5: return(_MM_EXTRACT_EPI16(r,5));
|
||||
case 6: return(_MM_EXTRACT_EPI16(r,6));
|
||||
case 7: return(_MM_EXTRACT_EPI16(r,7));
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
void sse_banded_align_lcs_and_ali_len(int16_t* seq1, int16_t* seq2, int l1, int l2, int bandLengthLeft, int bandLengthTotal, int16_t* address, double* lcs_length, int* ali_length)
|
||||
{
|
||||
register int j;
|
||||
int k1, k2;
|
||||
int max, diff;
|
||||
int l_reg, l_loc;
|
||||
int line;
|
||||
int numberOfRegistersPerLine;
|
||||
int numberOfRegistersFor3Lines;
|
||||
|
||||
BOOL even_line;
|
||||
BOOL odd_line;
|
||||
BOOL even_BLL;
|
||||
BOOL odd_BLL;
|
||||
|
||||
um128* SSEregisters;
|
||||
um128* p_diag;
|
||||
um128* p_gap1;
|
||||
um128* p_gap2;
|
||||
um128* p_diag_j;
|
||||
um128* p_gap1_j;
|
||||
um128* p_gap2_j;
|
||||
um128 current;
|
||||
|
||||
um128* l_ali_SSEregisters;
|
||||
um128* p_l_ali_diag;
|
||||
um128* p_l_ali_gap1;
|
||||
um128* p_l_ali_gap2;
|
||||
um128* p_l_ali_diag_j;
|
||||
um128* p_l_ali_gap1_j;
|
||||
um128* p_l_ali_gap2_j;
|
||||
um128 l_ali_current;
|
||||
|
||||
um128 nucs1;
|
||||
um128 nucs2;
|
||||
um128 scores;
|
||||
|
||||
um128 boolean_reg;
|
||||
|
||||
// Initialisations
|
||||
|
||||
odd_BLL = bandLengthLeft & 1;
|
||||
even_BLL = !odd_BLL;
|
||||
|
||||
max = INT16_MAX - l1;
|
||||
|
||||
numberOfRegistersPerLine = bandLengthTotal / 8;
|
||||
numberOfRegistersFor3Lines = 3 * numberOfRegistersPerLine;
|
||||
|
||||
SSEregisters = (um128*) calloc(numberOfRegistersFor3Lines * 2, sizeof(um128));
|
||||
l_ali_SSEregisters = SSEregisters + numberOfRegistersFor3Lines;
|
||||
|
||||
// preparer registres SSE
|
||||
|
||||
for (j=0; j<numberOfRegistersFor3Lines; j++)
|
||||
l_ali_SSEregisters[j].i = _MM_LOAD_SI128(address+j*8);
|
||||
|
||||
p_diag = SSEregisters;
|
||||
p_gap1 = SSEregisters+numberOfRegistersPerLine;
|
||||
p_gap2 = SSEregisters+2*numberOfRegistersPerLine;
|
||||
|
||||
p_l_ali_diag = l_ali_SSEregisters;
|
||||
p_l_ali_gap1 = l_ali_SSEregisters+numberOfRegistersPerLine;
|
||||
p_l_ali_gap2 = l_ali_SSEregisters+2*numberOfRegistersPerLine;
|
||||
|
||||
// Loop on diagonals = 'lines' :
|
||||
for (line=2; line <= l1+l2; line++)
|
||||
{
|
||||
odd_line = line & 1;
|
||||
even_line = !odd_line;
|
||||
|
||||
// loop on the registers of a line :
|
||||
for (j=0; j < numberOfRegistersPerLine; j++)
|
||||
{
|
||||
p_diag_j = p_diag+j;
|
||||
p_gap1_j = p_gap1+j;
|
||||
p_gap2_j = p_gap2+j;
|
||||
p_l_ali_diag_j = p_l_ali_diag+j;
|
||||
p_l_ali_gap1_j = p_l_ali_gap1+j;
|
||||
p_l_ali_gap2_j = p_l_ali_gap2+j;
|
||||
|
||||
// comparing nucleotides for diagonal scores :
|
||||
|
||||
// k1 = position of the 1st nucleotide to align for seq1 and k2 = position of the 1st nucleotide to align for seq2
|
||||
if (odd_line && odd_BLL)
|
||||
k1 = (line / 2) + ((bandLengthLeft+1) / 2) - j*8;
|
||||
else
|
||||
k1 = (line / 2) + (bandLengthLeft/2) - j*8;
|
||||
|
||||
k2 = line - k1 - 1;
|
||||
|
||||
nucs1.i = _MM_LOADU_SI128(seq1+l1-k1);
|
||||
nucs2.i = _MM_LOADU_SI128(seq2+k2);
|
||||
|
||||
/* fprintf(stderr, "\nnucs, r %d, k1 = %d, k2 = %d\n", j, k1, k2);
|
||||
printreg(nucs1.i);
|
||||
printreg(nucs2.i);
|
||||
*/
|
||||
|
||||
// computing diagonal score :
|
||||
scores.i = _MM_AND_SI128(_MM_CMPEQ_EPI16(nucs1.i, nucs2.i), _MM_SET1_EPI16(1));
|
||||
current.i = _MM_ADDS_EPU16(p_diag_j->i, scores.i);
|
||||
|
||||
// Computing alignment length
|
||||
|
||||
l_ali_current.i = p_l_ali_diag_j->i;
|
||||
boolean_reg.i = _MM_CMPGT_EPI16(p_gap1_j->i, current.i);
|
||||
l_ali_current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_l_ali_gap1_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i));
|
||||
current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_gap1_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, current.i));
|
||||
boolean_reg.i = _MM_AND_SI128(
|
||||
_MM_CMPEQ_EPI16(p_gap1_j->i, current.i),
|
||||
_MM_CMPLT_EPI16(p_l_ali_gap1_j->i, l_ali_current.i));
|
||||
l_ali_current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_l_ali_gap1_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i));
|
||||
current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_gap1_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, current.i));
|
||||
boolean_reg.i = _MM_CMPGT_EPI16(p_gap2_j->i, current.i);
|
||||
l_ali_current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_l_ali_gap2_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i));
|
||||
current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_gap2_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, current.i));
|
||||
boolean_reg.i = _MM_AND_SI128(
|
||||
_MM_CMPEQ_EPI16(p_gap2_j->i, current.i),
|
||||
_MM_CMPLT_EPI16(p_l_ali_gap2_j->i, l_ali_current.i));
|
||||
l_ali_current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_l_ali_gap2_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, l_ali_current.i));
|
||||
current.i = _MM_OR_SI128(
|
||||
_MM_AND_SI128(p_gap2_j->i, boolean_reg.i),
|
||||
_MM_ANDNOT_SI128(boolean_reg.i, current.i));
|
||||
|
||||
|
||||
/* fprintf(stderr, "\nline = %d", line);
|
||||
fprintf(stderr, "\nDiag, r %d : ", j);
|
||||
printreg((*(p_diag_j)).i);
|
||||
fprintf(stderr, "Gap1 : ");
|
||||
printreg((*(p_gap1_j)).i);
|
||||
fprintf(stderr, "Gap2 : ");
|
||||
printreg((*(p_gap2_j)).i);
|
||||
fprintf(stderr, "current : ");
|
||||
printreg(current.i);
|
||||
fprintf(stderr, "L ALI\nDiag r %d : ", j);
|
||||
printreg((*(p_l_ali_diag_j)).i);
|
||||
fprintf(stderr, "Gap1 : ");
|
||||
printreg((*(p_l_ali_gap1_j)).i);
|
||||
fprintf(stderr, "Gap2 : ");
|
||||
printreg((*(p_l_ali_gap2_j)).i);
|
||||
fprintf(stderr, "current : ");
|
||||
printreg(l_ali_current.i);
|
||||
*/
|
||||
|
||||
// diag = gap1 and gap1 = current
|
||||
p_diag_j->i = p_gap1_j->i;
|
||||
p_gap1_j->i = current.i;
|
||||
|
||||
// l_ali_diag = l_ali_gap1 and l_ali_gap1 = l_ali_current+1
|
||||
p_l_ali_diag_j->i = p_l_ali_gap1_j->i;
|
||||
p_l_ali_gap1_j->i = _MM_ADD_EPI16(l_ali_current.i, _MM_SET1_EPI16(1));
|
||||
}
|
||||
|
||||
// shifts for gap2, to do only once all the registers of a line have been computed Copier gap2 puis le charger depuis la copie?
|
||||
|
||||
for (j=0; j < numberOfRegistersPerLine; j++)
|
||||
{
|
||||
if ((odd_line && even_BLL) || (even_line && odd_BLL))
|
||||
{
|
||||
p_gap2[j].i = _MM_LOADU_SI128((p_gap1[j].s16)-1);
|
||||
p_l_ali_gap2[j].i = _MM_LOADU_SI128((p_l_ali_gap1[j].s16)-1);
|
||||
if (j == 0)
|
||||
{
|
||||
p_gap2[j].i = _MM_INSERT_EPI16(p_gap2[j].i, 0, 0);
|
||||
p_l_ali_gap2[j].i = _MM_INSERT_EPI16(p_l_ali_gap2[j].i, max, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
p_gap2[j].i = _MM_LOADU_SI128(p_gap1[j].s16+1);
|
||||
p_l_ali_gap2[j].i = _MM_LOADU_SI128(p_l_ali_gap1[j].s16+1);
|
||||
if (j == numberOfRegistersPerLine - 1)
|
||||
{
|
||||
p_gap2[j].i = _MM_INSERT_EPI16(p_gap2[j].i, 0, 7);
|
||||
p_l_ali_gap2[j].i = _MM_INSERT_EPI16(p_l_ali_gap2[j].i, max, 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
// end shifts for gap2
|
||||
|
||||
}
|
||||
|
||||
/* /// Recovering LCS and alignment lengths \\\ */
|
||||
|
||||
// finding the location of the results in the registers :
|
||||
diff = l1-l2;
|
||||
if ((diff & 1) && odd_BLL)
|
||||
l_loc = (int) floor((double)(bandLengthLeft) / (double)2) - floor((double)(diff) / (double)2);
|
||||
else
|
||||
l_loc = (int) floor((double)(bandLengthLeft) / (double)2) - ceil((double)(diff) / (double)2);
|
||||
|
||||
l_reg = (int)floor((double)l_loc/(double)8.0);
|
||||
//fprintf(stderr, "\nl_reg = %d, l_loc = %d\n", l_reg, l_loc);
|
||||
l_loc = l_loc - l_reg*8;
|
||||
|
||||
// extracting the results from the registers :
|
||||
*lcs_length = extract_reg(p_gap1[l_reg].i, l_loc);
|
||||
*ali_length = extract_reg(p_l_ali_gap1[l_reg].i, l_loc) - 1;
|
||||
|
||||
// freeing the registers
|
||||
free(SSEregisters);
|
||||
}
|
||||
|
||||
|
||||
double sse_banded_align_just_lcs(int16_t* seq1, int16_t* seq2, int l1, int l2, int bandLengthLeft, int bandLengthTotal)
|
||||
{
|
||||
register int j;
|
||||
int k1, k2;
|
||||
int diff;
|
||||
int l_reg, l_loc;
|
||||
int16_t l_lcs;
|
||||
int line;
|
||||
int numberOfRegistersPerLine;
|
||||
int numberOfRegistersFor3Lines;
|
||||
|
||||
BOOL even_line;
|
||||
BOOL odd_line;
|
||||
BOOL even_BLL;
|
||||
BOOL odd_BLL;
|
||||
|
||||
um128* SSEregisters;
|
||||
um128* p_diag;
|
||||
um128* p_gap1;
|
||||
um128* p_gap2;
|
||||
um128* p_diag_j;
|
||||
um128* p_gap1_j;
|
||||
um128* p_gap2_j;
|
||||
um128 current;
|
||||
|
||||
um128 nucs1;
|
||||
um128 nucs2;
|
||||
um128 scores;
|
||||
|
||||
// Initialisations
|
||||
|
||||
odd_BLL = bandLengthLeft & 1;
|
||||
even_BLL = !odd_BLL;
|
||||
|
||||
numberOfRegistersPerLine = bandLengthTotal / 8;
|
||||
numberOfRegistersFor3Lines = 3 * numberOfRegistersPerLine;
|
||||
|
||||
SSEregisters = malloc(numberOfRegistersFor3Lines * sizeof(um128));
|
||||
|
||||
// preparer registres SSE
|
||||
|
||||
for (j=0; j<numberOfRegistersFor3Lines; j++)
|
||||
(*(SSEregisters+j)).i = _MM_SETZERO_SI128();
|
||||
|
||||
p_diag = SSEregisters;
|
||||
p_gap1 = SSEregisters+numberOfRegistersPerLine;
|
||||
p_gap2 = SSEregisters+2*numberOfRegistersPerLine;
|
||||
|
||||
// Loop on diagonals = 'lines' :
|
||||
for (line=2; line <= l1+l2; line++)
|
||||
{
|
||||
odd_line = line & 1;
|
||||
even_line = !odd_line;
|
||||
|
||||
// loop on the registers of a line :
|
||||
for (j=0; j < numberOfRegistersPerLine; j++)
|
||||
{
|
||||
p_diag_j = p_diag+j;
|
||||
p_gap1_j = p_gap1+j;
|
||||
p_gap2_j = p_gap2+j;
|
||||
|
||||
// comparing nucleotides for diagonal scores :
|
||||
|
||||
// k1 = position of the 1st nucleotide to align for seq1 and k2 = position of the 1st nucleotide to align for seq2
|
||||
if (odd_line && odd_BLL)
|
||||
k1 = (line / 2) + ((bandLengthLeft+1) / 2) - j*8;
|
||||
else
|
||||
k1 = (line / 2) + (bandLengthLeft/2) - j*8;
|
||||
|
||||
k2 = line - k1 - 1;
|
||||
|
||||
nucs1.i = _MM_LOADU_SI128(seq1+l1-k1);
|
||||
nucs2.i = _MM_LOADU_SI128(seq2+k2);
|
||||
|
||||
// computing diagonal score :
|
||||
scores.i = _MM_AND_SI128(_MM_CMPEQ_EPI16(nucs1.i, nucs2.i), _MM_SET1_EPI16(1));
|
||||
current.i = _MM_ADDS_EPU16((*(p_diag_j)).i, scores.i);
|
||||
|
||||
// current = max(gap1, current)
|
||||
current.i = _MM_MAX_EPI16((*(p_gap1_j)).i, current.i);
|
||||
|
||||
// current = max(gap2, current)
|
||||
current.i = _MM_MAX_EPI16((*(p_gap2_j)).i, current.i);
|
||||
|
||||
// diag = gap1 and gap1 = current
|
||||
(*(p_diag_j)).i = (*(p_gap1_j)).i;
|
||||
(*(p_gap1_j)).i = current.i;
|
||||
}
|
||||
|
||||
// shifts for gap2, to do only once all the registers of a line have been computed
|
||||
|
||||
for (j=0; j < numberOfRegistersPerLine; j++)
|
||||
{
|
||||
if ((odd_line && even_BLL) || (even_line && odd_BLL))
|
||||
{
|
||||
(*(p_gap2+j)).i = _MM_LOADU_SI128(((*(p_gap1+j)).s16)-1);
|
||||
if (j == 0)
|
||||
{
|
||||
(*(p_gap2+j)).i = _MM_INSERT_EPI16((*(p_gap2+j)).i, 0, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
(*(p_gap2+j)).i = _MM_LOADU_SI128(((*(p_gap1+j)).s16)+1);
|
||||
if (j == numberOfRegistersPerLine - 1)
|
||||
{
|
||||
(*(p_gap2+j)).i = _MM_INSERT_EPI16((*(p_gap2+j)).i, 0, 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
// end shifts for gap2
|
||||
|
||||
}
|
||||
|
||||
/* /// Recovering LCS and alignment lengths \\\ */
|
||||
|
||||
// finding the location of the results in the registers :
|
||||
diff = l1-l2;
|
||||
if ((diff & 1) && odd_BLL)
|
||||
l_loc = (int) floor((double)(bandLengthLeft) / (double)2) - floor((double)(diff) / (double)2);
|
||||
else
|
||||
l_loc = (int) floor((double)(bandLengthLeft) / (double)2) - ceil((double)(diff) / (double)2);
|
||||
|
||||
l_reg = (int)floor((double)l_loc/(double)8.0);
|
||||
//fprintf(stderr, "\nl_reg = %d, l_loc = %d\n", l_reg, l_loc);
|
||||
l_loc = l_loc - l_reg*8;
|
||||
|
||||
// extracting LCS from the registers :
|
||||
l_lcs = extract_reg((*(p_gap1+l_reg)).i, l_loc);
|
||||
|
||||
// freeing the registers
|
||||
free(SSEregisters);
|
||||
|
||||
return((double) l_lcs);
|
||||
}
|
||||
|
||||
|
||||
inline void calculateBandLengths(int l1, int l2, int* bandLengthRight, int* bandLengthLeft, int LCSmin)
|
||||
{
|
||||
(*bandLengthLeft) = l1 - LCSmin;
|
||||
(*bandLengthRight) = l2 - LCSmin;
|
||||
}
|
||||
|
||||
|
||||
int calculateLCSmin(int l1, int l2, double threshold, BOOL normalize, int reference, BOOL lcsmode)
|
||||
{
|
||||
int LCSmin;
|
||||
|
||||
if (threshold > 0)
|
||||
{
|
||||
if (normalize)
|
||||
{
|
||||
if (reference == MINLEN)
|
||||
LCSmin = threshold*l2;
|
||||
else // ref = maxlen or alilen
|
||||
LCSmin = threshold*l1;
|
||||
}
|
||||
else if (lcsmode)
|
||||
LCSmin = threshold;
|
||||
else if ((reference == MINLEN)) // not lcsmode
|
||||
LCSmin = l2 - threshold;
|
||||
else // not lcsmode and ref = maxlen or alilen
|
||||
LCSmin = l1 - threshold;
|
||||
}
|
||||
else
|
||||
LCSmin = 0;
|
||||
|
||||
return(LCSmin);
|
||||
}
|
||||
|
||||
|
||||
int calculateSSEBandLength(int bandLengthRight, int bandLengthLeft)
|
||||
{
|
||||
// *bandLengthTotal= (double) floor(bandLengthRight + bandLengthLeft) / 2.0 + 1;
|
||||
int bandLengthTotal= (double)(bandLengthRight + bandLengthLeft) / 2.0 + 1.0;
|
||||
|
||||
return (bandLengthTotal & (~ (int)7)) + (( bandLengthTotal & (int)7) ? 8:0); // Calcule le multiple de 8 superieur
|
||||
}
|
||||
|
||||
|
||||
int calculateSizeToAllocate(int maxLen, int minLen, int LCSmin)
|
||||
{
|
||||
int size;
|
||||
int notUsed;
|
||||
|
||||
calculateBandLengths(maxLen, minLen, ¬Used, &size, LCSmin); // max size = max left band length * 2
|
||||
|
||||
//fprintf(stderr, "\nsize for address before %8 = %d", size);
|
||||
|
||||
size*= 2;
|
||||
size = (size & (~ (int)7)) + (( size & (int)7) ? 8:0); // Calcule le multiple de 8 superieur
|
||||
size*= 3;
|
||||
size+= 16;
|
||||
|
||||
//fprintf(stderr, "\nsize for address = %d", size);
|
||||
|
||||
return(size*sizeof(int16_t));
|
||||
}
|
||||
|
||||
|
||||
void iniSeq(int16_t* seq, int size, int16_t iniValue)
|
||||
{
|
||||
int16_t *target=seq;
|
||||
int16_t *end = target + (size_t)size;
|
||||
|
||||
for (; target < end; target++)
|
||||
*target = iniValue;
|
||||
}
|
||||
|
||||
|
||||
void putSeqInSeq(int16_t* seq, char* s, int l, BOOL reverse)
|
||||
{
|
||||
int16_t *target=seq;
|
||||
int16_t *end = target + (size_t)l;
|
||||
char *source=s;
|
||||
|
||||
if (reverse)
|
||||
for (source=s + (size_t)l-1; target < end; target++, source--)
|
||||
*target=*source;
|
||||
else
|
||||
for (; target < end; source++,target++)
|
||||
*target=*source;
|
||||
}
|
||||
|
||||
|
||||
void initializeAddressWithGaps(int16_t* address, int bandLengthTotal, int bandLengthLeft, int l1)
|
||||
{
|
||||
int i;
|
||||
int address_00, x_address_10, address_01, address_01_shifted;
|
||||
int numberOfRegistersPerLine;
|
||||
int bm;
|
||||
int value=INT16_MAX-l1;
|
||||
|
||||
numberOfRegistersPerLine = bandLengthTotal / 8;
|
||||
bm = bandLengthLeft%2;
|
||||
|
||||
for (i=0; i < (3*numberOfRegistersPerLine*8); i++)
|
||||
address[i] = value;
|
||||
|
||||
// 0,0 set to 1 and 0,1 and 1,0 set to 2
|
||||
|
||||
address_00 = bandLengthLeft / 2;
|
||||
|
||||
x_address_10 = address_00 + bm - 1;
|
||||
address_01 = numberOfRegistersPerLine*8 + x_address_10;
|
||||
|
||||
address_01_shifted = numberOfRegistersPerLine*16 + address_00 - bm;
|
||||
|
||||
// fill address_00, address_01,+1, address_01_shifted,+1
|
||||
|
||||
address[address_00] = 1;
|
||||
address[address_01] = 2;
|
||||
address[address_01+1] = 2;
|
||||
address[address_01_shifted] = 2;
|
||||
address[address_01_shifted+1] = 2;
|
||||
}
|
||||
|
||||
|
||||
double sse_banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, BOOL normalize, int reference, BOOL lcsmode, int16_t* address, int LCSmin)
|
||||
{
|
||||
double id;
|
||||
int bandLengthRight, bandLengthLeft, bandLengthTotal;
|
||||
int ali_length;
|
||||
|
||||
//fprintf(stderr, "\nl1 = %d, l2 = %d\n", l1, l2);
|
||||
|
||||
calculateBandLengths(l1, l2, &bandLengthRight, &bandLengthLeft, LCSmin);
|
||||
|
||||
//fprintf(stderr, "\nBLL = %d, BLR = %d, LCSmin = %d\n", bandLengthLeft, bandLengthRight, LCSmin);
|
||||
|
||||
bandLengthTotal = calculateSSEBandLength(bandLengthRight, bandLengthLeft);
|
||||
|
||||
//fprintf(stderr, "\nBLT = %d\n", bandLengthTotal);
|
||||
|
||||
if ((reference == ALILEN) && (normalize || !lcsmode))
|
||||
{
|
||||
initializeAddressWithGaps(address, bandLengthTotal, bandLengthLeft, l1);
|
||||
sse_banded_align_lcs_and_ali_len(seq1, seq2, l1, l2, bandLengthLeft, bandLengthTotal, address, &id, &ali_length);
|
||||
}
|
||||
else
|
||||
id = sse_banded_align_just_lcs(seq1, seq2, l1, l2, bandLengthLeft, bandLengthTotal);
|
||||
|
||||
//fprintf(stderr, "\nid before normalizations = %f", id);
|
||||
|
||||
//fprintf(stderr, "\nlcs = %f, ali = %d\n", id, ali_length);
|
||||
|
||||
if (!lcsmode && !normalize)
|
||||
switch(reference) {
|
||||
case ALILEN: id = ali_length - id;
|
||||
break;
|
||||
case MAXLEN: id = l1 - id;
|
||||
break;
|
||||
case MINLEN: id = l2 - id;
|
||||
}
|
||||
|
||||
//fprintf(stderr, "\n2>>> %f, %d\n", id, ali_length);
|
||||
if (normalize)
|
||||
switch(reference) {
|
||||
case ALILEN: id = id / (double) ali_length;
|
||||
break;
|
||||
case MAXLEN: id = id / (double) l1;
|
||||
break;
|
||||
case MINLEN: id = id / (double) l2;
|
||||
}
|
||||
|
||||
//fprintf(stderr, "\nid = %f\n", id);
|
||||
return(id);
|
||||
}
|
||||
|
||||
|
||||
double generic_sse_banded_lcs_align(char* seq1, char* seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, int16_t** address, int* buffer_size, int16_t** iseq1,
|
||||
int16_t** iseq2, int* buffer_sizeS)
|
||||
{
|
||||
double id;
|
||||
int l1;
|
||||
int l2;
|
||||
int lmax, lmin;
|
||||
int sizeToAllocateForBand;
|
||||
int maxBLL, notUsed;
|
||||
int sizeToAllocateForSeqs;
|
||||
int LCSmin;
|
||||
|
||||
l1 = strlen(seq1);
|
||||
l2 = strlen(seq2);
|
||||
|
||||
if (l2 > l1)
|
||||
{
|
||||
lmax = l1;
|
||||
lmin = l2;
|
||||
}
|
||||
else
|
||||
{
|
||||
lmax = l2;
|
||||
lmin = l1;
|
||||
}
|
||||
|
||||
if (!lcsmode && (normalize==TRUE))
|
||||
{
|
||||
threshold = 1.0 - threshold;
|
||||
}
|
||||
|
||||
LCSmin = calculateLCSmin(lmax, lmin, threshold, normalize, reference, lcsmode);
|
||||
|
||||
// Allocating space for matrix band if the alignment must be computed
|
||||
|
||||
if ((reference == ALILEN) && ((lcsmode && normalize) || (!lcsmode))) // checking if alignment must be computed
|
||||
{
|
||||
sizeToAllocateForBand = calculateSizeToAllocate(lmax, lmin, LCSmin);
|
||||
|
||||
if (sizeToAllocateForBand > (*buffer_size))
|
||||
{
|
||||
// reallocating if needed
|
||||
address = reallocA16Address(*address, sizeToAllocateForBand);
|
||||
}
|
||||
}
|
||||
|
||||
// Allocating space for the int16_t arrays representing the sequences
|
||||
|
||||
calculateBandLengths(lmax, lmin, ¬Used, &maxBLL, LCSmin);
|
||||
|
||||
sizeToAllocateForSeqs = 2*maxBLL+lmax;
|
||||
|
||||
if (sizeToAllocateForSeqs > *buffer_sizeS)
|
||||
{
|
||||
(*(iseq1)) = realloc((*(iseq1)), sizeToAllocateForSeqs*sizeof(int16_t));
|
||||
(*(iseq2)) = realloc((*(iseq2)), sizeToAllocateForSeqs*sizeof(int16_t));
|
||||
}
|
||||
|
||||
iniSeq(*(iseq1), maxBLL, 0);
|
||||
iniSeq(*(iseq2), maxBLL, 255);
|
||||
*(iseq1) = *(iseq1)+maxBLL;
|
||||
*(iseq2) = *(iseq2)+maxBLL;
|
||||
|
||||
// longest seq must be first argument of sse_align function
|
||||
if (l2 > l1)
|
||||
{
|
||||
putSeqInSeq((*(iseq1)), seq2, l2, TRUE);
|
||||
putSeqInSeq((*(iseq2)), seq1, l1, FALSE);
|
||||
id = sse_banded_lcs_align(*(iseq1), *(iseq2), l2, l1, normalize, reference, lcsmode, *address, LCSmin);
|
||||
}
|
||||
else
|
||||
{
|
||||
putSeqInSeq((*(iseq1)), seq1, l1, TRUE);
|
||||
putSeqInSeq((*(iseq2)), seq2, l2, FALSE);
|
||||
id = sse_banded_lcs_align(*(iseq1), *(iseq2), l1, l2, normalize, reference, lcsmode, *address, LCSmin);
|
||||
}
|
||||
|
||||
return(id);
|
||||
}
|
||||
|
||||
|
||||
int prepareTablesForSumathings(int lmax, int lmin, double threshold, BOOL normalize, int reference, BOOL lcsmode,
|
||||
int16_t** address, int16_t** iseq1, int16_t** iseq2)
|
||||
{
|
||||
int sizeToAllocateForBand;
|
||||
int maxBLL;
|
||||
int notUsed;
|
||||
int sizeToAllocateForSeqs;
|
||||
int LCSmin;
|
||||
|
||||
LCSmin = calculateLCSmin(lmax, lmin, threshold, normalize, reference, lcsmode);
|
||||
|
||||
// Allocating space for matrix band if the alignment must be computed
|
||||
|
||||
if ((reference == ALILEN) && (normalize || !lcsmode)) // checking if alignment must be computed
|
||||
{
|
||||
sizeToAllocateForBand = calculateSizeToAllocate(lmax, lmin, LCSmin);
|
||||
(*(address)) = getA16Address(sizeToAllocateForBand);
|
||||
}
|
||||
|
||||
// Allocating space for the int16_t arrays representing the sequences
|
||||
|
||||
calculateBandLengths(lmax, lmin, ¬Used, &maxBLL, LCSmin);
|
||||
|
||||
sizeToAllocateForSeqs = 2*maxBLL+lmax;
|
||||
(*(iseq1)) = malloc(sizeToAllocateForSeqs*sizeof(int16_t));
|
||||
(*(iseq2)) = malloc(sizeToAllocateForSeqs*sizeof(int16_t));
|
||||
|
||||
iniSeq(*(iseq1), maxBLL, 0);
|
||||
iniSeq(*(iseq2), maxBLL, 255);
|
||||
*(iseq1) = *(iseq1)+maxBLL;
|
||||
*(iseq2) = *(iseq2)+maxBLL;
|
||||
|
||||
return(maxBLL+lmax);
|
||||
}
|
||||
|
||||
|
||||
double alignForSumathings(char* seq1, int16_t* iseq1, char* seq2, int16_t* iseq2, int l1, int l2,
|
||||
BOOL normalize, int reference, BOOL lcsmode, int16_t* address, int sizeForSeqs, int LCSmin)
|
||||
{
|
||||
double id;
|
||||
|
||||
iniSeq(iseq1, sizeForSeqs, 0);
|
||||
iniSeq(iseq2, sizeForSeqs, 255);
|
||||
|
||||
if (l2 > l1)
|
||||
{
|
||||
putSeqInSeq(iseq1, seq2, l2, TRUE);
|
||||
putSeqInSeq(iseq2, seq1, l1, FALSE);
|
||||
id = sse_banded_lcs_align(iseq1, iseq2, l2, l1, normalize, reference, lcsmode, address, LCSmin);
|
||||
}
|
||||
else
|
||||
{
|
||||
putSeqInSeq(iseq1, seq1, l1, TRUE);
|
||||
putSeqInSeq(iseq2, seq2, l2, FALSE);
|
||||
id = sse_banded_lcs_align(iseq1, iseq2, l1, l2, normalize, reference, lcsmode, address, LCSmin);
|
||||
}
|
||||
|
||||
return(id);
|
||||
}
|
||||
|
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* sse_banded_LCS_alignment.h
|
||||
*
|
||||
* Created on: november 29, 2012
|
||||
* Author: mercier
|
||||
*/
|
||||
|
||||
#ifndef SSE_BANDED_LCS_ALIGNMENT_H_
|
||||
#define SSE_BANDED_LCS_ALIGNMENT_H_
|
||||
#include <stdint.h>
|
||||
|
||||
double sse_banded_lcs_align(int16_t* seq1, int16_t* seq2, int l1, int l2, BOOL normalize, int reference, BOOL lcsmode, int16_t* address, int LCSmin);
|
||||
int calculateSizeToAllocate(int maxLen, int minLen, int LCSmin);
|
||||
void calculateThresholdFromErrorNumber(int error, int length, double* threshold);
|
||||
void iniSeq(int16_t* seq, int size, int16_t iniValue);
|
||||
void putSeqInSeq(int16_t* seq, char* s, int l, BOOL reverse);
|
||||
double generic_sse_banded_lcs_align(char* seq1, char* seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, int16_t** address, int* buffer_size, int16_t** iseq1,
|
||||
int16_t** iseq2, int* buffer_sizeS);
|
||||
int prepareTablesForSumathings(int lmax, int lmin, double threshold, BOOL normalize, int reference, BOOL lcsmode,
|
||||
int16_t** address, int16_t** iseq1, int16_t** iseq2);
|
||||
double alignForSumathings(char* seq1, int16_t* iseq1, char* seq2, int16_t* iseq2, int l1, int l2, BOOL normalize,
|
||||
int reference, BOOL lcsmode, int16_t* address, int sizeForSeqs, int LCSmin);
|
||||
int calculateLCSmin(int l1, int l2, double threshold, BOOL normalize, int reference, BOOL lcsmode);
|
||||
#endif
|
382
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/upperband.c
Normal file
382
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/upperband.c
Normal file
@ -0,0 +1,382 @@
|
||||
#include "../libsse/_sse.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include "../libutils/utilities.h"
|
||||
#include "../libfasta/sequence.h"
|
||||
#include "sse_banded_LCS_alignment.h"
|
||||
|
||||
|
||||
inline static uchar_v hash4m128(uchar_v frag)
|
||||
{
|
||||
uchar_v words;
|
||||
|
||||
vUInt8 mask_03= _MM_SET1_EPI8(0x03); // charge le registre avec 16x le meme octet
|
||||
vUInt8 mask_FC= _MM_SET1_EPI8(0xFC);
|
||||
|
||||
frag.m = _MM_SRLI_EPI64(frag.m,1); // shift logic a droite sur 2 x 64 bits
|
||||
frag.m = _MM_AND_SI128(frag.m,mask_03); // and sur les 128 bits
|
||||
|
||||
|
||||
words.m= _MM_SLLI_EPI64(frag.m,2);
|
||||
words.m= _MM_AND_SI128(words.m,mask_FC);
|
||||
frag.m = _MM_SRLI_SI128(frag.m,1);
|
||||
words.m= _MM_OR_SI128(words.m,frag.m);
|
||||
|
||||
words.m= _MM_SLLI_EPI64(words.m,2);
|
||||
words.m= _MM_AND_SI128(words.m,mask_FC);
|
||||
frag.m = _MM_SRLI_SI128(frag.m,1);
|
||||
words.m= _MM_OR_SI128(words.m,frag.m);
|
||||
|
||||
words.m= _MM_SLLI_EPI64(words.m,2);
|
||||
words.m= _MM_AND_SI128(words.m,mask_FC);
|
||||
frag.m = _MM_SRLI_SI128(frag.m,1);
|
||||
words.m= _MM_OR_SI128(words.m,frag.m);
|
||||
|
||||
return words;
|
||||
}
|
||||
|
||||
#ifdef __SSE2__
|
||||
|
||||
inline static int anyzerom128(vUInt8 data)
|
||||
{
|
||||
vUInt8 mask_00= _MM_SETZERO_SI128();
|
||||
uint64_v tmp;
|
||||
tmp.m = _MM_CMPEQ_EPI8(data,mask_00);
|
||||
return (int)(tmp.c[0]!=0 || tmp.c[1]!=0);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
inline static int anyzerom128(vUInt8 data)
|
||||
{
|
||||
int i;
|
||||
um128 tmp;
|
||||
tmp.i = data;
|
||||
for (i=0;i<8;i++)
|
||||
if (tmp.s8[i]==0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
inline static void dumpm128(unsigned short *table,vUInt8 data)
|
||||
{
|
||||
memcpy(table,&data,16);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute 4mer occurrence table from a DNA sequence
|
||||
*
|
||||
* sequence : a pointer to the null terminated nuc sequence
|
||||
* table : a pointer to a 256 cells unisgned char table for
|
||||
* storing the occurrence table
|
||||
* count : pointer to an int value used as a return value
|
||||
* containing the global word counted
|
||||
*
|
||||
* returns the number of words observed in the sequence with a
|
||||
* count greater than 255.
|
||||
*/
|
||||
|
||||
int buildTable(const char* sequence, unsigned char *table, int *count)
|
||||
{
|
||||
int overflow = 0;
|
||||
int wc=0;
|
||||
int i;
|
||||
vUInt8 mask_00= _MM_SETZERO_SI128();
|
||||
|
||||
uchar_v frag;
|
||||
uchar_v words;
|
||||
uchar_v zero;
|
||||
|
||||
char* s;
|
||||
|
||||
s=(char*)sequence;
|
||||
|
||||
memset(table,0,256*sizeof(unsigned char));
|
||||
|
||||
// encode ascii sequence with A : 00 C : 01 T: 10 G : 11
|
||||
|
||||
for(frag.m=_MM_LOADU_SI128((vUInt8*)s);
|
||||
! anyzerom128(frag.m);
|
||||
s+=12,frag.m=_MM_LOADU_SI128((vUInt8*)s))
|
||||
{
|
||||
words= hash4m128(frag);
|
||||
|
||||
// printf("%d %d %d %d\n",words.c[0],words.c[1],words.c[2],words.c[3]);
|
||||
|
||||
if (table[words.c[0]]<255) table[words.c[0]]++; else overflow++;
|
||||
if (table[words.c[1]]<255) table[words.c[1]]++; else overflow++;
|
||||
if (table[words.c[2]]<255) table[words.c[2]]++; else overflow++;
|
||||
if (table[words.c[3]]<255) table[words.c[3]]++; else overflow++;
|
||||
if (table[words.c[4]]<255) table[words.c[4]]++; else overflow++;
|
||||
if (table[words.c[5]]<255) table[words.c[5]]++; else overflow++;
|
||||
if (table[words.c[6]]<255) table[words.c[6]]++; else overflow++;
|
||||
if (table[words.c[7]]<255) table[words.c[7]]++; else overflow++;
|
||||
if (table[words.c[8]]<255) table[words.c[8]]++; else overflow++;
|
||||
if (table[words.c[9]]<255) table[words.c[9]]++; else overflow++;
|
||||
if (table[words.c[10]]<255) table[words.c[10]]++; else overflow++;
|
||||
if (table[words.c[11]]<255) table[words.c[11]]++; else overflow++;
|
||||
|
||||
wc+=12;
|
||||
}
|
||||
|
||||
zero.m=_MM_CMPEQ_EPI8(frag.m,mask_00);
|
||||
//printf("frag=%d %d %d %d\n",frag.c[0],frag.c[1],frag.c[2],frag.c[3]);
|
||||
//printf("zero=%d %d %d %d\n",zero.c[0],zero.c[1],zero.c[2],zero.c[3]);
|
||||
words = hash4m128(frag);
|
||||
|
||||
if (zero.c[0]+zero.c[1]+zero.c[2]+zero.c[3]==0)
|
||||
for(i=0;zero.c[i+3]==0;i++,wc++)
|
||||
if (table[words.c[i]]<255) table[words.c[i]]++; else overflow++;
|
||||
|
||||
if (count) *count=wc;
|
||||
return overflow;
|
||||
}
|
||||
|
||||
static inline vUInt16 partialminsum(vUInt8 ft1,vUInt8 ft2)
|
||||
{
|
||||
vUInt8 mini;
|
||||
vUInt16 minilo;
|
||||
vUInt16 minihi;
|
||||
vUInt8 mask_00= _MM_SETZERO_SI128();
|
||||
|
||||
mini = _MM_MIN_EPU8(ft1,ft2);
|
||||
minilo = _MM_UNPACKLO_EPI8(mini,mask_00);
|
||||
minihi = _MM_UNPACKHI_EPI8(mini,mask_00);
|
||||
|
||||
return _MM_ADDS_EPU16(minilo,minihi);
|
||||
}
|
||||
|
||||
int compareTable(unsigned char *t1, int over1, unsigned char* t2, int over2)
|
||||
{
|
||||
vUInt8 ft1;
|
||||
vUInt8 ft2;
|
||||
vUInt8 *table1=(vUInt8*)t1;
|
||||
vUInt8 *table2=(vUInt8*)t2;
|
||||
ushort_v summini;
|
||||
int i;
|
||||
int total;
|
||||
|
||||
ft1 = _MM_LOADU_SI128(table1);
|
||||
ft2 = _MM_LOADU_SI128(table2);
|
||||
summini.m = partialminsum(ft1,ft2);
|
||||
table1++;
|
||||
table2++;
|
||||
|
||||
|
||||
for (i=1;i<16;i++,table1++,table2++)
|
||||
{
|
||||
ft1 = _MM_LOADU_SI128(table1);
|
||||
ft2 = _MM_LOADU_SI128(table2);
|
||||
summini.m = _MM_ADDS_EPU16(summini.m,partialminsum(ft1,ft2));
|
||||
|
||||
}
|
||||
|
||||
// Finishing the sum process
|
||||
|
||||
summini.m = _MM_ADDS_EPU16(summini.m,_MM_SRLI_SI128(summini.m,8)); // sum the 4 firsts with the 4 lasts
|
||||
summini.m = _MM_ADDS_EPU16(summini.m,_MM_SRLI_SI128(summini.m,4));
|
||||
|
||||
total = summini.c[0]+summini.c[1];
|
||||
total+= (over1 < over2) ? over1:over2;
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
int threshold4(int wordcount,double identity)
|
||||
{
|
||||
int error;
|
||||
int lmax;
|
||||
|
||||
wordcount+=3;
|
||||
error = (int)floor((double)wordcount * ((double)1.0-identity));
|
||||
lmax = (wordcount - error) / (error + 1);
|
||||
if (lmax < 4)
|
||||
return 0;
|
||||
return (lmax - 3) \
|
||||
* (error + 1) \
|
||||
+ ((wordcount - error) % (error + 1));
|
||||
}
|
||||
|
||||
|
||||
int thresholdLCS4(int32_t reflen,int32_t lcs)
|
||||
{
|
||||
int nbfrag;
|
||||
int smin;
|
||||
int R;
|
||||
int common;
|
||||
|
||||
nbfrag = (reflen - lcs)*2 + 1;
|
||||
smin = lcs/nbfrag;
|
||||
R = lcs - smin * nbfrag;
|
||||
common = MAX(smin - 2,0) * R + MAX(smin - 3,0) * (nbfrag - R);
|
||||
return common;
|
||||
}
|
||||
|
||||
|
||||
int hashDB(fastaSeqCount db)
|
||||
{
|
||||
int32_t i;
|
||||
int32_t count;
|
||||
|
||||
fprintf(stderr,"Indexing dataset...");
|
||||
|
||||
for (i=0; i < db.count;i++)
|
||||
{
|
||||
db.fastaSeqs[i].table = util_malloc((256)*sizeof(unsigned char), __FILE__, __LINE__);
|
||||
db.fastaSeqs[i].over = buildTable((const char*)(db.fastaSeqs[i].sequence),
|
||||
db.fastaSeqs[i].table,
|
||||
&count);
|
||||
}
|
||||
|
||||
fprintf(stderr," : Done\n");
|
||||
|
||||
return db.count;
|
||||
}
|
||||
|
||||
|
||||
BOOL isPossible(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode)
|
||||
{
|
||||
int32_t reflen;
|
||||
int32_t maxlen;
|
||||
int32_t lcs;
|
||||
int32_t mincount;
|
||||
|
||||
if (seq1->length < 12 || seq2->length < 12)
|
||||
return TRUE;
|
||||
|
||||
maxlen = MAX(seq1->length,seq2->length);
|
||||
|
||||
if (reference==ALILEN || reference==MAXLEN)
|
||||
reflen = maxlen;
|
||||
else
|
||||
reflen = MIN(seq1->length,seq2->length);
|
||||
|
||||
if (normalize)
|
||||
{
|
||||
if (! lcsmode)
|
||||
threshold = 1. - threshold;
|
||||
|
||||
lcs = (int32_t)ceil((double)reflen * threshold);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! lcsmode)
|
||||
threshold = reflen - threshold;
|
||||
lcs = (int32_t) threshold;
|
||||
}
|
||||
|
||||
if (lcs > MIN(seq1->length,seq2->length))
|
||||
return FALSE;
|
||||
|
||||
mincount = thresholdLCS4(maxlen,lcs);
|
||||
|
||||
return compareTable(seq1->table,seq1->over,seq2->table,seq2->over) >=mincount;
|
||||
}
|
||||
|
||||
|
||||
BOOL isPossibleSumathings(fastaSeqPtr seq1, fastaSeqPtr seq2, int l1, int l2, double threshold, BOOL normalize, int reference, BOOL lcsmode)
|
||||
{ // optimized version of the filter for sumaclust and sumatra
|
||||
|
||||
int32_t reflen;
|
||||
int32_t lcs;
|
||||
int32_t mincount;
|
||||
|
||||
if (l1 < 12 || l2 < 12)
|
||||
return TRUE;
|
||||
|
||||
if (reference==ALILEN || reference==MAXLEN)
|
||||
reflen = l1;
|
||||
else
|
||||
reflen = l2;
|
||||
|
||||
if (normalize)
|
||||
lcs = (int32_t)ceil((double)reflen * threshold);
|
||||
else
|
||||
{
|
||||
if (! lcsmode)
|
||||
threshold = reflen - threshold;
|
||||
lcs = (int32_t) threshold;
|
||||
}
|
||||
|
||||
mincount = thresholdLCS4(l1,lcs);
|
||||
|
||||
return compareTable(seq1->table,seq1->over,seq2->table,seq2->over) >=mincount;
|
||||
}
|
||||
|
||||
|
||||
void filters(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin)
|
||||
{ // score takes value -1 if filters are passed. score must be initialized in calling function.
|
||||
int l1;
|
||||
int l2;
|
||||
|
||||
l1 = seq1->length;
|
||||
l2 = seq2->length;
|
||||
|
||||
if (l1 >= l2)
|
||||
{
|
||||
*LCSmin = calculateLCSmin(l1, l2, threshold, normalize, reference, lcsmode);
|
||||
if (l2 >= *LCSmin)
|
||||
{
|
||||
if (isPossibleSumathings(seq1, seq2, l1, l2, threshold, normalize, reference, lcsmode)) // 4-mers filter
|
||||
*score = -1.0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*LCSmin = calculateLCSmin(l2, l1, threshold, normalize, reference, lcsmode);
|
||||
if (l1 >= *LCSmin)
|
||||
{
|
||||
if (isPossibleSumathings(seq2, seq1, l2, l1, threshold, normalize, reference, lcsmode)) // 4-mers filter
|
||||
*score = -1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void filtersSumatra(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin)
|
||||
{ // score takes value -2 if filters are not passed, -1 if filters are passed and >= 0 with max score if the 2 sequences are identical.
|
||||
|
||||
int l1;
|
||||
int l2;
|
||||
l1 = seq1->length;
|
||||
|
||||
*score = -2.0;
|
||||
|
||||
if (strcmp(seq1->sequence, seq2->sequence) == 0) // the 2 sequences are identical
|
||||
{
|
||||
if (lcsmode && normalize)
|
||||
*score = 1.0;
|
||||
else if (!lcsmode)
|
||||
*score = 0.0;
|
||||
else
|
||||
*score = l1;
|
||||
}
|
||||
|
||||
else if (threshold != 0)
|
||||
{
|
||||
l2 = seq2->length;
|
||||
|
||||
if (l1 >= l2)
|
||||
{
|
||||
*LCSmin = calculateLCSmin(l1, l2, threshold, normalize, reference, lcsmode);
|
||||
if (l2 >= *LCSmin)
|
||||
{
|
||||
if (isPossibleSumathings(seq1, seq2, l1, l2, threshold, normalize, reference, lcsmode)) // 4-mers filter
|
||||
*score = -1.0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*LCSmin = calculateLCSmin(l2, l1, threshold, normalize, reference, lcsmode);
|
||||
if (l1 >= *LCSmin)
|
||||
{
|
||||
if (isPossibleSumathings(seq2, seq1, l2, l1, threshold, normalize, reference, lcsmode)) // 4-mers filter
|
||||
*score = -1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
*LCSmin = 0;
|
||||
}
|
18
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/upperband.h
Normal file
18
src/sumaclust/sumaclust_v1.0.10/sumalibs/liblcs/upperband.h
Normal file
@ -0,0 +1,18 @@
|
||||
|
||||
#ifndef UPPERBAND_H_
|
||||
#define UPPERBAND_H_
|
||||
|
||||
|
||||
int buildTable(const char *sequence, unsigned char *table, int *count);
|
||||
int compareTable(unsigned char *t1, int over1, unsigned char* t2, int over2);
|
||||
int threshold4(int wordcount,double identity);
|
||||
int thresholdLCS4(int32_t reflen,int32_t lcs);
|
||||
|
||||
|
||||
int hashDB(fastaSeqCount);
|
||||
BOOL isPossible(fastaSeqPtr, fastaSeqPtr, BOOL, int, double, BOOL);
|
||||
BOOL isPossibleSumathings(fastaSeqPtr seq1, fastaSeqPtr seq2, int l1, int l2, double threshold, BOOL normalize, int reference, BOOL lcsmode);
|
||||
void filters(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin);
|
||||
void filtersSumatra(fastaSeqPtr seq1, fastaSeqPtr seq2, double threshold, BOOL normalize, int reference, BOOL lcsmode, double* score, int* LCSmin);
|
||||
#endif
|
||||
|
961
src/sumaclust/sumaclust_v1.0.10/sumalibs/libsse/_sse.h
Normal file
961
src/sumaclust/sumaclust_v1.0.10/sumalibs/libsse/_sse.h
Normal file
@ -0,0 +1,961 @@
|
||||
#ifndef _SSE_H_
|
||||
#define _SSE_H_
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <inttypes.h>
|
||||
#ifdef __SSE2__
|
||||
#include <xmmintrin.h>
|
||||
#else
|
||||
typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
|
||||
#endif /* __SSE2__ */
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(x,y) (((x)>(y)) ? (x):(y))
|
||||
#define MIN(x,y) (((x)<(y)) ? (x):(y))
|
||||
#endif
|
||||
|
||||
#define ALIGN __attribute__((aligned(16)))
|
||||
typedef __m128i vUInt8;
|
||||
typedef __m128i vInt8;
|
||||
|
||||
typedef __m128i vUInt16;
|
||||
typedef __m128i vInt16;
|
||||
|
||||
typedef __m128i vUInt64;
|
||||
|
||||
typedef union
|
||||
{
|
||||
__m128i i;
|
||||
int64_t s64[ 2];
|
||||
int16_t s16[ 8];
|
||||
int8_t s8 [16];
|
||||
uint8_t u8 [16];
|
||||
uint16_t u16[8 ];
|
||||
uint32_t u32[4 ];
|
||||
uint64_t u64[2 ];
|
||||
} um128;
|
||||
|
||||
typedef union
|
||||
{
|
||||
vUInt8 m;
|
||||
uint8_t c[16];
|
||||
} uchar_v;
|
||||
|
||||
typedef union
|
||||
{
|
||||
vUInt16 m;
|
||||
uint16_t c[8];
|
||||
} ushort_v;
|
||||
|
||||
typedef union
|
||||
{
|
||||
vUInt64 m;
|
||||
uint64_t c[2];
|
||||
} uint64_v;
|
||||
|
||||
|
||||
#ifdef __SSE2__
|
||||
|
||||
static inline int8_t _s2_extract_epi8(__m128i r, const int p)
|
||||
{
|
||||
#define ACTIONP(r,x) return _mm_extract_epi16(r,x) & 0xFF
|
||||
#define ACTIONI(r,x) return _mm_extract_epi16(r,x) >> 8
|
||||
switch (p) {
|
||||
case 0: ACTIONP(r,0);
|
||||
case 1: ACTIONI(r,0);
|
||||
case 2: ACTIONP(r,1);
|
||||
case 3: ACTIONI(r,1);
|
||||
case 4: ACTIONP(r,2);
|
||||
case 5: ACTIONI(r,2);
|
||||
case 6: ACTIONP(r,3);
|
||||
case 7: ACTIONI(r,3);
|
||||
case 8: ACTIONP(r,4);
|
||||
case 9: ACTIONI(r,4);
|
||||
case 10: ACTIONP(r,5);
|
||||
case 11: ACTIONI(r,5);
|
||||
case 12: ACTIONP(r,6);
|
||||
case 13: ACTIONI(r,6);
|
||||
case 14: ACTIONP(r,7);
|
||||
case 15: ACTIONI(r,7);
|
||||
}
|
||||
#undef ACTIONP
|
||||
#undef ACTIONI
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline __m128i _s2_max_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
__m128i mask = _mm_cmpgt_epi8( a, b );
|
||||
a = _mm_and_si128 (a,mask );
|
||||
b = _mm_andnot_si128(mask,b);
|
||||
return _mm_or_si128(a,b);
|
||||
}
|
||||
|
||||
static inline __m128i _s2_min_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
__m128i mask = _mm_cmplt_epi8( a, b );
|
||||
a = _mm_and_si128 (a,mask );
|
||||
b = _mm_andnot_si128(mask,b);
|
||||
return _mm_or_si128(a,b);
|
||||
}
|
||||
|
||||
static inline __m128i _s2_insert_epi8(__m128i r, int b, const int p)
|
||||
{
|
||||
#define ACTIONP(r,x) return _mm_insert_epi16(r,(_mm_extract_epi16(r,x) & 0xFF00) | (b & 0x00FF),x)
|
||||
#define ACTIONI(r,x) return _mm_insert_epi16(r,(_mm_extract_epi16(r,x) & 0x00FF) | ((b << 8)& 0xFF00),x)
|
||||
switch (p) {
|
||||
case 0: ACTIONP(r,0);
|
||||
case 1: ACTIONI(r,0);
|
||||
case 2: ACTIONP(r,1);
|
||||
case 3: ACTIONI(r,1);
|
||||
case 4: ACTIONP(r,2);
|
||||
case 5: ACTIONI(r,2);
|
||||
case 6: ACTIONP(r,3);
|
||||
case 7: ACTIONI(r,3);
|
||||
case 8: ACTIONP(r,4);
|
||||
case 9: ACTIONI(r,4);
|
||||
case 10: ACTIONP(r,5);
|
||||
case 11: ACTIONI(r,5);
|
||||
case 12: ACTIONP(r,6);
|
||||
case 13: ACTIONI(r,6);
|
||||
case 14: ACTIONP(r,7);
|
||||
case 15: ACTIONI(r,7);
|
||||
}
|
||||
#undef ACTIONP
|
||||
#undef ACTIONI
|
||||
|
||||
return _mm_setzero_si128();
|
||||
}
|
||||
|
||||
// Fill a SSE Register with 16 time the same 8bits integer value
|
||||
#define _MM_SET1_EPI8(x) _mm_set1_epi8(x)
|
||||
#define _MM_INSERT_EPI8(r,x,i) _s2_insert_epi8((r),(x),(i))
|
||||
#define _MM_CMPEQ_EPI8(x,y) _mm_cmpeq_epi8((x),(y))
|
||||
#define _MM_CMPGT_EPI8(x,y) _mm_cmpgt_epi8((x),(y))
|
||||
#define _MM_CMPLT_EPI8(x,y) _mm_cmplt_epi8((x),(y))
|
||||
#define _MM_MAX_EPI8(x,y) _s2_max_epi8((x),(y))
|
||||
#define _MM_MIN_EPI8(x,y) _s2_min_epi8((x),(y))
|
||||
#define _MM_ADD_EPI8(x,y) _mm_add_epi8((x),(y))
|
||||
#define _MM_SUB_EPI8(x,y) _mm_sub_epi8((x),(y))
|
||||
#define _MM_EXTRACT_EPI8(r,p) _s2_extract_epi8((r),(p))
|
||||
|
||||
#define _MM_MIN_EPU8(x,y) _mm_min_epu8((x),(y))
|
||||
|
||||
// Fill a SSE Register with 8 time the same 16bits integer value
|
||||
#define _MM_SET1_EPI16(x) _mm_set1_epi16(x)
|
||||
|
||||
#define _MM_INSERT_EPI16(r,x,i) _mm_insert_epi16((r),(x),(i))
|
||||
#define _MM_CMPEQ_EPI16(x,y) _mm_cmpeq_epi16((x),(y))
|
||||
#define _MM_CMPGT_EPI16(x,y) _mm_cmpgt_epi16((x),(y))
|
||||
#define _MM_CMPGT_EPU16(x,y) _mm_cmpgt_epu16((x),(y)) // n'existe pas ??
|
||||
#define _MM_CMPLT_EPI16(x,y) _mm_cmplt_epi16((x),(y))
|
||||
#define _MM_MAX_EPI16(x,y) _mm_max_epi16((x),(y))
|
||||
#define _MM_MIN_EPI16(x,y) _mm_min_epi16((x),(y))
|
||||
#define _MM_ADD_EPI16(x,y) _mm_add_epi16((x),(y))
|
||||
#define _MM_SUB_EPI16(x,y) _mm_sub_epi16((x),(y))
|
||||
#define _MM_EXTRACT_EPI16(r,p) _mm_extract_epi16((r),(p))
|
||||
#define _MM_UNPACKLO_EPI8(a,b) _mm_unpacklo_epi8((a),(b))
|
||||
#define _MM_UNPACKHI_EPI8(a,b) _mm_unpackhi_epi8((a),(b))
|
||||
#define _MM_ADDS_EPU16(x,y) _mm_adds_epu16((x),(y))
|
||||
|
||||
// Multiplication
|
||||
#define _MM_MULLO_EPI16(x,y) _mm_mullo_epi16((x), (y))
|
||||
|
||||
#define _MM_SRLI_EPI64(r,x) _mm_srli_epi64((r),(x))
|
||||
#define _MM_SLLI_EPI64(r,x) _mm_slli_epi64((r),(x))
|
||||
|
||||
// Set a SSE Register to 0
|
||||
#define _MM_SETZERO_SI128() _mm_setzero_si128()
|
||||
|
||||
#define _MM_AND_SI128(x,y) _mm_and_si128((x),(y))
|
||||
#define _MM_ANDNOT_SI128(x,y) _mm_andnot_si128((x),(y))
|
||||
#define _MM_OR_SI128(x,y) _mm_or_si128((x),(y))
|
||||
#define _MM_XOR_SI128(x,y) _mm_xor_si128((x),(y))
|
||||
#define _MM_SLLI_SI128(r,s) _mm_slli_si128((r),(s))
|
||||
#define _MM_SRLI_SI128(r,s) _mm_srli_si128((r),(s))
|
||||
|
||||
// Load a SSE register from an unaligned address
|
||||
#define _MM_LOADU_SI128(x) _mm_loadu_si128(x)
|
||||
|
||||
// Load a SSE register from an aligned address (/!\ not defined when SSE not available)
|
||||
#define _MM_LOAD_SI128(x) _mm_load_si128(x)
|
||||
|
||||
// #define _MM_UNPACKLO_EPI8(x,y) _mm_unpacklo_epi8((x),(y))
|
||||
|
||||
#else /* __SSE2__ Not defined */
|
||||
|
||||
static inline __m128i _em_set1_epi8(int x)
|
||||
{
|
||||
um128 a;
|
||||
|
||||
x&=0xFF;
|
||||
a.s8[0]=x;
|
||||
a.s8[1]=x;
|
||||
a.u16[1]=a.u16[0];
|
||||
a.u32[1]=a.u32[0];
|
||||
a.u64[1]=a.u64[0];
|
||||
|
||||
return a.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_insert_epi8(__m128i r, int x, const int i)
|
||||
{
|
||||
um128 a;
|
||||
a.i=r;
|
||||
a.s8[i]=x & 0xFF;
|
||||
return a.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_cmpeq_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s8[z]=(x.s8[z]==y.s8[z]) ? 0xFF:0
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_cmpgt_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s8[z]=(x.s8[z]>y.s8[z]) ? 0xFF:0
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_cmplt_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s8[z]=(x.s8[z]<y.s8[z]) ? 0xFF:0
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_max_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s8[z]=MAX(x.s8[z],y.s8[z])
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_min_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s8[z]=MIN(x.s8[z],y.s8[z])
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_add_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s8[z]=x.s8[z]+y.s8[z]
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_sub_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s8[z]=x.s8[z]+y.s8[z]
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
|
||||
static inline int _em_extract_epi8(__m128i r, const int i)
|
||||
{
|
||||
um128 a;
|
||||
|
||||
a.i=r;
|
||||
|
||||
return a.s8[i] & 0xFF;
|
||||
}
|
||||
|
||||
static inline __m128i _em_min_epu8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.u8[z]=MIN(x.u8[z],y.u8[z])
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_set1_epi16(int x)
|
||||
{
|
||||
um128 a;
|
||||
|
||||
x&=0xFFFF;
|
||||
a.s16[0]=x;
|
||||
a.s16[1]=x;
|
||||
a.u32[1]=a.u32[0];
|
||||
a.u64[1]=a.u64[0];
|
||||
|
||||
return a.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_insert_epi16(__m128i r, int x, const int i)
|
||||
{
|
||||
um128 a;
|
||||
a.i=r;
|
||||
a.s16[i]=x & 0xFFFF;
|
||||
return a.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_cmpeq_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s16[z]=(x.s16[z]==y.s16[z]) ? 0xFFFF:0
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_cmpgt_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s16[z]=(x.s16[z]>y.s16[z]) ? 0xFFFF:0
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_cmplt_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s16[z]=(x.s16[z]<y.s16[z]) ? 0xFFFF:0
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_max_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
|
||||
#define R(z) r.s16[z]=MAX(x.s16[z],y.s16[z])
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_min_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
|
||||
#define R(z) r.s16[z]=MIN(x.s16[z],y.s16[z])
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_add_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s16[z]=x.s16[z]+y.s16[z]
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_sub_epi16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s16[z]=x.s16[z]+y.s16[z]
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline int _em_extract_epi16(__m128i r, const int i)
|
||||
{
|
||||
um128 a;
|
||||
a.i=r;
|
||||
return a.s16[i] & 0xFFFF;
|
||||
}
|
||||
|
||||
static inline __m128i _em_unpacklo_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s16[z]=(((int16_t)(y.s8[z])) << 8) | (int16_t)(x.s8[z])
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_unpackhi_epi8(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.s16[z]=(((int16_t)(y.s8[z+8])) << 8) | (int16_t)(x.s8[z+8])
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_adds_epu16(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
|
||||
#define R(z) r.u16[z]=x.u16[z]+y.u16[z]
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_srli_epi64(__m128i a, int b)
|
||||
{
|
||||
um128 x;
|
||||
|
||||
x.i=a;
|
||||
|
||||
x.s64[0]>>=b;
|
||||
x.s64[1]>>=b;
|
||||
|
||||
return x.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_slli_epi64(__m128i a, int b)
|
||||
{
|
||||
um128 x;
|
||||
|
||||
x.i=a;
|
||||
|
||||
x.s64[0]<<=b;
|
||||
x.s64[1]<<=b;
|
||||
|
||||
return x.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_setzero_si128()
|
||||
{
|
||||
um128 x;
|
||||
|
||||
x.s64[0]=x.s64[1]=0;
|
||||
|
||||
return x.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_and_si128(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
|
||||
#define R(z) r.u64[z]=x.u64[z] & y.u64[z]
|
||||
R(0);
|
||||
R(1);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_andnot_si128(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
|
||||
#define R(z) r.u64[z]=(~x.u64[z]) & y.u64[z]
|
||||
R(0);
|
||||
R(1);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_or_si128(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.u64[z]=x.u64[z] | y.u64[z]
|
||||
R(0);
|
||||
R(1);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_xor_si128(__m128i a, __m128i b)
|
||||
{
|
||||
um128 x;
|
||||
um128 y;
|
||||
um128 r;
|
||||
|
||||
x.i=a;
|
||||
y.i=b;
|
||||
|
||||
#define R(z) r.u64[z]=x.u64[z] ^ y.u64[z]
|
||||
R(0);
|
||||
R(1);
|
||||
#undef R
|
||||
|
||||
return r.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_slli_si128(__m128i a, int b)
|
||||
{
|
||||
um128 x;
|
||||
|
||||
x.i=a;
|
||||
|
||||
#define R(z) x.u8[z]=(z>=b) ? x.u8[z-b]:0
|
||||
R(15);
|
||||
R(14);
|
||||
R(13);
|
||||
R(12);
|
||||
R(11);
|
||||
R(10);
|
||||
R(9);
|
||||
R(8);
|
||||
R(7);
|
||||
R(6);
|
||||
R(5);
|
||||
R(4);
|
||||
R(3);
|
||||
R(2);
|
||||
R(1);
|
||||
R(0);
|
||||
#undef R
|
||||
|
||||
return x.i;
|
||||
}
|
||||
|
||||
static inline __m128i _em_srli_si128(__m128i a, int b)
|
||||
{
|
||||
um128 x;
|
||||
|
||||
x.i=a;
|
||||
|
||||
#define R(z) x.u8[z]=((b+z) > 15) ? 0:x.u8[z+b]
|
||||
R(0);
|
||||
R(1);
|
||||
R(2);
|
||||
R(3);
|
||||
R(4);
|
||||
R(5);
|
||||
R(6);
|
||||
R(7);
|
||||
R(8);
|
||||
R(9);
|
||||
R(10);
|
||||
R(11);
|
||||
R(12);
|
||||
R(13);
|
||||
R(14);
|
||||
R(15);
|
||||
#undef R
|
||||
|
||||
return x.i;
|
||||
}
|
||||
|
||||
inline static __m128i _em_loadu_si128(__m128i const *P)
|
||||
{
|
||||
um128 tmp;
|
||||
um128 *pp=(um128*)P;
|
||||
|
||||
tmp.u8[0]=(*pp).u8[0];
|
||||
tmp.u8[1]=(*pp).u8[1];
|
||||
tmp.u8[2]=(*pp).u8[2];
|
||||
tmp.u8[3]=(*pp).u8[3];
|
||||
tmp.u8[4]=(*pp).u8[4];
|
||||
tmp.u8[5]=(*pp).u8[5];
|
||||
tmp.u8[6]=(*pp).u8[6];
|
||||
tmp.u8[7]=(*pp).u8[7];
|
||||
tmp.u8[8]=(*pp).u8[8];
|
||||
tmp.u8[9]=(*pp).u8[9];
|
||||
tmp.u8[10]=(*pp).u8[10];
|
||||
tmp.u8[11]=(*pp).u8[11];
|
||||
tmp.u8[12]=(*pp).u8[12];
|
||||
tmp.u8[13]=(*pp).u8[13];
|
||||
tmp.u8[14]=(*pp).u8[14];
|
||||
tmp.u8[15]=(*pp).u8[15];
|
||||
return tmp.i;
|
||||
}
|
||||
|
||||
|
||||
#define _MM_SET1_EPI8(x) _em_set1_epi8(x)
|
||||
#define _MM_INSERT_EPI8(r,x,i) _em_insert_epi8((r),(x),(i))
|
||||
#define _MM_CMPEQ_EPI8(x,y) _em_cmpeq_epi8((x),(y))
|
||||
#define _MM_CMPGT_EPI8(x,y) _em_cmpgt_epi8((x),(y))
|
||||
#define _MM_CMPLT_EPI8(x,y) _em_cmplt_epi8((x),(y))
|
||||
#define _MM_MAX_EPI8(x,y) _em_max_epi8((x),(y))
|
||||
#define _MM_MIN_EPI8(x,y) _em_min_epi8((x),(y))
|
||||
#define _MM_ADD_EPI8(x,y) _em_add_epi8((x),(y))
|
||||
#define _MM_SUB_EPI8(x,y) _em_sub_epi8((x),(y))
|
||||
#define _MM_EXTRACT_EPI8(r,p) _em_extract_epi8((r),(p))
|
||||
|
||||
#define _MM_MIN_EPU8(x,y) _em_min_epu8((x),(y))
|
||||
|
||||
#define _MM_SET1_EPI16(x) _em_set1_epi16(x)
|
||||
#define _MM_INSERT_EPI16(r,x,i) _em_insert_epi16((r),(x),(i))
|
||||
#define _MM_CMPEQ_EPI16(x,y) _em_cmpeq_epi16((x),(y))
|
||||
#define _MM_CMPGT_EPI16(x,y) _em_cmpgt_epi16((x),(y))
|
||||
#define _MM_CMPLT_EPI16(x,y) _em_cmplt_epi16((x),(y))
|
||||
#define _MM_MAX_EPI16(x,y) _em_max_epi16((x),(y))
|
||||
#define _MM_MIN_EPI16(x,y) _em_min_epi16((x),(y))
|
||||
#define _MM_ADD_EPI16(x,y) _em_add_epi16((x),(y))
|
||||
#define _MM_SUB_EPI16(x,y) _em_sub_epi16((x),(y))
|
||||
#define _MM_EXTRACT_EPI16(r,p) _em_extract_epi16((r),(p))
|
||||
#define _MM_UNPACKLO_EPI8(a,b) _em_unpacklo_epi8((a),(b))
|
||||
#define _MM_UNPACKHI_EPI8(a,b) _em_unpackhi_epi8((a),(b))
|
||||
#define _MM_ADDS_EPU16(x,y) _em_adds_epu16((x),(y))
|
||||
|
||||
#define _MM_SRLI_EPI64(r,x) _em_srli_epi64((r),(x))
|
||||
#define _MM_SLLI_EPI64(r,x) _em_slli_epi64((r),(x))
|
||||
|
||||
#define _MM_SETZERO_SI128() _em_setzero_si128()
|
||||
|
||||
#define _MM_AND_SI128(x,y) _em_and_si128((x),(y))
|
||||
#define _MM_ANDNOT_SI128(x,y) _em_andnot_si128((x),(y))
|
||||
#define _MM_OR_SI128(x,y) _em_or_si128((x),(y))
|
||||
#define _MM_XOR_SI128(x,y) _em_xor_si128((x),(y))
|
||||
#define _MM_SLLI_SI128(r,s) _em_slli_si128((r),(s))
|
||||
#define _MM_SRLI_SI128(r,s) _em_srli_si128((r),(s))
|
||||
|
||||
#define _MM_LOADU_SI128(x) _em_loadu_si128(x)
|
||||
#define _MM_LOAD_SI128(x) _em_loadu_si128(x)
|
||||
|
||||
|
||||
#endif /* __SSE2__ */
|
||||
|
||||
#define _MM_NOT_SI128(x) _MM_XOR_SI128((x),(_MM_SET1_EPI8(0xFFFF)))
|
||||
|
||||
#endif
|
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/Makefile
Normal file
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
SOURCES = utilities.c \
|
||||
debug.c
|
||||
|
||||
SRCS=$(SOURCES)
|
||||
|
||||
|
||||
OBJECTS= $(patsubst %.c,%.o,$(SOURCES))
|
||||
|
||||
LIBFILE= libutils.a
|
||||
RANLIB=ranlib
|
||||
|
||||
|
||||
include ../global.mk
|
||||
|
||||
all: $(LIBFILE)
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJECTS) $(LIBFILE)
|
||||
rm -f *.P
|
||||
rm -f *.a
|
||||
|
||||
$(LIBFILE): $(OBJECTS)
|
||||
ar -cr $@ $?
|
||||
$(RANLIB) $@
|
32
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/debug.c
Normal file
32
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/debug.c
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* debug.c
|
||||
*
|
||||
* Created on: 4 sept. 2012
|
||||
* Author: coissac
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
#include "debug.h"
|
||||
|
||||
char* int2bin(int64_t i,size_t bits)
|
||||
{
|
||||
static char str[65];
|
||||
uint64_t u;
|
||||
|
||||
if (bits > 64)
|
||||
return NULL;
|
||||
|
||||
str[bits] = 0;
|
||||
|
||||
// type punning because signed shift is implementation-defined
|
||||
u = *(unsigned *)&i;
|
||||
|
||||
for(; bits--; u >>= 1)
|
||||
str[bits] = u & 1 ? '1' : '0';
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
|
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/debug.h
Normal file
25
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/debug.h
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* debug.h
|
||||
*
|
||||
* Created on: 4 sept. 2012
|
||||
* Author: coissac
|
||||
*/
|
||||
|
||||
#ifndef DEBUG_H_
|
||||
#define DEBUG_H_
|
||||
|
||||
#ifdef DEBUG
|
||||
#undef DEBUG
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_ON
|
||||
#define DEBUG(format,...) fprintf(stderr,"[%s:%d] : "format"\n",__FILE__,__LINE__,__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format,...)
|
||||
#endif
|
||||
#include <stdint.h>
|
||||
|
||||
char * int2bin(int64_t i,size_t bits);
|
||||
|
||||
|
||||
#endif /* DEBUG_H_ */
|
230
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/utilities.c
Normal file
230
src/sumaclust/sumaclust_v1.0.10/sumalibs/libutils/utilities.c
Normal file
@ -0,0 +1,230 @@
|
||||
/**
|
||||
* FileName: utilities.c
|
||||
* Author: Tiayyba Riaz
|
||||
* Description: C file for miscellenious functions and macros
|
||||
* **/
|
||||
|
||||
#include "utilities.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* Function Name: errorAbort(int errorCode, char* errorMsg, char* fileName, int lineNumber)
|
||||
* Description: Reports an error on standard error and aborts
|
||||
*/
|
||||
void errorAbort(int32_t errorCode, char* errorMsg, char* fileName, int32_t lineNumber)
|
||||
{
|
||||
fprintf(stderr,"Error %d in file %s line %d : %s\n",
|
||||
errorCode,
|
||||
fileName,
|
||||
lineNumber,
|
||||
errorMsg);
|
||||
|
||||
abort();
|
||||
}
|
||||
|
||||
void *util_malloc(size_t chunksize, const char *filename, int32_t line)
|
||||
{
|
||||
void * chunk;
|
||||
|
||||
chunk = calloc(1,chunksize);
|
||||
|
||||
if (!chunk)
|
||||
errorAbort(MEM_ALLOC_ERROR,"Could not allocate memory.",filename,line);
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function Name: util_realloc(void *chunk, int32_t newsize, const char *filename, int32_t line)
|
||||
* Description: Overloading realloc funstion, changes the size of the memory object pointed to by chunk
|
||||
* to the size specified by newsize. If memory cannot be allocated, gives the error on stderr and aborts.
|
||||
*/
|
||||
void *util_realloc(void *chunk, size_t newsize, const char *filename, int32_t line)
|
||||
{
|
||||
void *newchunk;
|
||||
|
||||
newchunk = realloc(chunk,newsize);
|
||||
|
||||
if (!newchunk)
|
||||
{
|
||||
errorAbort(MEM_ALLOC_ERROR,"Could not allocate memory.",filename,line);
|
||||
}
|
||||
|
||||
return newchunk;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function Name: util_free(void *chunk)
|
||||
* Description: Returns the memory specified by chunk back to operating syste.
|
||||
*/
|
||||
void util_free(void *chunk)
|
||||
{
|
||||
free(chunk);
|
||||
}
|
||||
|
||||
BOOL util_findInArr(int32_t tempArr[], int seqNo, int32_t noOfSeqs)
|
||||
{
|
||||
int index;
|
||||
|
||||
for(index = 0; index < noOfSeqs; index++)
|
||||
{
|
||||
if(tempArr[index] == seqNo) return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* String handling utilities
|
||||
*
|
||||
**/
|
||||
|
||||
/*
|
||||
* Function Name: str_chopAtDelim(char *dest, char *src, char *delim, BOOL includeDelim)
|
||||
* Description: chops the string startig from source to the delimeter specified.
|
||||
*/
|
||||
char *str_chopAtDelim(char *dest, char *src, char *delim, BOOL includeDelim)
|
||||
{
|
||||
char *temp;
|
||||
int32_t len;
|
||||
|
||||
/* returns a pointer to the first occurance of delim in src*/
|
||||
temp = strstr(src, delim);
|
||||
|
||||
if (temp == NULL)
|
||||
return NULL;
|
||||
|
||||
if (includeDelim)
|
||||
{
|
||||
/* temp - src + strlen(delim) -> a string between src and delimeter including delimeter*/
|
||||
len = temp - src + strlen(delim);
|
||||
strncpy(dest, src, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
len = temp - src;
|
||||
strncpy(dest, src, temp - src);
|
||||
}
|
||||
dest[len] = '\0';
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function Name: str_sepNameValue(char *name, char *value, char *src, char *delim)
|
||||
* Description: .
|
||||
*/
|
||||
void str_sepNameValue(char *name, char *value, char *src, char *delim)
|
||||
{
|
||||
char *temp;
|
||||
|
||||
temp = strstr(src, delim);
|
||||
|
||||
if(temp != NULL)
|
||||
{
|
||||
strncpy(name, src, temp - src);
|
||||
strcpy(value, temp + strlen(delim));
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(name, src);
|
||||
strcpy(value, "");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Function Name: str_removeSpaces(char *src)
|
||||
* Description: Removes the spaces from the start and end of the string.
|
||||
*/
|
||||
int str_isSpace (char ch)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\n':
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void str_removeSpaces(char *src)
|
||||
{
|
||||
int32_t start = 0, end = strlen(src) - 1;
|
||||
int32_t index = 0;
|
||||
|
||||
if (src == NULL || end < 0) return;
|
||||
|
||||
while(str_isSpace(src[start]) && start < end) start++;
|
||||
while(str_isSpace(src[end]) && end > start) end--;
|
||||
|
||||
if ( start == end && src[start] == ' ')
|
||||
{
|
||||
src[0] = '\0';
|
||||
return;
|
||||
}
|
||||
if (start > 0)
|
||||
{
|
||||
while(start <= end)
|
||||
{
|
||||
src[index] = src[start];
|
||||
index++;
|
||||
start++;
|
||||
}
|
||||
src[index] = '\0';
|
||||
return;
|
||||
}
|
||||
src[end+1] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Function Name: str_strrstr(char *src, char *delim)
|
||||
* Description: Searches the position of last occurence of string delim in src.
|
||||
*/
|
||||
char *str_strrstr(char *src, char *delim)
|
||||
{
|
||||
char *last, *next;
|
||||
next = strstr(src, delim);
|
||||
last = next;
|
||||
while(next != NULL)
|
||||
{
|
||||
last = next;
|
||||
next = strstr(last + 1, delim);
|
||||
}
|
||||
return last;
|
||||
}
|
||||
|
||||
|
||||
void* getA16Address(int size)
|
||||
{
|
||||
void* address;
|
||||
address = (void*) malloc(size);
|
||||
while ((((long long unsigned int) (address))%16) != 0)
|
||||
address++;
|
||||
return(address);
|
||||
}
|
||||
|
||||
|
||||
void** reallocA16Address(void** address, int size)
|
||||
{
|
||||
if (*(address) == NULL)
|
||||
*(address) = malloc(size);
|
||||
*(address) = realloc(address, size);
|
||||
while ((((long long unsigned int) (*(address)))%16) != 0)
|
||||
(*(address))++;
|
||||
return(address);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,56 @@
|
||||
/**
|
||||
* FileName: utilities.h
|
||||
* Author: Tiayyba Riaz
|
||||
* Description: Header file for miscellenious functions and macros
|
||||
* **/
|
||||
|
||||
#ifndef UTILITIES_H_
|
||||
#define UTILITIES_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
|
||||
//static char *basecodes = "00100020000000000003000000";
|
||||
|
||||
//#define BASEIDX(ch) basecodes[ch - 'a'] - 48
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(x,y) (((x)>(y)) ? (x):(y))
|
||||
#define MIN(x,y) (((x)<(y)) ? (x):(y))
|
||||
#endif
|
||||
|
||||
typedef char BOOL;
|
||||
#define TRUE (3==3)
|
||||
#define FALSE (!TRUE)
|
||||
#define ALILEN (0)
|
||||
#define MAXLEN (1)
|
||||
#define MINLEN (2)
|
||||
|
||||
|
||||
/* Error Codes */
|
||||
#define FILE_OPENING_ERROR (1)
|
||||
#define MEM_ALLOC_ERROR (2)
|
||||
|
||||
/* Prototypes */
|
||||
void errorAbort(int32_t code, char* errorMsg, char* fileName, int32_t lineNumber);
|
||||
char *str_strrstr(char *src, char *delim);
|
||||
void str_removeSpaces(char *src);
|
||||
void str_sepNameValue(char *name, char *value, char *src, char *delim);
|
||||
char *str_chopAtDelim(char *dest, char *src, char *delim, BOOL includeDelim);
|
||||
void util_free(void *chunk);
|
||||
void *util_realloc(void *chunk, size_t newsize, const char *filename, int32_t line);
|
||||
void *util_malloc(size_t chunksize, const char *filename, int32_t line);
|
||||
BOOL util_findInArr(int32_t tempArr[], int seqNo, int32_t noOfSeqs);
|
||||
void* getA16Address(int size);
|
||||
void** reallocA16Address(void** address, int size);
|
||||
|
||||
/* Macros */
|
||||
#define ERRORABORT(code, msg) errorAbort((code), (msg), __FILE__, __LINE__)
|
||||
|
||||
#endif /*UTILITIES_H_*/
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user