------------------------------------------------------------------------ r831 | chris | 2006-07-25 21:55:38 +0100 (Tue, 25 Jul 2006) | 5 lines I have fixed some bugs in the assignment of parameters and now the sb2 example works a little more (test/SireDB/assign_sb2.py). It even assigns the atom parameters for the perturbed state. However, this has highlighted a major logic error on my part. At the moment I am using parameter number '0' to signify dummy and not-found. This is a problem, as when the user sets the parameter 0, the db reports it as not found and will then try to find a better parameter (hence why sb2 perturbed state has a total charge of 0.315 - the three supposedly dummy hydrogens have been assigned reference state parameters, with charges of 0.105 each). I will need to change the code so it uses 0 for dummy, and -1 for not found. Such a change is best not attempted at 10pm - it would lead to too many tired bugs... Otherwise the code compiles, links and appears to run well :-) ------------------------------------------------------------------------ r830 | chris | 2006-07-25 13:59:16 +0100 (Tue, 25 Jul 2006) | 3 lines I have updated the DB classes to allow assignment of angle and dihedral parameters. All of the parameters of tip4p are now correctly assigned (both in python and in the C++ test case). I am now working on getting the larger SB2 and p38 test cases working (they don't currently!) ------------------------------------------------------------------------ r829 | chris | 2006-07-25 11:49:19 +0100 (Tue, 25 Jul 2006) | 7 lines I have created the angle and dihedral tables, and generators, and code necessary to assign them :-) Everything compiles and appears to run well. I am missing the logic in angledb and dihedraldb to create tables and assign parameters, but I can add this after lunch :-) I have come up with really nifty algorithms for generating the angles and dihedrals - see anglegenerator.cpp and dihedralgenerator.cpp ------------------------------------------------------------------------ r828 | chris | 2006-07-24 21:43:15 +0100 (Mon, 24 Jul 2006) | 5 lines I am about to write the angle, dihedral, improper and urey bradley tables. To start, I have swapped GroupedVector to GroupedVector as this is the more normal order (e.g. QHash) Code compiles, links and appears to work ;-) ------------------------------------------------------------------------ r827 | chris | 2006-07-24 20:57:43 +0100 (Mon, 24 Jul 2006) | 5 lines I have finished the testcase for the assignment of tip4p parameters. It works, and behaves almost identically to test/SireDB/assign_tip4p.py. I think that not only is this a good test, but also that it is a good example of the symmetry of the python and C++ API. I have also worked out why some template classes were screwing up virtual inheritance - it is because virtual inheritance won't work through classes that are not exported (e.g. via SIREDB_EXPORT). I will have to check all of my classes and ensure that those that are part of a hierarchy are all exported. ------------------------------------------------------------------------ r826 | chris | 2006-07-24 18:02:33 +0100 (Mon, 24 Jul 2006) | 3 lines I have written a C++ version of test/test.py for the unit test of loading and assigning the parameters of TIP4P. This doesn't work yet though, but happily, it does compile and link :-) ------------------------------------------------------------------------ r825 | chris | 2006-07-24 12:26:22 +0100 (Mon, 24 Jul 2006) | 11 lines Assignment of bond parameters is now working! test/test.py assigns the bonds for tip4p (ok, so not that impressive!) I have added the code that mirrors internal match relationships, so OW-HW matches HW-OW I have added some wrapping of internal lists/sets/vectors. I have also fixed the problem of saving binary data into a database. I have only fixed it for FuncDB and will need to go and fix it at every other place in the code... Everything compiles, links and appears to run well. ------------------------------------------------------------------------ r824 | chris | 2006-07-23 18:53:08 +0100 (Sun, 23 Jul 2006) | 7 lines I am wrapping up more of the assign bonds classes... Break for dinner :-) Code is broken ------------------------------------------------------------------------ r823 | chris | 2006-07-23 16:28:48 +0100 (Sun, 23 Jul 2006) | 3 lines I have finished wrapping up BondTable - the code links and appears to run. I still need to test the object however. ------------------------------------------------------------------------ r822 | chris | 2006-07-21 23:04:02 +0100 (Fri, 21 Jul 2006) | 3 lines working on wrapping BondTable - code is broken (well, only wrap_bondtable.cpp is broken :-) ------------------------------------------------------------------------ r821 | chris | 2006-07-21 15:47:10 +0100 (Fri, 21 Jul 2006) | 3 lines I have fixed the code so that it now compiles, links and seems to run ok. I now need to wrap up assign_bonds and test whether or not it works. If it does, then I should be able to copy all of the 'bond' classes to make the equivalents for angle, dihedral and urey-bradley. ------------------------------------------------------------------------ r820 | chris | 2006-07-21 13:47:59 +0100 (Fri, 21 Jul 2006) | 9 lines So much work..... I have got assign_bonds compiling, though it has yet to be tested. I think that I have finally sorted out the logic of the generation of internals. Essentially, the generator that you pass to assign_internals is used only when the table is first created. By default the generator is the standard one (e.g. BondGenerator) so the 'easy' case does what you expect. Because the generator is not used for existing tables that it will not overwrite a custom table hand-crafted by the more advanced user. I have also added polymorphic stream support to DynamicSharedPtr (i.e. you can now stream the pointer, which will take care of dynamic loading and saving itself!) - this needs to be tested as well. The code is still broken (I need to move the python wrapping of the classes I moved from SireMol to SireMM) ------------------------------------------------------------------------ r819 | chris | 2006-07-20 17:27:30 +0100 (Thu, 20 Jul 2006) | 5 lines I am working on reintegrating the moved code, and am also getting the parts of SireMM to compile. I have discovered many errors in MolInternalInfo and ParameterStore and am trying to fix these. Code is broken ------------------------------------------------------------------------ r818 | chris | 2006-07-20 15:51:50 +0100 (Thu, 20 Jul 2006) | 3 lines I am in the process of moving files - code is very broken!! ------------------------------------------------------------------------ r817 | chris | 2006-07-20 15:45:06 +0100 (Thu, 20 Jul 2006) | 3 lines I have remove the annoying warnings about strict aliasing, and I am working on how the internals are generated by default, and how this may be overridden. I am commiting now as I am going to move the InternalInfo classes into SireMM as they don't belong in SireMol. ------------------------------------------------------------------------ r816 | chris | 2006-07-19 22:24:10 +0100 (Wed, 19 Jul 2006) | 8 lines I have made some progress with the assignment of internals - I have written the interface class for it. I am now just stuck a little on the need to have moleculeinfo in molinternalinfo, so that invalid internals are not added to a molecule. This made me realise that while implicit sharing is great for running, it is horrible for dumping and loading, as it leads to over-duplication of data. I thus had to come up with a way of reducing bloat (see ideas/qdatastream_implicit). Now that I know that I can get around this problem, I am beginning to add MoleculeCGInfo to MolInternalInfo so that it can be used to check the molecule. Note that I will need to update MoleculeCGInfo so that it is a true implicitly shared class (otherwise I will waste so much with the constant copying of MoleculeCGInfo! On another note, while I can assign the parameters of tip4p, and the reference state of SB2, I have not got the assignment of parameters of p38 nor the perturbed state of sb2 working! Code is broken. ------------------------------------------------------------------------ r815 | chris | 2006-07-19 12:41:39 +0100 (Wed, 19 Jul 2006) | 5 lines I have written the atom parameter assignment code (see test/SireDB/assign_tip4p.py) - and it works :-) - well at least for assigning the parameters for tip4p... The code compiles, links and runs, and things seem to be fine (though there may be some errors in the dumping and loading of binary global database parameters... see test/db/protomsdb_speedtest.py and diff the two created databases) ------------------------------------------------------------------------ r814 | chris | 2006-07-18 23:59:59 +0100 (Tue, 18 Jul 2006) | 5 lines I am working on the code to assign parameters from the database - I have created a RelationshipDB class that acts as the interface to the dbs containing relationships. I have written the framework and majority of the code to do the assignments. I have now just got to fill some things in. Code is broken ------------------------------------------------------------------------ r813 | chris | 2006-07-18 16:48:38 +0100 (Tue, 18 Jul 2006) | 7 lines I have wrapped up the ParameterDB classes and they appear to work. Copying and streaming a ParameterDB appears to work as well :-) I think that it was a good idea to make the ParameterDB classes more flexible, and more like the ParameterTable classes. A couple of days work now has perhaps saved some confusion later. The code compiles, links and appears to run well. ------------------------------------------------------------------------ r812 | chris | 2006-07-18 12:44:48 +0100 (Tue, 18 Jul 2006) | 3 lines I have continued wrapping up the database classes. Breaking for lunch... ------------------------------------------------------------------------ r811 | chris | 2006-07-17 21:47:50 +0100 (Mon, 17 Jul 2006) | 5 lines I have updated most of the database code to use the new layout. The SireMM, SireIO and SireDB modules all compile and link. I am now working on updating the python wrapping. The code is broken. ------------------------------------------------------------------------ r810 | chris | 2006-07-17 16:56:16 +0100 (Mon, 17 Jul 2006) | 5 lines I am in the process of re-working the database classes to mirror the design of the table classes. Things are going well, but I must now break for dinner :-) Code is broken ------------------------------------------------------------------------ r809 | chris | 2006-07-17 11:49:39 +0100 (Mon, 17 Jul 2006) | 18 lines I have fixed an incredibally annoying bug that caused a segfault when serialising a ParameterTable. The problem was that QMetaType::save was passed the iterator object, rather than the pointer to the iterator object, e.g. line 49 in parametertable.cpp read; if (not QMetaType::save(ds, id, it)) when it should read if (not QMetaType::save(ds, id, *it)) So much trouble and time was lost because of a single missing asterisk! I need to remember that there is no type-checking for QMetaType::save as it takes a void*, so I must be extra careful with its use. Anyway, now that that is fixed, the ParameterTable can be successfully streamed to and from a binary datastream (see the end of test/test.py). The design of ParameterTable is very powerful, with lots of flexibility and proper streaming (the stream itself contains the information about the components, rather than the user needing to set them up beforehand). This design, especially the streaming, is worth adapting for the ParameterDB classes. Now that I have ParameterTable, ParameterDB should mirror it, especially as this will allow the user to have extreme flexibility and power. I have decided to allow streaming of the ParameterDB class - it will stream the raw SQL needed to write the database. This will contain a table with the names and versions of the DB components, so that these can be created from the stream at load time. The code all compiles and links and runs. ------------------------------------------------------------------------ r808 | chris | 2006-07-14 14:53:53 +0100 (Fri, 14 Jul 2006) | 7 lines I have nearly finished writing all of the machinery... I can now write python code like this (and it works!) table = db.assign(m, assign_atoms( using_parameters(ChargeDB,LJDB), using_relationships(RelateAtomTypeDB)) ) table.assign(db, [ assign_atoms( using_parameters(ChargeDB,LJDB) ), using_relationships(RelateMRADB) ]) ------------------------------------------------------------------------ r807 | chris | 2006-07-14 13:00:27 +0100 (Fri, 14 Jul 2006) | 3 lines I have written more of the code that will be used to assign parameters. It is all working quite well now :-) ------------------------------------------------------------------------ r806 | chris | 2006-07-14 10:30:19 +0100 (Fri, 14 Jul 2006) | 3 lines I have fixed the name mangling problems of getBackTrace and now have pretty nice output (this was to follow up my post on qt-interest). I have moved this function to SireError as it should be there, and not in SireBase! ------------------------------------------------------------------------ r805 | chris | 2006-07-13 17:23:24 +0100 (Thu, 13 Jul 2006) | 17 lines I am working on the classes that will be used to provide the nice syntax for the assignment of parameters. They are coming along well, and will be very powerful, yet easy to understand :-) The idea is to enable the following syntax; params = db.assign( mol, [assign_atoms( atms, using_parameters(ChargeDB,LJDB) ), \ assign_bonds( bonds, using_parameters(BondDB) ), \ using_relationships(RelateMRADB), \ assign_dihedrals( dihs, using_parameters(DihedralDB), \ using_relationships(RelateAtomTypeDB) ) \ ] \ ) So far I have written assign_atoms, using_parameters and using_relationships, and these all seem to work :-) ------------------------------------------------------------------------ r804 | chris | 2006-07-13 12:42:56 +0100 (Thu, 13 Jul 2006) | 7 lines I have wrapped up the LJTable and have got all of the dynamic casting from ParameterTable working :-) See test/test.py (also test/SireDB/parametertable.py) to see how the system allow the creation of a parameter table containing all of the parameters of a TIP4P water molecule. All of the code compiles, links and appears to work ------------------------------------------------------------------------ r803 | chris | 2006-07-13 10:00:19 +0100 (Thu, 13 Jul 2006) | 9 lines Added the wrapping of ChargeTable and got the python wrapping of ParameterTable working so that it can cast using python classes rather than strings (cool :-) Now that I have the cast-via-strings code working I can write my classes so that they look template-ish from python but are really polymorphic underneath. This will allow me to write my parameter assignment code without the hassle of having millions of template instantiated classes. All of the code compiles and runs well. (I have also added getbacktrace.cpp, which is some code I sent to the Qt-interest mailing list, and loadinfo.c which is some I got back :-) ------------------------------------------------------------------------ r802 | chris | 2006-07-12 23:22:47 +0100 (Wed, 12 Jul 2006) | 7 lines I have got the class-by-name code working and have wrapped up ParameterTable to give it a test. See test/test.py - this shows how I can create classes from passed strings and also how I can 'cast' back from the ParameterTable to AtomTypeTable by string :-) This was not originally working as the casting from TableBase to AtomTypeTable got stuck at the template class AtomTableT. I solved this problem (or rather hacked around this problem!) by adding both AtomTableT and AtomTable to the list of bases of AtomTypeTable in wrap_atomtypetable.cpp. Its not the best solution, but it seems to work ok. I think that the problem may be down to the template being instantiated in the wrapper library not being recognised by boost::python as being the same as the template instantiated in libSireDB, though looking at the boost python code I can't work out why this would be the case. The code all compiles and runs and everything seems fine. ------------------------------------------------------------------------ r801 | chris | 2006-07-12 15:50:34 +0100 (Wed, 12 Jul 2006) | 7 lines I have finished updating the code. Everything now compiles, links and runs. sire, spier and siretest all work fine, as do the python modules. I have also now added the serialisation code for ParameterTable - this uses QMetaType for the polymorphic serialisation (see - there was a reason for the madness of the last couple of days :-) The only problem at the moment is a crash with test/test.py as my new DB code causes an assertation failure (parent == 0 in DB component constructor...) ------------------------------------------------------------------------ r800 | chris | 2006-07-12 11:31:41 +0100 (Wed, 12 Jul 2006) | 7 lines I have now updated SireDB and SireFF (and have cleaned up some crufty files). The code is still broken, but there are only a few modules to go... :-) Commit 800 :-) ------------------------------------------------------------------------ r799 | chris | 2006-07-12 10:45:41 +0100 (Wed, 12 Jul 2006) | 3 lines I have now updated everything up to SireDB (which I have just started). The code is broken, but is getting there. ------------------------------------------------------------------------ r798 | chris | 2006-07-11 23:34:01 +0100 (Tue, 11 Jul 2006) | 5 lines Making progress upgrading the streaming operators in SireMol... Code is still broken ------------------------------------------------------------------------ r797 | chris | 2006-07-11 22:23:43 +0100 (Tue, 11 Jul 2006) | 3 lines I have now finished updating SireMaths, SireCAS and SireBase - these now compiles and link. I am about to start fixing SireMol... ------------------------------------------------------------------------ r796 | chris | 2006-07-11 18:06:45 +0100 (Tue, 11 Jul 2006) | 3 lines I am updating the classes to update them to the new QDataStream protocol. The code is very broken, but I am making good progress. I am up to SireCAS/power.cpp (alphabetical progress) ------------------------------------------------------------------------ r795 | chris | 2006-07-11 15:38:23 +0100 (Tue, 11 Jul 2006) | 7 lines I have worked out how to have name based components in the ParameterDB and ParameterTable. I have implemented my ideas in these classes (though they are untested). I have also made progress cleaning up the data streaming operators and cleaning up the exceptions. I have remade SireError and have turned SireStream from a library for text streaming into library used to help with data streaming. The code is very broken as I will need to work through all of the code and update all of the streaming operators... ------------------------------------------------------------------------ r794 | chris | 2006-07-10 21:24:05 +0100 (Mon, 10 Jul 2006) | 5 lines I am thinking about how to assign the parameters from the database to the table. Meanwhile I am beginning to formalising all of the classes by ensuring that they have copy constructors, Q_DECLARE_METAINFO, binary datastreams, magic IDs and versions... ------------------------------------------------------------------------ r793 | chris | 2006-07-10 14:50:27 +0100 (Mon, 10 Jul 2006) | 3 lines I have now tested (and fixed) the wrapping of AtomTypeTable. It is quite nice (the test cases are in test/SireDB/atomtypetable.py) ------------------------------------------------------------------------ r792 | chris | 2006-07-10 13:21:11 +0100 (Mon, 10 Jul 2006) | 5 lines Fixed a compile bug in the wrapping of editres and have also fixed a crash when writing a PDB file (cannot pass ResNum to snprintf function as is can't cope with it) Code now compiles, links and runs without problem. ------------------------------------------------------------------------ r791 | chris | 2006-07-10 11:44:04 +0100 (Mon, 10 Jul 2006) | 5 lines I have cleaned up the wrapping and now everything compiles and runs, and the python scripts in test/ work again. sire, siretest and spier all work correctly, as do the python modules. ------------------------------------------------------------------------ r790 | chris | 2006-07-09 19:58:25 +0100 (Sun, 09 Jul 2006) | 3 lines Wrapping up AtomTable and AtomTypeTable. The code is broken... ------------------------------------------------------------------------ r789 | chris | 2006-07-09 14:01:10 +0100 (Sun, 09 Jul 2006) | 3 lines I have now wrapped up the ID types, and rewrapped the Atom, AtomIndex and Element classes. ------------------------------------------------------------------------ r788 | chris | 2006-07-08 23:18:14 +0100 (Sat, 08 Jul 2006) | 3 lines I have updated the rest of the code so that it is compatible with the new class-based ID types. Everything now compiles and links, sire, siretest and spier work. I need to wrap up the new class-based ID types so that the test scripts will work. ------------------------------------------------------------------------ r787 | chris | 2006-07-07 16:46:27 +0100 (Fri, 07 Jul 2006) | 3 lines Updating the code to use the new class-based ID types. The code is still broken. ------------------------------------------------------------------------ r786 | chris | 2006-07-07 12:22:52 +0100 (Fri, 07 Jul 2006) | 5 lines I am now working on converting each ID type from a typedef into a class type. This should reduce bugs by increasing the type safety of the types, and should also ease the wrapping of functions that are distinguished by these types (since now the user can unambiguously say what type of ID they want to use) The code is currently very broken !! ------------------------------------------------------------------------ r785 | chris | 2006-07-07 10:02:40 +0100 (Fri, 07 Jul 2006) | 3 lines I have wrapped up AtomTable. I have also realised that I cannot use typedefs to overload functions (e.g. overloaded nAtoms via typedefs for CutGroupID and ResNum). I will need to make small classes to represent these types... ------------------------------------------------------------------------ r784 | chris | 2006-07-05 17:25:34 +0100 (Wed, 05 Jul 2006) | 3 lines I have cleaned up some of the python wrappping and have also wrapped up all of the enums and function in the global Qt namespace. ------------------------------------------------------------------------ r783 | chris | 2006-07-04 23:03:20 +0100 (Tue, 04 Jul 2006) | 3 lines I have used boost::mpl to solve the problem of the python wrapping of Qt containers when returning non-const references to objects via the indexing operators. The problem was that this won't work if the containers contain POD types. I now use boost::mpl to change the return policy of these wrappers when the container contains a POD type. ------------------------------------------------------------------------ r782 | chris | 2006-07-03 21:51:30 +0100 (Mon, 03 Jul 2006) | 5 lines I have fixed some compile problems with the last revision (SireDB/wrap_atomtable.cpp) was not compiling due to problems with wrapGroupedVector.hpp I have also wrapped QTextStream ------------------------------------------------------------------------ r781 | chris | 2006-07-03 12:27:23 +0100 (Mon, 03 Jul 2006) | 5 lines I have now wrapped up QList, QSet, QHash and QMap in addition to QVector. They all seem to work well, and behave exactly like the comparitive python types. The code all compiles and runs, though the changes to __str__ that I introduced means that the python tests don't run. I will need to go over the python wrapping of quite a few things and update it. ------------------------------------------------------------------------ r780 | chris | 2006-07-03 09:45:15 +0100 (Mon, 03 Jul 2006) | 3 lines Got nice printing of list types, and have wrapped up some more QVectors... ------------------------------------------------------------------------ r779 | chris | 2006-07-02 23:02:28 +0100 (Sun, 02 Jul 2006) | 10 lines I have completed the python wrapping of QString, QByteArray, QIODevice and QFile, and have fully sorted out the datastream operations. Things are really nice - I can even reverse-slice a QString, e.g. s = QString("Hello World!") print s[12::-1] outputs; "!dlroW olleH ------------------------------------------------------------------------ r778 | chris | 2006-07-02 17:02:32 +0100 (Sun, 02 Jul 2006) | 5 lines I have much improved the python wrapping of QString and have also now wrapped up QDataStream and QChar, and have got binary data streaming working :-) Code compiles and runs. Go play with Sire.Qt :-) ------------------------------------------------------------------------ r777 | chris | 2006-07-01 23:50:30 +0100 (Sat, 01 Jul 2006) | 5 lines I have sorted out the nice wrapping of QVector, and have exposed QVector, QVector, QVector and QVector. I think that I have got a complete wrapping working, complete with automatic conversion from python tuple and list :-) The code compiles and links, and sire, siretest, spier and python modules all seem to work. ------------------------------------------------------------------------ r776 | chris | 2006-07-01 00:00:55 +0100 (Sat, 01 Jul 2006) | 3 lines I am in the process of improving the wrapping of QVector and QString. I want to provide a reasonably complete set of wrappers for the basic Qt classes so that they can be used with Sire. I also want to add a lot of conversion functions from lists/tuples/dicts to the Qt equivelents, as this helps create interesting and friendly syntax. ------------------------------------------------------------------------ r775 | chris | 2006-06-30 16:30:41 +0100 (Fri, 30 Jun 2006) | 3 lines I have wrapped up AtomTable and GroupedVector. I have also improved the wrapping of container classes and will extend this by creating better wrapping for the Qt container classes. ------------------------------------------------------------------------ r774 | chris | 2006-06-30 12:07:16 +0100 (Fri, 30 Jun 2006) | 30 lines I am still filling in the missing functions. The code is broken. The new code is very powerful however, with new functions that allow parameters to be directly copied into generic arrays, e.g. ChargeParameters can be directly copied into QVector arrays :-) I have also had some good ideas about how I will do checkpointing... I won't :-) I will make SimSystem into an implicitly shared class, and then the user can just copy it whenever they want. The copy will be the checkpoint. Implicit sharing means that only the things that change will be copied, so this should be relatively quick. The user can then copy back to restore an old checkpoint, or can even branch the simulation in multiple directions. Implemented correctly, this will provide an incredibally powerful mechanism for writing complex simulations. I have also realised that the way we do MC moves in ProtoMS is a bit stupid. Currently we do; MCMove: Choose what to move. Get old energy of things that will move. Make the move. Get new energy of things that will move. Calculate the difference in energy, accept or reject the move. The MCMove is responsible for keeping track of the changes in energy and for doing the bookkeeping. Also, the move needs to keep track of what is moving. A better solution would be; MVMove: Obtain the current total energy from the forcefield Move some things (implicitly tells the forcefield what has moved) Obtain the new total energy from the forcefield Calculate the difference and accept of reject Now the forcefield keeps track of what has moved, and indeed has the old and new coordinates together when it calculates the change in energy. This means that it can do any caching or other tricks it wants, as it has all of the information at once. Implicit sharing again makes this memory efficient (as 'old' and 'new' coordinates are effectively shared across all forcefields). Also, the move is now easier to network, as only a single network request per move is required. It also works better with nested moves, as the forcefield itself knows how many things have moved, and it is not necessary for the MCMove to do any bookkeeping. The forcefield is also responsible for updating its total energy and keeping it up to date. This again is better than the MCMove trying to do that. Finally, this move doesn't add overhead to forcefields that require total energy calculations (e.g. QM) - they no longer have to expose a useless "energy(components)" function that can't do what it advertises. ------------------------------------------------------------------------ r773 | chris | 2006-06-29 18:25:24 +0100 (Thu, 29 Jun 2006) | 9 lines I have now filled in most of the API and the code now compiles, links and runs. I still need to wrap up the tables, at which point I will no doubt find more functions that I have missed! :-) I have yet to test any of the table classes... The code at least now compiles, links and runs, and sire, siretest and spier all appear to work. I have also added a small test application (testlink) that tests a link of all libraries to ensure that there are no link errors or missing symbols. ------------------------------------------------------------------------ r772 | chris | 2006-06-29 09:39:55 +0100 (Thu, 29 Jun 2006) | 3 lines Still filling in functions... Code is still broken ------------------------------------------------------------------------ r771 | chris | 2006-06-28 18:14:44 +0100 (Wed, 28 Jun 2006) | 3 lines I am still filling in the functions... code is still broken! ------------------------------------------------------------------------ r770 | chris | 2006-06-28 11:54:13 +0100 (Wed, 28 Jun 2006) | 3 lines Still working on the parameter tables....! I have pretty much sorted out the API and am now filling in the missing functions. The code isbroken. ------------------------------------------------------------------------ r769 | chris | 2006-06-27 17:30:36 +0100 (Tue, 27 Jun 2006) | 3 lines Still working on the table classes. I am getting there, and think that I have sorted out the API that I want. The code is still very broken. ------------------------------------------------------------------------ r768 | chris | 2006-06-26 17:15:35 +0100 (Mon, 26 Jun 2006) | 11 lines Beginning work on BondTable - this means updating ParameterStore. The code is broken I have also added code to allow conversion from python tuple to a QList, so that I have a nice syntax for Sire.CAS, e.g. f.evaluate( (x==5.0, y==3.2) ) f.substitute( (g(x) == pow(x,2), h(x) == Sin(x)) ) ------------------------------------------------------------------------ r767 | chris | 2006-06-26 15:06:14 +0100 (Mon, 26 Jun 2006) | 21 lines Fixed link flags so that it compiles and links on scruffy The timings for test/db/protomsdb_speedtest.py are similar to those recorded for 736 ## cubert (gcc4.1.1) ## reading parameter files took 966 ms ## dumping database took 145 ms ## loading database took 255 ms ## dumping second database took 142 ms ## scruffy (gcc 4.1.1, 64bit) ## reading parameter files took 476 ms ## dumping database took 74 ms ## loading database took 110 ms ## dumping second database took 50 ms (must remember when taking timings to ensure that the processor is running at full speed, i.e. initial tests for scruffy showed similar speed to cubert, but this was scruffy running at its lowest speed compared to cubert running at full speed :-) ------------------------------------------------------------------------ r766 | chris | 2006-06-26 14:37:43 +0100 (Mon, 26 Jun 2006) | 3 lines I had to add the private Qt header file to QSqliteDriver so that I know that it is always available for the compile (e.g. it wasn't available on scruffy!) ------------------------------------------------------------------------ r765 | chris | 2006-06-26 14:30:04 +0100 (Mon, 26 Jun 2006) | 5 lines I have added the qsqlite driver and Qt-supplied sqlite3 source directly to the Sire codebase, in SqliteDriver. This means that the code will be directly compiled and linked with Sire, thus simplifying the distribution of the binary. All of the code compiles, links and runs :-), and sire, siretest and spier work without problem, and the test scripts run with python2.3 and python2.4 ------------------------------------------------------------------------ r764 | chris | 2006-06-26 12:00:32 +0100 (Mon, 26 Jun 2006) | 3 lines I am so nearly there... The code compiles and runs ok. There is a small problem with finding the path to the qsqlite plugin, but I am in the process of fixing that. Once this is done, then the scripts will all work in either sire or in plain python :-) ------------------------------------------------------------------------ r763 | chris | 2006-06-26 10:35:10 +0100 (Mon, 26 Jun 2006) | 3 lines making a bit of a mess of the file moving... ------------------------------------------------------------------------ r762 | chris | 2006-06-26 10:33:11 +0100 (Mon, 26 Jun 2006) | 3 lines Still moving files... ------------------------------------------------------------------------ r761 | chris | 2006-06-26 10:24:06 +0100 (Mon, 26 Jun 2006) | 5 lines Renamed the modules - I now need to update all of the internals... Code is broken ------------------------------------------------------------------------ r760 | chris | 2006-06-26 10:21:07 +0100 (Mon, 26 Jun 2006) | 3 lines I have just about finished getting Sire working correctly from within a normal python shell. Everything is linking and there are now only a few small issues to resolve. The most important is sorting out the namespace issues within python, namely changing SireModule to Sire.Module (so that I can write "from Sire import *" or "from Sire.Mol import *" ------------------------------------------------------------------------ r759 | chris | 2006-06-25 23:19:11 +0100 (Sun, 25 Jun 2006) | 7 lines This is quite a major change - I have separated out all of the python wrappers into their own libraries. This will allow sire to be used with a normal python interpreter, and should simplify its use with Sire. Note that the code is still broken - splitting in this way has caused problems with missing functions that I have forgotten to export... The code does however compile and install, and siretest and spier run correctly. ------------------------------------------------------------------------ r758 | chris | 2006-06-25 13:12:23 +0100 (Sun, 25 Jun 2006) | 5 lines Begining to move all of the Python wrapping code into separate directories and libraries. This will help me to enforce the separation of python from C++ (and also to get an idea of how large my C++ libraries are compared to their wrapping) Code is broken ------------------------------------------------------------------------ r757 | chris | 2006-06-25 12:35:08 +0100 (Sun, 25 Jun 2006) | 13 lines I have got automatic python tuple to boost::tuple conversion working, and then boost::tuple to AtomIndex, Bond, Angle etc. This means that I can now write in python; bonds.addBond( (("C",1),("H",1)) ) which is much less verbose than bonds.addBond( Bond(AtomIndex("C",1),AtomIndex("H",1)) ) All code compiles and runs :-) ------------------------------------------------------------------------ r756 | chris | 2006-06-25 00:56:33 +0100 (Sun, 25 Jun 2006) | 3 lines I have got my head around the python conversion functions and am writing a converter to convert python tuples to boost::tuple, so that I can create a nice syntax for creating bonds. ------------------------------------------------------------------------ r755 | chris | 2006-06-23 15:50:35 +0100 (Fri, 23 Jun 2006) | 11 lines I have fixed the problems with the residueinfo classes losing the information passed to them by the molinfo classes. The problem was that InternalInfo was not updating the groupids object of the extracted InternalInfo representing the residue. I have fixed more bugs and have also written and wrapped the MolDihedralInfo and ResDihedralInfo classes. These are shown and slightly tested in test/test.py All of the code compiles, links and runs, and sire, siretest and spier appear to run without any problems. Code also works with icc (I've had to update the qmakespec rules for icc to include '-gcc-version=345 -gcc-name=gcc-3.4.5' in the QMAKE_CFLAGS so that icc uses the right version of gcc (it doesn't like gcc4!). It would be nice to upgrade to icc9 but that doesn't have a non-profit version. ------------------------------------------------------------------------ r754 | chris | 2006-06-23 12:22:48 +0100 (Fri, 23 Jun 2006) | 5 lines I have added (and wrapped) the metadata objects for internal angles (MolAngleInfo and ResAngleInfo). I have also added some extra functionality to the iterator class so that the user can jump over groups that have the wrong residue combination. Code compiles and runs, though I have yet to fix the problem with the residueinfo object not picking up the internals from the molinfo object. ------------------------------------------------------------------------ r753 | chris | 2006-06-22 16:51:17 +0100 (Thu, 22 Jun 2006) | 5 lines I have created and wrapped up the ResBondInfo class and am beginning to test it. There seems to be a problem with the ResBondInfo reporting that there are no bonds in the residue, despite the MolBondInfo containing some... sire, spier and siretest all compile and run ok ------------------------------------------------------------------------ r752 | chris | 2006-06-22 15:52:24 +0100 (Thu, 22 Jun 2006) | 5 lines I've completed the python wrappers and the code now all compiles and runs, and the MolBondInfo class appears to be working... (see test/test.py) sire, siretest and spier all appear to work. ------------------------------------------------------------------------ r751 | chris | 2006-06-22 14:45:06 +0100 (Thu, 22 Jun 2006) | 3 lines I am filling in functions and writing the python wrapping code for the MolInternalInfo classes. Code is still broken. ------------------------------------------------------------------------ r750 | chris | 2006-06-22 11:53:26 +0100 (Thu, 22 Jun 2006) | 4 lines Last night I split the BondResID, BondAtomID etc. classes out into internaldatatypes.h/.cpp, and then I defined equivalents for Angle and Dihedral. I have been debugging the code I wrote yesterday and it now (finally!) compiles, though there are still some missing template functions that need to be written, so it doesn't link. ------------------------------------------------------------------------ r749 | chris | 2006-06-21 16:47:36 +0100 (Wed, 21 Jun 2006) | 3 lines Still working on the bond meta info classes. Things are going well as I have now written InternalGroup, InternalGroupIterator and InternalInfo, and have integrated then with MolBondInfo. The code is still broken, but I should be able to fix it tonight. ------------------------------------------------------------------------ r748 | chris | 2006-06-21 11:56:12 +0100 (Wed, 21 Jun 2006) | 5 lines Continuing to work on the MolBondInfo object - I have now got a sufficient idea of how it will work that I am now working on the template base class that will be used to create MolBondInfo and all of the other internal info classes (ResBondInfo, MolAngleInfo, ResDihedralInfo etc. ) Code is broken ------------------------------------------------------------------------ r747 | chris | 2006-06-20 17:18:15 +0100 (Tue, 20 Jun 2006) | 3 lines Getting back to working on MolBondInfo - I am building an iterator so that I can iterate over sets of bonds without lots of copying. ------------------------------------------------------------------------ r746 | chris | 2006-06-20 14:20:05 +0100 (Tue, 20 Jun 2006) | 5 lines Updated the build system a little bit. The python flags are now automatically detected and there is a little more cleaning and automation. I have also added some more documentation to the configure.pri file and have cleaned up all of the local.pri files in the different sire module directories. All of the code compiles, links and runs ok - sire, siretest and spier all seem to work. ------------------------------------------------------------------------ r745 | chris | 2006-06-19 17:04:53 +0100 (Mon, 19 Jun 2006) | 8 lines I have finished updating the code to use symbol hiding. The code now all compiles and runs correctly using gcc4.1. sire, siretest and spier all work. You can disable symbol hiding either by setting sire.no_symbol_hiding to any value in configure.pri in Sire/trunk, or you can disable it on a module by module basis by setting it to any value in local.pri in the module source directory. ------------------------------------------------------------------------ r744 | chris | 2006-06-19 11:54:51 +0100 (Mon, 19 Jun 2006) | 7 lines I have upgraded cubert to gcc4.1 and am now updating the code so that it takes advantage of gcc4's symbol visibility support. This is giving me the opportunity to remove dead and crufty code as well! The code is currently broken :-) ------------------------------------------------------------------------ r743 | chris | 2006-06-16 11:56:04 +0100 (Fri, 16 Jun 2006) | 3 lines I have now created and python wrapped the AtomTypeTable and AtomTable classes (and AtomTableT and ParameterStore). They appear to work, and the code compiles, links and runs. sire, siretest and spier all appear to run correctly. ------------------------------------------------------------------------ r742 | chris | 2006-06-15 16:10:42 +0100 (Thu, 15 Jun 2006) | 34 lines I have spent the last couple of days working on the parameter table classes. I am still working out the details of how the parameter tables will be combined into a single class (see techdocs/testtemplatetypedef.cpp). In terms of each of the tables, I have come up with the following design; Virtual base class: AtomTable -> holds metainfo in AtomTableData class. Then derived class: AtomTableT : public virtual AtomTable \_ this class holds the parameters themselves in a ParameterStore object Then derived class: AtomTypeTable : public AtomTableT Virtual inheritance and implicit sharing mean that even if I have a multipally inherited table class, e.g AtomTypeTable:ChargeTable:LJTable, then it would still have only a single AtomTable base class containing only a single copy of the metadata for the molecule. Then separating them out is easy, as the virtual inheritance ensures that a separated AtomTypeTable would take with it a copy of the AtomTable with its associated metadata. The ParameterStore object is interesting; it stores the parameters in QVector groups, with a template-defined index used to index the groups. For AtomTableT, the index is CutGroupID. This means that the atom-based parameters are stored in QVectors that match up with the QVectors of atoms in the CutGroups. For the internals (bond,angle,dihedral,etc.) I will use this class, but with a ResMapID. The internals will be broken down into groups according to their ResMapID. Each residue bonding combination is assigned a unique ResMapID, e.g. res 33 bond to res 33 may be given ResMapID = 1, while res 33 bonded to res 34 may be given ResMapID = 2. All of the bonds from res 33 to res 33 will then be stored in a different QVector to all of the bonds between 33 and 34, and these QVectors will be stored in a QHash indexed by the ResMapID. The beauty of this scheme is that it allows trivial lookup of all of the bonds/angles/dihedrals/etc. that involve a particular residue, or group of residues, e.g. all bonds that involve residue 33 would be in groups with ResMapID 1 and 2, while those involving 34 would be in the group with ResMapID 2. I will cache this information (e.g. have a list of ResMapIDs for each residue) so that it is then trivial to go from sets of residues to sets of bonds/angles/dihedrals/etc. I will create MolBondInfo, MolAngleInfo and MolDihedralInfo classes that will act like the MoleculeCGInfo class, and allow the easy transformation from Bond/Angle/Dihedral objects to ResMapID:index objects. These may then be used to look up the internal parameters. I will also include sufficient information in the new Mol??Info objects so that they can be queried to return the set of ResMapIDs that contain the internals for a set of residues, and can map from ResMapID:index back to a bond/angle/dihedral. Once these are complete, I can then create the tables that hold the internal parameters, e.g. BondTable : public BondTableT (public virtual BondTableBase - contains BondTableData/MolBondInfo) AngleTable : public AngleTableT (public virtual AngleTableBase - contains AngleTableData/MolAngleInfo) DihedralTable : public DihedralTableT (public virtual DihedralTableBase - contains DihedralTableData/MolDihedralInfo) The code is currently broken and will not compile. ------------------------------------------------------------------------ r741 | chris | 2006-06-13 16:47:39 +0100 (Tue, 13 Jun 2006) | 7 lines Now that the parameter databases look to be working, and that ProtoMS files appear to be read correctly, I am now working on the assignment of parameters and storage in parameter tables. This will be a complex piece of code relying on partial template specialisation and virtual inheritance to combine different sub-classes together - indeed it will be very similar to the database classes themselves. The first steps have been the creation of separate files for ChargeParameter (replacement for 'double' representation of charge parameters), LJParameter and CLJPair. I have also created a SireDB::combine_parameter class that can default-combine parameters together, and an overridden CLJParameter class that will be used for the combination of ChargeParameter with LJParameter (this is specified via the partial template specialisation of choose_combine_holder_type from SireDB/combine_parameter.hpp) Code compiles, links and runs correctly, and siretest and spier work. ------------------------------------------------------------------------ r740 | chris | 2006-06-13 13:09:45 +0100 (Tue, 13 Jun 2006) | 13 lines The residue aliasing code does appear to be working - it was an error in test/test.py I have written; m.alias( res_name == "SER" and match, "middle serine" ) when I should have written m.alias( (res_name == "SER") & match, "middle serine" ) This highlights the problem of python's operators... ------------------------------------------------------------------------ r739 | chris | 2006-06-13 11:50:53 +0100 (Tue, 13 Jun 2006) | 16 lines I have wrapped up the MatchData family of classes - it is now possible to specify relationships in python and add those to the database directly :-) I am playing around with this in test/test.py (which demonstrates quite a few relationships) Nearly everything seems to be ok - the only exception is that there may be an error when adding residue aliases. I will look into this after lunch. Note that python's operators are slightly more brain dead than C++. In python, you cannot use 'and' (it doesn't crash, just does the wrong thing :-(. You have to use '&'. Also, '&' has higher precedence that '==', so you have to write matches like; db.relateCharge( (res_name == "ALA") & (atom_name == "CH2"), 0.5 ) which compares to C++ db.relateCharge( res_name == "ALA" and atom_name == "CH2", 0.5 ); ------------------------------------------------------------------------ r738 | chris | 2006-06-12 17:08:37 +0100 (Mon, 12 Jun 2006) | 3 lines Working on some of the python code for SireDB - have written code that performs deep copies of databases, and can replicate the 'isA()' functionality of the C++ versions. ------------------------------------------------------------------------ r737 | chris | 2006-06-12 16:33:37 +0100 (Mon, 12 Jun 2006) | 3 lines I have fixed a few more bugs that I noticed when loading the database (most importantly, that the atom type helpers were not passing on the information about which atom they referred to). I have also modified the dumping and loading so that it is possible to dump and load from a file, string or text stream. I have used to string dump/load functions to write a small python-based function that can take a deep copy of the database. This is something that is not possible in C++, as that cannot return an object by reference. ------------------------------------------------------------------------ r736 | chris | 2006-06-12 14:53:48 +0100 (Mon, 12 Jun 2006) | 27 lines I have completed the timings for scruffy, 64bit gcc4.1. The timings to run the parts of test/test.py for the three systems were; ## icc on cubert: ## reading parameter files took 1134 ms ## dumping database took 107 ms ## loading database took 250 ms ## dumping database again took 108 ms ## ## gcc3.4 on cubert ## reading parameter file took 1117 ms ## dumping database took 105 ms ## loading database took 250 ms ## dumping database again took 108 ms ## ## gcc4.1 on scruffy ## reading parameter file took 580 ms ## dumping database took 42 ms ## loading database took 116 ms ## dumping database again took 43 ms The dumped database files are identical for each of the three codes, even between cubert and scruffy (thus showing that the database dump is independent of 32bit or 64bit (and I hope that the use of QByteArray means that it should also be independent of endianess) The timings show that there is nothing between icc and gcc3.4 on this test, and that scruffy is much faster than cubert! The reason that gcc and icc are showing very similar times is, I think, because they are both using gcc compiled libraries. I am sure that the icc version would be faster if it was linked to icc-compiled versions of Qt and GSL etc. ------------------------------------------------------------------------ r735 | chris | 2006-06-12 14:42:15 +0100 (Mon, 12 Jun 2006) | 5 lines I fixed the problem with the missing RelateMRADB - I had accidentally inherited it in CLJDB, so there were two copies in ProtoMSDB. This meant that a single copy could not be found by dynamic_cast (nor by the python wrapping) so it failed to appear. I have removed the extraneous copy and everything works now. I have debugged some more (there were problems with RelateMRDB not properly adding residue names) and now the database looks like it is correct. Dumping and loading of the database works, and I have been doing some timing (as the code now works using gcc3.4 and icc on cubert, and 64bit gcc4.1 on scruffy) - see test.py ------------------------------------------------------------------------ r734 | chris | 2006-06-12 11:53:28 +0100 (Mon, 12 Jun 2006) | 3 lines I have wrapped up the ProtoMS file reader in python and have begun trying to load ProtoMS parameter files. I have fixed a few bugs, and it now appears to all work well. The only problem is that ProtoMSWS is not detecting that the database has a RelateMRADB component, so it is failing to read in the template classes. ------------------------------------------------------------------------ r733 | chris | 2006-06-12 10:56:05 +0100 (Mon, 12 Jun 2006) | 3 lines I have added the code necessary to allow Sire to compile and link using gcc4 (mainly updating all of the qHash declarations). sire, siretest and spier now all run correctly on scruffy (athlon64, gcc4.1, 64bit). Things are going well :-) ------------------------------------------------------------------------ r732 | chris | 2006-06-12 09:17:55 +0100 (Mon, 12 Jun 2006) | 3 lines Code now compiles, links and runs correctly with gcc 3.4 as well. I will now see if it still works with gcc4 on athlon64... ------------------------------------------------------------------------ r731 | chris | 2006-06-11 16:06:13 +0100 (Sun, 11 Jun 2006) | 7 lines I have fixed the problem with the python wrapping of ProtoMSDB - the problem was that a class will not be wrapped unless all of the classes that are specified in bases<..> have also been wrapped (and specified before this class). ProtoMSDB was not wrapping because not_specified was not wrapped. In debugging this, I have now compiled the code using icc (v8.1), and now sire, siretest and spier all compile, link and run correctly using this compiler. ProtoMSDB wraps up, and its inheritance hierarchy looks good (run sire test/test.py to see). I still need to test this class, but the dumped database looks correct. ------------------------------------------------------------------------ r730 | chris | 2006-06-09 16:42:38 +0100 (Fri, 09 Jun 2006) | 5 lines I have fixed the problem with the DBBase failing to find the ParameterDB - the problem was that all of the DBBase were private or protected inherited. Need to have at least one public interited one to work. See testmultiple.cpp for more information and to play with this yourself. I am now struggling with the problem that the boost python wrapping isn't working and fails to output the ProtoMSDB class if I try to specify its inheritance - this needs fixing :-) ------------------------------------------------------------------------ r729 | chris | 2006-06-09 13:30:34 +0100 (Fri, 09 Jun 2006) | 3 lines I have written the code to wrap up the combined database classes and am beginning to test it. I am currently having the problem that the database components cannot find the pointer to the parent ParameterDB - it seems to be some obscure problem with dynamic_cast. I am looking into it... ------------------------------------------------------------------------ r728 | chris | 2006-06-08 16:28:59 +0100 (Thu, 08 Jun 2006) | 5 lines I am working on the template classes (build_database, contains_relationships and contains_parameters) that will be used to combine database components together into a single poweful parameter database object. The code is broken at the moment... ------------------------------------------------------------------------ r727 | chris | 2006-06-08 11:54:27 +0100 (Thu, 08 Jun 2006) | 3 lines I have wrapped up the SireDB and SireMM user-facing database classes. I still need to wrap up the Match classes and sort out their operators... ------------------------------------------------------------------------ r726 | chris | 2006-06-08 10:08:52 +0100 (Thu, 08 Jun 2006) | 5 lines I have filled in the missing functions and the code now fully compiles and links, and siretest, sire and spier all appear to run correctly. My next job is to wrap up the database and matching classes in python so that I can write test scripts. ------------------------------------------------------------------------ r725 | chris | 2006-06-07 16:21:38 +0100 (Wed, 07 Jun 2006) | 3 lines Code now all compiles, but doesn't link. I will need to fill in the missing functions, then wrap up all of the new code and provide test cases. ------------------------------------------------------------------------ r724 | chris | 2006-06-07 15:01:41 +0100 (Wed, 07 Jun 2006) | 3 lines I have written all of the code now to read in a ProtoMS2 parameter file - I just now need to get everything to compile and link. I am having to adjust some of the SireDB code as I am making the distinction between using MatchMRAData for multiple atom matches, while only using MatchMRA for single atom matches. ------------------------------------------------------------------------ r723 | chris | 2006-06-07 11:50:14 +0100 (Wed, 07 Jun 2006) | 3 lines Now very close to finishing the ProtoMS parameter file reading class. I am putting in the final touches, e.g. the reading of parameter relationships for specified bonds, angles, dihedrals and Urey-Bradley groups. Things are looking up :-) ------------------------------------------------------------------------ r722 | chris | 2006-06-06 16:44:22 +0100 (Tue, 06 Jun 2006) | 3 lines I have added a Urey-Bradley term database and have written most of the ProtoMS parameter file reader functions. The code is still broken but it is now very nearly ready. I have added a ProtoMSWS class that provides a workspace in which data is held while the parameter file is being read. This prevents repeated lookup and generation of state data and has helped to abstract a lot of the low-level code away from the main ProtoMS class. ------------------------------------------------------------------------ r721 | chris | 2006-06-06 10:01:03 +0100 (Tue, 06 Jun 2006) | 3 lines Committing the change of file name - code is still broken ------------------------------------------------------------------------ r720 | chris | 2006-06-06 09:59:29 +0100 (Tue, 06 Jun 2006) | 5 lines I am in the process of renaming FFParentDB and FFChildDB to ParameterDB and DBBase, as these names more accurately convey how the classes are used, and also makes clearer code that uses these classes, e.g. ProtoMS::read(QString filename, ParameterDB &db) is a lot more clear than ProtoMS::read(QString filename, FFParentDB &db). Code is broken ------------------------------------------------------------------------ r719 | chris | 2006-05-26 16:51:07 +0100 (Fri, 26 May 2006) | 5 lines Added the code necessary to allow functional terms to be added to the database, and then for the functions that are composed of those terms to be used as parameters. I have also written the code to allow residue aliases to be used. This allows the chain templates of ProtoMS to be loaded up, and is actually quite elegant (and more powerful). Code is broken ------------------------------------------------------------------------ r718 | chris | 2006-05-25 16:50:57 +0100 (Thu, 25 May 2006) | 3 lines Making headway adding terms to the function database. I am using the SireCAS::Function code that I built into SireCAS. This does almost exactly what I want, and will allow for very flexible (and recursive) substitution. Code is broken ------------------------------------------------------------------------ r717 | chris | 2006-05-25 15:08:16 +0100 (Thu, 25 May 2006) | 4 lines I have written the database containing relationships based on atom types. The code is very similar to that for the atom names and numbers, which is good as I am beginning to feel that this design is correct (the code is now flowing, rather than spluttering!) ------------------------------------------------------------------------ r716 | chris | 2006-05-25 11:28:56 +0100 (Thu, 25 May 2006) | 5 lines Writing the code for matching atom types. Have written MatchAtomType and MatchAtomTypeData and have added the match helpers for these classes (atom_type == ... and atom_element == ...). I am about to start writing the RelateAtomTypeDB class that will hold the matching relationships involving atom types. ------------------------------------------------------------------------ r715 | chris | 2006-05-24 16:13:54 +0100 (Wed, 24 May 2006) | 15 lines Still working on matching. I am now at the point where I have the following tasks to complete; (1) Write code to allow 'terms' to be used in FuncDB. Each FuncDB will contain a database of terms, with symbols used to represent the terms in the equations. These symbols will be substituted when the parameters are assigned? (2) Write code to provide the atom type DB and MatchAtomType classes. This will contain the logic to allow matching on atom types, including wild atom type matching, and wild-element type matching. (3) Write code to load relationships (see the template readers in ProtoMS::read) (4) Write parameter table code - this will take ParentTable and ChildTable and allow them to be combined into a generic table that will hold all of the different assigned parameters. I have still to work out how this will work with regards to the more complex combined types that will be produced by the database... (5) Write the code to do the actual parameter assignment. Once this is done I shall be able to assign a wide variety of forcefields and can then move on to writing the forcefield and simulation code. :-) The code now compiles and links, and sire and siretest run without problems. I have not tested any of the new SireDB and SireMM code... ------------------------------------------------------------------------ r714 | chris | 2006-05-24 11:43:03 +0100 (Wed, 24 May 2006) | 3 lines Making lots of progress filling in the machinery of RelateMRDB and RelateMRADB. Code is still broken. ------------------------------------------------------------------------ r713 | chris | 2006-05-23 16:23:43 +0100 (Tue, 23 May 2006) | 5 lines SireDB is taking such a long time to write... Code is still not ready and is broken I have split all of the name matching into a new NameDB class. This abstracts all name and case-sensitivity code into a single location. I am in the process of finishing off RelateMRDB, and I think that it is looking ok. There is definitely more logic in it than there was originally. I have yet to work out how I will deal with reverse matching... (e.g. will need to know the order of a multi-atom match, e.g. have I matched atom0-atom1 or atom1-atom0. This is important for chained searches, e.g. can't pair up a mol/res match of atom0-atom1 with an atom match of atom1-atom0!). There are also implications for non-symmetrical forcefield terms, and coupled terms that do distinguish between atom0-atom1 and atom1-atom0... (though I am not sure how?) ------------------------------------------------------------------------ r712 | chris | 2006-05-23 11:41:40 +0100 (Tue, 23 May 2006) | 24 lines Continuing work on SireDB. I am on yet another small redesign (one day I will finally be happy...). I am moving the molecule and residue matching criteria up into a parent class as these should be separate from the atom matching criteria. This way, I can match the molecule and residue, then match the atom via name (MatchMRA), atom type (MatchAtomType) or smiles (MatchSmiles). The molecule and residue criteria help limit the matching to specified molecules and residues. I have added criteria for the molecule group (e.g. "protein" or "solvent") and also state (e.g. "reference" or "perturbed") to the molecule matching criteria. This will allow the limiting of matching to particular groups of molecules of particular states (e.g. lambda states). This, combined with a new way of 'and' combining matches (last match overrides first) means that I will soon be able to allow the user to override match types when assigning parameters, e.g. could do params = db.assign( my_molecule, mol_state == "perturbed" ); or to do name aliases params = db.assign( my_molecule, mol_name == "p38" ); The passed MatchMR (mol/res) criteria are and-combined with the matching criteria of each atom, overriding whatever else is set. The user is thus able to fine-tune the parameter assignment, e.g. could renumber from 1 via; ########## i = 0 foreach residue in mol.residues(): i++ params[i] = db.assign( mol, residue, res_num == i ) ########## The 'res_num == i' will overwrite whatever the res_num was when the residue is examined. This allows residue renumbering without the hassle of actually renumbering the residues in the molecule. In addition to this I have also written the AtomTypeDB, used to store atom types. I will need to modify this so that it will be able to access atom types by name, rather than as current via name and element. ------------------------------------------------------------------------ r711 | chris | 2006-05-18 15:57:00 +0100 (Thu, 18 May 2006) | 5 lines Still working on the databases. Have cleaned the code up so that it now all compiles, siretest works as does sire and spier. Database and matching code is still untested. ------------------------------------------------------------------------ r710 | chris | 2006-05-18 11:41:52 +0100 (Thu, 18 May 2006) | 7 lines I have added SireFF and SireMM back to the code, and have cleaned them up so that they compile again (though this has been achieved mainly by removing old code). Working on RelateDB, which forms the base class of most databases that want to relate parameters to both user supplied ID strings, and also to atom matching relationships. Code is broken ------------------------------------------------------------------------ r709 | chris | 2006-05-16 11:55:24 +0100 (Tue, 16 May 2006) | 3 lines Working on the logic of adding and searching for atomic relationships. Code is broken. ------------------------------------------------------------------------ r708 | chris | 2006-05-15 15:21:23 +0100 (Mon, 15 May 2006) | 3 lines Still working on SireDB. At a notable point because the code (finally) compiles and runs again. sire and siretest work fine. ------------------------------------------------------------------------ r707 | chris | 2006-05-15 12:09:23 +0100 (Mon, 15 May 2006) | 3 lines Updating code to reflect new names. Also removed atom type and smarts from MatchAtom (as they are no longer used there) and cleaned up MultiMatch as it was a bit of a mess! Code is still broken ------------------------------------------------------------------------ r706 | chris | 2006-05-15 11:21:02 +0100 (Mon, 15 May 2006) | 3 lines Renaming SireDB files - I have a clear idea of how this will now all work. Code is broken ------------------------------------------------------------------------ r705 | chris | 2006-05-11 12:19:07 +0100 (Thu, 11 May 2006) | 23 lines I am slightly redesigning the Match classes and RelateDB as I have come up with a cleaner design that is also a lot more extendable. I now use a virtual class hierarchy routed on MatchData. There will be MatchMRAData which matches Molecule/Residue/Atom combinations (molecule name, residue name and/or number, atom name and/or number). There will also be MatchAtomTypeData, which matches atom type combinations, and MatchSmilesData, which will match smiles strings. These will all pair up with database classes, e.g. RelateMRADB, RelateAtomTypeDB and RelateSmilesDB. The user can then include whichever relationships they wish in their database, with the order of assignment controlled by the order in which they are multiplally inherited in the database class, e.g. MMDB : public FFDB { ... }; This builds a database that contains CLJ, bond, angle and dihedral parameters, and searches for parameters first by inspecting molecule/residue/atom names and/or numbers, then atom types for any missing assignments, then finally smiles strings for anything else that is unassigned. If you want to match smiles strings first, then create the class; MMDB2 : public FFDB { ... }; I still need to create the FFDB class. This will be a template that will automatically include the FFParentDB class and will provide the additional functionality needs to create all of the tables, parametise the molecule, dump and load to a file, serialise and deserialise from a binary datastream etc. It is basically a wrapper than simplifies the creation of the user-facing database classes. ------------------------------------------------------------------------ r704 | chris | 2006-05-10 12:15:04 +0100 (Wed, 10 May 2006) | 5 lines Continuing to write the RelateDB - I have written the code to create all of the tables, and to map molecule, residue and atom names to NameID identifiers. Code is broken. ------------------------------------------------------------------------ r703 | chris | 2006-05-09 17:02:44 +0100 (Tue, 09 May 2006) | 5 lines Working on the actual atom relationship database class (RelateDB). Also added the original references for Smiles, together with the algorithm used to generate a unique smiles string. These will come in handy when I finally write my smiles and smarts parsers and generators. Code is broken! ------------------------------------------------------------------------ r702 | chris | 2006-05-08 16:30:00 +0100 (Mon, 08 May 2006) | 3 lines I have wrapped up the Match classes in python and have also begun writing using tests for them. So far things are working well (code all compiles and links, siretest runs without error, sire test/test.py works etc). The only problem is that while the python wrapping correclty maps the .__and__ function to the c++ operator, it fails to map the python 'and' operator to the c++ operator. (see test/test.py to see what I mean). This is something that I will worry about at a much later date, as for the moment, I am only interested in using the Match classes from within the parameter file reader classes in c++. ------------------------------------------------------------------------ r701 | chris | 2006-05-08 11:51:47 +0100 (Mon, 08 May 2006) | 5 lines Still working on atom matching (and the DBMatch classes). I've taken the time to get the code to compile and link so that I can go on to test what I have written so far. I have also cleaned out all zero-length files that are no longer necessary. Code compiles, links and runs, and siretest works, as does spier and sire test/test.py ------------------------------------------------------------------------ r700 | chris | 2006-05-05 11:54:43 +0100 (Fri, 05 May 2006) | 3 lines Finally making some headway with the atom matching classes. Code is still very broken, but I am can now see land. ------------------------------------------------------------------------ r699 | chris | 2006-05-04 11:59:03 +0100 (Thu, 04 May 2006) | 11 lines After a lot of thought, I think that I have come with a way to have a nice syntax for atom matching that can also satisfy the tight requirements for atom matching in the database. I have come up with the MatchData class. This contains all of the information specified during the construction of the match, which will then be analysed by specific DBMatch classes (DBMatch1, DBMatch2 etc.) which will then apply the more stringent constraints and throw a run-time exception if there is a problem. Helper classes will then allow a nice syntax to be used to specify matches, e.g. db.matchCLJ( "42", mol_name == "p38" and res_name == "ALA" and res_has_inter_bond_via("C") and not res_has_inter_bond_via("N") and atom_name == "CA" ); Code is really broken and SireDB is filled with half-forgotten classes as I try and work out how best to get atom matching working... ------------------------------------------------------------------------ r698 | chris | 2006-05-02 17:03:03 +0100 (Tue, 02 May 2006) | 7 lines I am continuing pursuing the goal of splitting off the atomic relationships from the actual parameters. I have been creating the Match classes, which are actually quite complex. The design will however allow nice syntax such as; db.relateCLJ( "44", Match().molecule("p38").residue("ALA", InterResBondTo("N") and InterResBondTo("C")).atom("CA") ); This also solves the problem of residue position in a chain. Now I just specify which atoms do, or do not, have inter-residue bonds connected to them (without needing to say which residues or atoms they are actually bonded to) ------------------------------------------------------------------------ r697 | chris | 2006-05-02 12:30:41 +0100 (Tue, 02 May 2006) | 16 lines I am now working on generalising the code used to match atomic relationships (atom called "CA" in any residue called "ALA" in molecule called "p38") so that it can be used across different database modules, e.g. CLJ, Bond, Dihedral etc. To do this, I will create a RelateDB while will hold atomic relationships and will assign each one a parameter number. Then each database module can then relate parameters to these RelateDB parameter numbers. To facilitate passing relationships to the database modules I am now creating a Match (and also Match2, Match3 and Match4) class, that can be used to express atomic relationships using a clear syntax, e.g. db.relateCLJ( "14", Match().molecule("p38").residue("ALA").atom("CA1") ); or db.relateBond( "23", Match2().molecule("p38") .residue0("ALA").atom0("CA") .residue1("ALA").atom1("HA").delta(0) ); I am still working on the Match classes, and the code is broken :-) ------------------------------------------------------------------------ r696 | chris | 2006-04-28 16:40:40 +0100 (Fri, 28 Apr 2006) | 5 lines I am still working on SireDB... I am about to update AtomMatchDB to use a base class to find tables for atom parameters based on molecule and residue names (with the same case-sensitive, then case-insensitive matching used as with the atom names). This will allow the same code to be used to match atom parameters and also for specified bond / angle/ dihedral/ other parameters. Code is broken ------------------------------------------------------------------------ r695 | chris | 2006-04-28 11:13:35 +0100 (Fri, 28 Apr 2006) | 5 lines I am working on building the parameter table classes to use the same class structure as the parameter database classes. I am also consolodating the split of SireFF into SireDB, SireFF and SireMM. Code is very broken! ------------------------------------------------------------------------ r694 | chris | 2006-04-26 14:50:00 +0100 (Wed, 26 Apr 2006) | 3 lines I have reorganised the directories. I now need to work through each new module and integrate it with the rest of the code. ------------------------------------------------------------------------ r693 | chris | 2006-04-26 14:31:06 +0100 (Wed, 26 Apr 2006) | 11 lines I am now working on integrating SireFF with the new Molecule/EditMol data structures, as well as the new SireCAS module. Code is broken. I am planning to split the parameter database core from SireFF and place it into its own SireDB library. I will also split out the molecular mechanics specific code into SireMM. The new arrangement will mean; SireDB: Base classes of all parameter (and other?) databases. Holds FFParentDB, FFChildDB, ValueDB and Func12DB etc. Also holds AtomType and AtomMatchDB. SireFF: Base classes and machinary for all forcefields. Holds FFWrapper, Energy, Mutators?, etc. SireMM: Holds all of the MM forcefields and parameters. BondDB, CLJParameter, CLJDB, MMDB, CLJFF, InterCLJFF etc. All pure MM forcefields will be able to be constructed and held within this library. This will contain Opls02FF, Amber95FF, GAFF, CharmmFF etc. Squire: Holds all of the QM forcefields and machinery. Holds parameter databases, functional forms, integrators, etc. Squire may eventually grow into a large application in its own right, with many sub libraries, e.g. SquirePDE, SquireHF etc. These libraries will hopefully be based on libSquire. One such library will be SquireMM, which will implement the QM/MM functionality. ------------------------------------------------------------------------ r692 | chris | 2006-04-26 12:12:23 +0100 (Wed, 26 Apr 2006) | 15 lines I have got most of the CAS now working :-) Both siretest and sire test/test.py work as expected, and I have also now fixed the bugs when substituting f(x) into an expression containing f(x') (etc.) I have also added the remaining trig funcs, and now have the complete basic complement (sin, cos, tan, sec, csc, cot, plus all their inverses, plus all of their hyperbolic forms and hyperbolic inverses). The only basic type of expression that I think I am now missing is a logarithm. While I have Ln, I need log10 and log_a Future work for SireCAS must be sorting out the series expansions. This will involve creating an 'order' symbol (e.g. O(n^2)), and also filling in the series expansions of all of the implemented functions. I also need to work on the expanding and collapsing expressions, and on implementing some simplification logic (e.g. converting all trig functions to variations of e^x, then collapsing). Finally, I need to look into how on earth I could implement integrating a product/quotient... The speed of SireCAS is still high, with the RunTests test still giving the result; a = 1.24999e+06, ms = 1003 ------------------------------------------------------------------------ r691 | chris | 2006-04-25 16:46:14 +0100 (Tue, 25 Apr 2006) | 3 lines I have nearly finished the Function class, and have nearly got function substitution working. I have also sorted out the operators a little more, though there is still the unresolved problem of getting a SymbolExpression from an ExBase==ExBase (which returns a bool). ------------------------------------------------------------------------ r690 | chris | 2006-04-25 12:33:45 +0100 (Tue, 25 Apr 2006) | 3 lines I am currently working on the generic functions that will be used in SireCAS to represent either unknown functions, or functions that are too complex to represent completely (e.g. SireFF will use this to represent the instantaneous energy of an atom as energy(x,y,z), and thus the instantaneous force on the atom will be the vector [ energy(x',y,z), energy(x,y',z), energy(x,y,z') ]. (this is possible if it is assumed that the positions of all other particles in the system are constant, which is true during an instant). This will allow SireFF to mix forces calculated via the forcefields with forces calculated via derivatives of generic SireCAS functions (e.g. user-supplied restraint functions, or umbrella terms). ------------------------------------------------------------------------ r689 | chris | 2006-04-25 08:28:12 +0100 (Tue, 25 Apr 2006) | 11 lines siretest runs correctly, and sire test/test.py now also runs correctly. The timing and value for the test in SireTest/runtests.cpp gives the result; a = 1.24999e+06, ms = 1018 this compares to a = 1.24999e+06, ms = 1093 for SireCAS in version 666 ------------------------------------------------------------------------ r688 | chris | 2006-04-24 22:33:36 +0100 (Mon, 24 Apr 2006) | 3 lines I have fixed some bugs in SireCAS, though I have yet to sort out finding the right operators in the python wrapper... ------------------------------------------------------------------------ r687 | chris | 2006-04-24 17:00:00 +0100 (Mon, 24 Apr 2006) | 3 lines I have cleaned up the integration and differentiation of single functions and am now adding in the hyperbolic and inverse trigonomic functions. ------------------------------------------------------------------------ r686 | chris | 2006-04-24 13:02:01 +0100 (Mon, 24 Apr 2006) | 3 lines I have added a unit test for SireCAS. The unit test works quite well. The test/test.py script still doesn't work however, due to problems with choosing the wrong overloaded operators. It is so annoying... ------------------------------------------------------------------------ r685 | chris | 2006-04-24 09:31:34 +0100 (Mon, 24 Apr 2006) | 3 lines Added tests for SireMaths::Complex, and also cleaned out tests for obsoleted classes. Also changed SireMaths::areEqual to use the gsl_fcmp function. ------------------------------------------------------------------------ r684 | chris | 2006-04-23 22:18:41 +0100 (Sun, 23 Apr 2006) | 3 lines I am fixing bugs in the code (most of test/test.py doesn't work). I've fixed a couple of stupid bugs in SireMaths/complex.h which were causing me a major headache... Note to self - check that copy constructors actually copy things properly! ------------------------------------------------------------------------ r683 | chris | 2006-04-21 16:36:54 +0100 (Fri, 21 Apr 2006) | 3 lines SireCAS now compiles and links. I have added all of the trig functions (sin,cos,tan,csc,sec,cot) together with their integrals and derivatives. ------------------------------------------------------------------------ r682 | chris | 2006-04-21 12:29:20 +0100 (Fri, 21 Apr 2006) | 5 lines Very nearly done now. I have integrated the use of Complex throughout the code, and SireCAS now appears to compile (though it probably won't link). I have added integration to the functions, and I think that it will work. Integration will be very experimental! (especially integrals of products...) Jobs for this afternoon are to write the isRational and toRational functions, to add the remaining trig and hyperbolic trig functions, to add a set of log functions (log_10, log_b etc.), then to wrap and test it all. ------------------------------------------------------------------------ r681 | chris | 2006-04-20 21:41:53 +0100 (Thu, 20 Apr 2006) | 3 lines Further integration of Complex with the rest of SireCAS... ------------------------------------------------------------------------ r680 | chris | 2006-04-20 17:40:04 +0100 (Thu, 20 Apr 2006) | 4 lines Working on switching over to use the new Complex class. Have changed the power functions and am in the process of creating SymbolComplex and ComplexValues. Code is broken. ------------------------------------------------------------------------ r679 | chris | 2006-04-20 15:48:50 +0100 (Thu, 20 Apr 2006) | 11 lines After much messing around I have finally worked out how to do the rational and complex arithmetic that I want :-) I have created a new ExBase called 'I' which represents the complex number 'i'. This will represent 'i' in the Expression, and throws a domain_error if it is evaluated via a double I have also wrapped up the gsl complex struct into a class with associated functions (SireMaths/complex.h). I will eventually create an analogue of Values (ComplexValues) and if the expression is evaluate using ComplexValues then full complex maths should be used, else fast non-complex math should be used. I have got rid of the Irrational class as I didn't like it! I will replace it with tests to see if a double is an integer, or if it is rational. If it is, then I will substitute RealPower with either IntPower or RationalPower. There will also be a new ComplexPower class as well. I have expanded the base functions in ExBase to include simplification, expansion, collapsing, series expansion and integration. I will try to fill in these new functions as I go along adding functions, in the hope that this will lower the extra work needed to get all this functionality fully working when I decide I want to implement it properly. ------------------------------------------------------------------------ r678 | chris | 2006-04-19 15:39:02 +0100 (Wed, 19 Apr 2006) | 5 lines I have implemented the product and quotient rules and have been playing with the SireCAS via the script test/test.py. One part of this script is to obtain the differential of an expression and to compare the anaytic differential to the numerically evaluate differential at several points. So far the code seems to be working, with very good agreement between the numerical and analytic differentials (even for very messy functions!). I am pretty pleased :-) ------------------------------------------------------------------------ r677 | chris | 2006-04-19 12:09:33 +0100 (Wed, 19 Apr 2006) | 16 lines The code now compiles, links and appears to work. I will need to perform some testing, and also still need to implement differentiation of a Product. Also, I am not hugely happy about my Irrational class. It is really crude. In my mind I see if as the basis of the high-precision and complex number class, whereby it stores a double holding the real part (so that arithmetic using real doubles is still fast), which it also holds a high precision representation of the complex number. However, pursuing this will take a lot of time, and would turn my small and fast CAS into something that it perhaps too powerful for my needs (do I really want the user to input complex numbers? how would I get the force from a complex number input?). As far as I can tell, I have four requirements for the Irrational class; (1) *most important* Provide very fast access to a 'double' representation of the value (2) Know when it is rational, and store the rational number (very useful for powers, e.g. ^2, ^(1/4) etc. (3) Hold the number to a user-controlled precision (4) Eventually provide a route to holding a complex number So far, Irrational only really satisfies point (1) I have tested SireCAS using the same test as before, and the changes have not affected its speed. ------------------------------------------------------------------------ r676 | chris | 2006-04-18 22:16:45 +0100 (Tue, 18 Apr 2006) | 3 lines SireMaths and SireCAS now all compile. I just need to update the python wrappers for SireCAS... ------------------------------------------------------------------------ r675 | chris | 2006-04-18 21:31:07 +0100 (Tue, 18 Apr 2006) | 3 lines Renamed wrap_fraction.cpp to wrap_rational.cpp ------------------------------------------------------------------------ r674 | chris | 2006-04-18 21:30:13 +0100 (Tue, 18 Apr 2006) | 3 lines Nearly there... :-) ------------------------------------------------------------------------ r673 | chris | 2006-04-18 18:07:20 +0100 (Tue, 18 Apr 2006) | 5 lines I am very nearly there with sorting out factors when building the product! Just a bit more work and I think that I will have done it :-) Code is still broken though! :-) ------------------------------------------------------------------------ r672 | chris | 2006-04-18 12:05:57 +0100 (Tue, 18 Apr 2006) | 2 lines Renamed fraction.cpp/.h to rational.cpp/.h ------------------------------------------------------------------------ r671 | chris | 2006-04-18 12:04:52 +0100 (Tue, 18 Apr 2006) | 9 lines I have realised that the Expression should not contain a power, as this really complicate the Product and PowerFunction classes. I am in the process of updating the code to remove the power. In doing this, I have realised that the factor of the expression should preserve the rational part (as diff x^3/2 should return (3/2) x^1/2 rather than 1.5 x^1/2) In doing this, I have replaced my 'Fraction' with the boost::rational class, and have written an Irrational class. Code is broken... ------------------------------------------------------------------------ r670 | chris | 2006-04-17 23:03:20 +0100 (Mon, 17 Apr 2006) | 5 lines Changing Product so that is properly factorises functions have functional powers (including functions raised to the power of functions raised to the power of functions raised...) Code is broken as I need to go to bed :-) ------------------------------------------------------------------------ r669 | chris | 2006-04-16 22:57:06 +0100 (Sun, 16 Apr 2006) | 3 lines I have cleaned up the wrapping of the power functions, which appear to work well. I am now looking at integrating them properly into the Product class (so that powers are collected together correctly) and am now looking at differentiating the Product class. This is crucial, as most of the derivatives of the power objects fail as they involve the product and quotient rules... ------------------------------------------------------------------------ r668 | chris | 2006-04-16 18:54:51 +0100 (Sun, 16 Apr 2006) | 3 lines Working on providing power functions (f(x)^g(x)) which provides access to a range of functionality (including exp and log). Written code and wrapped in python, though not tested yet. I also suspect that I'd get a link error as well with this version... ------------------------------------------------------------------------ r667 | chris | 2006-04-15 23:24:41 +0100 (Sat, 15 Apr 2006) | 3 lines I have wrapped up most of the SireCAS classes in python and they do seem to work! I am sure that I will find some wrinkles that will need ironing, but I am now very pleased with myself :-) ------------------------------------------------------------------------ r666 | chris | 2006-04-15 21:18:46 +0100 (Sat, 15 Apr 2006) | 37 lines I have improved the speed a little, and performed some proper time tests. The test of my old CAS and SireCAS are both performed in RunTests (run current test/test.py script). The GiNaC test uses testginac.cpp in techdocs/GiNaC. The test calculates; y = (1 + cos(x)) + 0.5*(1 + cos(2x)) - 0.25*(1 + cos(3x)) This is input into GiNaC as; symbol x("x"); ex poly = (1+cos(x)) + 0.5*(1+cos(2*x)) - 0.25*(1+cos(3*x)); This is input into SireCAS as; Symbol x("x"); Expression ex = (1.0 + cosine(x)) + 0.5*(1 + cosine(2*x)) - 0.25*(1 + cosine(3*x)); This is input into my old CAS as; MathFuncPtr e1 = CosPlusOne() + 0.5*CosPlusOne(1.0,2.0) - 0.25*CosPlusOne(1.0,3.0); These functions were calculated 1000000 times, from x=0 to x=99999.9 The calculation was timed using QTime around the main loop. I optimised the speed of GiNaC and SireCAS as much as I could. The results are; CAS Total Time(ms) Relative Speedup Old 1.24999e+06 595 186% 214 102 SireCAS 1.24999e+06 1093 100% 116 55 GiNaC 1.24999e+06 60174 2% 2 1 GiNaC_2 1.24999e+06 127464 1% 1 0.5 (GiNaC uses digits=1, while GiNaC_2 uses the default value of digits) SireCAS is much faster than GiNaC, though is about half the speed of the old implementation. I poked around with the timings and believe that the difference is due to the use of Symbol in SireCAS (the old system was fixed to use x, y and z). ------------------------------------------------------------------------ r665 | chris | 2006-04-15 18:14:47 +0100 (Sat, 15 Apr 2006) | 3 lines The SireCAS module compiles and now works (well, the little bit that has been tested). SireTest::RunTests gives the same answers as my old CAS, though it is currently 4 times slower than my old CAS. Oh well, I think that I should be able to speed it up! :-) ------------------------------------------------------------------------ r664 | chris | 2006-04-14 21:49:08 +0100 (Fri, 14 Apr 2006) | 5 lines Fleshed out the 'Fraction' class with operators, and have added the Identities class to hold mappings from Symbols to Expressions (used for substitutions) Code is still broken, but making good progress :-) ------------------------------------------------------------------------ r663 | chris | 2006-04-14 13:19:14 +0100 (Fri, 14 Apr 2006) | 4 lines More work filling in the functionality of SireCAS, and also added the SireMaths::Fraction class. Needs testing :-) ------------------------------------------------------------------------ r662 | chris | 2006-04-14 00:29:46 +0100 (Fri, 14 Apr 2006) | 6 lines Making a lot more progress with SireCAS. Have worked out how to serialise and deserialise expressions (via Factory and RegisterExpression classes), have expanded the Values class, and have filled in a lot of the other classes. Code is still broken, but getting there :-) ------------------------------------------------------------------------ r661 | chris | 2006-04-13 17:22:07 +0100 (Thu, 13 Apr 2006) | 5 lines I tested GiNaC but found that it was too slow. I think that this was down to its use a multi-precision library, while I am only interested in evaluating as a double. I have thus decided to stick with my own mini-cas. I am in the process of updating it and moving it into its own library (SireCAS). I am borrowing some of the ideas from GiNaC, in particular using generic symbols that are assigned a unique ID number, and have a user-defined print string. Code is very broken! ------------------------------------------------------------------------ r660 | chris | 2006-04-11 13:46:44 +0100 (Tue, 11 Apr 2006) | 3 lines Added functions to convert to/from EditMols and Molecules. Also investigating the GiNaC maths library, as this may be able to provide an algebra library in the code that will be superior to the SireMaths classes that I wrote. ------------------------------------------------------------------------ r659 | chris | 2006-04-08 18:11:25 +0100 (Sat, 08 Apr 2006) | 3 lines I have got the MoleculeSignature class working and have tested it using a little test script (test/io/testsigs.py). I have also written a pseudo script to see how I want to work the syntax for parametising molecules (ideas/parametise.py). ------------------------------------------------------------------------ r658 | chris | 2006-04-03 16:34:57 +0100 (Mon, 03 Apr 2006) | 3 lines Finished renaming the file and have added the MoleculeSignature class. ------------------------------------------------------------------------ r657 | chris | 2006-04-03 14:32:00 +0100 (Mon, 03 Apr 2006) | 3 lines Beginning work on the MoleculeSignature class which will be used to see if an EditMol and Molecule are referring to the same type of molecule. Renaming ResName to ResidueID ------------------------------------------------------------------------ r656 | chris | 2006-04-03 11:58:40 +0100 (Mon, 03 Apr 2006) | 5 lines I have now written the code to create a Molecule from primitive data (that can be easily obtained from an EditMol) I am quite pleased. I haven't tested the code, but it all compiles and runs. ------------------------------------------------------------------------ r655 | chris | 2006-04-02 18:30:59 +0100 (Sun, 02 Apr 2006) | 3 lines Working on integrating the CutGroups with MoleculeData. I think that I am now a lot clearer with how it will all work. The only thing that I am now alltogether happy with is the MutableSetIterator, which I think may be too slow for updating CutGroup coordinates... ------------------------------------------------------------------------ r654 | chris | 2006-03-31 22:10:51 +0100 (Fri, 31 Mar 2006) | 3 lines New code compiles, but missing functions so won't link... ------------------------------------------------------------------------ r653 | chris | 2006-03-31 17:37:02 +0100 (Fri, 31 Mar 2006) | 3 lines Working on the new MoleculeInfo and ResidueInfo classes that will be used to provide meta information about molecules and residues. Also working on wrapping up these classes in python, as well as the MoleculeBonds and ResidueBonds classes. ------------------------------------------------------------------------ r652 | chris | 2006-03-31 11:53:37 +0100 (Fri, 31 Mar 2006) | 3 lines Code now compiles and links. siretest works (although is quite cut down). spier works, and displays molecules well. sire also works, and can build a tip4p water molecule. ------------------------------------------------------------------------ r651 | chris | 2006-03-31 09:45:21 +0100 (Fri, 31 Mar 2006) | 3 lines Added python wrapping of Molecule, Residue, MoleculeSet and ResidueSet. Also added definitions so that now the only missing functions are those in MoleculeData/MoleculeDataPvt. I will now work on filling in these gaps... ------------------------------------------------------------------------ r650 | chris | 2006-03-31 08:13:00 +0100 (Fri, 31 Mar 2006) | 3 lines Code now compiles without using NetObjects or SandBox, but still has link errors... ------------------------------------------------------------------------ r649 | chris | 2006-03-31 07:55:26 +0100 (Fri, 31 Mar 2006) | 3 lines Removed the NetObjects and SandBox directories as they are no longer necessary. Code still broken :-) ------------------------------------------------------------------------ r648 | chris | 2006-03-30 22:31:00 +0100 (Thu, 30 Mar 2006) | 7 lines Working on getting the code compiling again. The code appears to compile now, but won't link (I am missing too many functions!) I have disabled NetObjects, SireFF and SireSystem until they have been migrated (or, in the case of NetObjects, removed) Code is broken :-) ------------------------------------------------------------------------ r647 | chris | 2006-03-30 17:34:38 +0100 (Thu, 30 Mar 2006) | 3 lines Working the code to get it to compile - still broken though :-) ------------------------------------------------------------------------ r646 | chris | 2006-03-30 14:51:35 +0100 (Thu, 30 Mar 2006) | 5 lines Integrating the new Set class with CutGroup (via AtomSet) and changing over CutGroupSet, MoleculeSet and ResidueSet. Code is still very broken :-) ------------------------------------------------------------------------ r645 | chris | 2006-03-30 12:29:51 +0100 (Thu, 30 Mar 2006) | 7 lines I have realised that the Set class needs to use an indexer type function to get indexes from the contained objects, especially as the contained objects will contain their indexes. To fix the problem of subtle bugs caused by changing the index of an object that is in a set, I have created SetIterator and MutableSetIterator classes that allow iteration and modification of a set in a safe and bug-free manner, even if the modifications change the index of the object. I have also realised that CutGroup needs its own ID number, and should not use MolCutGroupID. I will thus change CutGroup back to having an ID number of its own... Ah well, I am so indecisive :-) ------------------------------------------------------------------------ r644 | chris | 2006-03-29 22:47:35 +0100 (Wed, 29 Mar 2006) | 9 lines Still working on the MoleculeData class... Added a collection of ID types (CutGroupID, MoleculeID, MolCutGroupID, MolCGAtomID etc) that provide multi-level identification of Molecules, CutGroups and Atoms (and perhaps should be extended to have MolResidueID and MolResAtomID?) As part of this change, whereby I am using specified indexes to search for objects, I am rewriting the SireBase::Set class to be more like a hash, e.g. have specified key and value. This removes the need for the 'indexer' function, and also means that changing the object will not change the index (thus removing the potential for really weird bugs). Code is broken ------------------------------------------------------------------------ r643 | chris | 2006-03-29 13:57:29 +0100 (Wed, 29 Mar 2006) | 5 lines Working on changing the Molecule and Residue classes to be views on an underlying MoleculeData class. Code is broken. ------------------------------------------------------------------------ r642 | chris | 2006-03-27 10:59:43 +0100 (Mon, 27 Mar 2006) | 3 lines I have changed EditMol/EditRes/EditMolData to be explicitly shared, which solves the copy problem (if in a bit of a messy way). The code now works, and make-tip4p.py makes a correct TIP4P water molecule. ------------------------------------------------------------------------ r641 | chris | 2006-03-23 20:26:53 +0000 (Thu, 23 Mar 2006) | 3 lines Changed 'Int' as datatype for AtomIndex, and replaced it with 'ResNum'. This makes the code clearer, and also prevents me having to define 'Int' in multiple modules. ------------------------------------------------------------------------ r640 | chris | 2006-03-23 17:19:06 +0000 (Thu, 23 Mar 2006) | 3 lines I am trying to get the make-tip4p.py test script working again. I am running into major difficulties with boost::python taking taking a const copy of an EditRes, so that shallow copying is not working!!! Annoying... ------------------------------------------------------------------------ r639 | chris | 2006-03-23 13:32:17 +0000 (Thu, 23 Mar 2006) | 3 lines I have wrapped up the EditRes class. It all seems to run and work well... ------------------------------------------------------------------------ r638 | chris | 2006-03-21 17:16:45 +0000 (Tue, 21 Mar 2006) | 3 lines I have wrapped up the EditMol class in python, and have implemented some missing functions. ------------------------------------------------------------------------ r637 | chris | 2006-03-21 10:55:03 +0000 (Tue, 21 Mar 2006) | 3 lines Fixed some bugs - spier now works with the new EditMols! ------------------------------------------------------------------------ r636 | chris | 2006-03-20 20:48:20 +0000 (Mon, 20 Mar 2006) | 3 lines Code all now compiles and links, though lots of functionality still needs to be added. ------------------------------------------------------------------------ r635 | chris | 2006-03-20 17:06:32 +0000 (Mon, 20 Mar 2006) | 3 lines I am gradually filling in the missing functions... ------------------------------------------------------------------------ r634 | chris | 2006-03-20 15:45:15 +0000 (Mon, 20 Mar 2006) | 3 lines Code now compiles, but still doesn't link... ------------------------------------------------------------------------ r633 | chris | 2006-03-20 15:20:53 +0000 (Mon, 20 Mar 2006) | 3 lines Removed files - code is very broken... ------------------------------------------------------------------------ r632 | chris | 2006-03-20 15:11:18 +0000 (Mon, 20 Mar 2006) | 3 lines Code now compiles from scratch, but doesn't link as there are many functions missing! I am now going to remove zero-size files and also editmolptr.h and editresptr.h.... ------------------------------------------------------------------------ r631 | chris | 2006-03-20 13:23:47 +0000 (Mon, 20 Mar 2006) | 3 lines I think that I have now got SireMol compiling once again. However the code is still broken with lots of missing functions (so won't link) ------------------------------------------------------------------------ r630 | chris | 2006-03-18 15:41:04 +0000 (Sat, 18 Mar 2006) | 3 lines More work on EditMol/EditRes - code is broken. ------------------------------------------------------------------------ r629 | chris | 2006-03-17 16:45:13 +0000 (Fri, 17 Mar 2006) | 3 lines Working on integrating EditMol with EditMolData. I have created a new WeightFunction/WeightCalculator class hierarchy which can be used to calculate the weights of groups of atoms. I have used a buffer type approach to the class design so that it won't be slowed down by too many virtual function calls... ------------------------------------------------------------------------ r628 | chris | 2006-03-16 15:41:39 +0000 (Thu, 16 Mar 2006) | 5 lines Code is fixed again (sire, spier and siretest work). New code compiles, though is untested and unused. I will now break everything again by changing EditMol and EditRes to work with EditMolData... ------------------------------------------------------------------------ r627 | chris | 2006-03-16 15:04:41 +0000 (Thu, 16 Mar 2006) | 3 lines Still working... Most of the new code compiles now, though is still broken. I have added some SireMol errors in a dedicated SireMol namespace. ------------------------------------------------------------------------ r626 | chris | 2006-03-16 11:15:59 +0000 (Thu, 16 Mar 2006) | 5 lines I have made more progress with the EditMolData class, though I still need to finish it :-) Code is broken ------------------------------------------------------------------------ r625 | chris | 2006-03-15 18:06:06 +0000 (Wed, 15 Mar 2006) | 3 lines Combining EditMol/EditRes into a single class. ------------------------------------------------------------------------ r624 | chris | 2006-03-15 11:49:17 +0000 (Wed, 15 Mar 2006) | 5 lines I have created the MoleculeBonds and ResidueBonds classes, which will eventually replace the BondGroup class. These two classes more closely match our intuition of bonding (residue and molecule based), and also are easy to implicitly share (BondGroup contained pointers, which were annoying to share and keep up-to-date). Code is broken ------------------------------------------------------------------------ r623 | chris | 2006-03-14 17:00:45 +0000 (Tue, 14 Mar 2006) | 6 lines I have realised that NetObjects is not the way to do the parallelisation. I have decided to eventually move to CORBA. For now, I have realised that it would be best to have CutGroup, Molecule and EditMol be implicitly shared classes, so I am in the process of updating these classes. The code is very broken. ------------------------------------------------------------------------ r622 | chris | 2006-03-09 13:43:53 +0000 (Thu, 09 Mar 2006) | 3 lines Code compiles and runs on amd64 and i686, using gcc3, icc and gcc4. I am also fixing the problem of the crash on NetExitMsg::action() (error shuttting down the MPIPeer) ------------------------------------------------------------------------ r621 | chris | 2006-03-09 12:04:26 +0000 (Thu, 09 Mar 2006) | 7 lines I have a working Interface - Pipe (LocalPipe) - Invoker system! Surprisingly it worked first time :-) siretest is now working again and completing without error, though this is only because I have butchered the NetObjects tests. There may be a problem with the IPI system in terms of registering and calling const functions. I will need to investigate and test this. ------------------------------------------------------------------------ r620 | chris | 2006-03-08 12:24:51 +0000 (Wed, 08 Mar 2006) | 2 lines Working on the IPI system. I now have a clear idea of how the IPI system will work (see techdocs/testinterface.cpp). The code is currently broken. ------------------------------------------------------------------------ r619 | chris | 2006-03-07 10:32:23 +0000 (Tue, 07 Mar 2006) | 3 lines This code compiles and runs using gcc 4.1 (on amd64!) ------------------------------------------------------------------------ r618 | chris | 2006-03-06 15:48:02 +0000 (Mon, 06 Mar 2006) | 3 lines I now have gcc-4.1 on scruffy (amd64) and am beginning to ensure that the code compiles using this compiler. The biggest problem is that the qHash functions are not being found, which is why I am having to predeclare them. Also there are many warnings about type-punned pointers, which I am going to fix (I have removed fastInvSqrt as it isn't much faster, and causes so many warnings!) ------------------------------------------------------------------------ r617 | chris | 2006-03-05 19:37:35 +0000 (Sun, 05 Mar 2006) | 3 lines Worked up the WaitValue class, which is the backend for the result class. ------------------------------------------------------------------------ r616 | chris | 2006-03-03 21:33:39 +0000 (Fri, 03 Mar 2006) | 3 lines Rewritten Args class compiles and works well. The updated unit test works, and siretest compiles and runs (though fails on netobjects test with unavailable_netobject exception) ------------------------------------------------------------------------ r615 | chris | 2006-03-03 15:21:23 +0000 (Fri, 03 Mar 2006) | 3 lines Moved argspvt to the wrong place, and am working on the new Args class... ------------------------------------------------------------------------ r614 | chris | 2006-03-03 14:51:18 +0000 (Fri, 03 Mar 2006) | 2 lines Moved args to argspvt (it will be the private implementation class) ------------------------------------------------------------------------ r613 | chris | 2006-03-03 14:50:13 +0000 (Fri, 03 Mar 2006) | 3 lines I am working on the interface/invoker for FFWrapper. First, I am slightly rewriting the Result and Args classes to make them easier to use, and to cut down on unnecessary copying (both classes will become pimpl classes using shared_ptr to facilitate quick copying) ------------------------------------------------------------------------ r612 | chris | 2006-03-03 11:02:07 +0000 (Fri, 03 Mar 2006) | 3 lines I have written a lot of serialisation functions. The code now compiles and runs, though I haven't tested any of the serialisation yet. ------------------------------------------------------------------------ r611 | chris | 2006-03-02 22:48:48 +0000 (Thu, 02 Mar 2006) | 3 lines Creating all of the necessary QDataStream streaming functions... Code is broken, but getting there... ------------------------------------------------------------------------ r610 | chris | 2006-03-02 17:04:50 +0000 (Thu, 02 Mar 2006) | 3 lines I have created the FFRegistry and am working on the registration and serialisation/deserialisation of FFWrappers. The code is broken, but I am making quite a bit of progress. ------------------------------------------------------------------------ r609 | chris | 2006-03-02 13:30:14 +0000 (Thu, 02 Mar 2006) | 39 lines SireSystem now compiles, though doesn't do anything. I have realised that I need to sort out the FFWrapper class, as this will be key to the parallelisation of the energy calculation; FFBase (virtual class, base of forcefields) Wrapped up by FFWrapper, which is derived from FFWrapperBase. This class uses the contained FFBase to calculate the energies, and has the functionality to store and average the energies. It also provides a single, consistent interface, (via FFWrapperBase) to what can be very different forcefields, returning very different types of energy. FFWrapperPtr is a NetObjects::Ptr - i.e. it is the FFWrapper that is distributed via NetObjects. As FFWrapperBase is a common interface, there is thus only the need for this single NetObject::Ptr class (and machinery) FFWrapperPtr::Interface is the interface that controls the FFWrapperPtr class remotely (together with FFWrapperPtr::Invoker). There is thus just a single Interface/Invoker for all of the different forcefield classes, as they are all handled via the FFWrapperBase interface. A potential problem with this design is that while FFBase::energy() is const (and thus involves no network updates), FFWrapperBase::energy() is not const. This is a pain, as it could mean that a network update would be required for every single energy evaluation. One possible solution would be to implement a NetObjects::Ptr::noncopyable flag, which would prevent a NetObject from being copied to multiple processors. This would mean that there would be no need for network updates on write operations (as the object would only exist on a single processor). For this to work, I will need to register all of the FFWrapper derived classes, so that the FFWrapper objects can be sent across the network. I will use the same registry design as used in NetObjects. For the moment all of my registry classes are separate - eventually I may wish to pool their code so that all of the registries are constructed from a single common code base. For the moment I don't think that this is necessary, as I don't have a sufficiently clear idea of what the general requirements of the supra-registry class would be, and I would waste a lot of time trying to write it. ------------------------------------------------------------------------ r608 | chris | 2006-03-02 10:13:51 +0000 (Thu, 02 Mar 2006) | 3 lines I have create a LocalProcessor class so that Sire can also run within a single thread with no networking at all! ------------------------------------------------------------------------ r607 | chris | 2006-03-02 09:31:15 +0000 (Thu, 02 Mar 2006) | 3 lines I have put the python parser back into the program, running in the main thread. I have got rid of the PythonThread class. I have also added code to allow the processor to wait until the MPIPeer, TCPServer and ActionThread have started before moving on (thus preventing the possibility that the script is parsed before the cluster is ready) ------------------------------------------------------------------------ r606 | chris | 2006-03-01 17:28:23 +0000 (Wed, 01 Mar 2006) | 3 lines Changing the code over to get rid of TypeIDs and the mess associated with their mapping. I am now just using the class names as provided by the programmer. This may be fractionally slower, but it is much easier to write and administer/debug. ------------------------------------------------------------------------ r605 | chris | 2006-03-01 16:32:17 +0000 (Wed, 01 Mar 2006) | 5 lines I have written the exception registry, and changed MessageRegistry and TypeRegistry to get the TypeID->name mapping from the alphabetical order of the types. I am beginning to wonder however if it is necessary to use TypeIDs... Is the speed gain really worth the hassle and potential confusion? ------------------------------------------------------------------------ r604 | chris | 2006-03-01 13:01:30 +0000 (Wed, 01 Mar 2006) | 5 lines I have decided against the node registration system that I was using, as it would have meant that an extraordinarily large number of messages would have had to have been sent if a large cluster were used. I am thus instead using static registration, whereby all MPI nodes use PIDs 1->mpiTCPBoundary()-1, while all TCP processors use mpiTCPBoundary()+1 upwards. Also, as I am already requiring that all processors run the same version of sire, I can also assume that the same messages/exceptions/netobjects are registered. I will thus assign ID types from the alphabetical order of the classes in the registry. (ascii order) I have create the beginnings of the code for the TCP client and server, so that I can work out the routing of messages. I think that I have got it now... ------------------------------------------------------------------------ r603 | chris | 2006-02-27 15:22:52 +0000 (Mon, 27 Feb 2006) | 3 lines Moved getMagic into a separate file so that I can debug it (scruffy gets the wrong magic...) ------------------------------------------------------------------------ r602 | chris | 2006-02-27 15:06:21 +0000 (Mon, 27 Feb 2006) | 3 lines Forgot to update the NetObjects.pro file when I cleaned out some files.. ------------------------------------------------------------------------ r601 | chris | 2006-02-27 15:03:25 +0000 (Mon, 27 Feb 2006) | 5 lines Code now compiles and runs. I have moved away from using VersionIDs for versioning, and have instead switched over to using magic numbers to ensure the integrity of the data stream (this works a bit, as it places checks in the data stream that the right object is being loaded. If some extra data is added, or some data is removed, then the stream will move out of sync when being read, and thus the magic number will not be found and thus a magic_error will be thrown) ------------------------------------------------------------------------ r600 | chris | 2006-02-27 12:11:33 +0000 (Mon, 27 Feb 2006) | 7 lines I am working on registering nodes. I have given up on the idea of versioning all network traffic as the problem of matching version numbers is too difficult, and I think that including versioning implies that I am happy with the idea of multiple versions of the program clustering together. This will lead to weird and difficult to reproduce bugs. I will thus have the requirement that all processors run exactly the same version of the program. Removing this requirement can be left as an exercise for future generations... :-) Code is really broken at the moment. (by the way - I should say that the version before this one works on amd64, and correctly communicates between amd64 and i686 - in other words, scruffy and cubert are happily talking to one another) ------------------------------------------------------------------------ r599 | chris | 2006-02-25 18:11:09 +0000 (Sat, 25 Feb 2006) | 3 lines Added time and processor/thread ID to the printout. This is not how it will eventually be - it is just here so that I can debug the program as I am writing it. ------------------------------------------------------------------------ r598 | chris | 2006-02-24 22:06:54 +0000 (Fri, 24 Feb 2006) | 2 lines The code all seems to work now (though SireStream is but a shadow of its former self!) ------------------------------------------------------------------------ r597 | chris | 2006-02-24 22:02:57 +0000 (Fri, 24 Feb 2006) | 3 lines I found the bug - SireStream::printLine did some static initialisation using QObject::tr, which caused a weird bug in Qt. I think that this is because of a clash with the installation of translators. I have stripped SireStream down to the bear minimum, and this seems to have fixed the bug. :-) ------------------------------------------------------------------------ r596 | chris | 2006-02-24 17:09:06 +0000 (Fri, 24 Feb 2006) | 9 lines I am working on the registration system, and have built the beginnings of classes to register messages. However... programming can be annoying! I get a segfault when static RegisterNewNodeMsg in newnodemsg.cpp calls any function (static or plain function) in MessageMgr. I cannot figure out what the problem is... I am thus recompiling everything from scratch to see if I can fix it... (during which, I found more python wrappers that take up too much memory to compile, so I have split them up into separate files) ------------------------------------------------------------------------ r595 | chris | 2006-02-24 11:34:34 +0000 (Fri, 24 Feb 2006) | 3 lines I now have round trip communication (proc 1 sends registration request, proc 0 responds with registration pack). Also I have been looking at the issue of precision, as I think that I am wasting a lot of processor speed by doing distances in doubles, when I could get much better performance using floats. Energy accumalation should use doubles. ------------------------------------------------------------------------ r594 | chris | 2006-02-23 17:11:21 +0000 (Thu, 23 Feb 2006) | 3 lines I now have a small NewNodeMsg being sent from a slave node to the master :-) ------------------------------------------------------------------------ r593 | chris | 2006-02-23 14:34:26 +0000 (Thu, 23 Feb 2006) | 3 lines I have split a few of the python wrapper files into parts as I was running out of memory when I was compiling the files on scruffy (now running amd64 linux) ------------------------------------------------------------------------ r592 | chris | 2006-02-23 13:16:14 +0000 (Thu, 23 Feb 2006) | 3 lines Doesn't crash at exit now... ------------------------------------------------------------------------ r591 | chris | 2006-02-23 12:04:55 +0000 (Thu, 23 Feb 2006) | 3 lines The code now compiles and links (finally) and siretest/sirempitest run without errors. sire however does nothing, and crashes when sent a sighalt. ------------------------------------------------------------------------ r590 | chris | 2006-02-22 16:58:06 +0000 (Wed, 22 Feb 2006) | 3 lines Working on filling in the remaining functions. I am changing the messages so that they are dumped to a QByteArray when they are placed into an Envelope (this is easier than trying to manage this when creating the messages) ------------------------------------------------------------------------ r589 | chris | 2006-02-22 15:18:07 +0000 (Wed, 22 Feb 2006) | 3 lines Deleted some zero-size files. Code still doesn't link... ------------------------------------------------------------------------ r588 | chris | 2006-02-22 15:08:28 +0000 (Wed, 22 Feb 2006) | 21 lines The code now compiles, though doesn't link as I am missing a few functions. I am beginning to get an idea of the factory function. Essentially, have a static object provide a function pointer to the registry, with the function pointer used to create a new instance of the class. There are several factories in the code; NetObjects factory: Currently managed via NetObject - will be left alone, as this is more complex than a simple factory SireError::exceptions factory: Currently hard coded - will be changed to static object and function pointer NetObjects Messages: Currently broken - will be changed to static object and function pointer All methods will use the name of the class provided by the coder as the key, e.g, via name supplied to NetObject, or via the name provided by the "what()" functions of exception and Message. All will use a static object to register the object at library link time (will eventually create a plugin initialisation function for plugin libraries). There are also several registry classes; TypeRegistry : Registry of NetObjects class types MessageRegistry : Registry of Message types ExceptionRegistry : (todo) Registry of exception types ThreadRegistry : Registry of all threads in the program I may try and share code between these (in particular the static object code via a template) ------------------------------------------------------------------------ r587 | chris | 2006-02-20 16:30:36 +0000 (Mon, 20 Feb 2006) | 3 lines Continuing work on the new NetObjects::Messages system... Code is still broken... ------------------------------------------------------------------------ r586 | chris | 2006-02-20 14:01:50 +0000 (Mon, 20 Feb 2006) | 3 lines Renamed and cleaned up the NetObjects files... ------------------------------------------------------------------------ r585 | chris | 2006-02-20 13:50:55 +0000 (Mon, 20 Feb 2006) | 3 lines Working on Response class - will renamed MsgResponse to Response. Will also get rid of MsgHandle, as Envelope/Message split removes the need for this class. ------------------------------------------------------------------------ r584 | chris | 2006-02-20 10:44:03 +0000 (Mon, 20 Feb 2006) | 3 lines MessageRegistry has been moved... ------------------------------------------------------------------------ r583 | chris | 2006-02-20 10:43:07 +0000 (Mon, 20 Feb 2006) | 5 lines I am going to rename MessageMgr to MessageRegistry... Code is very broken.. ------------------------------------------------------------------------ r582 | chris | 2006-02-18 17:10:03 +0000 (Sat, 18 Feb 2006) | 13 lines I am reworking the NetMessages side of NetObjects. It now makes more sense; MessageMgr will be changed to MessageRegistry, and just maps Messages to ID numbers. Its only task is to identify and construct messages. Processor is now a static class, used to access a contained ProcessorPvt derived class. ProcessorPvt is responsible for all Processor specific functionality, e.g. sending and receiving messages using the communications system available to the processor. So MPIProcessor will use the new MPIPeer class to send and receive messages, while TCPProcessor will use the (yet to be created) TCPClient class. The MasterProcessor has an MPIPeer and a TCPServer class for sending and receiving. The messages themselves have been split into two parts; the first is the actual message data, which is still in the 'Message' class (and its decendents). Meanwhile, all transport information about the message is now moved into the Envelope class. A message is sent in two parts; first the Envelope is sent, then the Message is sent afterwards. The envelope contains all the information needed to receive the message (the type and size of the message), to forward the message (the destination PID) and to respond to the message (the Envelope::ReturnAddress). This means that the transport layer does not need to be concerned with problems of redirection, e.g. if a duplicate() message is sent to the old master process, then it can forward the message onto the correct processor, which will then use the returnaddress to correctly respond to the original sending processor. ------------------------------------------------------------------------ r581 | chris | 2006-02-16 17:36:52 +0000 (Thu, 16 Feb 2006) | 7 lines I can't write the FFWrapper without being able to write FFInterface, which means that I need to get NetObjects::IPI and NetObjects::Messages working again... The code is broken. I am in the process of creating a 'Processor' object to represent each processor in the cluster, so that all the PID is no longer the rank of the processor in MPI. This will clean up a lot of the code and will remove the annoying NetObjects::Master:: type functions. ------------------------------------------------------------------------ r580 | chris | 2006-02-16 09:26:10 +0000 (Thu, 16 Feb 2006) | 25 lines I am working on the SireSystem classes. I think that I have now worked out the best way to interface with the system. The actual System class is not accessible to the user. Instead the user interfaces with it via either a SystemEditor class (which is used to edit the System during simulation setup or updating), or SystemRunner (used to run a simulation). These provide FFGroupEditor and FFGroupRunner helper objects etc. In addition, boost::python provides automatic dynamic down-casting, which is very useful as it will allow me to return a boost::shared_ptr to the FFWrapperBase, and have boost::python automatically cast down to the actual FFWrapper derived class. This will allow the user to write code such as; sys.forcefield().component("CLJ").setCombiningRules( OPLSCombiningRules() ) sys.forcefield().component("QM").setMaxIterations(5000) In addition to this, I have also realised that it will be best to have multiple FFGroups accessible from the System, e.g. for simulations such as MTSMC, e.g. sys.forcefield() # returns default forcefield sys.forcefield("fast") # returns another forcefield, that the user has called 'fast' I will do the same thing with molecules - there will be a single set of all molecules in the system, and also the user can add their own, named groups; sys.molecules() # returns all molecules sys.molecules("solvent") # returns molecules in the 'solvent' group, designated by the user In addition, each molecule will be added into a group that matches its name. This way, automatic groups are created (e.g. 'TIP4P') Moves are created which operate on MoleculeGroups, not on individual molecules. The reason for this is that grand canonical moves could add or delete molecules, so referring to individual molecules is difficult. However, if the GC move also knew which groups to add the molecules, then this would also fix all of the moves (thus adding a TIP4P to the solvent group ensures that it is available for MC moves like the rest of the solvent molecules) The only complexity of this is that GC type moves will need to have user-defined code to be able to work, e.g. adding the molecule requires knowledge of which molecule groups it should be added to, and which forcefields as well. I don't think that there is any way for me to avoid this, and this is probably the best solution (the complexity should be in the GC move, as it is the part of the code that is doing this). ------------------------------------------------------------------------ r579 | chris | 2006-02-13 12:02:50 +0000 (Mon, 13 Feb 2006) | 3 lines Beginning work on new SimSystem library, holding the System class that represents a complete simulation system. ------------------------------------------------------------------------ r578 | chris | 2006-02-13 11:57:13 +0000 (Mon, 13 Feb 2006) | 3 lines Added NetID to the cutgroups, allowing easy access to a unique identifier to a NetObject that identifies both the type of the netobject and the specific instance. ------------------------------------------------------------------------ r577 | chris | 2006-02-11 22:43:12 +0000 (Sat, 11 Feb 2006) | 3 lines Updated build system so that it can cope with multiple compiles using different compilers. Fixed a few problems identified by the intel compiler. Fixed a bug in ptrwriter so that siretest now completes with no errors. ------------------------------------------------------------------------ r576 | chris | 2006-02-10 22:03:30 +0000 (Fri, 10 Feb 2006) | 7 lines Code now compiles and runs. The correct energies for the test/test.py script are calculated :-) The times are 3320ms for the InterCLJFF, and 3255ms for the InterGroupCLJFF. siretest does however crash after the netobjects tests... ------------------------------------------------------------------------ r575 | chris | 2006-02-10 16:28:03 +0000 (Fri, 10 Feb 2006) | 3 lines More work on cleaning up the new NetObjects system. The changes I made have made it more logical. The code is still broken, though NetObjects has compiled. ------------------------------------------------------------------------ r574 | chris | 2006-02-10 14:51:56 +0000 (Fri, 10 Feb 2006) | 3 lines Renamed PtrInfoPtr to PtrHandlePtr to match PtrHandle class.. ------------------------------------------------------------------------ r573 | chris | 2006-02-10 14:50:13 +0000 (Fri, 10 Feb 2006) | 3 lines Renamed PtrLocker to MutexLocker to represent its more general use. ------------------------------------------------------------------------ r572 | chris | 2006-02-10 14:48:22 +0000 (Fri, 10 Feb 2006) | 3 lines Renamed PtrInfo to PtrHandle. Code is still broken :-) ------------------------------------------------------------------------ r571 | chris | 2006-02-10 14:47:16 +0000 (Fri, 10 Feb 2006) | 10 lines I am working on cleaning up the myriad of interfaces in NetObjects that I created. I am now settled on passing everything through the PtrInfo class, which is being split into two; PtrHandle : -> manages all changes of state of the NetObject over the cluster MetaData : -> holds the current state of the object on the cluster I thus have PtrHandle, MetaData, NetObject, Registry and TypeRegistry that perform all of the network and sharing side of NetObjects (and are all accessed via PtrHandle and MetaData), while PtrProxy, Ptr, WeakPtr and PtrWriter handle the actual object itself, and contain no network code or state information (instead, PtrProxy contains a shared_ptr to PtrHandle, and WeakPtr contains a shared_ptr to PtrHandle) The code is currently broken. ------------------------------------------------------------------------ r570 | chris | 2006-02-09 20:59:38 +0000 (Thu, 09 Feb 2006) | 3 lines I have moved the pointer to the NetObject from the proxy into the actual NetObjects pointer. This allows the pointer to directly get the object from memory, without having to pull up the proxy first. This has increased the speed of the code so that we are now back up to 3300ms :-) ------------------------------------------------------------------------ r569 | chris | 2006-02-09 16:56:54 +0000 (Thu, 09 Feb 2006) | 5 lines Adding code to provide a parent/child hierarchy of NetObjects. Also, Caterina has sent me her thesis, and I have checked the sizes of her systems. They range from 10k water molecules to 20k water molecules. I therefore feel that I should have my upper limit (by memory) set at 512MB to simulate of the order of 1M waters. ------------------------------------------------------------------------ r568 | chris | 2006-02-09 16:01:09 +0000 (Thu, 09 Feb 2006) | 22 lines I am struggling with the current speed of the code. I have lost about 10-25% of the speed since version 493. To compare, I have checked out various versions of Sire, and have checked the speed of 1000 moves for 15A cutoff, 1679 water box, periodic boundaries. For a start, version 493 is slower than it was when it was coded. This could be due to a change in C++ compiler (I am now using gcc 3.4.5, installed 29 Dec 2005, compared to gcc 3.3.5 used previously - I will check soon if this is the cause of the difference) All version calculate the same energy of -16364.1 kcal mol-1 Version Time to do 1000 moves (InterCLJ) (InterCLJ + InterGroupCLJ) 493 3360 3150 550 3350 3190 557 3455 3440 Current 3650 3650 (mod of 567) Three interesting things to note; (1) Between 550 and 557 we lose the improved speed of Inter+InterGroup (lose 200ms). From 550-557 I changed SireBase::Set to allow the use of a QVector to store the entries, and I then used this to update CutGroup to use AtomVectorSet rather than AtomVector. I also added a list of CutGroups to the Molecule. However no changes were made to SireFF or SireVol. (2) Big change from 557 to current version. This will be version 568. The only change has been the introduction of my new NetObjects version. This is annoying, as this suggests that the new Ptr class is slower than the old NetPtr class... I honestly can't work out why, as both versions used a proxy in the same way as I am using, and both have been compiled with the same optimisation flags etc. My only thought is that the slowdown may be caused by cache misses, caused by core classes getting larger? ------------------------------------------------------------------------ r567 | chris | 2006-02-09 10:21:46 +0000 (Thu, 09 Feb 2006) | 3 lines The CutGroups give the right energy again, though the code is about 30-50% slower than before... I need to fix this! ------------------------------------------------------------------------ r566 | chris | 2006-02-06 17:13:52 +0000 (Mon, 06 Feb 2006) | 3 lines I have worked out how to get NetObject working, and have implemented it. I am also now working on Registry. ------------------------------------------------------------------------ r565 | chris | 2006-02-04 23:08:08 +0000 (Sat, 04 Feb 2006) | 20 lines Beginning to think about how to work the NetObject / Registry classes. I am now leaning towards a design with a single, concrete Registry class. All type specifics are handled by the NetObject class, which contain s the functions necessary to construct and serialise/deserialise the object. NetObject holds a pointer to the registry, which itself points to the NetObject. PtrInfo holds a pointer to the Registry. PtrProxy holds a PtrInfo pointer. Thus PtrInfo can get type and perform all registry type operations (e.g. all MPI functions) via the single, concrete Registry class. The use of NetObject means that there is no need to have several global registry classes. There is guaranteed to be a single registry per NetObject. Each registry will then register itself with the single global registry that is in NetObjects (which will only be held and used by the concrete Registry class that is fully instantiated within NetObjects, so no need for global registry to exist outside the NetObjects library). NetObject : NetObjectBase(){ Registry rgstry; } { globalptr = this; } static NetObjectBase& NetObject::get(){ return *globalptr; } void PtrProxy::register() { metainfo = NetObject::register(*this); } ------------------------------------------------------------------------ r564 | chris | 2006-02-04 20:01:59 +0000 (Sat, 04 Feb 2006) | 3 lines The code now compiles. Doesn't work, but at least it compiles and runs... :-) ------------------------------------------------------------------------ r563 | chris | 2006-02-03 21:53:10 +0000 (Fri, 03 Feb 2006) | 3 lines I am slowly cleaning up the linking problems... ------------------------------------------------------------------------ r562 | chris | 2006-02-03 18:00:32 +0000 (Fri, 03 Feb 2006) | 7 lines I have been further integrating the new design into the code. I have completely broken the network part of NetObjects (its raison d'etre!), and while all of the object files in the project compile, there are link problems. I am also not happy as I have had to make the base class of PtrBase public so that boost::python can see that it is based on shared_ptr... I have an absolutely huge amount of work to do to put all of this back together again... (why must I always refactor things? Everytime I get close, I keep coming up with a better design and end up cleaning everything - for example, the new Ptr design implies the creation of a 'SelfPtr' class, which can replace the mess involved in setting self pointers for CutGroup and Molecule. This of course will change how I hold and recover things like the CutGroupID/MoleculeID within these classes, as this can now be better stored in the PtrProxy class. Of course there will be interesting issues to do with whether or not I automatically register Ptr classes, and thus whether or not it will have a valid CutGroupID...) ------------------------------------------------------------------------ r561 | chris | 2006-02-03 10:53:59 +0000 (Fri, 03 Feb 2006) | 3 lines I have renamed all of the files that are involved in the name change... ------------------------------------------------------------------------ r560 | chris | 2006-02-03 10:47:48 +0000 (Fri, 03 Feb 2006) | 21 lines I am continuing to rewrite the NetPtr type classes. I am about to rename them all, as I wish to drop the 'Net' prefix as it is ugly (and the use of namespaces means that prefixes are unnecessary). The classes will be renamed as follows; In general; Net??? ---> ??? e.g. NetPtr ---> Ptr NetPtrInfo ---> PtrInfo NetPtrProxyPtr ---> PtrProxyPtr The dynamically typed objects will be renamed from ???PtrPtr to Dynamic???Ptr e.g. NetPtrPtr ---> DynamicPtr NetWeakPtrPtr ---> DynamicWeakPtr ------------------------------------------------------------------------ r559 | chris | 2006-02-02 17:42:27 +0000 (Thu, 02 Feb 2006) | 3 lines I am in the middle of changing NetObjects over to the new NetPtr system demonstrated in testvoidcast.cpp. It is making for a much cleaner and more easy to follow design. I am not sure however if NetPtrPtr and NetWeakPtrPtr are the right names for these classes (as they are better known as typeless classes). ------------------------------------------------------------------------ r558 | chris | 2006-02-02 12:57:37 +0000 (Thu, 02 Feb 2006) | 5 lines Working on the new version of NetObjects - the basis of this is in testvoidcast.cpp. The new version will place more functionality into NetPtr (e.g. cloning and serialisation), and will also allow NetPtrs to be placed into a parent/child hierarchy. This will allow a NetPtr to repeat operations on all of its children (e.g. change master for parent and all children, or copy parent and all children to another processor). This will also allow the concept of ownership to be in the NetPtr, so a Molecule will own its CutGroups, and a SimSystem will own the Molecule. This will be how I will prevent a Molecule from being in multiple environments simultaneously, as it will only be able to have one parent, which will be the only thing that can control the master status of the object. ------------------------------------------------------------------------ r557 | chris | 2006-02-01 17:44:44 +0000 (Wed, 01 Feb 2006) | 3 lines Molecule now has a list of CutGroups and a list of Residues. ------------------------------------------------------------------------ r556 | chris | 2006-02-01 17:30:03 +0000 (Wed, 01 Feb 2006) | 3 lines Adding indexing to the CutGroup has allowed me to remove it from the Residue class, which can now use the smaller ResidueData class to hold residue information, rather than the larger ResidueInfo class. The atom name information is now in the AtomVectorSet in the CutGroup, and is not duplicated within the molecule :-) ------------------------------------------------------------------------ r555 | chris | 2006-02-01 16:56:54 +0000 (Wed, 01 Feb 2006) | 3 lines I have changed SireBase::Set so that the type of container used to hold the values can be specified as a template parameter. This has allowed the creation of an AtomVectorSet class, which stores Atoms in a QVector, but also indexes them, and provides the same API as the AtomSet class. I have switched CutGroup over to using the AtomVectorSet and see no performance penalty :-) ------------------------------------------------------------------------ r554 | chris | 2006-02-01 15:46:47 +0000 (Wed, 01 Feb 2006) | 3 lines I have fixed a bug in the new ResidueInfo/MoleculeInfo layout, and now the code works. I have also continued the changes to those classes. I am not happy with having Residue use a ResidueInfo (I would rather use a ResidueData) - the problem is that I have to use the ResidueInfo to index the CutGroup. Perhaps it would be best to add indexing information to the CutGroup itself, thus solving the problem once and for all? ------------------------------------------------------------------------ r553 | chris | 2006-02-01 12:27:23 +0000 (Wed, 01 Feb 2006) | 3 lines Cleaning up the interface and use of MoleculeInfo/ResidueInfo so that they are consistently used by classes that require molecule and residue information. ------------------------------------------------------------------------ r552 | chris | 2006-01-31 17:07:24 +0000 (Tue, 31 Jan 2006) | 2 lines The new build system appears to work.. :-) ------------------------------------------------------------------------ r551 | chris | 2006-01-31 15:57:26 +0000 (Tue, 31 Jan 2006) | 2 lines I am updating the build system so that it only uses qmake. This will make it easier to port to windows or to another compiler (as currently I am stuck with g++) ------------------------------------------------------------------------ r550 | chris | 2006-01-26 09:36:47 +0000 (Thu, 26 Jan 2006) | 3 lines I am fixing some of the tests/demos so that I can show them off tomorrow. ------------------------------------------------------------------------ r549 | chris | 2006-01-25 11:48:15 +0000 (Wed, 25 Jan 2006) | 2 lines I have cleaned up the spier interface so that it will look more professional for my demo. I have also added a 'center' function to EditMol so that I can get the center of the EditMol (thus allowing centering when viewing a molecule) ------------------------------------------------------------------------ r548 | chris | 2006-01-24 15:42:46 +0000 (Tue, 24 Jan 2006) | 2 lines Added the presentation that I will be giving at Bristol and Slough this week. It describes the current design and philosophy of the program. ------------------------------------------------------------------------ r547 | chris | 2006-01-22 22:40:04 +0000 (Sun, 22 Jan 2006) | 3 lines I have sorted out translating the camera, and added a button class that is used to change between rotation and translation modes. I have also added a 'center selection' button, and also updated the selection info box to add bond length or angle/dihedral size depending on how many atoms are selected. There appears however to be a memory leak when the display is repainted... ------------------------------------------------------------------------ r546 | chris | 2006-01-21 23:47:42 +0000 (Sat, 21 Jan 2006) | 3 lines TextLabel is now working, and I have a dynamic highlight and selection label, which appear and disappear via signals/slots ------------------------------------------------------------------------ r545 | chris | 2006-01-21 21:17:50 +0000 (Sat, 21 Jan 2006) | 2 lines Working on getting the text label to resize nicely to just fit the text. ------------------------------------------------------------------------ r544 | chris | 2006-01-20 21:58:43 +0000 (Fri, 20 Jan 2006) | 3 lines I am working on the sizing and layout of widgets. I have written a very simple TextLabel class. I will eventually use this to display text on the canvas (e.g. the highlighted atom information, or the selected atom information) ------------------------------------------------------------------------ r543 | chris | 2006-01-20 15:17:07 +0000 (Fri, 20 Jan 2006) | 3 lines Now using a QMainWindow with spier. Activated a menu with various options. Added ability to view different buffers within the Viewer. It is pretty cool! ------------------------------------------------------------------------ r542 | chris | 2006-01-19 22:42:02 +0000 (Thu, 19 Jan 2006) | 3 lines Added the beginnings of the framework to allow animation of the widget. ------------------------------------------------------------------------ r541 | chris | 2006-01-19 22:03:36 +0000 (Thu, 19 Jan 2006) | 3 lines I have sorted out the GLWidget code to use shared pointers for memory control, rather then QObject. I have also sorted out the widget transformations using QMatrix and the float Qt coordinate classes (QSizeF, QPointF and QRectF), and have also switched over to using QPainterPath to work out where the widget clipping is, and whether or not the mouse is over the widget. ------------------------------------------------------------------------ r540 | chris | 2006-01-18 17:06:01 +0000 (Wed, 18 Jan 2006) | 3 lines I can draw a lot, and have nearly positioned the pie menu text labels correctly. However, I think that my underlying widget design is too complex and messy - in particular, my piemenu/piemenubutton split is wrong as there is too much indecision over which part is doing the painting. I also don't like the qobject delete property - I would rather use shared pointers, as in the rest of the code. ------------------------------------------------------------------------ r539 | chris | 2006-01-18 11:23:55 +0000 (Wed, 18 Jan 2006) | 3 lines I have added some unit tests for the SireMaths::Angle class, and have just about got my pie menu class working (it is nearly functional). It is definitely pretty :-) ------------------------------------------------------------------------ r538 | chris | 2006-01-17 17:28:46 +0000 (Tue, 17 Jan 2006) | 3 lines I can draw a trivial pursuit wedge holder! ------------------------------------------------------------------------ r537 | chris | 2006-01-17 16:13:10 +0000 (Tue, 17 Jan 2006) | 3 lines Creating a framework to have GLWidgets drawn on the GLCanvas. I have also changed the SireMaths::Angle class so that it goes from -360 to 360, (with positive meaning clockwise, negative being anticlockwise) ------------------------------------------------------------------------ r536 | chris | 2006-01-17 14:13:03 +0000 (Tue, 17 Jan 2006) | 3 lines I have split the rendering of the UI off into a separate class (so to simplify the GLCanvas class) ------------------------------------------------------------------------ r535 | chris | 2006-01-17 10:05:09 +0000 (Tue, 17 Jan 2006) | 3 lines I had to give up using a texture as it was too slow on scruffy. I have thus changed to applying the QPainter first, saving the state, drawing the scene, then restoring the state. It works quite well, and the QPainter commands work well too. I can even now use the font dialog to choose the font. ------------------------------------------------------------------------ r534 | chris | 2006-01-16 22:03:31 +0000 (Mon, 16 Jan 2006) | 3 lines I am working on rendering the scene to a texture, and using QPainter to draw the UI elements on top of the scene - I will eventually use a Piemenu... ------------------------------------------------------------------------ r533 | chris | 2006-01-16 11:09:15 +0000 (Mon, 16 Jan 2006) | 5 lines I have got selection working now! I have also upgraded to Qt 4.1 (though am not yet using any 4.1 specific features). I am pretty pleased with this. :-) ------------------------------------------------------------------------ r532 | chris | 2006-01-15 23:13:18 +0000 (Sun, 15 Jan 2006) | 2 lines Nearly finished updating the data structure - code is still broken. ------------------------------------------------------------------------ r531 | chris | 2006-01-15 21:17:06 +0000 (Sun, 15 Jan 2006) | 3 lines I am making more progress sorting out the data structure to hold the molecule. The code is still broken, but it is getting there :-) ------------------------------------------------------------------------ r530 | chris | 2006-01-15 15:04:57 +0000 (Sun, 15 Jan 2006) | 3 lines I am working on a MolDisplayData class that will hold all of the display information about a molecule (including its MoleculeReps). The code is currently broken. ------------------------------------------------------------------------ r529 | chris | 2006-01-14 23:11:35 +0000 (Sat, 14 Jan 2006) | 3 lines I have improved the render speed by not performing selection while the camera is being moved. I have also slowed down camera rotation by a half, which has made things look smoother. I have also written some code that resets the cursor position after a move to the position it was in when the mouse button was first pressed. ------------------------------------------------------------------------ r528 | chris | 2006-01-14 18:29:01 +0000 (Sat, 14 Jan 2006) | 3 lines Fixed ViewMode so that selection works again. ------------------------------------------------------------------------ r527 | chris | 2006-01-14 18:05:11 +0000 (Sat, 14 Jan 2006) | 3 lines I have abstracted all of the code to handle and interpret keyboard and mouse events into a InputInterpreter virtual class hierarchy (with the current GLCanvas code now in the ViewMode class). This has simplified GLCanvas, and enables me to easily switch between different ways of handling hte mouse and keyboard (e.g. so that I can switch from rotating the molecule to translating atoms or resizing bonds). ------------------------------------------------------------------------ r526 | chris | 2006-01-14 13:12:18 +0000 (Sat, 14 Jan 2006) | 3 lines Added a mouseClickEvent so that I can click on the canvas, and I have also begun work on freezing the mouse cursor (and hiding it) when the view is being rotated. This needs more work however, as it creates some jerky motion... ------------------------------------------------------------------------ r525 | chris | 2006-01-12 22:48:27 +0000 (Thu, 12 Jan 2006) | 5 lines Added mouse wheel support to spier. I will need to update spier by creating a 'mouseClickEvent' function, which could be a mouse press and release within a specified interval, that doesn't involve much motion of the mouse (e.g. if the mouse moves more than a tolerance then a mouse press, then mouse move events are sent). I will implement the logic for this in the viewer class, which can then pass mouseClick events to the GLCanvas. In Qt, the double click event does still send the press event and release event immediately, then a doubleClickEvent afterwards... ------------------------------------------------------------------------ r524 | chris | 2006-01-12 22:18:41 +0000 (Thu, 12 Jan 2006) | 3 lines I have fixed the bug in the triangle class that meant that it was calculating the wrong angle. Now that that has been fixed, and now I have added a change/setImproper set of functions, the tip4p molecule can now be built! (though setImproper doesn't seem to work for all angles...) ------------------------------------------------------------------------ r523 | chris | 2006-01-12 16:31:51 +0000 (Thu, 12 Jan 2006) | 3 lines I have written the code to change the internal geometry of EditMols, and am beginning to test it (by building a tip4p molecule). Something is not quite right at the moment, so I will need to test and debug... ------------------------------------------------------------------------ r522 | chris | 2006-01-11 17:40:24 +0000 (Wed, 11 Jan 2006) | 3 lines I am now working on the code to split the molecule using the new BondGroup class used by the EditMol and Molecule classes. I think that I have got the algorithm in place, with most of the code, but it is not quite ready, so will not yet compile. ------------------------------------------------------------------------ r521 | chris | 2006-01-11 08:26:37 +0000 (Wed, 11 Jan 2006) | 3 lines I have changed the GLSphereMesh slightly so that it uses different LOD for different sphere radii - I do need a better algorithm that works out the height in pixels of the rendered sphere, and then works out the LOD based on that... ------------------------------------------------------------------------ r520 | chris | 2006-01-10 16:19:09 +0000 (Tue, 10 Jan 2006) | 7 lines I have added some code to slow down rendering to a maximum of 15fps (so that we don't overuse CPU) I have also fixed a small bug that meant that the whole scene was redrawn for every paint event (as camera->look() always returned true). I have also split MoleculeRep to create two different molecular representations (VDWRep and CPKRep). I need to update the dynamic LOD algorithm to use different LOD boundaries depending on the size of the object on the screen (as the VDWRep looks pretty poor as it uses large spheres) ------------------------------------------------------------------------ r519 | chris | 2006-01-09 21:15:07 +0000 (Mon, 09 Jan 2006) | 3 lines I have got the sphere view frustrum culling algorithm working, and also the dynamic LOD for spheres and cylinders. This has resulted in some very fast rendering! My water box and p38 now render at interactive speeds on my laptop. ------------------------------------------------------------------------ r518 | chris | 2006-01-09 17:54:39 +0000 (Mon, 09 Jan 2006) | 3 lines I can now get the equations for the view frustrum planes for the camera, and now have the beginnings of view frustrum culling. I need to optimise the data structure, and still need to cull the cylinders, but the maths is appearing to be working! ------------------------------------------------------------------------ r517 | chris | 2006-01-09 16:41:03 +0000 (Mon, 09 Jan 2006) | 3 lines I have converted GLCylinder to GLCylinderMesh, and created a new GLCylinder class, as I did for GLSphere/GLSphereMesh ------------------------------------------------------------------------ r516 | chris | 2006-01-09 15:48:57 +0000 (Mon, 09 Jan 2006) | 5 lines Created a SireMaths::Sphere class to handle the maths that I will soon be doing with spheres. Also moved GLSphere to GLSphereMesh, and have made GLSphere handle everything, from moving to the right place to setting the material. This necessitated fixing glPush/PopAttrib to work with the fixed state of materials... ------------------------------------------------------------------------ r515 | chris | 2006-01-08 22:58:04 +0000 (Sun, 08 Jan 2006) | 3 lines Added code to the camera class so that it can calculate the equations of the frustrum planes in world coordinates. This will allow me to do view frustrum culling and also (hopefully) quick depth calculations, thus allowing me to try and speed up the code a little! ------------------------------------------------------------------------ r514 | chris | 2006-01-08 20:04:42 +0000 (Sun, 08 Jan 2006) | 3 lines I have fixed the cylinder orientation bug (all bonds are now rendered correctly) and have also changed the 'main' function so that I can specify PDB files on the command line to display. I am pretty pleased with this code now! ------------------------------------------------------------------------ r513 | chris | 2006-01-08 12:46:44 +0000 (Sun, 08 Jan 2006) | 5 lines I have worked up the keyboard interface to the GLCanvas (can now rotate spin and zoom the molecule using the keyboard as well as the mouse) and have got a nice ctrl/shift modifier scheme working which is consistent for both the keyboard and mouse manipulation method. I have also changed the camera to use spin and zoom, thus fixing the problem with the camera flipping over if it got too close. I have also added some fog, which looks quite nice. ------------------------------------------------------------------------ r512 | chris | 2006-01-08 11:12:14 +0000 (Sun, 08 Jan 2006) | 3 lines Moved all rendering to go view a GLCanvas class, thus allowing multiple GLCanvas objects to be swapped to and from a Viewer widget. This has also cleaned up a lot of the code, with the Viewer no longer being passed with every draw operation! ------------------------------------------------------------------------ r511 | chris | 2006-01-07 17:34:51 +0000 (Sat, 07 Jan 2006) | 3 lines I have added the glew library so that I can easily access openGL extensions. I have used it to access the multisample extensions so that I can control the antialiasing. ------------------------------------------------------------------------ r510 | chris | 2006-01-04 22:36:46 +0000 (Wed, 04 Jan 2006) | 3 lines I can now draw a nice background gradient :-) ------------------------------------------------------------------------ r509 | chris | 2006-01-04 00:03:30 +0000 (Wed, 04 Jan 2006) | 3 lines I have created a GLMatrix class which has allowed me to cache the result of the geometry calculation that was necessary to rotate all of the cylinders to lie along the bonds. I now have a nice ball and stick rendering of a molecule. There are a few problems (some cylinders are the wrong way around for the water box and ntrc) but the dioxin is perfect! ------------------------------------------------------------------------ r508 | chris | 2006-01-03 22:41:18 +0000 (Tue, 03 Jan 2006) | 3 lines I nearly have the ball and stick model working... (I just need to rotate the cylinders to align with the bonds) ------------------------------------------------------------------------ r507 | chris | 2006-01-03 22:02:12 +0000 (Tue, 03 Jan 2006) | 3 lines Added a GLCylinder class, and have changed the MeshMgr to use the actual mesh as the index, rather than its parameters, as this simplifies the library code for meshes with complex parameters (e.g. cylinder) ------------------------------------------------------------------------ r506 | chris | 2006-01-03 18:03:27 +0000 (Tue, 03 Jan 2006) | 2 lines Switching over to using GLUQuadrics to render the sphere, as a way of learning how to use them (ready for how I use one in GLCylinder) ------------------------------------------------------------------------ r505 | chris | 2006-01-03 16:51:13 +0000 (Tue, 03 Jan 2006) | 3 lines Fixed a bug in the encoding and decoding of pixel colours, and have also improved the logic of the render sequence so that very little work is done unless the mouse is actually over a molecule. This means that the selection is usable for my water box (though I do need to find a way to speed up the rendering of spheres) ------------------------------------------------------------------------ r504 | chris | 2006-01-03 13:57:19 +0000 (Tue, 03 Jan 2006) | 2 lines Changed SelectID so that it is an implicitly shared class, and cleaned up some of the render code. ------------------------------------------------------------------------ r503 | chris | 2006-01-03 11:54:15 +0000 (Tue, 03 Jan 2006) | 3 lines I now have full atomic resolution picking! It is not the most efficient way yet, so I will reorder parts so that the molecular level selections are always available on the back buffer (thus we only need to redraw when the mouse moves over a molecule - while in selection mode). ------------------------------------------------------------------------ r502 | chris | 2006-01-02 17:13:38 +0000 (Mon, 02 Jan 2006) | 3 lines I have got a basic pixel based picking system working, though it needs more work. It is a lot more accurate than the openGL picking method, and will be the one that I will use... ------------------------------------------------------------------------ r501 | chris | 2006-01-02 16:09:58 +0000 (Mon, 02 Jan 2006) | 2 lines I have got picking working using the glLoadName picking mechanism. It is not very accurate however. I will now implement a colour picking method using the back buffer, as I suspect that this will be more accurate. ------------------------------------------------------------------------ r500 | chris | 2006-01-02 11:37:23 +0000 (Mon, 02 Jan 2006) | 3 lines Have a mesh manager so that individual meshes can be reused for different atoms (e.g. GLSphere replicated for several atoms). Can also load multiple molecules, and have slightly improved the rendering speed. ------------------------------------------------------------------------ r499 | chris | 2006-01-01 22:23:35 +0000 (Sun, 01 Jan 2006) | 3 lines I now have a pretty coloured in molecule rendered in spier! ------------------------------------------------------------------------ r498 | chris | 2006-01-01 14:48:19 +0000 (Sun, 01 Jan 2006) | 3 lines I have written the framework of the Material code (the code that manages and applies openGL materials, composed of materials, textures and shaders). ------------------------------------------------------------------------ r497 | chris | 2005-12-29 18:43:15 +0000 (Thu, 29 Dec 2005) | 3 lines Spier can now load and view a molecule (as a collection of white wireframe spheres) ------------------------------------------------------------------------ r496 | chris | 2005-12-17 23:25:17 +0000 (Sat, 17 Dec 2005) | 3 lines Added a Spier library and application, as the beginnings of the basics of the viewer and camera class. These are very dirty, but are just here to allow me to view whatever I render via a simple class. ------------------------------------------------------------------------ r495 | chris | 2005-12-17 16:22:33 +0000 (Sat, 17 Dec 2005) | 3 lines Starting my Christmas mini-project - building a basic viewer (spier) for the EditMol class. This will eventually become the GUI for Sire, allowing the graphical construction and manipulation of molecules, as well as monitoring running simulations. However, for this Christmas, all I want to write is a small code that can view an EditMol. ------------------------------------------------------------------------ r494 | chris | 2005-12-16 09:38:21 +0000 (Fri, 16 Dec 2005) | 5 lines I have sped up the periodic boundaris a little more. I think that they are now as fast as they are going to get (at least not without costing a lot more effort for little gain - periodic boundaris only add about 0.14ns per water-water interaction. The time for 1000 moves is now faster than ProtoMS2.1, so I am pretty pleased! :-) ------------------------------------------------------------------------ r493 | chris | 2005-12-15 19:03:32 +0000 (Thu, 15 Dec 2005) | 3 lines I have sped up the periodic box even more, now completing 1000 steps in 3 seconds. ------------------------------------------------------------------------ r492 | chris | 2005-12-15 15:07:10 +0000 (Thu, 15 Dec 2005) | 3 lines I have succeeded in making the periodic box code a little bit quicker. It is still not as fast as I would like it to be though. ------------------------------------------------------------------------ r491 | chris | 2005-12-15 08:54:40 +0000 (Thu, 15 Dec 2005) | 5 lines The cause of the slow speed of InterGroupCLJFF for moves per second was because it used Set.splitIntoLists, which is very inefficient for large sets. I have replaced this with, to be honest, a much better piece of code, and the code now does 1000 moves in 1.8 seconds, while the single InterCLJFF forcefield achieves 1000 moves in 1.7 seconds. I think that that is pretty good :-) I have tested the periodic box code, and there is definitly something wrong with that, as the code is still very very slow when the box size is huge (i.e. the result is the same as in vacuum). I will need to look at this in detail to work out what is going wrong... ------------------------------------------------------------------------ r490 | chris | 2005-12-14 17:54:10 +0000 (Wed, 14 Dec 2005) | 3 lines Moves using the InterGroupCLJFF run at about 1000 every 2.8 seconds now, while using a single InterCLJFF they run at about 1000 every 1.7 seconds. It is still not sufficiently fast (I want both to be about 1-1.5 seconds) ------------------------------------------------------------------------ r489 | chris | 2005-12-14 16:19:36 +0000 (Wed, 14 Dec 2005) | 3 lines The last few versions wouldn't compile from scratch. I have fixed the code (it now does compile from scratch) but the speed has dropped to 1000 moves in 3.5 seconds. Why have I lost half a second? ------------------------------------------------------------------------ r488 | chris | 2005-12-14 15:50:41 +0000 (Wed, 14 Dec 2005) | 3 lines I have wrapped up the FFGroup and am beginning to speed test the energy calculation. I have faked up a subroutine that does a set of 'moves' of the cutgroups that have loaded (FFGroup::testSpeed) and have compared this to the simulation speed of ProtoMS. ProtoMS2.1 runs at about 1000 moves every 2 seconds for gas-phase boundaries and 15A cutoff. Sire runs at 1000 moves in 3 seconds. I have got quite a bit of work to do to speed this up...! ------------------------------------------------------------------------ r487 | chris | 2005-12-14 11:51:08 +0000 (Wed, 14 Dec 2005) | 3 lines I have done some more work on the FFWrapper class, and on working out how to automatically cast from a forcefield (that does not have to be part of any inheritance hierarchy) to an FFWrapperPtr. I have achieved this (see techdocs/testcast.cpp for the basics) and I have also achieved this in python via some python hackery (see python/Sire/SireFF/__init__.py). ------------------------------------------------------------------------ r486 | chris | 2005-12-13 23:01:33 +0000 (Tue, 13 Dec 2005) | 3 lines I am working on the FFWrapper class, which is used to wrap up a forcefield to provide a consistent interface to it, and also to manage the energies that are being calculated. ------------------------------------------------------------------------ r485 | chris | 2005-12-13 12:23:17 +0000 (Tue, 13 Dec 2005) | 3 lines I have wrapped up the InterGroupCLJFF class and have tested it in python (by splitting the water box into two separate groups). The total energy is equal to the single group value (so the energies are correct) and it is even quicker to do this than to use the single group! (this suggests some inefficiency in InterCLJFF). I am really pleased, as this validates my idea to use multiple forcefields to represent complex interactions. It also shows that the multiple forcefield route is the best one to use to get arbitrary components (e.g. here I have split the total CLJ energy of the water box into three components; i) interaction within group A, ii) interaction within group B, and iii) interaction between group A and B. We could imagine group A being the ligand, and group B being the solvent (or even adding a group C as the protein). ------------------------------------------------------------------------ r484 | chris | 2005-12-13 11:59:49 +0000 (Tue, 13 Dec 2005) | 3 lines I have finished implementing the InterGroupCLJFF (though it still needs testing). I have cleaned up the code for the Set class, fixed a bug in the Atom class (didn't take account of the specified element in the constructor) and fixed testnetobjects.cpp so that the unit tests all work again. ------------------------------------------------------------------------ r483 | chris | 2005-12-12 17:09:34 +0000 (Mon, 12 Dec 2005) | 2 lines I am working on implementing the InterGroupCLJFF - the code probably doesn't compile at the moment... :-) ------------------------------------------------------------------------ r482 | chris | 2005-12-12 15:27:51 +0000 (Mon, 12 Dec 2005) | 3 lines I have now started work on the InterGroupCLJFF, which calculates the CLJ energy between groups of CutGroups. To do this, I have moved the common CLJ code into a CLJFF class. I have also created a base ForceField class, though at the moment I am not sure if I really need it... ------------------------------------------------------------------------ r481 | chris | 2005-12-12 12:09:27 +0000 (Mon, 12 Dec 2005) | 5 lines I have implemented the periodic boundary conditions, and have run a speed and energy comparison to ProtoMS2.1 (in ideas/current-speed) The periodic boundaries appear to give the right energy, and are faster for large cutoffs. They are however slower for small cutoffs, with a 15A cutoff being about the same speed in both codes. I need to think about why the addition of these boundary conditions has slowed the code down so much. ------------------------------------------------------------------------ r480 | chris | 2005-12-09 14:38:47 +0000 (Fri, 09 Dec 2005) | 3 lines I have added a periodic box volume class (though it is currently just a copy of Cartesian), and I have moved all cutgroup and cutoff information out of SimVolume (which has now become pure virtual) and into InterCLJFF. A forcefield should manage its own cutoff and list of contained cutgroups. ------------------------------------------------------------------------ r479 | chris | 2005-12-09 13:36:49 +0000 (Fri, 09 Dec 2005) | 3 lines I have moved the code holding CutGroups out of the volume and into the InterCLJFF. I now think that a forcefield should hold the cutgroups, and use a volume to test how close together they are. ------------------------------------------------------------------------ r478 | chris | 2005-12-09 13:22:34 +0000 (Fri, 09 Dec 2005) | 3 lines I have gone back to the slow version (by stepping through the creation of that version) and I found that the speed loss was caused by the grouping of the 'if' conditions in InterCLJFF (see the source code comments for details). I have fixed it so that the volume classes are not used to get the lists of cutgroups. ------------------------------------------------------------------------ r477 | chris | 2005-12-09 12:37:05 +0000 (Fri, 09 Dec 2005) | 3 lines I have gone back to the previous version as it has kept the speed. I don't know what happened with the last version... ------------------------------------------------------------------------ r476 | chris | 2005-12-09 11:39:09 +0000 (Fri, 09 Dec 2005) | 3 lines I have switched over to not returning lists of CutGroups from the volume. For some reason this has really slowed down the speed of the code... (even though I haven't changed the important parts?). I will test to see what has gone wrong... ------------------------------------------------------------------------ r475 | chris | 2005-12-09 11:03:15 +0000 (Fri, 09 Dec 2005) | 3 lines I have written the code to calculate the energy of subsets of CutGroups of the InterCLJFF forcefield. ------------------------------------------------------------------------ r474 | chris | 2005-12-08 11:17:14 +0000 (Thu, 08 Dec 2005) | 3 lines I have just run some speed tests comparing the last version of Sire against ProtoMS3 (version 200) and ProtoMS2.1 (version 723). The results are in ideas/current-speed, but I am pleased to say that this version is as fast as the prototype, and much faster than ProtoMS2.1 :-) ------------------------------------------------------------------------ r473 | chris | 2005-12-08 10:22:40 +0000 (Thu, 08 Dec 2005) | 13 lines I have managed to get the code as fast, if not faster, than the prototype! The changes I made to do this are; Main speed up due to removing copying of CLJWindows when lookup in the hash. Used a pointer instead. Also modified Windows so that it used an internal array, and lookup up in array, rather than switch case (what was I thinking?) Also removed Energy objects from inner loop, and reverted to using plain doubles and double&. This gave a small speedup (about 100-200ms), which was worth it. The Energy class is still used to return the final result, and should be used by the user and the forcefield handler classes (which aren't doing double loops!) Changed function that combines CLJ parameters from one which calls function pointer for each CLJ pair (again, what was I thinking?), to having a single function pointer that calls a function that combine together all of the CLJ pairs. Moved the lookup of the CLJWindow for the second group of the pair into the cljEnergy function, so that it is only looked up if the groups are within the cutoff distance (this saved quite a bit of time as well). Changed CLJParameter, LJParameter and CLJPair to return const double& rather than double - this saved a surprisingly large amount of time! My efforts to do this (together with the actual speeds, compared to the prototype, ProtoMS3, also run today) are in techdocs/speed-test ------------------------------------------------------------------------ r472 | chris | 2005-12-07 20:10:06 +0000 (Wed, 07 Dec 2005) | 3 lines I have fixed the bug in the calculation of the energy. There is a slight difference in the energy compared to the prototype, and while the speed is only a bit slower for 80A cutoff, it is a lot slower for the 15A cutoff. ------------------------------------------------------------------------ r471 | chris | 2005-12-07 17:15:26 +0000 (Wed, 07 Dec 2005) | 3 lines The code was not dog slow (phew!). I thought I was calculating the energy once, but was actually doing it ten times - this is why the speed was ten times slower than I thought it should be! I have recompiled the version I used for the original benchmarking (version 200) and this is actually a bit quicker now (probably due to gcc 3.4 being better). This code is slower than the prototype, and is also wrong (something wrong with adding together EnergyPacks). Ah well - more debugging ahead! ------------------------------------------------------------------------ r470 | chris | 2005-12-07 12:40:46 +0000 (Wed, 07 Dec 2005) | 3 lines I am making modifications to speed this code up, because it is dog slow!!! Where has all the speed from the prototype gone??? ------------------------------------------------------------------------ r469 | chris | 2005-12-05 16:51:44 +0000 (Mon, 05 Dec 2005) | 7 lines I have wrapped up the Set class, so that now MoleculeSet and CutGroupSet are wrapped (this required lots of effort, involving moving all indexer functions into a dedicated file, and updating some of the Set class). The code can now add molecules to a forcefield and calculate the energy. The energy looks wrong, but at least this is a start! I have a big problem with my CLJTable class in that it only works if the molecule uses the same residue numbers. A solvent typically uses the residue number as an atom number, so this doesn't work. I think that I will need to add the function to CLJTable to renumber residues, as I looked at renumbering the EditRes but that it hugely complicated (as you have to renumber all EditRes at once or you break the inter-residue bonding!) ------------------------------------------------------------------------ r468 | chris | 2005-12-05 12:19:51 +0000 (Mon, 05 Dec 2005) | 5 lines I have now actually written the code that calculates the intermolecular CLJ energy! (at last!) I haven't tested it yet, but it does all compile and link. ------------------------------------------------------------------------ r467 | chris | 2005-12-04 22:29:09 +0000 (Sun, 04 Dec 2005) | 5 lines Adding in records of which CutGroups are perturbable in the InterCLJFF forcefield. Code is still broken. ------------------------------------------------------------------------ r466 | chris | 2005-12-04 16:00:03 +0000 (Sun, 04 Dec 2005) | 5 lines Working on the CLJMutator, and assigning parameters to CutGroups. I think that I have a scheme that will work... The code is broken... ------------------------------------------------------------------------ r465 | chris | 2005-12-02 15:11:02 +0000 (Fri, 02 Dec 2005) | 3 lines I am working on adding the CLJ parameters to the forcefield. It is complicated by the desire that I want to save memory by not having multiple copies of the same parameters. Maybe that's not worth it? Whatever, I need to get working on the mutator, as the form of the CLJMutator is key to how I represent the CLJ parameters within the forcefield. ------------------------------------------------------------------------ r464 | chris | 2005-12-02 12:31:23 +0000 (Fri, 02 Dec 2005) | 5 lines I am back working on the forcefield and volume classes. It makes so much more sense now I have a more logical data structure for the molecules. I have now got good separation between forcefields (so separate InterCLJFF and IntraCLJFF etc) and a cleaner way to do energy components. I now just have to implement everything :-) (code is currently broken) ------------------------------------------------------------------------ r463 | chris | 2005-12-02 09:18:55 +0000 (Fri, 02 Dec 2005) | 3 lines Added ddd to the debug run options, and fixed a bug in the non-exact matching of atom names (forgot to return the index, so got a crash) ------------------------------------------------------------------------ r462 | chris | 2005-12-01 21:33:13 +0000 (Thu, 01 Dec 2005) | 5 lines Fixed a bug in the assignment of the residue atoms, and have also added some string functions to more classes. I have also updated the residueinfo class to try case insensitive matches if a case-sensitive match is not found. ------------------------------------------------------------------------ r461 | chris | 2005-12-01 17:03:53 +0000 (Thu, 01 Dec 2005) | 3 lines I have wrapped up the geometry classes (line, triangle and torsion) and have also added some functionality to the element (information as to the period and group of the element, which can then allow functions that return whether it is a noble gas, transition metal etc.) ------------------------------------------------------------------------ r460 | chris | 2005-12-01 14:13:10 +0000 (Thu, 01 Dec 2005) | 2 lines The wrapping of molecule, residue and cutgroup is going well, and it looks like I can convert EditMols to a variety of different types of molecule! ------------------------------------------------------------------------ r459 | chris | 2005-12-01 12:16:02 +0000 (Thu, 01 Dec 2005) | 21 lines I have wrapped up the molecule class, and provided MoleculeFactory and CutGroupFactory so that the classes can be used with NetObjects. I have very much rationalised how I will do serialising and deserialising, and will eventually update all classes to use the same standard functions and operators, e.g. Obj(const QByteArray &data); /// create object from data Obj.load(const QByteArray &data); /// load existing object from data Obj.streamLoad(QDataStream &ds); /// load existing object from datastream QByteArray Obj.dump() const; /// dump the object to a QByteArray void Obj.streamDump(QDataStream &ds) const; ///dump the object to a datastream then also define operator>> and operator<< to a QDataStream. See Molecule, CutGroup, AABox and PerturbData for examples of completed code. The benefit of this is that it allows a flexible dump and restore interface, there is no issue with friend operator functions, and the actual work is performed by only two functions (streamLoad and streamDump) which both use a version token to prevent loading of incompatible data versions. ------------------------------------------------------------------------ r458 | chris | 2005-11-30 22:47:56 +0000 (Wed, 30 Nov 2005) | 3 lines Wrapping up the Molecule class - I have also improved the wrapping of the QList, QSet and QVector. ------------------------------------------------------------------------ r457 | chris | 2005-11-30 16:33:04 +0000 (Wed, 30 Nov 2005) | 3 lines I have integrated the new SireMol module with the rest of the program. The units tests work, as does the test/test.py script (which loads up p38, sb1 and a water box, and assigns the clj parameters from the database - the parameters look correct!) ------------------------------------------------------------------------ r456 | chris | 2005-11-30 11:31:37 +0000 (Wed, 30 Nov 2005) | 5 lines The new SireMol classes now compile in their new location. My next step is to integrate the rest of the modules with them (which should hopefully not be too difficult, as long as I have written this in as modular a manner as I hope I have :-) (also, I have just now started using kde 3.5 and kdevelop 3.3!) ------------------------------------------------------------------------ r455 | chris | 2005-11-30 09:52:41 +0000 (Wed, 30 Nov 2005) | 2 lines I have changed all 'SandBox' references in the new files to 'SireMol'. My next step is to fix everything so that it will compile again... :-) ------------------------------------------------------------------------ r454 | chris | 2005-11-30 09:27:42 +0000 (Wed, 30 Nov 2005) | 3 lines I have now moved the new SireMol files into the SireMol directory, and have removed tmp. ------------------------------------------------------------------------ r453 | chris | 2005-11-30 09:20:55 +0000 (Wed, 30 Nov 2005) | 5 lines I have now moved the old SireMol files to tmp. It is interesting to note that the replacing files are ~3500 lines, with the originals being ~5000 lines. I still need to do some work to finish the new files, in particular I need to wrap up all of the classes. ------------------------------------------------------------------------ r452 | chris | 2005-11-30 09:13:55 +0000 (Wed, 30 Nov 2005) | 3 lines Ok, I have now moved the SandBox files into tmp... ------------------------------------------------------------------------ r451 | chris | 2005-11-30 09:08:55 +0000 (Wed, 30 Nov 2005) | 3 lines I am now going to start moving the sandbox files into SireMol. I will swap the files, so I will first move them into tmp, then I will move the SireMol files into the sandbox, then I will move the new files into SireMol, then remove tmp. ------------------------------------------------------------------------ r450 | chris | 2005-11-29 16:08:22 +0000 (Tue, 29 Nov 2005) | 2 lines I am now testing the EditMol wrapping, and am beginning to make some changes to improve the usage api. ------------------------------------------------------------------------ r449 | chris | 2005-11-29 15:34:17 +0000 (Tue, 29 Nov 2005) | 3 lines I have implemented a lot more of the SandBox, and the code now compiles and runs. I still need to test the editmol/res wrapping... ------------------------------------------------------------------------ r448 | chris | 2005-11-29 11:45:23 +0000 (Tue, 29 Nov 2005) | 3 lines I have wrapped up the new EditMol and EditRes classes, and the code compiles and runs. I am now beginning to test the new classes, and will then wrap up everything else. ------------------------------------------------------------------------ r447 | chris | 2005-11-28 22:32:48 +0000 (Mon, 28 Nov 2005) | 3 lines The code now compiles, and runs! The tests and test.py all work. Note that I haven't finished my work in the sandbox - all this means is that what I have written does compile, and that the use of the SandBox namespace means that it is not clashing with the old SireMol data structure. ------------------------------------------------------------------------ r446 | chris | 2005-11-28 17:05:17 +0000 (Mon, 28 Nov 2005) | 3 lines More files are now compiling (up to EditMol), but I am still not done.... ------------------------------------------------------------------------ r445 | chris | 2005-11-28 14:53:59 +0000 (Mon, 28 Nov 2005) | 2 lines molecule.cpp and cutgroup.cpp now compile :-) ------------------------------------------------------------------------ r444 | chris | 2005-11-28 14:00:39 +0000 (Mon, 28 Nov 2005) | 3 lines I am making a lot of progress implementing my ideas in the sandbox. I am also now beginning to try and compile things, though of course nothing new compiles yet... :-0 ------------------------------------------------------------------------ r443 | chris | 2005-11-26 23:23:31 +0000 (Sat, 26 Nov 2005) | 5 lines I have added EditMol and EditRes to the SandBox, and have updated EditMol to the new data structure. I have also written the first draft implementation of BondGroup. I think that this is a much cleaner way of handling bonds, especially now that I have dropped the need to store the actual atom data in a bond, but rather just store the atomindex data. I will be able to use BondGroups to describe the bonding in both the EditMol and Molecule classes, so will be able to provide a common interface to the splitMolecule and moveInternal functions! As ever at the moment, the code is broken (indeed, I haven't even attempted to compile the SandBox once yet...) ------------------------------------------------------------------------ r442 | chris | 2005-11-26 16:10:52 +0000 (Sat, 26 Nov 2005) | 3 lines I am beginning to write the implementation of my design... I have changed the perturbation so that the Mutator holds the lam0 and lam1 states, and that the molecule is based on a skeleton that does not change at all with lambda. ------------------------------------------------------------------------ r441 | chris | 2005-11-25 13:53:07 +0000 (Fri, 25 Nov 2005) | 3 lines Added an EnumFlags template class so that the TmplType class functions can be used with any suitable enum class. ------------------------------------------------------------------------ r440 | chris | 2005-11-25 11:49:28 +0000 (Fri, 25 Nov 2005) | 3 lines I have added back the BondGroup class (originally called FlexGroup). I think that the new data structure should be very powerful, as I can already see how the perturbations will work, and how the inter- and intra-molecular energies will be calculated (something that was quite vague using the old structure). Also, this structure places fewer restrictions on the types of molecules that may be loaded. ------------------------------------------------------------------------ r439 | chris | 2005-11-25 11:39:42 +0000 (Fri, 25 Nov 2005) | 3 lines I have made more progress with the residueinfo class, which is the key class for identifying atoms in a residue at different lambda states. The residueinfo will be passed to lots of different classes that need to keep tabs on atoms, e.g. CLJTable. I have mistakenly removed flexgroup, which will be the BondGroup class, so I will now need to retrieve it :-) ------------------------------------------------------------------------ r438 | chris | 2005-11-25 09:39:18 +0000 (Fri, 25 Nov 2005) | 3 lines Copying moleculeinfo to the sandbox. ------------------------------------------------------------------------ r437 | chris | 2005-11-25 09:38:53 +0000 (Fri, 25 Nov 2005) | 2 lines File movements... ------------------------------------------------------------------------ r436 | chris | 2005-11-25 09:38:22 +0000 (Fri, 25 Nov 2005) | 2 lines Mistakes... ------------------------------------------------------------------------ r435 | chris | 2005-11-25 09:35:18 +0000 (Fri, 25 Nov 2005) | 5 lines The data structure for the molecule is beginning to crystallise :-) Code is broken. ------------------------------------------------------------------------ r434 | chris | 2005-11-24 16:00:00 +0000 (Thu, 24 Nov 2005) | 3 lines I am still thinking about and playing with the new SireMol classes... ------------------------------------------------------------------------ r433 | chris | 2005-11-24 10:55:37 +0000 (Thu, 24 Nov 2005) | 5 lines In rewriting the SireMol classes I have realised that there is a serious bug in the Bond class! There is no way that I can use a pointer to an atom as the means of storing the bonded atoms. The reason for this is that I am using Qt storage classes, and these will reallocate the arrays containing the atoms behind the scenes. This means that the pointers stored in the bonds may become invalid and thus cause weird results or crashes. I have thus worked up a Bond class in the sandbox that stores AtomIndexes and a weak pointer to the molecule, thus allowing the atoms to be obtained from the molecule whenever they are needed. This requires slightly more storage than the old method, but also solves some of the problems I was having regarding letting the python interface create bonds and use them. ------------------------------------------------------------------------ r432 | chris | 2005-11-23 16:35:57 +0000 (Wed, 23 Nov 2005) | 3 lines I am now roughing out the new family of Molecule/CutGroup classes. I think that this is a good idea, as it is letting me clean up a lot of the problems that the current system has. I will however need to change splitMolecule and moveInternal to use the new interface. I am thinking that they should be changed so that they work with FlexMol and EditMol directly. This will mean that I will need to standardise the interfaces to FlexMol and EditMol, but I think that the effort to do that will be worth it. ------------------------------------------------------------------------ r431 | chris | 2005-11-23 15:29:39 +0000 (Wed, 23 Nov 2005) | 3 lines I have added a 'SandBox' library which I can use to develop updated classes without breaking the existing versions (e.g. I will use the sandbox to develop SandBox::Molecule, SandBox::CutGroup etc. which will not clash with SireMol::Molecule and SireMol::CutGroup) ------------------------------------------------------------------------ r430 | chris | 2005-11-23 15:15:06 +0000 (Wed, 23 Nov 2005) | 3 lines I have integrated SireVol. As I was working on the InterCLJFF class I was running into problems with working out when I was dealing with Molecules, and when I was dealing with CutGroups. Then I realised that a Molecule is not a CutGroup (as a ChainMol is not a CutGroup, while a ChainRes is a CutGroup). I think that this part of my data structure is not quite correct. I will now try to modify it so that Molecule is not derived from CutGroup, but rather that a Molecule has a function that returns the CutGroups that make up the Molecule. I think that I will also have a separate MoleculeID, perhaps being equal to the CutGroupID of the first (and perhaps only) CutGroup in the Molecule. ------------------------------------------------------------------------ r429 | chris | 2005-11-23 13:15:46 +0000 (Wed, 23 Nov 2005) | 3 lines I am now starting work on the InterCLJFF, a forcefield to calculate intermolecular coulomb/LJ energies. To start, I am now integrating the SireVol code. Everything is currently broken. ------------------------------------------------------------------------ r428 | chris | 2005-11-23 11:55:43 +0000 (Wed, 23 Nov 2005) | 3 lines I have got the MoleculeInfo and ResidueInfo classes working, and have added them to the AtomTypeTable. I have cleaned up the API for the AtomTypeTable and CLJTable and have wrapped them up in python. I have run some tests that calculate the total charge on residues and molecules, and the total charges for p38, sb1 and tip4p are all correct. I am now pretty sure that the CLJ parameters have been correctly assigned to the molecules! ------------------------------------------------------------------------ r427 | chris | 2005-11-22 22:42:24 +0000 (Tue, 22 Nov 2005) | 5 lines I have replaced the ResidueInfo struct with the better MoleculeInfo and ResidueInfo classes. These are immutable once constructors, and provide a much safer way for the molecule to distribute information about itself. I have also cleaned up the code of Molecule, AtomArray and Array ------------------------------------------------------------------------ r426 | chris | 2005-11-22 15:59:10 +0000 (Tue, 22 Nov 2005) | 7 lines I have written and wrapped the AtomTypeTable and CLJTable and have completed the code that populates them from the database. My tests show that p38 looks like it is correctly parametised. I have written some code to guess the LJ parameters from the atom type. To do this I moved the 'score' function from FuncDB to FFChildDB, as it is something that could find more utility in other types of database. I have also added a function to 'Molecule' that enables it to quickly return the corresponding Atom to an AtomIndex - it uses the ResidueInfo struct to do this. The ResidueInfo struct is actually quite useful, and I think that it should be made into a better class that can also be put in with the AtomTypeTable (thus allowing it to calculate the charges of residues, or to quickly break down into AtomTypeTables of residues, rather than just of molecules, e.g. when we create the tables for ChainRes groups from the parent ChainMol's table). ------------------------------------------------------------------------ r425 | chris | 2005-11-22 11:39:28 +0000 (Tue, 22 Nov 2005) | 3 lines I am now working on the AtomTypeTable and CLJTable, and am making them implicitly shared to support copying tables to different copies of the same molecule. The code is currently broken, as I am taking my lunch break now :-) ------------------------------------------------------------------------ r424 | chris | 2005-11-22 10:28:18 +0000 (Tue, 22 Nov 2005) | 7 lines I have been speed testing the assignment of parameters. I have had to add a cache for the recovery of MMAtomParameters, as the cache doubled the speed of paramter assignment. I have been testing by assigning the clj parameters for sb1, p38, a very big water box (currently loaded as a single molecule) and my water-methane water box, loaded as separate water molecules. So far, it takes 23.2s on my laptop to assign all of the CLJ parameters for these atoms (time is to run the entire program, including reading all of the parameter and pdb files). This isn't spectacular (23s for about 35000 atoms translates to only about 1500 atoms per second), and for big systems, of 100-500k atoms, the parametisation will be very slow (probably 1-5 minutes!). I think that I will need to treat the database as the initial parametiser, that is used to search for parameters, and that I will need to use another file that directly links atoms to parameters (e.g. a parameter restart file) that can be used once the parameters have been found. This way, the db is only used right at the beginning of the first job run. Most of the time was parametising the waters (the protein only took about 4s). Another alternative is to ensure that the normal use of the database is to parametise only one copy of the molecule, and then to allow this parameter table to be assigned to multiple molecule copies. Hey - this is a good idea, as this would also drastically reduce memory usage! (only one copy of the parameter table for water, rather than tens of thousands!) (same for lipid system as well!) Yes - I will do this. This means writing the parameter table to be implicitly shared. It would thus be best to base it on a Qt container class, e.g. a QHash or QList, as this will do the implicit sharing for us. ------------------------------------------------------------------------ r423 | chris | 2005-11-22 09:17:43 +0000 (Tue, 22 Nov 2005) | 5 lines I have now finished cleaning up the atom matching code. It seems to work, and the code is now quite nice :-) I have also wrapped up QStringList. ------------------------------------------------------------------------ r422 | chris | 2005-11-21 23:05:03 +0000 (Mon, 21 Nov 2005) | 3 lines I am in the process of cleaning up the code for the AtomMatchDB - I am solving the problems of case matching, and also I have arranged the code in a much more logical layout that is much easier to follow and understand. I have also replaced the inconsistant index table with the mol-resnum table, that is used and can be attached to misctables in exactly the same manner as the other match tables. ------------------------------------------------------------------------ r421 | chris | 2005-11-21 21:14:04 +0000 (Mon, 21 Nov 2005) | 3 lines Updated the documentation describing the creation of the AtomMatchDB tables, and also updated the code so that the table_prefix is used correctly (so that multiple AtomMatchDBs can coexist in a single DB ------------------------------------------------------------------------ r420 | chris | 2005-11-21 20:21:20 +0000 (Mon, 21 Nov 2005) | 3 lines I have moved the atom matching code into AtomMatchDB and updated the names to match. The code works, but I haven't yet rewritten it properly (e.g. to sort out the case details etc.) ------------------------------------------------------------------------ r419 | chris | 2005-11-21 16:57:38 +0000 (Mon, 21 Nov 2005) | 5 lines I have now written the code that assigns parameters to atoms in molecules. It appears to work, though I will need to more extensively test it. The code has raised a few issues, e.g. should atom/residue name matching be case-sensitive or case-insensitive? I think that I will write something that tries a case-sensitive match, then if that fails it drops back to a case-insensitive match (and takes the first one returned). I will do this after I move all of the atom matching code out of CLJDB and into a specfic AtomMatchDB (as it is over 1/2 of the CLJDB code, and does not rely on the presence of CLJ parameters) ------------------------------------------------------------------------ r418 | chris | 2005-11-21 14:05:25 +0000 (Mon, 21 Nov 2005) | 3 lines I have tested the reading in of a wide variety of ProtoMS parameter files and, after fixing many bugs, it all now appears to work. The next step is now to write the code that can assign the parameter to the loaded molecule. ------------------------------------------------------------------------ r417 | chris | 2005-11-21 11:56:24 +0000 (Mon, 21 Nov 2005) | 3 lines I have now written the code that reads in the different ProtoMS templates and relates the CLJ parameter numbers to atoms. I have still to test this however... ------------------------------------------------------------------------ r416 | chris | 2005-11-21 08:23:08 +0000 (Mon, 21 Nov 2005) | 3 lines Added the ability to add relationships between atoms and CLJ parameters. ------------------------------------------------------------------------ r415 | chris | 2005-11-18 17:32:26 +0000 (Fri, 18 Nov 2005) | 3 lines I am now working on the code that relates Atoms to parameters, and then populates parameter tables. I think that I have worked out how it will work, I just now need to get on and implement it. This commit just puts in lots of code that isn't really written yet - it just represents how I have been playing out the ideas. This code is currently broken. ------------------------------------------------------------------------ r414 | chris | 2005-11-18 11:10:48 +0000 (Fri, 18 Nov 2005) | 5 lines I have fixed some bugs in the operator matching of the MathFunc family of classes, and I have also modified the Atom class so that it has an optional atom number (used to preserve the atom number from the input coordinate file throughout the program to atom output, and also to allow assignment of parameters for PSF files). I have also removed the variety of "add" functions from EditRes, and instead created many more constructors for Atom that provide convienient shortcuts for creating atoms from strings or partial information. ------------------------------------------------------------------------ r413 | chris | 2005-11-17 17:51:38 +0000 (Thu, 17 Nov 2005) | 3 lines I have now added the type-safe wrapping of the family of Energy classes. ------------------------------------------------------------------------ r412 | chris | 2005-11-17 16:14:13 +0000 (Thu, 17 Nov 2005) | 5 lines I have sorted out the mess of the MathFunc operators, and it now all makes sense! Indeed, wrapping up the MathFunc in boost::python went really well, and I have even managed to wrap the operators in python as well (thus making it very easy for the user to write their own functions!). I have added a new test script that graphs the supplied function. It seems to work well. ------------------------------------------------------------------------ r411 | chris | 2005-11-17 15:01:09 +0000 (Thu, 17 Nov 2005) | 5 lines I have wrapped up the MMDB class hierarchy (surprisingly easy - boost::python is excellent, though is does require over 210MB to compile the wrappers!). I have also wrapped up AtomType, CLJParameter, LJParameter and CLJPair. ------------------------------------------------------------------------ r410 | chris | 2005-11-17 12:17:17 +0000 (Thu, 17 Nov 2005) | 3 lines I have now written the code that reads in the ProtoMS2.1 dihedral paramter section from the parameter file. It all seems to be working well! I have also updated FuncSum - the operators were ambiguous. I think that eventually I will need to take a good look through the MathFuncs and sort them out so that they are useful. Thier code is not anywhere near perfect... ------------------------------------------------------------------------ r409 | chris | 2005-11-16 19:21:04 +0000 (Wed, 16 Nov 2005) | 3 lines I have now written the dihedral and Term14DB databases. These seem to work. I have written the CosPlusOne function, which forms the basis of most dihedral functions, though I have yet to write the code to read these parameters from the ProtoMS parameter files. ------------------------------------------------------------------------ r408 | chris | 2005-11-16 15:09:03 +0000 (Wed, 16 Nov 2005) | 3 lines I have now written the Term13DB and the AngleDB that is built on top of it, and have written the code to read the angle terms from a ProtoMS parameter file! Now that I have finally got the foundations sorted, writing the 'real-world' code on top is now quite quick and straightforward. ------------------------------------------------------------------------ r407 | chris | 2005-11-16 11:28:23 +0000 (Wed, 16 Nov 2005) | 3 lines I have abstracted functionality that will be common to Term12DB, Term13DB and Term14DB into a common base, FuncDB. The code should all now compile and run well :-) ------------------------------------------------------------------------ r406 | chris | 2005-11-16 10:25:40 +0000 (Wed, 16 Nov 2005) | 3 lines I have fixed the problem of saving and restoring the functions from the database - I ended up needing to use the QSqlTable type classes to use the Qt API itself to add the function, rather than forming my own SQL query. ------------------------------------------------------------------------ r405 | chris | 2005-11-15 16:22:14 +0000 (Tue, 15 Nov 2005) | 3 lines Annoyingly, I have tried to get the MathFuncs to store and restore from the database, but have failed. For some reason the QByteArrays were corrupting on save/load, so binary storage wouldn't work (as well as being messy anyway for a parameter file...). I have now moved to text, but I haven't really come up with a good way of representing the functions using text. (well, I need to write a function parser...) ------------------------------------------------------------------------ r404 | chris | 2005-11-15 11:18:20 +0000 (Tue, 15 Nov 2005) | 3 lines Just adding some more wrapping of the FFParentDB class... ------------------------------------------------------------------------ r403 | chris | 2005-11-15 11:01:47 +0000 (Tue, 15 Nov 2005) | 3 lines I have finished the first write of the Term12DB, and inherited up to the BondDB. It seems to load the parameters well! ------------------------------------------------------------------------ r402 | chris | 2005-11-14 17:49:27 +0000 (Mon, 14 Nov 2005) | 3 lines I have added an Harmonic function for bond and angle energies, and am now working on Term12DB, which forms the base of all 12 parameter databases (e.g. bond parameter database). The code does not currently compile (I have been interupted as Erica has finished making a wonderfully aromatic dinner... Mmmmm :-) ------------------------------------------------------------------------ r401 | chris | 2005-11-14 11:49:35 +0000 (Mon, 14 Nov 2005) | 3 lines I have got a lot of the maths functions working! (even the differentiation). I have written some unit tests to test things, but it is all looking quite good! ------------------------------------------------------------------------ r400 | chris | 2005-11-13 18:58:18 +0000 (Sun, 13 Nov 2005) | 3 lines Finished the renaming, and it all compiles and works again! Commit 400! ------------------------------------------------------------------------ r399 | chris | 2005-11-13 18:10:14 +0000 (Sun, 13 Nov 2005) | 3 lines Still renaming... ------------------------------------------------------------------------ r398 | chris | 2005-11-13 18:08:38 +0000 (Sun, 13 Nov 2005) | 3 lines Still renaming files... ------------------------------------------------------------------------ r397 | chris | 2005-11-13 17:45:04 +0000 (Sun, 13 Nov 2005) | 3 lines Separated out the maths code into a dedicated SireMaths library, and have moved md5 into the ThirdParty library. I have only moved the files, so the code will not currently compile. ------------------------------------------------------------------------ r396 | chris | 2005-11-13 17:29:44 +0000 (Sun, 13 Nov 2005) | 3 lines The code now compiles, though I need to do quite a bit of work to test it. ------------------------------------------------------------------------ r395 | chris | 2005-11-13 13:16:14 +0000 (Sun, 13 Nov 2005) | 3 lines I am making more progress with the mathfunc family of classes. I have now got a clear idea in my mind of how they will work, and it is just now down to putting the time in to implement them all... ------------------------------------------------------------------------ r394 | chris | 2005-11-11 22:27:54 +0000 (Fri, 11 Nov 2005) | 3 lines Now working on the Bond parameter database. Before I can do this I need the general maths functions objects that will be used to make the general functions used for the intramolecular energy terms. The MathFunc library of classes provide function units which can be combined together into a range of single argument functions. These functions will eventually be able to be serialised to a string or bytearray so that they can be stored in the database together with the parameters. ------------------------------------------------------------------------ r393 | chris | 2005-11-11 12:46:09 +0000 (Fri, 11 Nov 2005) | 3 lines I have got the new, split-up parameter database classes now working, and they seem to be able to read in the parameter files ok. The code now compiles and runs again, and the tests all seem to work. ------------------------------------------------------------------------ r392 | chris | 2005-11-11 11:19:23 +0000 (Fri, 11 Nov 2005) | 2 lines I have renamed the files that make up the forcefield database components - the names are now more logical. ------------------------------------------------------------------------ r391 | chris | 2005-11-11 11:14:54 +0000 (Fri, 11 Nov 2005) | 3 lines I am working on splitting the monolithic MMDB class into individual component classes that are combined via multiple inheritance. This code will not compile at the moment... ------------------------------------------------------------------------ r390 | chris | 2005-11-11 08:54:19 +0000 (Fri, 11 Nov 2005) | 5 lines I have worked out a multiple inheritance scheme that will work really well for the parameter databases (it is essentially the same sort of idea as the mixin classes used in Woodman in python, e.g. make a big parent class that combines the functionality of lots of child classes). I have thought about whether or not multiple inheritance is the best solution for this, and after considering the alternatives (bridge and nested classes) I have decided this is the best choice. The reason is that I will get implicit casting, so I can pass a parent that derives from CLJDB and BondDB to any function that takes CLJDB as an argument, or to any function that accepts a BondDB as an argument. To test my ideas, and to show that the compilers will create the code that I want (and it behaves as I expect) I have written a small test (techdocs multipleinheritance.cpp) which gives a skeleton of the type of class hierarchy that I will build. I have compiled and tested that this works using g++ 3.4.4 and icc 8.1 ------------------------------------------------------------------------ r389 | chris | 2005-11-10 22:05:19 +0000 (Thu, 10 Nov 2005) | 5 lines Now that the MM database is working (well ish!) I am rearranging the class hierarchy to make it more general, and so that I can plug different parts together to form different types of parameter database. My goals are for the same framework to support parameter databases for the generic MM database, the more complex MMF forcefield (non-LJ FF forcefield) and also for the QM parameters. ------------------------------------------------------------------------ r388 | chris | 2005-11-10 17:49:29 +0000 (Thu, 10 Nov 2005) | 3 lines I have written an initial class to read in a ProtoMS parameter file. So far it can read in the CLJ parameters. ------------------------------------------------------------------------ r387 | chris | 2005-11-10 15:45:59 +0000 (Thu, 10 Nov 2005) | 3 lines Further working on the database - am reading up the charmm prm file now, though that is not working as well... ------------------------------------------------------------------------ r386 | chris | 2005-11-10 11:50:14 +0000 (Thu, 10 Nov 2005) | 5 lines I have got the code to do the dumping and loading of the in-memory database working! In ran into major difficulties as the included QSQLITE driver in the source code was not working, and produced random rubbish when more than 1 column was returned! I have thus switched to using the QSQLITE plugin in the QT lib directory. I must remember this, as I wanted everything compiled in (its easier), but that's life... The test script now loads parameters from a psf file and then dumps the resulting database to a raw sql file! ------------------------------------------------------------------------ r385 | chris | 2005-11-09 21:40:41 +0000 (Wed, 09 Nov 2005) | 3 lines I have begun working on a PSF reader, and am using it to read in a 25000 atom PSF file as a strong test of the speed of the MMDB system. An in-memory database is definitely much quicker, though I have a current problem with the CLJ_PARAMETER table which can become very slow if it gains thousands of missing parameters... ------------------------------------------------------------------------ r384 | chris | 2005-11-09 17:26:09 +0000 (Wed, 09 Nov 2005) | 3 lines Making good progress with the MMDB database, and definitely a good idea to use SQL to store the parameters - it is very flexible. I have come up with a very powerful set of related tables that I think will allow very flexible input and retrieval of parameters. I will try it out by writing parsers for the ProtoMS2 and charmm .psf/.param parameter files. ------------------------------------------------------------------------ r383 | chris | 2005-11-09 10:18:55 +0000 (Wed, 09 Nov 2005) | 3 lines Finished refactoring the CLJParameter, and I am now beginning work on the MMDB. I have decided that it will need to be a real SQL database, as I need a lot of flexibility for searching, and I shouldn't reinvent the wheel when there are already good database libraries. I plan to use the QtSql driver for the sqlite3 database. If I can, I want it to be an in-memory database so that there is little disk access, though it would also be nice to be able to dump the database to disk as well (for persistent parameter databases). ------------------------------------------------------------------------ r382 | chris | 2005-11-08 16:14:26 +0000 (Tue, 08 Nov 2005) | 3 lines Refactored CLJParameter so that it is derived from a new LJParameter class. I am beginning work on the MMDB database class for MM parameters. The code is very broken, as I am still roughing out ideas. My aim is to write something that can cope with native OPLS, AMBER, GAFF and CHARMM parameter files, e.g. it must cope with different ways of indexing and finding parameters and combinations, and it must have a 'wild' type for at least dihedral finding (though wilds for LJ, bond and angle may be nice as well...) ------------------------------------------------------------------------ r381 | chris | 2005-11-08 13:29:32 +0000 (Tue, 08 Nov 2005) | 3 lines I have added a SireUnits library that contains lots of physical constants and conversion factors from normal units to internal units used within sire. I have also added a unit test for these. I have verified that the factors that I am using are identical to those used in ProtoMS, and have also added a couple of PDF files that give the values of physical constants and definitions of SI units. ------------------------------------------------------------------------ r380 | chris | 2005-11-07 15:37:03 +0000 (Mon, 07 Nov 2005) | 3 lines Added a Delta class that simplifies the holding and calculation of deltas (new - old). Added a unit test class to test them. Code seems to work, as do the tests. ------------------------------------------------------------------------ r379 | chris | 2005-11-07 11:40:58 +0000 (Mon, 07 Nov 2005) | 3 lines I have written fuller tests for the average class, including tests of the averages of energies and EnergyPacks. These revealed bugs and namespace issues which have now been resolved (essentially, energymaths.hpp must be included before average.hpp so that the right sqrt and abs functions are found). I have also added a pdf of a web page that talks about floating point numbers and roundoff error. ------------------------------------------------------------------------ r378 | chris | 2005-11-05 23:41:44 +0000 (Sat, 05 Nov 2005) | 3 lines Added sqrt and abs functions for all of the energy types, and added tests for these in testenergy. ------------------------------------------------------------------------ r377 | chris | 2005-11-04 21:56:54 +0000 (Fri, 04 Nov 2005) | 3 lines Working on a set of Average classes, and have added the unit tests for them. ------------------------------------------------------------------------ r376 | chris | 2005-11-04 17:22:26 +0000 (Fri, 04 Nov 2005) | 3 lines Beginning work on the Average classes - these will provide very general averages which will work on any numeric type (including Energy and EnergyPack types). ------------------------------------------------------------------------ r375 | chris | 2005-11-04 16:31:48 +0000 (Fri, 04 Nov 2005) | 5 lines I have got a wide range of Energy and EnergyPack tests now and they all seem to work well. I have updated the api of these classes a little to make them slightly easier to use. I have also added a nice article from the internet on how to use template metaprogramming to speed up vector calculations. ------------------------------------------------------------------------ r374 | chris | 2005-11-04 15:11:17 +0000 (Fri, 04 Nov 2005) | 7 lines Added multiplication and divide to energies, and fixed the template power functions (pow_2(EnergyPack) works!) Also removed the unnecessary arithmetic operators between Energy types and double, as double can be implicitly converted to EnergyBase (or EnergyT). Updated the energy unit tests to include some EnergyT and EnergyPack tests. The arithmetic appears to work! ------------------------------------------------------------------------ r373 | chris | 2005-11-04 12:09:25 +0000 (Fri, 04 Nov 2005) | 3 lines I have refactored the energy classes to be derived from EnergyBase, and have renamed Energy as a general purpose Energy class that can have any energy component of EnergyPack added or subtracted from it, and is the result of any mixed arithmetic of energy components. ------------------------------------------------------------------------ r372 | chris | 2005-11-04 11:06:28 +0000 (Fri, 04 Nov 2005) | 3 lines I have got the template based energy components and EnergyPack working! I am really pleased with these two classes, as they will help me solve many of the problems of keeping track of energy components. I will be able to build Average and History template classes that work with these types, and will thus automatically keep track of all of the parts! ------------------------------------------------------------------------ r371 | chris | 2005-11-03 22:54:43 +0000 (Thu, 03 Nov 2005) | 3 lines I am now working on an advanced version of Energy that will use template parameters to specify different components. This should be really powerful, but at the moment I am struggling to remove the multiple overloads of unused dummy parameters! ------------------------------------------------------------------------ r370 | chris | 2005-11-03 15:05:28 +0000 (Thu, 03 Nov 2005) | 2 lines Moved the 'energy' class into SireFF so that it is with the EnergyHistory class. ------------------------------------------------------------------------ r369 | chris | 2005-11-03 14:57:49 +0000 (Thu, 03 Nov 2005) | 3 lines Still working on integrating SireFF - the code is currently broken ------------------------------------------------------------------------ r368 | chris | 2005-11-03 13:41:46 +0000 (Thu, 03 Nov 2005) | 3 lines Beginning work on reintegrating the forcefield library (SireFF) ------------------------------------------------------------------------ r367 | chris | 2005-11-03 12:08:15 +0000 (Thu, 03 Nov 2005) | 3 lines I have updated all of the test python scripts in the test directory and they all now work with the new version of Sire! The only small problem is the script to convert a single tip3p into a tip4p does not add the M atom in the plane with the other atoms. I can't work out why, and will sort this out at some future point (when I really make the editmol/editres flexible and useful!) ------------------------------------------------------------------------ r366 | chris | 2005-11-02 16:09:59 +0000 (Wed, 02 Nov 2005) | 9 lines I have cleaned up the interface for the EditRes and for molecule building (see the updated make-tip4p.py, which has now a much cleaner and easier to understand syntax). I upgraded my boost libraries, and the changes have necessitated that I make NetPtr be publically derived from boost::shared_ptr. I didn't really want to do this, though cannot think of any problems with doing so (other than that a dedicated programmer could get access to the NetPtrProxy when they shouldn't). I have renamed a lot of the EditRes functions, and have made more use of overloading to choose the function, e.g. changeBond(Bond) has been changed to change(Bond). The code compiles, runs well, siretest and sirempitest both work. ------------------------------------------------------------------------ r365 | chris | 2005-11-02 11:55:19 +0000 (Wed, 02 Nov 2005) | 3 lines I am working on cleaning up the EditRes class and have replaced the enum based system for passing weight functions with an object based system. This should be easier to wrap, and easier to dekludge when I better learn how to do it! ------------------------------------------------------------------------ r364 | chris | 2005-10-30 20:32:13 +0000 (Sun, 30 Oct 2005) | 3 lines Fixed small bug in not properly stopping the actionthread (non-virtual 'stop' function). Also have created shallow value based classes that hold copies of the atoms in the bond, and should not thus segfault if the molecule that owns the bond is deleted. They also allow for bonds and bondindexes to be created by the user in python. I have got the auto-conversion routines working so that a Bond or BondIndex is converted to VBond and VBondIndex (which are wrapped as Bond and BondIndex in python). ------------------------------------------------------------------------ r363 | chris | 2005-10-30 17:12:43 +0000 (Sun, 30 Oct 2005) | 3 lines Removing some debugging lines - code now definitely works. ------------------------------------------------------------------------ r362 | chris | 2005-10-30 16:50:33 +0000 (Sun, 30 Oct 2005) | 3 lines Fixed bugs in introduction of NetObjects::Thread - siretest, sirempitest and sire now seem to all work, though the mpi tests don't (sirempitest with nproc >= 3) ------------------------------------------------------------------------ r361 | chris | 2005-10-29 23:32:07 +0100 (Sat, 29 Oct 2005) | 7 lines I have now broken the code and the tests as I have replaced QThread with NetObjects::Thread. What am I thinking... (I am sure that it will be worth it once it is working again) The problem is that the code locks up too much. I think that it is because I haven't properly replaced the waiting and mutexes in the old versions of the code with the new versions that are absorbed into the NetObjects::Thread class. Also, sire segfaults at program shutdown. This is probably due to the threads still running, or not, or something else... ------------------------------------------------------------------------ r360 | chris | 2005-10-28 23:35:53 +0100 (Fri, 28 Oct 2005) | 3 lines Working now on a Thread class that allows rapid starting and has a unique process/thread ID. ------------------------------------------------------------------------ r359 | chris | 2005-10-26 15:41:36 +0100 (Wed, 26 Oct 2005) | 3 lines The 'make-tip4p.py' script works again! I can now use sire again to make tip4p molecules from scratch! There were a few problems now that vector.normalise throws exceptions for zero vectors, but this is something that I will have to deal with in each case (I think that it is better that I deal with zero vectors each time I use vector.normalise, rather than trying a universal fix within vector.normalise) ------------------------------------------------------------------------ r358 | chris | 2005-10-26 14:41:32 +0100 (Wed, 26 Oct 2005) | 3 lines Removed the CutGroupRegistry class as its functionality is now provided via NetObjects. ------------------------------------------------------------------------ r357 | chris | 2005-10-24 17:56:06 +0100 (Mon, 24 Oct 2005) | 2 lines Cleaning out some now unused files. ------------------------------------------------------------------------ r356 | chris | 2005-10-24 17:55:10 +0100 (Mon, 24 Oct 2005) | 3 lines Added back the python wrappers of the SireMol classes. I have also written a template function that can add standard QList and QSet functions to QList and QSet based classes, and have added a template function so that NetPtr and DerivedPtr can be added to a QSet or QHash. Also changed EditMolList to be a standard QList (I will write additional functions to add functionality that will be either accessed via clever wrapping, or via extra python code, e.g. __str__(editmol){ printObj(editmol)} ------------------------------------------------------------------------ r355 | chris | 2005-10-22 22:04:49 +0100 (Sat, 22 Oct 2005) | 3 lines SireIO is now compiling and wrapped, though there is a memory access violation when I try to load a PDB file. ------------------------------------------------------------------------ r354 | chris | 2005-10-22 21:19:04 +0100 (Sat, 22 Oct 2005) | 2 lines Working on adding back the SireIO module... ------------------------------------------------------------------------ r353 | chris | 2005-10-22 21:16:41 +0100 (Sat, 22 Oct 2005) | 2 lines Misnamed SireIO.pro! ------------------------------------------------------------------------ r352 | chris | 2005-10-22 21:15:43 +0100 (Sat, 22 Oct 2005) | 3 lines I have got the EditMol wrapping working again. I have also checked that the use of NetPtr with python works (by creating the netptr in python, then putting it into an EditMolList, and then deleting the python created NetPtr and checking that the list still held a valid pointer). ------------------------------------------------------------------------ r351 | chris | 2005-10-21 11:17:22 +0100 (Fri, 21 Oct 2005) | 5 lines I have got dynamic implicit conversion of NetPtr and DerivedPtr types working well (so I can easily do MoleculePtr = FlexMolPtr etc.), and I have also started on the python wrapping of the CutGroupPtr and MoleculePtr. It works :-) I have got working python wrapping of my own shared_ptr type class. I am pretty pleased with this. The only slight problem is that it requires returning a non-const raw pointer from the NetPtr/DerivedPtr without going through the NetPtrWriter or DerivedWriter classes. I think that I can work around this however by wrapping up the const object separately to the non-const object, e.g. have a CutGroup held by a CutGroupPtr (and only expose the const functions in the CutGroup wrapping), and then have a separate CutGroupWriter class that can be used to access the non-const functions. I am also going to have to write a template function that can expose a whole load of functions of the actual NetPtr or DerivedPtr (e.g. duplicate, reset, etc.) ------------------------------------------------------------------------ r350 | chris | 2005-10-20 22:07:31 +0100 (Thu, 20 Oct 2005) | 3 lines Fixed compiler problems (forgot to include "netobjects.h" in cpp files) and have added a unit test for CutGroups (just to make moleculeptrs etc and convert between them and check that derived pointers work, and dumping and loading work). ------------------------------------------------------------------------ r349 | chris | 2005-10-20 16:30:30 +0100 (Thu, 20 Oct 2005) | 3 lines Added a CutGroupFactory and changed the way to get a CutGroupPtr from a CutGroup. Now you can create CutGroups directly using the constructor, and then use the CutGroup::self() function to return a CutGroupPtr to that CutGroup. ------------------------------------------------------------------------ r348 | chris | 2005-10-18 11:35:45 +0100 (Tue, 18 Oct 2005) | 3 lines Written a set of DerivedPtr classes (DerivedPtr, DerivedWeakPtr and DerivedWriter) that are the NetPtr equivalents for derived classes. This means that I can now have NetPtr with DerivedPtr and DerivedPtr, and have functions that can cast between these three (if possible). The DerivedPtr variants all hold the corresponding NetPtr to the base class, (DerivedPtr holds a NetPtr) so the relationships within the class hierarchy are preserved. Also, static_cast is used so that DerivedPtr.get() returns a pointer to a Molecule, not to a CutGroup (as NetPtr.get() would do). If you want to use a DerivedPtr with functions that expect NetPtrs, then you use the 'toNetPtr()' function (or 'toNetPtrWriter' or 'toWeakPtr' functions). This way you can still build an interface to operate on the pointer, with the interface (correctly) operating on the base type. ------------------------------------------------------------------------ r347 | chris | 2005-10-17 21:38:36 +0100 (Mon, 17 Oct 2005) | 3 lines The code now compiles and runs. My next step is to sort out how to have a NetPtr to CutGroup that can be cast to a NetPtr to Molecule or FlexMol etc. ------------------------------------------------------------------------ r346 | chris | 2005-10-17 17:50:27 +0100 (Mon, 17 Oct 2005) | 5 lines Working on getting SireMol to compile. So far I am up to EditRes... My first order of business once I get SireMol compiled is to modify NetPtr so that I can cast from a NetPtr of a base type to a NetPtr of a derived type. I am thinking about using an explicit template type for a NetPtr, e.g. NeDerivedPtr? No, that would be too complex... ------------------------------------------------------------------------ r345 | chris | 2005-10-17 11:31:24 +0100 (Mon, 17 Oct 2005) | 5 lines Am now starting work on the SireMol module. I have not fully fixed the problems with NetObjects yet, but I need to move on. I will fix them as I start to use NetObjects in anger via NetPtrs to SireMol objects. This commit is just after I have created SireMol.pro, and updated atom.h/.cpp to the new namespace. As such, this will not compile nor run! ------------------------------------------------------------------------ r344 | chris | 2005-10-17 11:01:40 +0100 (Mon, 17 Oct 2005) | 3 lines Registered the new messages with NetObjects::messenger() and have updated Vector and Quaternion to use arrays rather than individual values. ------------------------------------------------------------------------ r343 | chris | 2005-10-14 19:49:32 +0100 (Fri, 14 Oct 2005) | 3 lines Code now compiles the things are beginning to run. siretest runs to completion, while sirempitest shows that the ThreadPipe and MPIPipe work(!), though an exception is thrown when the invoker is reconstructed on process 0 after being sent back from process 1. sire itself still throws an unknown exception in runtests... ------------------------------------------------------------------------ r342 | chris | 2005-10-14 16:45:46 +0100 (Fri, 14 Oct 2005) | 4 lines The code compiles again, and siretest works. However, the main program and sirempitest both lock up when they try to duplicate or update an object. Deadlock problems that must be debugged... ------------------------------------------------------------------------ r341 | chris | 2005-10-14 15:12:30 +0100 (Fri, 14 Oct 2005) | 5 lines The code is nearly back to the point where it can compile! Well, netregistrybase.cpp can compile... I have added in more message classes and now the system for keeping track of added, duplicated and deleted objects is beginning to crystallise out. The design is cleanish, though I need to rewrite parts of NetPtr and NetPtrWriter so that they use the updated way of duplicating and updating themselves... ------------------------------------------------------------------------ r340 | chris | 2005-10-14 12:09:03 +0100 (Fri, 14 Oct 2005) | 5 lines Still working on sending objects between processes, and the code is still massively broken... I am cleaning it up though, and the addition of the NetObjectData class has allowed a lot of abstraction of the packaging and unpackaging of an object for transmission. ------------------------------------------------------------------------ r339 | chris | 2005-10-13 23:10:28 +0100 (Thu, 13 Oct 2005) | 3 lines I am finally getting a handle on this sending of objects between processes. The main change I am making is that I register a new process as having a copy of an object, not when it is sent, but when it is dumped by the master process. This simplifies so many things regarding requesting and sending NetObjects. Of course, I have now majorly broken the code... so very broken... needs lots of tlc... ------------------------------------------------------------------------ r338 | chris | 2005-10-13 16:17:08 +0100 (Thu, 13 Oct 2005) | 3 lines Changed ActionThread to use multiple WorkerThreads to process the messages. This should help prevent deadlocks. I am still stuck on the GetObjectMsg though... ------------------------------------------------------------------------ r337 | chris | 2005-10-13 12:27:27 +0100 (Thu, 13 Oct 2005) | 3 lines I am working on the ability for one process to ask to be sent a copy of an object from another (it is problems with this that is causing the crash when the MPIPipe is deactivated). I am getting stuck however working out how to not block the actionthread of the process that is sending the object... ------------------------------------------------------------------------ r336 | chris | 2005-10-12 15:42:28 +0100 (Wed, 12 Oct 2005) | 3 lines The MPI pipe is now working sufficiently well for me to be able to call the vector.length() function remotely! There is a crash however with vector.set() (I think). It is however quite clean and I am optimistic that I should be able to wrinkle out the bugs tonight. ------------------------------------------------------------------------ r335 | chris | 2005-10-12 14:06:10 +0100 (Wed, 12 Oct 2005) | 3 lines Giving a Result an exception now works! As does the new ErrorResult class. Only siretest is currently running without problems. ------------------------------------------------------------------------ r334 | chris | 2005-10-12 11:36:26 +0100 (Wed, 12 Oct 2005) | 3 lines Added process ID and backtrace capability to the SireError::exceptions, and am writing an ErrorResult class to allow Interface-Pipe-Invoker function calls to return an exception if one is thrown. I know that I should be moving on from NetObjects, but I am trying to make this into a very strong foundation for the code... ------------------------------------------------------------------------ r333 | chris | 2005-10-12 08:35:46 +0100 (Wed, 12 Oct 2005) | 3 lines Working on the MPIPipe function call. Code is broken! ------------------------------------------------------------------------ r332 | chris | 2005-10-11 16:14:54 +0100 (Tue, 11 Oct 2005) | 3 lines I have set up both sides of the MPIPipe now, and am beginning to send communication over the pipe. The code crashes at the moment... ------------------------------------------------------------------------ r331 | chris | 2005-10-11 12:06:25 +0100 (Tue, 11 Oct 2005) | 3 lines Moved the NetInterface wrapping of an object into a separate file so that it can be called and used by multiple unit tests. Have also create a class to be a factory for all of the Invoker that are used in the unit tests. ------------------------------------------------------------------------ r330 | chris | 2005-10-11 11:45:15 +0100 (Tue, 11 Oct 2005) | 3 lines All three programs now work as expected (sire, siretest and sirempitest). I can now get down to the job of actually writing some MPI tests... ------------------------------------------------------------------------ r329 | chris | 2005-10-11 10:48:47 +0100 (Tue, 11 Oct 2005) | 3 lines Got the parsing of command line arguments working. I got so stuck with a bug getting it to work that I have wasted so much time... ------------------------------------------------------------------------ r328 | chris | 2005-10-10 22:03:03 +0100 (Mon, 10 Oct 2005) | 3 lines Changed the startup of the MainApp to make it a bit cleaner and easier to understand, and have also changed the parsing of command line arguments so that this is also cleaner. ------------------------------------------------------------------------ r327 | chris | 2005-10-10 16:58:23 +0100 (Mon, 10 Oct 2005) | 5 lines Working on the MPIPipe. I am also writing an MPI enabled version of siretest (sirempitest) so that I can run unit tests that use mpi communication (e.g. testing the new MPIPipe!) Code compiles and runs, though the new sirempitest is not working yet. ------------------------------------------------------------------------ r326 | chris | 2005-10-10 10:46:51 +0100 (Mon, 10 Oct 2005) | 7 lines Fixed blocking problems with ThreadPipe and it now works well. I have also switched ThreadPipe to now use a single, continously running thread which sleeps between function calls, and uses a QWaitCondition to be woken for each call. This should be faster than starting a new thread for every function call. I have begun work on the MPI thread. This should be relatively straightforward (famous last words) This code compiles and the unit tests and test.py work in all tests! :-) ------------------------------------------------------------------------ r325 | chris | 2005-10-07 20:41:01 +0100 (Fri, 07 Oct 2005) | 3 lines The code now compiles and the program and unit test runs. The ThreadPipe does now run a the function in a different thread! The only problem is that the unit test deadlocks a little. I need to sit down and think through why this is the case. ------------------------------------------------------------------------ r324 | chris | 2005-10-07 17:00:06 +0100 (Fri, 07 Oct 2005) | 3 lines I have written the ThreadPipe class and more of the unit test. However, the use of a pure virtual base class (InvokerBase) with NetPtr revealed a problem with how I initialised the NetRegistry/NetObject (DefaultFactory was always used, regardless of the fact that InvokerBase cannot be created!). I have now fixed this, though the code is in a bit of a mess now and the unit tests don't run anymore. But I need to have dinner (Erica is waiting...) so I will leave this here... ------------------------------------------------------------------------ r323 | chris | 2005-10-07 13:39:10 +0100 (Fri, 07 Oct 2005) | 3 lines I am adding tests of the Interface class to the unit test for the invoker (so that I don't have to rewrite the local VecInvoker). Everything compiles and runs well at the moment (both unit tests, sire --local test/test.py and mpiexec -np 64 sire test/test.py) :-) ------------------------------------------------------------------------ r322 | chris | 2005-10-07 11:30:43 +0100 (Fri, 07 Oct 2005) | 3 lines Working on the Interface and Pipe classes. The code will not currently compile as I have not finished! ------------------------------------------------------------------------ r321 | chris | 2005-10-06 15:11:47 +0100 (Thu, 06 Oct 2005) | 3 lines Renamed invoker.h to invoker.hpp to maintain consistency. ------------------------------------------------------------------------ r320 | chris | 2005-10-06 15:06:53 +0100 (Thu, 06 Oct 2005) | 3 lines I have got the Invoker class working! The unit test (which uses a simple invoker on a Vector) works very well, and the syntax for use is reasonably clean. This is quite a success! :-) ------------------------------------------------------------------------ r319 | chris | 2005-10-06 11:09:34 +0100 (Thu, 06 Oct 2005) | 5 lines I am working out how to call the invoker functions by name. I think that I will use boost::function as this seems to be conceptually straightforward and clean, and my test (templatefuncptr.cpp) seemed to work very well! I have also realised that I can simplify the wrapping by creating an ArgsBinary which is derived from ArgsBase, and can be pointed to by ArgsPtr. This will allow QByteArray arguments to be passed to the functions as an ArgsPtr, which can then be automatically converted back to the correct type. ------------------------------------------------------------------------ r318 | chris | 2005-10-04 17:10:43 +0100 (Tue, 04 Oct 2005) | 3 lines I have created a NetPtrBase class so that tempalte independent NetPtrPtrs may be used. I have also written the dynamic_cast conversion functions to convert between the two and have appended the unit tests with tests of this. It is quite a nice system now! ------------------------------------------------------------------------ r317 | chris | 2005-10-04 15:01:02 +0100 (Tue, 04 Oct 2005) | 5 lines Written the NetObjects::Result unit tests, which all seem to work! :-) With both Args<..> and Result I am now able to pass around arguments and results through threads and MPI so I should now be able to get down to the serious business of actually implementing the Interface-Pipe-Invoker system... ------------------------------------------------------------------------ r316 | chris | 2005-10-04 11:34:39 +0100 (Tue, 04 Oct 2005) | 3 lines Written unit tests for Args<...>. They all work, and Args dynamic casting from ArgsPtr also works very well (with quite an informative exception if things fail). ------------------------------------------------------------------------ r315 | chris | 2005-10-04 10:54:00 +0100 (Tue, 04 Oct 2005) | 5 lines I have finished a lot more pseudocode that shows how I will implement the NetInterface system. I have updated the Args and Result classes so that they can do dynamic casting from template independent ArgsPtr and ResultPtr classes. I think that I have wrinkled out most of the intricacies of the design and I just need to get implementing... My next step is to write a load of unit tests for Result<> and Args<> so that I can ensure that they are behaving as I expect them to behave. ------------------------------------------------------------------------ r314 | chris | 2005-10-03 23:07:51 +0100 (Mon, 03 Oct 2005) | 3 lines Just writing some pseudocode to try and work out how I will actually implement my "grand ideas" :-) ------------------------------------------------------------------------ r313 | chris | 2005-10-03 19:27:27 +0100 (Mon, 03 Oct 2005) | 36 lines Changed Result so that it is an explicitly shared class, thus making it easier to pass around! I am now thinking about the interface. The way that I see it, I think that I need to have three classes; Interface --- Pipe --- Invoker ** Interface ** Hierarchy is UserCodedInterface <- Interface <- InterfaceBase This class provides the front-end interface to the NetObject, with the user calling functions on this interface. Interface may even have a 'interface.control()' function to separate out control functions, e.g. 'interface.control().activate(NetPID)' or 'interface.control().pointer().isMaster()' ** Pipe ** There are two types of Pipe, an MPIPipe and a ThreadPipe; MPIPipe. This communicates calls from Interface through to Invoker via MPI calls. Has its own thread that receives the responses. ThreadPipe. This has its own thread in which it runs the calls to Invoker. A Pipe can only process one call at a time, and will block if a second call comes in while it is busy. There are functions like 'wait' and 'isBusy' to wait for the pipe to be ready, or to see if the pipe is busy. A null pipe means to not use a pipe, but to instead have Interface directly call the Invoker in the current thread. ** Invoker ** Hierarchy is UserCodedInvoker <- Invoker <- InvokerBase There is a NetPtr with a user-supplied InvokerFactory used to construct the Invokers needed in the program. The invoker can be sent to whichever process is required, and it holds a NetPtr to the object that it is working on. The Pipe passes the call for the function to the Invoker which then calls the required function, packages up the result into a Result and sends the result back along the pipe. The Invoker can only run one function at a time, and can only interface with a single Pipe at a time. Control of the Invoker is via NetObjects messages, with simple NetObjects used to put an Invoker in place and connect it to an Interface, and then the Interface-Pipe-Invoker system used for remote object control. ------------------------------------------------------------------------ r312 | chris | 2005-10-03 14:43:44 +0100 (Mon, 03 Oct 2005) | 3 lines I have now written an 'Args' template class to hold and package/unpackage function arguments. This class will be used to hold up to ten arguments to a function (should be enough?) and can serialise and deserialise these arguments from a QByteArray. This class uses a boost::tuple to hold the arguments internally, and uses partial template specialisation to select which package and unpackage needs to be called. I have tried it out in runtests() and it seems to work quite well (even correctly giving a compile error if I try to access an invalid argument, e.g. argument 3 of Args). ------------------------------------------------------------------------ r311 | chris | 2005-10-03 09:44:08 +0100 (Mon, 03 Oct 2005) | 3 lines Am now starting work on the NetInterface system, which is used to allow efficient and easy remote control of NetObjects. I am starting with the 'result' class, which will hold the results of the function call. ------------------------------------------------------------------------ r310 | chris | 2005-10-02 22:48:38 +0100 (Sun, 02 Oct 2005) | 3 lines Fixed problem with deadlock. It seems that MPI::Probe doesn't work to well with locally sent messages? I have switched over to using a polling MPI::Iprobe and everything now seems fine. Unit tests and runtest work well :-) ------------------------------------------------------------------------ r309 | chris | 2005-10-01 19:52:08 +0100 (Sat, 01 Oct 2005) | 5 lines Written code to parse the responses to messages. Messages can now be sent, and then we can block until they are acknowledged (complete with returned information!). It seems to work, though it currently seems to hang when it is sending messages. I will need to track down the source of the deadlock... I have also written some functions to pack and unpack arguments to a QByteArray. I am using this a little to pack the data for the response, though will really use this in anger when I work on the direct communication interface-pipe-invoker system. ------------------------------------------------------------------------ r308 | chris | 2005-09-30 13:03:44 +0100 (Fri, 30 Sep 2005) | 5 lines Added a 'MsgResponse' class that can wait for responses to messages (even from multiple processes). I have also updated the mpi communication so that a double-message is sent, so that each sent message has a unique id number. Using a double-message is not ideal, but is a better solution than trying to encode the message id in the tag (since that is used to id the message types), nor to encode the msgid in the data of the message, as this would trigger a copy of the data of the message. (copying then modifying the message's QByteArray could be expensive for large messages - e.g. most of them!) It all works, the debugging strings for mpi are now easier to follow and understand, and the unit tests also work. ------------------------------------------------------------------------ r307 | chris | 2005-09-29 17:35:46 +0100 (Thu, 29 Sep 2005) | 5 lines I have put all processing of message actions into an ActionThread. This seems to work well. I have also tried to make the shutdown of the application a little more resiliant, though I can still get it to hang. Part of the problem is that the master process can shut down the thread before the other processes have even received and processed the first sets of messages. I think that I need to set up something that causes everyone to stop until all have reached a common point. Need to do this so that one process doesn't race to the end before another has even started. Other than that, the unit tests all work and the main program test also runs well. ------------------------------------------------------------------------ r306 | chris | 2005-09-29 14:53:42 +0100 (Thu, 29 Sep 2005) | 3 lines As I said, I have now switched the code over to use references for initialising NetObjects. Quite a lot of changes for some syntactic sugar... ------------------------------------------------------------------------ r305 | chris | 2005-09-29 11:39:00 +0100 (Thu, 29 Sep 2005) | 3 lines Added MsgHandle so that I can change messages after they have been sent, and also so that I can do value registration of messages (e.g. registerType(NetExitMsg()) rather than registerType(new NetExitMsg()). I will try and change NetObjects over to do the same thing as it makes the registration syntax a bit easier, and only requires a few changes to the code. ------------------------------------------------------------------------ r304 | chris | 2005-09-29 10:09:01 +0100 (Thu, 29 Sep 2005) | 3 lines Written the code to change masters between processes. A few bugs near shutdown but otherwise it seems to work well. ------------------------------------------------------------------------ r303 | chris | 2005-09-28 16:54:51 +0100 (Wed, 28 Sep 2005) | 3 lines Have successfully sent a Vector between processes, unpacked it and got the right output. I am also beginning to think about the 'remote controller' (RemoteCtrl) class that will act as a base for the classes/interfaces needed to remotely control one object from another process. ------------------------------------------------------------------------ r302 | chris | 2005-09-28 11:27:22 +0100 (Wed, 28 Sep 2005) | 3 lines Working on decoding the sent object on the receiving processor... Currently the unit tests work, but the sire test/test.py crashes (the receiving process crashes) ------------------------------------------------------------------------ r301 | chris | 2005-09-27 16:59:48 +0100 (Tue, 27 Sep 2005) | 3 lines Written the code to send an object to another process. I think that it is working now, though so far I haven't written the code to decode the message once it has arrived... ------------------------------------------------------------------------ r300 | chris | 2005-09-27 14:35:39 +0100 (Tue, 27 Sep 2005) | 9 lines 300th commit! Dumping and loading of an object seems to work well now. The problem appeared to be that QBuffer didn't actually save anything! I reverted to directly using a QByteArray and that fixed things. I have also changed NetPIDList to NetPIDSet (based on QSet) as this enables quicker tests for whether or not a pid is in the set, and for set operations on lists of pids. The unit tests all work now (including the dump and restore tests) as does the main program with test/test.py in local and mpi (64 process) mode. All in all, a good 300th commit! ------------------------------------------------------------------------ r299 | chris | 2005-09-27 12:40:34 +0100 (Tue, 27 Sep 2005) | 5 lines Written code to handle dumping and restoring of complex class hierarchies. Solution is to have a NetFactory class that has a sensible default for most classes, and can be overridden by the user for complex class families. Code compiles, but the dumping of a vector results in an empty byte array... ------------------------------------------------------------------------ r298 | chris | 2005-09-26 22:57:10 +0100 (Mon, 26 Sep 2005) | 3 lines Fixed locking bug in NetRegistry/NetRegistryBase. It seems that I can't use a QReadLocker and then unlock it, as it doesn't work. Why this is, I don't know. Now that I have fixed the bug the unit tests all run ok and the test script also runs. Things also seem to work with multiprocessor, though on one run with 64 processors, there was a hang when the master waited to tell the cluster to shut down. ------------------------------------------------------------------------ r297 | chris | 2005-09-26 17:24:21 +0100 (Mon, 26 Sep 2005) | 3 lines Got the code compiling again, but it crashes or hangs when it runs... ------------------------------------------------------------------------ r296 | chris | 2005-09-25 22:46:31 +0100 (Sun, 25 Sep 2005) | 5 lines Working on implementing the code for duplicating a NetObject. Things are so broken now... I am currently updating NetPtrWriter to use a shared_ptr to a QMutex so that it blocks until it can start editing, and other threads can block until the editing is complete. ------------------------------------------------------------------------ r295 | chris | 2005-09-25 14:10:41 +0100 (Sun, 25 Sep 2005) | 3 lines Splitting the meta information about a netobject from the actual storage of a netobject. This simplifies a lot of the communication involved when a NetObject is deleted on a local process. ------------------------------------------------------------------------ r294 | chris | 2005-09-25 12:37:33 +0100 (Sun, 25 Sep 2005) | 3 lines Changing some of the documentation to move it into the implementation (cpp) files rather than in the header files. This cleans up the headers, and mimimises recompilations due to documentation changes. ------------------------------------------------------------------------ r293 | chris | 2005-09-22 14:49:37 +0100 (Thu, 22 Sep 2005) | 3 lines API documentation builds quite well with DoxyS. I have read the manual and have decided to follow their recommendations. I will move documentation out of the header files and into the cpp files (because then changing documentation would not trigger large rebuilds). I will also use the formats correctly so that I can document the parameters and the return values of the functions. As a wiki style is used, it should also teach me the wiki commands so that I can use the Sire wiki when I eventually get it set up... :-) ------------------------------------------------------------------------ r292 | chris | 2005-09-22 11:51:54 +0100 (Thu, 22 Sep 2005) | 2 lines Ignoring Doxyfile... ------------------------------------------------------------------------ r291 | chris | 2005-09-22 11:50:32 +0100 (Thu, 22 Sep 2005) | 3 lines Changed the namespace of NetObjects from SireBase to NetObjects. This necessitated renaming the 'NetObjects' class to 'Manager' (and thus updating the code to read 'NetObjects::Manager::begin()' etc. ------------------------------------------------------------------------ r290 | chris | 2005-09-22 11:07:35 +0100 (Thu, 22 Sep 2005) | 3 lines Separation of NetObjects into its own library was very quick and painless. Code compiles, runs well and all unit tests are passed. The only thing I now need to do is rename the #ifndef header guards to read NETOBJECTS_... rather than SIREBASE_... ------------------------------------------------------------------------ r289 | chris | 2005-09-22 11:02:55 +0100 (Thu, 22 Sep 2005) | 11 lines Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. Moved all NetObjects files into their own directory and library. ------------------------------------------------------------------------ r288 | chris | 2005-09-22 10:54:45 +0100 (Thu, 22 Sep 2005) | 3 lines Creating NetObjects directory. ------------------------------------------------------------------------ r287 | chris | 2005-09-22 10:53:15 +0100 (Thu, 22 Sep 2005) | 3 lines Found the doxyS autodocumentation tool, which produces some very nice looking documentation. I have added auto-naming of NetObjects classes (if the user is unwilling to provide a name) and I am about to split off NetObjects into its own library. ------------------------------------------------------------------------ r286 | chris | 2005-09-21 18:22:25 +0100 (Wed, 21 Sep 2005) | 3 lines Passing of messages via MessageMgr and Message is working! Sire works (tested with up to 64 processes), as do the unit tests. What a good place to stop for the night... ------------------------------------------------------------------------ r285 | chris | 2005-09-21 15:19:00 +0100 (Wed, 21 Sep 2005) | 3 lines typeid works! It doesn't give a nice human readable string, but it does provide a unique string for a class. I will use this for reverse lookups... ------------------------------------------------------------------------ r284 | chris | 2005-09-21 14:58:10 +0100 (Wed, 21 Sep 2005) | 3 lines Continuing work on adding in the Message and MessageMgr classes. Read up on typeid and I think that this may help solve a few problems (including how to get the name of a class for debugging templates!) ------------------------------------------------------------------------ r283 | chris | 2005-09-21 11:11:49 +0100 (Wed, 21 Sep 2005) | 7 lines Made a lot of progress writing the pseudocode for the communication in NetRegistry. I think that I have now come up with an idea of how to do all of the communication without running into too many edge case problems. The solution is to split the 'master' from the object, e.g. a process can be a master of an object even if it doesn't have its own copy. This now completely separates the duplication of objects from the delegation of power. In addition, I am restricting the power to duplicate to the master. Any non-master process will ask the master to do the duplication. This ensures that the object is in a fit state, that it is the most up to date copy, and that the pid list is always correct and consistent (only the master holds the pidlist). If the master has delegated authority then it still retains information about where the new master is so that it can forward an messages. It only deletes this information when it receives the 'new master announce' message from the new master (which other processes should also have received). After this, it will return any master messages to sender, who should then be able to either have the new master information, or should only have to wait for a short time for the new master information. Only after waiting for a short time should we then know that there is a problem. Only ever need to broadcast when we don't know who the master is and we don't have a copy of the object. This should be rare, as NetObjects is a push orientated system, e.g. processes push their own objects onto other processes, rather than individual processes request objects. I do however still need to create a pool. This will hold objects once they have been sent to a new process (otherwise they would be deleted as soon as they arrive as they would have zero reference count). When we 'get' an object, we pull it out of the pool if we don't already have a 'user' NetPointer to it. Once it has been removed from the pool, it no longer exists in the pool, and deleting the user NetPtr will result in the reference count dropping to zero and the object being deleted. There will need to be a 'pool->clean()' function that is used to clear all objects from the pool, though this should only be called from the user thread. ------------------------------------------------------------------------ r282 | chris | 2005-09-20 16:43:52 +0100 (Tue, 20 Sep 2005) | 3 lines Added an MPIMessage class to abstract the sending and multiSending of MPI messages. Thinking about how I will achieve the actual passing of NetObjects while at the same time keeping the pidlists up to date. My thoughts so far keep coming back to the requirement that only the master process foran object is able to duplicate it. This would be a shame and quite inconvienient... ------------------------------------------------------------------------ r281 | chris | 2005-09-20 09:23:59 +0100 (Tue, 20 Sep 2005) | 3 lines Message passing between processes seems to work now! All processes start, synchronise and then shutdown properly. Now that this test is working, I need to formalise the message passing by providing a hierarchy of 'Message' classes... ------------------------------------------------------------------------ r280 | chris | 2005-09-19 12:18:34 +0100 (Mon, 19 Sep 2005) | 3 lines Sorted out the bootstrapping of the NetObjects system. Everything starts well now. I have cleaned up the code a little and improved the informativeness of the debugging messages. I have also split the netobjects.hpp header into a declaration and an implementation so that it can straddle either side of the netobjects class declaration. ------------------------------------------------------------------------ r279 | chris | 2005-09-16 17:08:20 +0100 (Fri, 16 Sep 2005) | 3 lines Working on waiting until the NetObjects subsystem has started properly before returning from NetObjects::begin() ------------------------------------------------------------------------ r278 | chris | 2005-09-16 16:37:03 +0100 (Fri, 16 Sep 2005) | 3 lines Code is now working using a ProcessInfo object to get information about the running process. This makes the NetObjects object class a bit cleaner as it does not need to probe for or store this stuff. ------------------------------------------------------------------------ r277 | chris | 2005-09-16 11:25:32 +0100 (Fri, 16 Sep 2005) | 5 lines Written a template Range class to hold the range of NetObjectID numbers that are reserved for allocation by each process. Also written the unit test suite for Range. I wrote so many bugs in Range and I have to admit that writing the unit test did catch all of them and sped up the creation of the working class. :-) I think that I should use unit testing by default now... ------------------------------------------------------------------------ r276 | chris | 2005-09-15 23:14:13 +0100 (Thu, 15 Sep 2005) | 8 lines Still working on the Net part of NetObjects. I have got the central NetObjects master object working, and the framework for the non-specialised handles linking with the template-specialised registries (via an easy to use 'register' function) NetObjects::registerType( new NetObject("Vector") ); NetObjects::registerType( new NetObject("QImage") ); That's all you need to do to register new types to enable them to be shared via NetObjects! ------------------------------------------------------------------------ r275 | chris | 2005-09-15 16:52:07 +0100 (Thu, 15 Sep 2005) | 3 lines Now I am working on the 'net' part of NetObjects. I have got a very clear idea about the framework and how it will all work, I just need to implement it all. I am about a quarter of the way through doing that now, though the code is not yet finished and is broken. Come back for a later version to see if I can get it working... ------------------------------------------------------------------------ r274 | chris | 2005-09-14 10:40:51 +0100 (Wed, 14 Sep 2005) | 3 lines Updated the unit test to include tests for NetWeakPtr... ------------------------------------------------------------------------ r273 | chris | 2005-09-14 10:30:01 +0100 (Wed, 14 Sep 2005) | 3 lines The NetPtrWriter is now working correctly, and by adding a NetPtrWriter(const NetPtrWriter&) constructor I was able to fix the problems of returning a NetPtrWriter by value (so now NetPtr.writer() works). I have updated the unit test to include some NetPtrWriter tests. I have also tested to ensure that I can call Vector.set() using a NetPtrWriter, but get a compile error if I call it from NetPtr. ------------------------------------------------------------------------ r272 | chris | 2005-09-13 17:01:59 +0100 (Tue, 13 Sep 2005) | 5 lines It looks like the NetPtrWriter and NetObjects are now working! (well apart from the actual 'Net' parts that is :-) Unit tests and python test/test.py script seem to be able to run without problems. ------------------------------------------------------------------------ r271 | chris | 2005-09-13 15:22:33 +0100 (Tue, 13 Sep 2005) | 3 lines Now trying to get the whole lot to compile - debugging template compile errors is just a bit messy... ------------------------------------------------------------------------ r270 | chris | 2005-09-13 14:33:06 +0100 (Tue, 13 Sep 2005) | 3 lines Renamed NetMetaInfo to NetPtrInfo to better reflect its role... ------------------------------------------------------------------------ r269 | chris | 2005-09-13 14:31:45 +0100 (Tue, 13 Sep 2005) | 3 lines Renamed NetPtrStatus to NetPtrProxy in all of the source files. ------------------------------------------------------------------------ r268 | chris | 2005-09-13 14:04:10 +0100 (Tue, 13 Sep 2005) | 3 lines Renamed NetPtrStatus to NetPtrProxy... ------------------------------------------------------------------------ r267 | chris | 2005-09-13 11:21:23 +0100 (Tue, 13 Sep 2005) | 5 lines Further work on NetObjects. I have added a unit test module for NetObjects (it was working until I broke the code!) and I am now working on the registry so that it stores 'NetMetaInfo' objects that say whether or not someone is editing the object, or which processors it resides on. The code is broken as I am moving some things around, e.g. I would like the 'is_master' variable to move to the metainfo, and I don't think that there is a need for the dataversion variable anymore. Indeed, this would mean that NetPtrStatus is really not NetPtrStatus, but is instead really NetPtrProxy... I think that I will have to rename it... ------------------------------------------------------------------------ r266 | chris | 2005-09-12 22:36:30 +0100 (Mon, 12 Sep 2005) | 3 lines The NetObjects all seem to compile now, and the runtests complete without error. The next job is to sort out the NetPtrWriter. Once that is done, I can then get to work on the actual message passing and NetRegistry based object registration... ------------------------------------------------------------------------ r265 | chris | 2005-09-12 17:33:31 +0100 (Mon, 12 Sep 2005) | 3 lines Working on the NetObjects framework. This will take some time, and as of yet does not compile. I do however now have a clear idea of how this will work, and have some ideas of how to speed up the message passing (e.g. allocate id numbers in ranges so that we don't need to do a network lookup every time we create a new object). ------------------------------------------------------------------------ r264 | chris | 2005-09-12 13:24:21 +0100 (Mon, 12 Sep 2005) | 3 lines Separated out the NetPointer into many files, as it is really a large unit in the program and implementing this in a single header file would be very messy... ------------------------------------------------------------------------ r263 | chris | 2005-09-09 16:47:34 +0100 (Fri, 09 Sep 2005) | 2 lines Working on the netpointer class - decided that I need to redirect via the NetPointerStatus (will be the thing that actually holds the pointer to the object) ------------------------------------------------------------------------ r262 | chris | 2005-09-09 13:38:07 +0100 (Fri, 09 Sep 2005) | 2 lines Both sire and siretest seem to be working now ------------------------------------------------------------------------ r261 | chris | 2005-09-09 13:34:11 +0100 (Fri, 09 Sep 2005) | 3 lines Updating files... ------------------------------------------------------------------------ r260 | chris | 2005-09-09 13:31:51 +0100 (Fri, 09 Sep 2005) | 2 lines Moved SireUnitTest to a top level module... ------------------------------------------------------------------------ r259 | chris | 2005-09-09 13:31:21 +0100 (Fri, 09 Sep 2005) | 2 lines Separating out the unit tests and also included the boost execution monitor to homogenise the failure reporting... ------------------------------------------------------------------------ r258 | chris | 2005-09-08 22:01:18 +0100 (Thu, 08 Sep 2005) | 3 lines Integrating the tests, except that I don't want to be linking the unit tests in as I am currently doing... I will need to separate the unit tests to another directory. ------------------------------------------------------------------------ r257 | chris | 2005-09-08 21:49:05 +0100 (Thu, 08 Sep 2005) | 3 lines It looks like 'siretest' is working and the (admittedly small number!) of unit tests are working correctly. ------------------------------------------------------------------------ r256 | chris | 2005-09-08 21:39:52 +0100 (Thu, 08 Sep 2005) | 3 lines Renaming some files... ------------------------------------------------------------------------ r255 | chris | 2005-09-08 21:38:07 +0100 (Thu, 08 Sep 2005) | 3 lines Moving all python wrapping into the libraries as this allows it to be linked with in the test application ------------------------------------------------------------------------ r254 | chris | 2005-09-08 21:36:49 +0100 (Thu, 08 Sep 2005) | 3 lines Working integrating the test system into the rest of the program... ------------------------------------------------------------------------ r253 | chris | 2005-09-08 21:15:57 +0100 (Thu, 08 Sep 2005) | 3 lines Working on adding in the SireTest module - primarily so that I can test the new code as I am writing it, and to ensure that existing code is still working... ------------------------------------------------------------------------ r252 | chris | 2005-09-08 17:53:32 +0100 (Thu, 08 Sep 2005) | 3 lines Added the missing wrappers to the SireBase module, and wrapped up SireError. C++ to python exception translation is now working correctly again! ------------------------------------------------------------------------ r251 | chris | 2005-09-08 16:19:39 +0100 (Thu, 08 Sep 2005) | 3 lines Written a script that checks that the pro files have the correct include file. ------------------------------------------------------------------------ r250 | chris | 2005-09-08 15:38:00 +0100 (Thu, 08 Sep 2005) | 3 lines Got the python wrapping working again. Now have fully wrapped Sire, SirePy and SireStream modules! (and they appear to work!) ------------------------------------------------------------------------ r249 | chris | 2005-09-08 13:56:39 +0100 (Thu, 08 Sep 2005) | 3 lines Creating directories for the missing Sire modules... ------------------------------------------------------------------------ r248 | chris | 2005-09-08 13:54:33 +0100 (Thu, 08 Sep 2005) | 3 lines Renaming the individual python modules... ------------------------------------------------------------------------ r247 | chris | 2005-09-08 13:52:26 +0100 (Thu, 08 Sep 2005) | 3 lines Renamed the ProtoMS3 python module to Sire... ------------------------------------------------------------------------ r246 | chris | 2005-09-08 12:33:02 +0100 (Thu, 08 Sep 2005) | 3 lines The python thread is now working pretty well - I have used signals to indicate when the thread enters its event loop. Doing this has prevented a random locking problem, where sometimes it would lock after starting the python thread, and sometimes it wouldn't. ------------------------------------------------------------------------ r245 | chris | 2005-09-08 11:53:46 +0100 (Thu, 08 Sep 2005) | 3 lines Fixed crash when trying to run python. It was caused by my confused implementation of thread-safety in the PythonParser class. I have fixed this by making the PythonParser and PythonThread *not* thread-safe, but instead have made the PythonScript class very thread-safe, and have set this as the interface through which other threads try to run or debug the python. ------------------------------------------------------------------------ r244 | chris | 2005-09-07 23:35:40 +0100 (Wed, 07 Sep 2005) | 3 lines Written the MainApp class so that it is arranged in a more logical manner! Code now runs, though crashes when it tries to parse any python - a problem to be solved on another day... ------------------------------------------------------------------------ r243 | chris | 2005-09-07 18:03:42 +0100 (Wed, 07 Sep 2005) | 2 lines Moved the MPI stuff into the MainApp so that it can decide whether or not to use MPI based on the command line variables ------------------------------------------------------------------------ r242 | chris | 2005-09-07 17:51:43 +0100 (Wed, 07 Sep 2005) | 3 lines Got the command line options (mostly) working, and can now parse python scripts again. Code is quite buggy though... ------------------------------------------------------------------------ r241 | chris | 2005-09-07 12:33:15 +0100 (Wed, 07 Sep 2005) | 3 lines Got delayed initialisation working, and starting of the python thread within the Qt event loop. Have also started using getopt to parse the command line options. ------------------------------------------------------------------------ r240 | chris | 2005-09-07 10:11:02 +0100 (Wed, 07 Sep 2005) | 3 lines Working on merging in the moved SireStream and SirePy modules... ------------------------------------------------------------------------ r239 | chris | 2005-09-07 09:21:56 +0100 (Wed, 07 Sep 2005) | 2 lines Cleaning up after a messy commit... ------------------------------------------------------------------------ r238 | chris | 2005-09-07 09:21:12 +0100 (Wed, 07 Sep 2005) | 3 lines Moving the stream files to SireStream ------------------------------------------------------------------------ r237 | chris | 2005-09-07 09:15:13 +0100 (Wed, 07 Sep 2005) | 3 lines Moving the print functions to 'SireStream' so that everything does not have to depend on SireBase! ------------------------------------------------------------------------ r236 | chris | 2005-09-06 21:52:55 +0100 (Tue, 06 Sep 2005) | 3 lines Got the build system to work compiling the whole system, complete with library dependencies and it works with distcc and ccache! ------------------------------------------------------------------------ r235 | chris | 2005-09-06 15:33:29 +0100 (Tue, 06 Sep 2005) | 3 lines The 'SireBase' and 'SireError' libraries now compile. No idea if they work though! :-) ------------------------------------------------------------------------ r234 | chris | 2005-09-06 14:45:04 +0100 (Tue, 06 Sep 2005) | 3 lines Beginning to slowly get the new build system working with the new layout... ------------------------------------------------------------------------ r233 | chris | 2005-09-06 10:55:01 +0100 (Tue, 06 Sep 2005) | 3 lines Re-added all of the files using the new file layout ------------------------------------------------------------------------ r232 | chris | 2005-09-06 10:52:39 +0100 (Tue, 06 Sep 2005) | 2 lines Removing everything as I am completely rearranging the code ------------------------------------------------------------------------ r231 | chris | 2005-09-06 09:48:47 +0100 (Tue, 06 Sep 2005) | 4 lines This has all led to a major reorganisation - this is necessary as their are circular dependencies between the libraries, and their is little logic to the way things are currently split... ------------------------------------------------------------------------ r230 | chris | 2005-09-05 16:00:54 +0100 (Mon, 05 Sep 2005) | 3 lines Removing old bin and lib directories as I will make the build system install the code in a specified place... ------------------------------------------------------------------------ r229 | chris | 2005-09-05 16:00:01 +0100 (Mon, 05 Sep 2005) | 3 lines More directory rearrangement... ------------------------------------------------------------------------ r228 | chris | 2005-09-05 15:58:28 +0100 (Mon, 05 Sep 2005) | 3 lines Bit of rearrangement as I update the build system (the old kludge is really annoying me!) ------------------------------------------------------------------------ r227 | chris | 2005-09-05 12:38:06 +0100 (Mon, 05 Sep 2005) | 3 lines Beginning work on the NetPointer class that provides the foundation of all of the inter-process communication... ------------------------------------------------------------------------ r226 | chris | 2005-09-05 11:07:28 +0100 (Mon, 05 Sep 2005) | 9 lines Back to work after summer hiatus (moving house from Southampton to South Wales, moving uni, completing work programming projects, summer hols etc!) Now that I have a new desktop I can really get some work done on the parallel code. First however I have switched over to using mpich, and have got the compile working with distcc so that I can compile on the desktop while I work on the laptop. While I have been away I have had a few ideas about how to do the networking/mpi. Essentially I will create a NetPointer class that handles the registration and network transparent pointing to objects. This will follow a single-data/multiple-copy model whereby each process has its own local copy of the object being pointed to, with only a single, master process having write access, with the rest having read access. This should work as it fits in with the idea of the program, i.e. that only a single controller changes things at a time. This pointer should thus prove useful in allowing me to expose objects to the python layer without worrying about a script changing an object while it is being simulated! The NetPointer will also include a lot of the functionality of the CutGroupID/CutGroupRegistry, so may be able to replace that. I will be working on this in a separate area for the moment, and will probably integrate it by rewriting chunks of the code. I do seem to keep going so far, then going back and rewriting... I will need to stop this if I am to get a working code by Christmas... ------------------------------------------------------------------------ r225 | chris | 2005-05-30 17:58:26 +0100 (Mon, 30 May 2005) | 3 lines Beginning work on the use of mpi to allow parallel programming. Code does not as yet compile as I am still learning... ------------------------------------------------------------------------ r224 | chris | 2005-05-25 21:59:56 +0100 (Wed, 25 May 2005) | 2 lines Beginning work on the threading code. ------------------------------------------------------------------------ r223 | chris | 2005-05-24 09:01:39 +0100 (Tue, 24 May 2005) | 3 lines Exposing forcefield and simsystem functions to the python interface. Beginning to test the addition of groups/forcefields to a simsystem. Code compiles and works, though is probably very buggy! ------------------------------------------------------------------------ r222 | chris | 2005-05-23 21:27:19 +0100 (Mon, 23 May 2005) | 3 lines Added protoms3 powerpoint presentation that I will be giving to Mike this Friday. ------------------------------------------------------------------------ r221 | chris | 2005-05-23 21:07:21 +0100 (Mon, 23 May 2005) | 3 lines Moved 'increment' into the ProtoMS3 namespace. Small compile problem caused by unit_test_protoms3 needing to link to libprotoms3 before it has been compiled! Kludged by adding 'make -k' to make.py so that I can run it twice after a distclean... ------------------------------------------------------------------------ r220 | chris | 2005-05-23 21:01:38 +0100 (Mon, 23 May 2005) | 5 lines Fixed the code that has been implemented so far. The code now compiles and runs. I have not tested the new SimSystem/FFGroup/FFBase addition and removal functions. I have also added an 'increment' function that increments a number on a string. ------------------------------------------------------------------------ r219 | chris | 2005-05-17 08:49:10 +0100 (Tue, 17 May 2005) | 3 lines Still working on interface for adding forcefields/molecules to systems... Code will not compile at the moment. ------------------------------------------------------------------------ r218 | chris | 2005-05-16 21:54:02 +0100 (Mon, 16 May 2005) | 3 lines Working on interface to add forcefields/groups to a system. ------------------------------------------------------------------------ r217 | chris | 2005-05-16 09:59:21 +0100 (Mon, 16 May 2005) | 3 lines Added an 'Energy' unit test... ------------------------------------------------------------------------ r216 | chris | 2005-05-16 09:47:28 +0100 (Mon, 16 May 2005) | 3 lines Got working Vector and Lambda unit tests. Fixed a bug that was found in Lambda. ------------------------------------------------------------------------ r215 | chris | 2005-05-16 08:50:31 +0100 (Mon, 16 May 2005) | 3 lines Beginning to build the test framework. ------------------------------------------------------------------------ r214 | chris | 2005-05-16 08:38:27 +0100 (Mon, 16 May 2005) | 3 lines Rearranged directories, now have protoms3 library with very basic client (just main.cpp). Unit test program compiles! ------------------------------------------------------------------------ r213 | chris | 2005-05-16 08:31:14 +0100 (Mon, 16 May 2005) | 2 lines Adding the 'client' directory, which is used to compile the main application. ------------------------------------------------------------------------ r212 | chris | 2005-05-16 08:29:16 +0100 (Mon, 16 May 2005) | 3 lines Adding unit_tests program directory. Will need however to change the main program so that protoms3 is a library... ------------------------------------------------------------------------ r211 | chris | 2005-05-16 08:17:20 +0100 (Mon, 16 May 2005) | 3 lines Added the 'unit_tests' directory... ------------------------------------------------------------------------ r210 | chris | 2005-05-16 08:15:35 +0100 (Mon, 16 May 2005) | 3 lines Moved compiled-in system tests to 'system_tests' directory. Unit tests will be placed into the 'unit_tests' directory. ------------------------------------------------------------------------ r209 | chris | 2005-05-16 08:10:42 +0100 (Mon, 16 May 2005) | 3 lines Rearranging test directory so that I have space to build a unit test program. ------------------------------------------------------------------------ r208 | chris | 2005-05-15 18:58:20 +0100 (Sun, 15 May 2005) | 3 lines The code now compiles and runs, though I haven't as yet tested any of the additions... ------------------------------------------------------------------------ r207 | chris | 2005-05-15 13:10:21 +0100 (Sun, 15 May 2005) | 3 lines Still coding... Adding an EnergyHistory object that stores Energies for each configuration. This provides a better way of doing 'old' and 'new' energies, as this will cope better with the use of multiple step MC moves, and with HMC/MD (it does not force an old/new mentality into the forcefield classes). Also this means that all of the 'running total' code is contained within a single class. ------------------------------------------------------------------------ r206 | chris | 2005-05-14 22:51:37 +0100 (Sat, 14 May 2005) | 3 lines Added a class to represent the lambda coordinate, and have added a class that represents the collection of all FFBases that make up a complete forcefield. Neither of these have been compiled or tested yet though... ------------------------------------------------------------------------ r205 | chris | 2005-05-14 20:42:00 +0100 (Sat, 14 May 2005) | 3 lines Added functionality to FFBase so that we can control whether the energies are cached as old/new/dontcare, and how much of the energy to calculate (reference only, reference and forward, or all). Also added the FFPtr as a shared pointer to FFBase. ------------------------------------------------------------------------ r204 | chris | 2005-05-13 09:13:02 +0100 (Fri, 13 May 2005) | 3 lines Testing time of energy evaluation, 1000 molecule-group evaluations comes in at 1800ms, so 1.8ms per evaluation. With 17ms for 1000 non-group interactions, things are going well. This figure compares well with ProtoMS2.1, which takes about 2.5-3 seconds to do 1000 moves with the same system and cutoffs. ------------------------------------------------------------------------ r203 | chris | 2005-05-13 09:07:42 +0100 (Fri, 13 May 2005) | 5 lines Yes, the new split version is marginally quicker for these tests, (679ms, 668ms and 71ms, compared to 705ms, 687ms, 75ms) Ok, so not a huge improvement, but not to shabby! ------------------------------------------------------------------------ r202 | chris | 2005-05-13 08:59:31 +0100 (Fri, 13 May 2005) | 3 lines Fixed bug in accumalation of energies. Am testing a new way of splitting the sets in two. Using the method of this revision, I get a time of 71ms. ------------------------------------------------------------------------ r201 | chris | 2005-05-12 09:41:59 +0100 (Thu, 12 May 2005) | 3 lines Added an energy class to store reference and perturbed energies together. The calculated energies are very wrong at the moment? ------------------------------------------------------------------------ r200 | chris | 2005-05-11 21:49:59 +0100 (Wed, 11 May 2005) | 3 lines I have tested the speed of ProtoMS3 vs. ProtoMS 2.1 on the water box for a variety of different cutoff distances, and for all but the smallest cutoff (5A) ProtoMS3 was about 30% faster. The details are in ideas/current-speed. ------------------------------------------------------------------------ r199 | chris | 2005-05-11 21:14:47 +0100 (Wed, 11 May 2005) | 3 lines Finished work on the Array class, and have switched AtomArray over to use it. I have also switched MM to use it, and have very much sped up the energy calculation. There are still a few things that I want to do to the MM forcefield before I am totally happy with it... ------------------------------------------------------------------------ r198 | chris | 2005-05-11 09:34:16 +0100 (Wed, 11 May 2005) | 5 lines Working on a template 'Array' class that will form the basis of both AtomArray and CutGroup/MoleculeArray. I have chosen to make my own class as I then have a much tighter control of how the memory is being allocated (important as these classes are used in the double loop, and I want to ensure that no heap-memory allocation is occuring in the double loop!) I haven't compiled or tested this code yet, so it is probably broken. ------------------------------------------------------------------------ r197 | chris | 2005-05-10 22:15:14 +0100 (Tue, 10 May 2005) | 5 lines Implementing method of getting close CutGroups. Will only be efficient if I can get classes that do no keep reallocating memory!!! I have tried QVector, but it keeps reallocating! I think that I may have to write my own template class... ------------------------------------------------------------------------ r196 | chris | 2005-05-10 21:38:19 +0100 (Tue, 10 May 2005) | 16 lines Fixed the bug in the calculated energies - now I get much better agreement. However, the speed is still quite poor; ProtoMS3 : -14467.1 kcal mol-1, took 906 ms ProtoMS2.1: -14465.2 kcal mol-1, took 939 ms The comparison is even worse for small cutoffs (5.0 A, ProtoMS3 is twice as slow as 2.1). The difference in energy is down to the slightly different ways of handling cutoffs and feather distances. ProtoMS3 uses the closest distance between the atoms of two groups as the cutoff and feather distances. ProtoMS2.1 uses the distance between the center of solvent molecules as the distance. The different definitions of the distance means that ProtoMS3 includes more waters than 2.1, and uses larger feather factors for a given water molecule. The energies are thus slightly larger, and the calculation is slightly more expensive. However, it is also more correct. When I do free energies, there will also be a difference as 3 uses a different nb calculation for the reference and perturbed states, thus the cutoff values can be different for the two states (this is the correct way of doing it!). 2.1 uses the same nb calculation for the reference and perturbed states, and thus the cutoff values of the reference state is used. This is quicker, but is not totally correct. ------------------------------------------------------------------------ r195 | chris | 2005-05-10 09:04:26 +0100 (Tue, 10 May 2005) | 5 lines I have added the cutoff and feather to the code, but the energies are wrong and the code is now slow compared to ProtoMS2.1 The slowness is a real and major problem. While the code is much faster with a large cutoff (as nearly all pairs of cutgroups must have their energy evaluated) the code is a lot slower for a small cutoff, as the cost to loop over all pairs of cutgroups is very high (about 300ms). This fixed cost is actually higher than than the complete time to calculate the energy using ProtoMS2.1. I will need to investigate this and find ways of speeding it up, as this could be a killer problem! ------------------------------------------------------------------------ r194 | chris | 2005-05-09 21:38:31 +0100 (Mon, 09 May 2005) | 3 lines Adding framework for saving CutGroup-CutGroup energies... This does slow the energy calculation down a bit though, and I am concerned as to the code complexity problems of caching this information... ------------------------------------------------------------------------ r193 | chris | 2005-05-09 21:07:14 +0100 (Mon, 09 May 2005) | 3 lines Reorganising the code a little to make it more readable and easily editable... ------------------------------------------------------------------------ r192 | chris | 2005-05-09 20:49:10 +0100 (Mon, 09 May 2005) | 3 lines Reworked the MM energy routines, and have made them a bit faster! They still get the energy correct, and now take 2904ms to calculate the energy (using the real sqrt). ------------------------------------------------------------------------ r191 | chris | 2005-05-09 10:03:35 +0100 (Mon, 09 May 2005) | 3 lines Working on the new forcefield system... Code is broken! ------------------------------------------------------------------------ r190 | chris | 2005-05-09 09:12:44 +0100 (Mon, 09 May 2005) | 3 lines Fixed bug where code complained if the same memory used for an old, deleted CutGroup was reused for a new CutGroup. Compared timings and energies to ProtoMS 2.1, and the energies are the same, but ProtoMS 2.1 is also a bit slower, calculating the energy in 4934ms. The relative speeds of 2.1 and 3 are thus still the same, so I think that the slowdown is due to the compiler. ------------------------------------------------------------------------ r189 | chris | 2005-05-09 08:45:59 +0100 (Mon, 09 May 2005) | 3 lines The 'runtest' still gives the correct energy (surprisingly!), but the time to calculate is now 3374ms for normal sqrt, and 2310ms for fast sqrt. This drop is speed may just be down to the change in compiler? (from gcc3.3 to 3.4) ------------------------------------------------------------------------ r188 | chris | 2005-05-09 08:34:05 +0100 (Mon, 09 May 2005) | 3 lines Fixed bug in QString -> python string conversion. The code now compiles and runs without crashing. ------------------------------------------------------------------------ r187 | chris | 2005-05-08 21:57:47 +0100 (Sun, 08 May 2005) | 7 lines I have had to change ProtoMSServer and PythonParser as I had misinterpreted the way signals and slots worked between threads. I have made the changes, though I am not happy with the current version. This is something I will need to come back and do properly at some point in the future... The code now compiles and runs, though the current script segfaults half way through... Also, I have had to hack a workaround to a weird bug in QTextStream (in TxtStream - it is flagged up via a #warning statement) ------------------------------------------------------------------------ r186 | chris | 2005-05-07 22:46:09 +0100 (Sat, 07 May 2005) | 9 lines The code now compiles(!) There are still a lot of things to do, but because I have upgraded to gcc 3.4 without recompiling boost::python, my c++ libraries are out of sync and the code is not printing anything to the screen! I still need to sort out all of the classes, but I will do this after I test "Molecule". I have also added some text on an idea that ForceField::MM stores all of the CutGroup-CutGroup pair energies. This would speed up the energy evaluation, and I have worked out that for the sorts of systems we normally use, that this will not impose an overly burdensome memory requirement. Unlike ProtoMS2 I can supply a version of ForceField::MM optimised for large systems that does not have this memory requirement. ------------------------------------------------------------------------ r185 | chris | 2005-05-07 16:10:53 +0100 (Sat, 07 May 2005) | 5 lines Finished renaming CutMolecule to Molecule. Am still updating to the new hierarchy. I am happy that this is the best thing to do, though I have so messed up the code at the moment, and I am in the process of fixing everything. This will probably take quite a while. The code is very broken! The main problem I have is that I need to work out whether I am working with molecules or cutgroups, and to make sure that the code is very specific about what it is using. I still need to write fast functions to change a MoleculeSet into a CutGroupSet, and back again (it is not straightforward as turning a MoleculeSet into a CutGroupSet involves replacing all of the ChainMols with the ChainRes children...) ------------------------------------------------------------------------ r184 | chris | 2005-05-07 14:33:00 +0100 (Sat, 07 May 2005) | 3 lines Beginning to rename 'CutMolecule' to 'Molecule' and made CutGroupSet just a plain Set ------------------------------------------------------------------------ r183 | chris | 2005-05-06 13:04:36 +0100 (Fri, 06 May 2005) | 2 lines Just a few more ideas, and changed make.py so that it works with my upgraded qt4 beta2 ------------------------------------------------------------------------ r182 | chris | 2005-05-05 10:06:08 +0100 (Thu, 05 May 2005) | 3 lines Making progress with the conversion of the CutGroups to the new hierarchy. The code is still however in a very broken, won't compile state! ------------------------------------------------------------------------ r181 | chris | 2005-05-04 23:11:27 +0100 (Wed, 04 May 2005) | 3 lines Added a FlexGroup class and am reorganising the CutGroup classes around the new hierarchy. This code is still very broken. ------------------------------------------------------------------------ r180 | chris | 2005-05-04 10:25:24 +0100 (Wed, 04 May 2005) | 3 lines Realised that I need to modify the CutGroup hierarchy. My ideas have been added, and I need to add a CutMolecule, CutResidue and FlexGroup class... The code won't now compile... ------------------------------------------------------------------------ r179 | chris | 2005-05-03 22:54:24 +0100 (Tue, 03 May 2005) | 5 lines Beginning to think about how a move class would work. This lead me to realise that I haven't sorted out the SimSystem properly, which in turn made me realise that I don't know how to represent ChainMol/ChainRes properly (e.g. preventing adding both ChainMol and ChainRes to the same CutGroupSet!). I have thus been cleaning up parts of the code in preparation for sorting out these problems. ------------------------------------------------------------------------ r178 | chris | 2005-05-02 17:42:50 +0100 (Mon, 02 May 2005) | 5 lines Written a lot of the code for the checkpoint class. Have not yet tested it though, so it is likely broken! Have also added operator+ to a Set so that sets can be added together. ------------------------------------------------------------------------ r177 | chris | 2005-05-02 15:21:31 +0100 (Mon, 02 May 2005) | 3 lines Added datastream >> and << functions to a few classes in preparation for the checkpointing functionality that I will use to save and restore the system between moves. ------------------------------------------------------------------------ r176 | chris | 2005-04-29 10:08:54 +0100 (Fri, 29 Apr 2005) | 3 lines Only a few small cosemetic changes. I am currently thinking about a checkpoint system that would allow the system saved before a move so that it can be restored if the move failed. I will need a more complex system than exists in ProtoMS2 as I expect to support much more complicated types of moves, e.g. multiple-time-step MC and hybrid MC. ------------------------------------------------------------------------ r175 | chris | 2005-04-28 10:07:49 +0100 (Thu, 28 Apr 2005) | 3 lines Actually removing the ptrhandle class... ------------------------------------------------------------------------ r174 | chris | 2005-04-28 10:06:51 +0100 (Thu, 28 Apr 2005) | 4 lines Now back to working on the SimSystem, and adding functions to add EditMols to SimSystems (with their conversions to CutGroups). I have removed the PtrHandle class as it was only doing the same thing as a weak_ptr. ------------------------------------------------------------------------ r173 | chris | 2005-04-27 23:25:05 +0100 (Wed, 27 Apr 2005) | 3 lines Written code to align one molecule onto another, though have not yet tested it. Have added a Matrix4 class (4x4 matrix) that is at the moment only being used for the alignment code. ------------------------------------------------------------------------ r172 | chris | 2005-04-27 21:54:32 +0100 (Wed, 27 Apr 2005) | 3 lines Finally got the principal axes code working! Have also now added code to calculate the center of mass an inertia tensor for a set of atoms. This also works. I have also improved the efficiency of the vector/matrix routines by allowing operator+= etc. for vector, and inlining matrix/vector multiplication. ------------------------------------------------------------------------ r171 | chris | 2005-04-27 11:06:45 +0100 (Wed, 27 Apr 2005) | 2 lines Its working! I was just mixing up my rows and columns! ------------------------------------------------------------------------ r170 | chris | 2005-04-27 10:55:10 +0100 (Wed, 27 Apr 2005) | 2 lines I am having so many problems with getting the axis set calculated correctly... It still doesn't work, and its my understanding of the maths that is to fault! ------------------------------------------------------------------------ r169 | chris | 2005-04-26 11:11:47 +0100 (Tue, 26 Apr 2005) | 3 lines Working on adding templates to whole EditMols - this code is yet to be tested though has been wrapped up. ------------------------------------------------------------------------ r168 | chris | 2005-04-25 10:12:38 +0100 (Mon, 25 Apr 2005) | 5 lines Fixed problem with calculating principal axes (I had misinterpreted what was meant by the metrix tensor). There is still a small problem with highly symmetrical molecules that have degenerate principal axes (e.g. tip4p) ------------------------------------------------------------------------ r167 | chris | 2005-04-24 23:46:15 +0100 (Sun, 24 Apr 2005) | 2 lines Fixed bugs so that I can now create a correct tip4p molecule from scratch! ------------------------------------------------------------------------ r166 | chris | 2005-04-24 00:56:49 +0100 (Sun, 24 Apr 2005) | 2 lines Fixed the code sufficiently so that I can convert a tip3p into a tip4p without any problem. Have fully wrapped up the EditRes change/set internal geometry functions, including using different weighting functions. However, there are still problems as I am unable to build a tip4p molecule from scratch... ------------------------------------------------------------------------ r165 | chris | 2005-04-23 17:59:19 +0100 (Sat, 23 Apr 2005) | 2 lines Begun work on a script to convert a tip3p into a tip4p. This seems to work, except that I need to specify how to move the atoms (at the moment I move the M03 atom, and the rest of the molecule moves out of the way!) ------------------------------------------------------------------------ r164 | chris | 2005-04-23 17:43:15 +0100 (Sat, 23 Apr 2005) | 3 lines Written the code to convert a tip4p box into an spc box - and it works! My template scheme is pretty good! ------------------------------------------------------------------------ r163 | chris | 2005-04-23 16:39:26 +0100 (Sat, 23 Apr 2005) | 5 lines Realised that Bonds made via temporary python atoms would cause the program to crash, so have prevented bonds from being made directly, and now require that they are constructed via EditMols. Added functionality to set internal geometry - have got a script that can now successfully convert a tip4p water into an SPC water! ------------------------------------------------------------------------ r162 | chris | 2005-04-21 23:55:21 +0100 (Thu, 21 Apr 2005) | 3 lines Written code to move angles and dihedrals. However I have run into a weird bug in the angle and dihedral code that is really annoying me. The references in the (supposedly const) atmangle and dihedral keep changing, eventually causing a crash... ------------------------------------------------------------------------ r161 | chris | 2005-04-21 22:36:06 +0100 (Thu, 21 Apr 2005) | 3 lines Added a Dihedral and DihedralIndex class, and have wrapped them up in python and tested them! ------------------------------------------------------------------------ r160 | chris | 2005-04-21 09:56:33 +0100 (Thu, 21 Apr 2005) | 3 lines Added an AtmAngle class to represent angles between atoms. Have wrapped it up in python and tested it (it was originally quite buggy!) ------------------------------------------------------------------------ r159 | chris | 2005-04-20 23:05:10 +0100 (Wed, 20 Apr 2005) | 3 lines Have got the 'changeBond' for EditRes working, and it does what it says on the tin! ------------------------------------------------------------------------ r158 | chris | 2005-04-20 22:25:23 +0100 (Wed, 20 Apr 2005) | 3 lines Finished updating IndexList to IndexSet - it all appears to work again! ------------------------------------------------------------------------ r157 | chris | 2005-04-20 22:06:33 +0100 (Wed, 20 Apr 2005) | 2 lines Renaming IndexList to IndexSet... ------------------------------------------------------------------------ r156 | chris | 2005-04-20 22:06:11 +0100 (Wed, 20 Apr 2005) | 3 lines Changing an IndexList into an IndexSet. This solves my problems about the anchor atoms (as now store an IndexSet of anchors, with easy test for intersection!) ------------------------------------------------------------------------ r155 | chris | 2005-04-20 10:13:17 +0100 (Wed, 20 Apr 2005) | 3 lines Removed an unnecessary anchor test. I am not happy with the way that I test for anchors though - it will be too slow for large molecules... ------------------------------------------------------------------------ r154 | chris | 2005-04-20 10:10:35 +0100 (Wed, 20 Apr 2005) | 2 lines Writing a 'moveinternal' class that contains all of the functions to move an AtomSet or AtomArray... ------------------------------------------------------------------------ r153 | chris | 2005-04-19 09:49:07 +0100 (Tue, 19 Apr 2005) | 2 lines Renamed 'splitmolecule.h' to 'splitmolecule.hpp' to represent that it provides template functions. ------------------------------------------------------------------------ r152 | chris | 2005-04-19 09:47:03 +0100 (Tue, 19 Apr 2005) | 3 lines Finished changing the splitMolecule functions over to returning the indexes of atoms in the two sets. This solves my problem of const Atom refs, and Atom copies! I have also added the IndexList class and have wrapped that up (in wrap_splitmolecule.cpp). ------------------------------------------------------------------------ r151 | chris | 2005-04-18 23:01:35 +0100 (Mon, 18 Apr 2005) | 2 lines Realised that I can solve my immutable AtomArray/AtomSet problems by having the splitMolecule functions return indexes into the Array/Set. I am in the process of updating the code to do this, and am about to create a proper 'IndexList' class... ------------------------------------------------------------------------ r150 | chris | 2005-04-17 23:56:53 +0100 (Sun, 17 Apr 2005) | 2 lines Have finished writing functions to split a molecule into two. The functions for bond, angle and dihedral all seem to work on the calix system! I have also updated BondSet to return an AtomArray of bonded atoms, and have modified the element class so that it tries harder to guess the element type from the atom name. ------------------------------------------------------------------------ r149 | chris | 2005-04-17 17:17:06 +0100 (Sun, 17 Apr 2005) | 2 lines Begun writing code to split a molecule in two based on bonding. Testing reveals that it doesn't work as there are some data problems with BondSet (that I am in the process of trying to solve!) ------------------------------------------------------------------------ r148 | chris | 2005-04-16 23:51:38 +0100 (Sat, 16 Apr 2005) | 3 lines Written code to get bond information from the 'conect' line in PDB files. Also added 'contains' functions to EditMol so that we can see if an atom is already present in an EditMol. ------------------------------------------------------------------------ r147 | chris | 2005-04-16 22:56:34 +0100 (Sat, 16 Apr 2005) | 2 lines The auto-add bond code seems to work perfectly! ------------------------------------------------------------------------ r146 | chris | 2005-04-16 22:52:23 +0100 (Sat, 16 Apr 2005) | 3 lines Written code to automatically add the bonds between atoms based on their bond-order radii. ------------------------------------------------------------------------ r145 | chris | 2005-04-14 10:53:28 +0100 (Thu, 14 Apr 2005) | 3 lines Updated BondSet to have an AtomIndex so that it should be able to rapidly locate the bonds that involve an atom. ------------------------------------------------------------------------ r144 | chris | 2005-04-12 23:51:29 +0100 (Tue, 12 Apr 2005) | 2 lines Fixed bugs in the building of atoms, and deleting items from a Set. Opened the can of worms by allowing non-const references from a Set, and changing coordinates of an Atom... ------------------------------------------------------------------------ r143 | chris | 2005-04-12 10:07:31 +0100 (Tue, 12 Apr 2005) | 3 lines Written the code to add atoms to an EditRes based on another EditRes acting as a template! There seems to be a small bug though with the second atom of the residue being retained, while the second atom of the template is forgotton! ------------------------------------------------------------------------ r142 | chris | 2005-04-11 22:51:36 +0100 (Mon, 11 Apr 2005) | 3 lines Written code to calculate the principal axes of a set of atoms, and it works! I have successfully calculate the principal axes of a lone TIP3P water. ------------------------------------------------------------------------ r141 | chris | 2005-04-11 22:03:12 +0100 (Mon, 11 Apr 2005) | 19 lines Included the GNU Scientific Library (GSL) to calculate the principal axes of symmetric matricies. I have checked the results using GNU octave (using; octave> [v,d] = eig(hilb(3)); octave> v giving results v = -0.12766 0.54745 0.82704 0.71375 -0.52829 0.45986 -0.68867 -0.64901 0.32330 (with the matrix being) 1.00000 0.50000 0.33333 0.50000 0.33333 0.25000 0.33333 0.25000 0.20000 ------------------------------------------------------------------------ r140 | chris | 2005-04-10 22:52:59 +0100 (Sun, 10 Apr 2005) | 3 lines Wrapped up the matrix class, fixed a bug in the matrix class. Written an 'inverse' function for the matrix class. Created an AxisSet class that represents an coordinate frame, and provides functions that allow conversion between coordinate frames. Wrapped up this AxisSet class, and have tested it and the matrix class in python. It all seems to work properly! ------------------------------------------------------------------------ r139 | chris | 2005-04-09 23:37:34 +0100 (Sat, 09 Apr 2005) | 2 lines Adding an 'M' atom to a whole box of TIP3Ps seems to work! ------------------------------------------------------------------------ r138 | chris | 2005-04-09 23:02:15 +0100 (Sat, 09 Apr 2005) | 3 lines Code even works when I try to add hydrogens! ------------------------------------------------------------------------ r137 | chris | 2005-04-09 22:49:40 +0100 (Sat, 09 Apr 2005) | 2 lines Got EditRes::applyTemplate working! (at least adding the 'M' atom from TIP4P to a TIP3P!) ------------------------------------------------------------------------ r136 | chris | 2005-04-09 22:15:23 +0100 (Sat, 09 Apr 2005) | 2 lines Code compiles and works now. Have updated the wrapping of vector and added the wrapping of Angle. Am currently testing the new vector functionality - it appears that the calculation of length, angle and dihedral all work, and the generation of a new vector based on length, angle, dihedral also seems to work correctly! ------------------------------------------------------------------------ r135 | chris | 2005-04-09 18:25:35 +0100 (Sat, 09 Apr 2005) | 2 lines Forgot to include atomset.cpp in the last commit! ------------------------------------------------------------------------ r134 | chris | 2005-04-09 18:25:15 +0100 (Sat, 09 Apr 2005) | 2 lines Working on adding and deleting atoms from an EditRes based on a template. It is going well, and I have added most of the code. I am now trying to compile the code (it doesn't at the moment!). In doing this I had to add lots of additional functionality, and have also cleaned up the logic of the Vector functions... ------------------------------------------------------------------------ r133 | chris | 2005-04-08 22:58:56 +0100 (Fri, 08 Apr 2005) | 3 lines Updated wrapping of CutGroupSet, added the rest of the Set functions. Wrapped to convert from Set base class to CutGroupSet derived class. ------------------------------------------------------------------------ r132 | chris | 2005-04-07 22:53:00 +0100 (Thu, 07 Apr 2005) | 3 lines Got wrapping of bond functions of EditMol working! Python script seems to do what I expect it to do! ------------------------------------------------------------------------ r131 | chris | 2005-04-07 22:32:17 +0100 (Thu, 07 Apr 2005) | 3 lines Got the wrapping of BondSet working, fixed a couple of bugs in Set, and have got a small script that tests the bonds. Now just need to wrap up the EditMol bond functions. ------------------------------------------------------------------------ r130 | chris | 2005-04-07 18:09:49 +0100 (Thu, 07 Apr 2005) | 3 lines Written the code to add and remove bonds from EditMol/Res classes. Have also wrapped up these functions and am testing them a little. I still need to wrap up the EditMol functions, and the BondSet functions to test these properly. ------------------------------------------------------------------------ r129 | chris | 2005-04-04 23:04:18 +0100 (Mon, 04 Apr 2005) | 3 lines Working on restoring the bond functionality to EditMol. Switched resresbnds in EditMol to hold references to bondsets, not smart pointers. Updating 'set' to return the filled indicies... ------------------------------------------------------------------------ r128 | chris | 2005-04-04 21:35:24 +0100 (Mon, 04 Apr 2005) | 2 lines Got the Set 'sort' functions working! ------------------------------------------------------------------------ r127 | chris | 2005-03-31 22:43:28 +0100 (Thu, 31 Mar 2005) | 9 lines Changed EditMol to use a Set to store its residues! Now have nice indexing in python, so can write code like; for res in editmol: for atm in res: atm.doStuff() It works!!! ------------------------------------------------------------------------ r126 | chris | 2005-03-31 19:27:32 +0100 (Thu, 31 Mar 2005) | 3 lines Got working exception translation - its pretty cool! ------------------------------------------------------------------------ r125 | chris | 2005-03-31 19:09:25 +0100 (Thu, 31 Mar 2005) | 2 lines Got working wrapping of EditMol/EditRes (with implicit shared_ptr!). Starting work on exception translation... ------------------------------------------------------------------------ r124 | chris | 2005-03-31 18:15:24 +0100 (Thu, 31 Mar 2005) | 3 lines A little more renaming, and have got 'indexer' function for a Set working. Now CutGroupPtr is just a plain shared_ptr (oh how things have changed!) ------------------------------------------------------------------------ r123 | chris | 2005-03-31 17:39:47 +0100 (Thu, 31 Mar 2005) | 5 lines Finished renaming the List classes to Set. Also moved some typedefs into their own header files... Code compiles and some of it even runs... ------------------------------------------------------------------------ r122 | chris | 2005-03-31 17:07:02 +0100 (Thu, 31 Mar 2005) | 3 lines Just renamed the 'list' classes to 'set' classes to better represent their base types... ------------------------------------------------------------------------ r121 | chris | 2005-03-31 10:12:02 +0100 (Thu, 31 Mar 2005) | 2 lines Fixed problem, now have implicit conversion to CutGroupPtrs working in both directions. Now need to update the whole of the rest of the code to use this 'new way' of doing things. ------------------------------------------------------------------------ r120 | chris | 2005-03-31 09:29:01 +0100 (Thu, 31 Mar 2005) | 3 lines Finished changing CutGroupList into CutGroupSet, and have partially wrapped it. Code compiles and now works, but while I have automatic conversion of python CutGroup to CutGroupPtr, I do not have conversion of CutGroupPtr to python CutGroup... Oh the annoyance! ------------------------------------------------------------------------ r119 | chris | 2005-03-30 22:01:43 +0100 (Wed, 30 Mar 2005) | 3 lines Switching over to using boost::shared_ptr (implicit) and CutGroupSet as opposed to CutGroupList... Broken code! ------------------------------------------------------------------------ r118 | chris | 2005-03-30 18:48:34 +0100 (Wed, 30 Mar 2005) | 2 lines Got the wrapping of Atom working again! ------------------------------------------------------------------------ r117 | chris | 2005-03-30 09:35:02 +0100 (Wed, 30 Mar 2005) | 3 lines The code now compiles, but it doesn't yet work. I have commented out a lot of the wrapping, and am about to experiment with the implicit shared_ptr wrapping of boost::python. Hopefully if this works I will be able to remove all of my explicit ClassPtr code (since it is such a hassle to maintain!) ------------------------------------------------------------------------ r116 | chris | 2005-03-29 22:41:46 +0100 (Tue, 29 Mar 2005) | 3 lines Incredibally the code is even more broken! I have created a SetPtr template class that provides a shared_ptr version of Set that may be wrapped up in python. I have also extended the exceptions, and added the file location macro. ------------------------------------------------------------------------ r115 | chris | 2005-03-29 18:17:02 +0100 (Tue, 29 Mar 2005) | 5 lines Really broken code... I am making a 'BondIndex' class for 'Bond' as I have done for 'Atom' ('AtomIndex'). The aim of this is that I can then replace BondList with a Set, and thus have better code reuse and also be able to do quick Set.contains(BondIndex(atomindex1,atomindex2)). I am only about a quarter of the way through this change though, and (perhaps rather stupidly!) I have still not finished the changes required when I swapped Atom to be derived from AtomIndex... ------------------------------------------------------------------------ r114 | chris | 2005-03-27 22:41:54 +0100 (Sun, 27 Mar 2005) | 2 lines Still working on the change-over to AtomIndex. Now multiply inherit Atom so that I get implicit casting (eases overloading of functions). Also worked some more on the exceptions and beginning to switch over to BOOST_ASSERT. ------------------------------------------------------------------------ r113 | chris | 2005-03-27 18:58:06 +0100 (Sun, 27 Mar 2005) | 3 lines Working on integrating the new Set class. Also beginning exception framework. Code still very broken! ------------------------------------------------------------------------ r112 | chris | 2005-03-27 15:44:07 +0100 (Sun, 27 Mar 2005) | 5 lines Lots of change to the Set and Atom classes. Will change over to using a Set class that holds objects that are uniquely indexed via an index class (so am modifying atom to return an AtomIndex class. Will also eventually change over the CutGroupList to be based on the Set class. Very broken code at the moment!! ------------------------------------------------------------------------ r111 | chris | 2005-03-24 22:19:50 +0000 (Thu, 24 Mar 2005) | 3 lines Updated code to use a template wrapper function for python indexing, that throws a C++ out_of_range exception when the index is out of range. This fixes a small bug in the 'for i in list' wrapping. ------------------------------------------------------------------------ r110 | chris | 2005-03-24 10:38:39 +0000 (Thu, 24 Mar 2005) | 2 lines Got indexing working on a few classes now, and moved 'str' function to python code (as it didn't work at all with the c++ code!). ------------------------------------------------------------------------ r109 | chris | 2005-03-23 22:31:09 +0000 (Wed, 23 Mar 2005) | 3 lines Beginning work to standardise all of the python wrapped classes to have print (str) functions, and also wrap up all containers to have python subscripting operators. ------------------------------------------------------------------------ r108 | chris | 2005-03-23 09:05:09 +0000 (Wed, 23 Mar 2005) | 3 lines Learning how to turn my C++ classes into Python objects that look like containers (e.g. can do for i in list:, or use [] subscripting). Have updated BondList, AtomArray and EditMolList to appear as read-only Python containers. ------------------------------------------------------------------------ r107 | chris | 2005-03-21 21:55:39 +0000 (Mon, 21 Mar 2005) | 3 lines Providing the python wrapping of the Bond and BondList classes. Code seems to compile and run ok. ------------------------------------------------------------------------ r106 | chris | 2005-03-21 20:22:59 +0000 (Mon, 21 Mar 2005) | 3 lines Updated the wrapping of EditMol and EditRes. It all compiles and runs again. ------------------------------------------------------------------------ r105 | chris | 2005-03-21 09:28:52 +0000 (Mon, 21 Mar 2005) | 3 lines Working on the python wrapping of the bond functions of EditMol/Res. Code is broken as I haven't finished! ------------------------------------------------------------------------ r104 | chris | 2005-03-20 22:48:54 +0000 (Sun, 20 Mar 2005) | 2 lines Still working on the EditMol/Res bond classes. Added a specialised BondList class and BondListPtr to fix reference problems and to also clear up the code. It all compiles and works again (though probably still missing some functions...) ------------------------------------------------------------------------ r103 | chris | 2005-03-19 23:03:53 +0000 (Sat, 19 Mar 2005) | 2 lines Still working on the bonding of EditMols... Added a Sparse Symmetrix Matrix (SSMatrix) template class to hold the inter-residue bonds. EditMol/Res code is broken at the moment and will not compile... ------------------------------------------------------------------------ r102 | chris | 2005-03-19 14:48:45 +0000 (Sat, 19 Mar 2005) | 3 lines Added a template 'Set' class that does a similar thing to the Python Set class. Working on applying a residue template to an EditRes... ------------------------------------------------------------------------ r101 | chris | 2005-03-18 10:06:34 +0000 (Fri, 18 Mar 2005) | 3 lines Added a TmplType class that allows complicated combinations of options to be specified in python. ------------------------------------------------------------------------ r100 | chris | 2005-03-14 08:55:57 +0000 (Mon, 14 Mar 2005) | 5 lines Working on adding bonds to EditMol. Also added a residue number to an Atom (as this makes a lot of algorithms more simple to implement). The EditMol/EditRes (being the only way to edit a molecule) should always ensure that an Atom has the right residue number. Also decided that EditMol/EditRes will be the only way to edit molecules. Read in EditMols, convert them to CutGroups. CutGroups cannot be edited. Must be converted to EditMol, edited, then add a CutGroup function that allows it to be rebuilt from an EditMol. ------------------------------------------------------------------------ r99 | chris | 2005-03-13 22:41:13 +0000 (Sun, 13 Mar 2005) | 3 lines Now working on a 'Bond' class, and how I will be adding this to the FlexMol and EditMol/Res classes. ------------------------------------------------------------------------ r98 | chris | 2005-03-13 15:30:54 +0000 (Sun, 13 Mar 2005) | 3 lines Playing around with Doxygen. Doxygen gives really nice autodocs output now! ------------------------------------------------------------------------ r97 | chris | 2005-03-13 15:11:40 +0000 (Sun, 13 Mar 2005) | 11 lines Sped it up a little more, and also ran another comparison to ProtoMS2. ProtoMS2 gives an energy of -14468.3743 in 4093 ms. ProtoMS3 with sqrt gives an energy of -14468.3 in 2898 or 2967 ms ProtoMS3 with fastInvSqrt gives an energy of -14468.1 in 2283 ms Fast sqrt version runs in 56% of the time of ProtoMS2! The error using the sqrt approximation is 0.001% (about 1 part in 100,000!) Even normal sqrt version runs in 72% of the time of ProtoMS2. The use of fastInvSqrt speeds up ProtoMS3 by 25% compared to the use of the normal sqrt. ------------------------------------------------------------------------ r96 | chris | 2005-03-13 14:52:55 +0000 (Sun, 13 Mar 2005) | 3 lines Added back the explicitly inline functions and have brought the speed back up. It now takes 3049 ms using invDistance and 2450 ms using fastInvDistance. ------------------------------------------------------------------------ r95 | chris | 2005-03-13 14:31:48 +0000 (Sun, 13 Mar 2005) | 2 lines Got the water box energy test working again, but while the energy is correct, the time to calculate has gone up to 5.5s! I think that I will need to inline a load of functions again... ------------------------------------------------------------------------ r94 | chris | 2005-03-13 13:54:31 +0000 (Sun, 13 Mar 2005) | 2 lines Correcting another filename typo! ------------------------------------------------------------------------ r93 | chris | 2005-03-13 13:52:48 +0000 (Sun, 13 Mar 2005) | 2 lines Working of forcefield module... Had to rename ForceField class to FFBase to prevent name clash ------------------------------------------------------------------------ r92 | chris | 2005-03-13 13:39:04 +0000 (Sun, 13 Mar 2005) | 2 lines Now updating forcefield module to new namespace conventions ------------------------------------------------------------------------ r91 | chris | 2005-03-13 12:57:42 +0000 (Sun, 13 Mar 2005) | 3 lines Finished porting across the volume classes to the new namespace. Still need to wrap it up though... ------------------------------------------------------------------------ r90 | chris | 2005-03-13 12:41:20 +0000 (Sun, 13 Mar 2005) | 2 lines Fixing a typo in the filename! ------------------------------------------------------------------------ r89 | chris | 2005-03-13 12:40:57 +0000 (Sun, 13 Mar 2005) | 2 lines In the process of renaming and arranging the 'volume' module ------------------------------------------------------------------------ r88 | chris | 2005-03-13 12:38:00 +0000 (Sun, 13 Mar 2005) | 3 lines Update IO classes to use new names and namespaces. Also got rid of the MoleculeIO class as this was redundant! ------------------------------------------------------------------------ r87 | chris | 2005-03-13 11:27:57 +0000 (Sun, 13 Mar 2005) | 3 lines Continuing to set up the files... ------------------------------------------------------------------------ r86 | chris | 2005-03-13 11:25:08 +0000 (Sun, 13 Mar 2005) | 3 lines Renamed a lot of the 'io' classes. ------------------------------------------------------------------------ r85 | chris | 2005-03-13 11:22:29 +0000 (Sun, 13 Mar 2005) | 2 lines Moved 'protoms3-gui' to 'gui' ------------------------------------------------------------------------ r84 | chris | 2005-03-13 11:19:23 +0000 (Sun, 13 Mar 2005) | 2 lines Working now on adding the volume and io modules. Code is now broken again! ------------------------------------------------------------------------ r83 | chris | 2005-03-12 23:03:58 +0000 (Sat, 12 Mar 2005) | 2 lines Fixed test.py script and had a go at generating the doxygen source docs... ------------------------------------------------------------------------ r82 | chris | 2005-03-12 22:53:57 +0000 (Sat, 12 Mar 2005) | 2 lines Capitalising the names of the python modules to match the C++ namespaces... ------------------------------------------------------------------------ r81 | chris | 2005-03-12 22:52:22 +0000 (Sat, 12 Mar 2005) | 3 lines Modified all of the code so that it uses C++ namespaces. This clean a lot of things up! Also removed all explicit inline functions. The compiler should be clever enough to be able to inline the functions that were explicitly inlined, and this makes the header files look a lot cleaner. I still need to test whether or not the functions have actually been implicitly inlined... ------------------------------------------------------------------------ r80 | chris | 2005-03-12 18:02:36 +0000 (Sat, 12 Mar 2005) | 3 lines Finally got it working. All C++ code must now be linked to the ProtoMS3 executable, with each C++ library having associated with a Python module with a related name (e.g. core library has associated python C++ module _core, which is wrapped up with other python functions to form the 'core' python module. ------------------------------------------------------------------------ r79 | chris | 2005-03-12 17:48:48 +0000 (Sat, 12 Mar 2005) | 2 lines Nearly there - this is quite complex! ------------------------------------------------------------------------ r78 | chris | 2005-03-12 17:28:43 +0000 (Sat, 12 Mar 2005) | 3 lines Realised that the current method won't work (mixing python and C++ linking of libraries). I am thus going to have to redo it all as C++ libraries (so that the modules can use each other's code and form hierarchies). ------------------------------------------------------------------------ r77 | chris | 2005-03-12 17:07:51 +0000 (Sat, 12 Mar 2005) | 3 lines Fixed bug in core module that was causing a crash. I forgot to add a function to initialise the core library upon loading! Am now beginning to add a test library that can provide all of the tools and code needed to test ProtoMS ------------------------------------------------------------------------ r76 | chris | 2005-03-11 22:52:52 +0000 (Fri, 11 Mar 2005) | 3 lines Working on tidying up the Python modules, and ensuring that they load up correctly. Got nice printing of their loading to the debug stream. ------------------------------------------------------------------------ r75 | chris | 2005-03-11 22:05:09 +0000 (Fri, 11 Mar 2005) | 3 lines Got working linking of dynamic core library! ------------------------------------------------------------------------ r74 | chris | 2005-03-11 22:00:21 +0000 (Fri, 11 Mar 2005) | 3 lines Got a working dynamically linked python module, though have had to cheat a little with the build process! ------------------------------------------------------------------------ r73 | chris | 2005-03-11 10:43:30 +0000 (Fri, 11 Mar 2005) | 3 lines Now working on building the core module. ------------------------------------------------------------------------ r72 | chris | 2005-03-11 08:50:00 +0000 (Fri, 11 Mar 2005) | 2 lines Just removing moc files from the svn status listing ------------------------------------------------------------------------ r71 | chris | 2005-03-11 08:47:55 +0000 (Fri, 11 Mar 2005) | 2 lines Got the protoms3 program working! ------------------------------------------------------------------------ r70 | chris | 2005-03-11 08:41:23 +0000 (Fri, 11 Mar 2005) | 3 lines Still working on rearranging the directories. I have started by trying to get the protoms3 program sorted out and running... ------------------------------------------------------------------------ r69 | chris | 2005-03-11 08:23:23 +0000 (Fri, 11 Mar 2005) | 3 lines Lots more reorganisation! Have decided to have a full featured protoms3 program that acts as the server and has all of the boiler-plate functionality. This removes a lot of things from core that should not really be there. Note that the code is *so* broken! ------------------------------------------------------------------------ r68 | chris | 2005-03-11 08:01:21 +0000 (Fri, 11 Mar 2005) | 3 lines Begun the directory rearrangment. Splitting the code up into a series of modules. Everything will be very broken for a little bit... ------------------------------------------------------------------------ r67 | chris | 2005-03-11 07:50:33 +0000 (Fri, 11 Mar 2005) | 2 lines Creating a tag that corresponds to a version of ProtoMS3 that has the correct calculation of the energy of a box of 1679 water molecules in a time that is 40% quicker than ProtoMS2 ------------------------------------------------------------------------ r66 | chris | 2005-03-11 07:48:25 +0000 (Fri, 11 Mar 2005) | 2 lines About to reorganise directory structure to make proper python packages and to better use C++ namespaces ------------------------------------------------------------------------ r65 | chris | 2005-03-10 09:16:05 +0000 (Thu, 10 Mar 2005) | 3 lines Used temporary arrays in the combineParameters function and have reduced the time needed to calculate the energy to 2450ms! ------------------------------------------------------------------------ r64 | chris | 2005-03-10 08:53:41 +0000 (Thu, 10 Mar 2005) | 8 lines Got agreement between energies of 1679 water box in ProtoMS2 and ProtoMS3. 0.INFO Energy = -14468.1, time = 3079 ms 0.INFO Energy = -14468.1, time = 3053 ms This compares to -14468.37 in ProtoMS2, which took on average 4.1 seconds to calculate! ------------------------------------------------------------------------ r63 | chris | 2005-03-09 09:11:39 +0000 (Wed, 09 Mar 2005) | 3 lines Continuing work on the generic MM forcefield. The code is currently broken. ------------------------------------------------------------------------ r62 | chris | 2005-03-08 22:10:57 +0000 (Tue, 08 Mar 2005) | 3 lines Since the energy evaluation seems to be efficient I am now working on the implementation of the generic molecular mechanics forcefield. I have written a CLJParameter class to hold CLJ parameters, and have begun work on an MMParameterDB class that can read and store MM parameters (from ProtoMS2 style input files). ------------------------------------------------------------------------ r61 | chris | 2005-03-08 09:36:17 +0000 (Tue, 08 Mar 2005) | 3 lines Got rudimentary calculation of the energy (wrong energy, but right form of the calculation). This performs the calculation of the total interaction of 1679 TIP4P waters in 1800ms, compared to around 4s for ProtoMS2! Probably not a real result though... ------------------------------------------------------------------------ r60 | chris | 2005-03-07 09:00:13 +0000 (Mon, 07 Mar 2005) | 3 lines Continuing to work on the ForceField class. The code is still broken. ------------------------------------------------------------------------ r59 | chris | 2005-03-06 18:22:10 +0000 (Sun, 06 Mar 2005) | 3 lines Beginning work on core ForceField class. The code is currently broken... ------------------------------------------------------------------------ r58 | chris | 2005-03-05 18:44:56 +0000 (Sat, 05 Mar 2005) | 2 lines Wrapped up SimVolume, and am now performing some timings of the intermolecular distance evaluations. Get 1910 atom mol with 1900 atom mol distances in 270ms, fastinv distances in 190ns and distances squared in 95ns ------------------------------------------------------------------------ r57 | chris | 2005-03-05 14:15:52 +0000 (Sat, 05 Mar 2005) | 4 lines Changed CutGroupRegistry and StreamManager/TxtStream to use smart_ptrs/weak_ptrs. Also updated PairMatrix so that it can be quickly redimensioned at any point during its use. ------------------------------------------------------------------------ r56 | chris | 2005-03-04 08:53:56 +0000 (Fri, 04 Mar 2005) | 3 lines Adding framework to set the SimVolume of a SimSystem, and have wrapped up a PairMatrix for Python. ------------------------------------------------------------------------ r55 | chris | 2005-03-03 09:07:42 +0000 (Thu, 03 Mar 2005) | 3 lines Written a PairMatrix class to allow rapid access to pre-calculated pair-pair distances (or other pair-pair information) and have begun the infinite cartesian volume class. ------------------------------------------------------------------------ r54 | chris | 2005-03-02 09:19:10 +0000 (Wed, 02 Mar 2005) | 3 lines Added an AABox (axis-aligned bounding box) class that can be used to improve the efficiency of the intermolecular distance calculation. Beginning to think about how to work with different boundary conditions (derived from SimVolume), and have also fixed a bug in PDB reader (QTextStream does not read the last line of the file properly) and moved ostream<< functions to class header/cpp files. ------------------------------------------------------------------------ r53 | chris | 2005-03-01 20:25:19 +0000 (Tue, 01 Mar 2005) | 2 lines Fixed a small bug in PtrHandle::isValid (it was returning false when it meant true!) ------------------------------------------------------------------------ r52 | chris | 2005-03-01 20:21:58 +0000 (Tue, 01 Mar 2005) | 2 lines Got passing of handles to SimSystem working, and nice shared_ptr/weak_ptr co-operation as well in the PtrHandle class. ------------------------------------------------------------------------ r51 | chris | 2005-03-01 19:17:25 +0000 (Tue, 01 Mar 2005) | 2 lines Small implementation and optimisation of CutGroupList. Adding 1679 CutGroups is now quite quick! ------------------------------------------------------------------------ r50 | chris | 2005-03-01 09:10:29 +0000 (Tue, 01 Mar 2005) | 2 lines Created a template form of PtrHandle, and have wrapped up SimSystem for Python. Seems to work quite well! ------------------------------------------------------------------------ r49 | chris | 2005-02-28 21:32:25 +0000 (Mon, 28 Feb 2005) | 3 lines Working on SimSystem. Trying to build a 'handle' class, that is automatically set to null when the held object is deleted. Probably should turn this into a template class. Also added the element names (for 109 elements!) to the ElementDB! ------------------------------------------------------------------------ r48 | chris | 2005-02-28 09:13:08 +0000 (Mon, 28 Feb 2005) | 3 lines Begun work on the SimSystem class. Broken code! ------------------------------------------------------------------------ r47 | chris | 2005-02-27 22:51:55 +0000 (Sun, 27 Feb 2005) | 2 lines Updated StreamManager so that it is much easier to add new streams (now QString based) and have wrapped up all of the stream functions for python. ------------------------------------------------------------------------ r46 | chris | 2005-02-27 15:49:16 +0000 (Sun, 27 Feb 2005) | 2 lines Wrapped up the AtomArray class, fixed a small bug in PDB reader and have got quite nice python control of reading files! ------------------------------------------------------------------------ r45 | chris | 2005-02-27 14:33:33 +0000 (Sun, 27 Feb 2005) | 2 lines Created Element class to hold ElementData pointers, thus allowing Atom (and other) classes to pass Elements by value, rather than ElementData by pointer! Fixed a bug in the EditMol index by atom number, and have updated all code to use Element (and have wrapped Element as well). ------------------------------------------------------------------------ r44 | chris | 2005-02-26 23:09:56 +0000 (Sat, 26 Feb 2005) | 3 lines Written thin shared_ptr wrappers of most classes now, and have written python interface based on these thin wrappers. ------------------------------------------------------------------------ r43 | chris | 2005-02-25 23:30:02 +0000 (Fri, 25 Feb 2005) | 2 lines Updated AtomList to use shared pointer to array, and updated CutGroup so that CutGroupPtr registers CutGroup to registry, preventing two different CutGroupPtrs trying to own the same CutGroup! ------------------------------------------------------------------------ r42 | chris | 2005-02-25 09:17:35 +0000 (Fri, 25 Feb 2005) | 3 lines Switched CutGroup (and list and registry) over to using shared pointers to CutGroups. Still need to sort out AtomArrays though... ------------------------------------------------------------------------ r41 | chris | 2005-02-24 22:47:10 +0000 (Thu, 24 Feb 2005) | 3 lines Added a PDB reader class (that works!) and am in the process of switching CutGroup/List over to using boost::shared_ptr. This should allow better passing of CutGroups between functions / python / C++, as it does reference counting. However, it is not thread safe? ------------------------------------------------------------------------ r40 | chris | 2005-02-24 21:36:06 +0000 (Thu, 24 Feb 2005) | 2 lines Fixed bug in elementdata references in Atoms... ------------------------------------------------------------------------ r39 | chris | 2005-02-23 22:13:04 +0000 (Wed, 23 Feb 2005) | 3 lines Written initial conversion of EditMol to CutGroup, though there appears to be a bug in copying the element data. ------------------------------------------------------------------------ r38 | chris | 2005-02-22 22:33:13 +0000 (Tue, 22 Feb 2005) | 3 lines Begun work on an EditMol/EditRes framework that enables the IO functions to work with EditMols, rather than directly with CutGroups. ------------------------------------------------------------------------ r37 | chris | 2005-02-22 10:09:08 +0000 (Tue, 22 Feb 2005) | 3 lines Have got python string to QString implicit conversion working, have wrapped up a quit function, debugged Vector::fromString and have wrapped up the printLine functions. ------------------------------------------------------------------------ r36 | chris | 2005-02-21 08:16:16 +0000 (Mon, 21 Feb 2005) | 3 lines Got 'str(self)' working for wrapped python classes! Can now finally print a QString! ------------------------------------------------------------------------ r35 | chris | 2005-02-20 21:40:24 +0000 (Sun, 20 Feb 2005) | 3 lines Got a working element database that can get or guess the element data while reading a coordinate file. ------------------------------------------------------------------------ r34 | chris | 2005-02-20 19:41:19 +0000 (Sun, 20 Feb 2005) | 2 lines Changed AtomList to AtomArray. Code now works again! ------------------------------------------------------------------------ r33 | chris | 2005-02-20 19:29:47 +0000 (Sun, 20 Feb 2005) | 2 lines Beginning rename of AtomList to AtomArray. Broken code! ------------------------------------------------------------------------ r32 | chris | 2005-02-20 19:29:06 +0000 (Sun, 20 Feb 2005) | 3 lines Working on .mct file loading class. This code is currently broken. ------------------------------------------------------------------------ r31 | chris | 2005-02-20 14:12:13 +0000 (Sun, 20 Feb 2005) | 3 lines Now working on a new file format parser... ------------------------------------------------------------------------ r30 | chris | 2005-02-20 13:22:29 +0000 (Sun, 20 Feb 2005) | 2 lines Got working streaming output! ------------------------------------------------------------------------ r29 | chris | 2005-02-19 23:38:11 +0000 (Sat, 19 Feb 2005) | 3 lines Working on streamed printing and thinking about the format used to read in a molecule/group of molecules. ------------------------------------------------------------------------ r28 | chris | 2005-02-18 20:58:25 +0000 (Fri, 18 Feb 2005) | 3 lines Have changed AtomList (again!) so that now it is implemented as a simple array, and everything is based on direct references. Hopefully this should be something that the compiler can turn into quick code. ------------------------------------------------------------------------ r27 | chris | 2005-02-16 21:55:44 +0000 (Wed, 16 Feb 2005) | 3 lines Redesigned parts of the system so that AtomLists now hold pointers to atoms, and thus only one copy of the coordinates is required for a ChainMol/Res. Also created a template registry class and have tried to clean up the deep copying semantics. ------------------------------------------------------------------------ r26 | chris | 2005-02-15 22:10:42 +0000 (Tue, 15 Feb 2005) | 3 lines Have started the wrapping of a CutGroupList. Things are working quite well now! There are a few little bugs but I am definitely calling python code from with C++! ------------------------------------------------------------------------ r25 | chris | 2005-02-15 21:00:19 +0000 (Tue, 15 Feb 2005) | 2 lines Got working virtual inheritance working! Can override a C++ function with a Python function! ------------------------------------------------------------------------ r24 | chris | 2005-02-14 21:59:33 +0000 (Mon, 14 Feb 2005) | 3 lines Added a class to keep a registry of all CutGroups, have finished most of the CutGroupList and have started wrapping a CutGroup. ------------------------------------------------------------------------ r23 | chris | 2005-02-13 21:35:57 +0000 (Sun, 13 Feb 2005) | 3 lines Worked on the CutGroupList to add all of the features that should be necessary. ------------------------------------------------------------------------ r22 | chris | 2005-02-13 16:04:49 +0000 (Sun, 13 Feb 2005) | 3 lines Working on creating a list of CutGroups, and beginnings of IO class for CutGroups. ------------------------------------------------------------------------ r21 | chris | 2005-02-13 14:48:23 +0000 (Sun, 13 Feb 2005) | 3 lines Successfully wrapped some classes, and now begun work of the molecular data structures. ------------------------------------------------------------------------ r20 | chris | 2005-02-11 09:38:38 +0000 (Fri, 11 Feb 2005) | 3 lines Added the ability for the PythonError class to generate a traceback! ------------------------------------------------------------------------ r19 | chris | 2005-02-10 22:47:20 +0000 (Thu, 10 Feb 2005) | 3 lines Got server parsing a complete python script from a file. Cleaned up PythonScript so that it works better, and also so that it can print out more informative debugging information. Cleaned up PythonError so that it takes a copy of the exception information and then returns the exception to python for printing. ------------------------------------------------------------------------ r18 | chris | 2005-02-10 10:12:03 +0000 (Thu, 10 Feb 2005) | 3 lines Looking at how to get C++ types from python types. Written a few convienience functions and playing around with python exceptions. ------------------------------------------------------------------------ r17 | chris | 2005-02-09 19:11:11 +0000 (Wed, 09 Feb 2005) | 3 lines Replace StringQueue with PythonScript and PythonError, classes that handle the representation of python scripts as sequences of blocks themselves (rather than having a basic StringQueue and leaving it up to the Parser to do everything!) ------------------------------------------------------------------------ r16 | chris | 2005-02-09 09:46:26 +0000 (Wed, 09 Feb 2005) | 3 lines Have redesigned the server and parser to use the new Qt4 features (each now has its own event loop and works via signals/slots). This has allowed easy implementation of new features, such as the ability to pause the parser. ------------------------------------------------------------------------ r15 | chris | 2005-02-08 22:24:19 +0000 (Tue, 08 Feb 2005) | 3 lines Finished porting to Qt4. The server seems to work again. I will need to change some of the design to take advantage of the new Qt4 features (especially thread-safe signals!) ------------------------------------------------------------------------ r14 | chris | 2005-02-08 10:47:31 +0000 (Tue, 08 Feb 2005) | 2 lines Added a file to source to allow the use of Qt4 ------------------------------------------------------------------------ r13 | chris | 2005-02-08 10:13:18 +0000 (Tue, 08 Feb 2005) | 3 lines Beginning the process of porting the code from Qt3 to Qt4. The code is currently very broken (but it is better to get this out of the way now rather than in 6 months time!) ------------------------------------------------------------------------ r12 | chris | 2005-02-07 21:02:16 +0000 (Mon, 07 Feb 2005) | 3 lines Added geometry code originally written for Ataqua, and moved wrapping of classes into their .cpp files. Have successfully wrapped Vector and MD5Sum. ------------------------------------------------------------------------ r11 | chris | 2005-02-07 19:36:31 +0000 (Mon, 07 Feb 2005) | 3 lines Actually made protoms3-gui into a gui! ------------------------------------------------------------------------ r10 | chris | 2005-02-07 09:40:10 +0000 (Mon, 07 Feb 2005) | 3 lines Created a basic client that can successfully connect to the server. Have also added a class to handle command line options. ------------------------------------------------------------------------ r9 | chris | 2005-02-06 22:42:28 +0000 (Sun, 06 Feb 2005) | 3 lines Have now got a working server that can execute Python! ------------------------------------------------------------------------ r8 | chris | 2005-02-06 21:19:23 +0000 (Sun, 06 Feb 2005) | 3 lines Have a working network server! ------------------------------------------------------------------------ r7 | chris | 2005-02-06 20:27:58 +0000 (Sun, 06 Feb 2005) | 3 lines Begun work on the network server used to separate the simulation program from the GUI. ------------------------------------------------------------------------ r6 | chris | 2005-02-06 18:21:50 +0000 (Sun, 06 Feb 2005) | 2 lines Added ideas files so that they are part of the repository ------------------------------------------------------------------------ r5 | chris | 2005-02-06 18:20:57 +0000 (Sun, 06 Feb 2005) | 2 lines Probably now have a working Python interpretor in a thread. ------------------------------------------------------------------------ r4 | chris | 2005-02-05 21:24:56 +0000 (Sat, 05 Feb 2005) | 3 lines Beginning to add some code. Nothing works yet though. ------------------------------------------------------------------------ r3 | chris | 2005-02-05 20:06:12 +0000 (Sat, 05 Feb 2005) | 2 lines Set the ignore property for this directory (svn propedit svn:ignore .) ------------------------------------------------------------------------ r2 | chris | 2005-02-05 19:56:02 +0000 (Sat, 05 Feb 2005) | 2 lines Creating kdevelop project... ------------------------------------------------------------------------ r1 | chris | 2005-02-05 19:51:51 +0000 (Sat, 05 Feb 2005) | 3 lines Initial creation of ProtoMS 3.0 repository ------------------------------------------------------------------------