From d437ba346010c12f6d1e579bf753eceb226a98df Mon Sep 17 00:00:00 2001 From: "N.N" Date: Fri, 5 Jan 2007 00:08:25 +0000 Subject: bye. (see you in DesireData) svn path=/trunk/externals/pureunity/; revision=7193 --- COPYING | 340 ---------------------------------- ChangeLog | 20 -- Makefile | 18 -- README | 594 ------------------------------------------------------------ TODO | 13 -- main.pd | 89 --------- pureunity.c | 64 ------- 7 files changed, 1138 deletions(-) delete mode 100644 COPYING delete mode 100644 ChangeLog delete mode 100644 Makefile delete mode 100644 README delete mode 100644 TODO delete mode 100644 main.pd delete mode 100644 pureunity.c diff --git a/COPYING b/COPYING deleted file mode 100644 index eeb586b..0000000 --- a/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 8fcebd6..0000000 --- a/ChangeLog +++ /dev/null @@ -1,20 +0,0 @@ -$Id: ChangeLog,v 1.1 2006-01-09 05:04:19 matju Exp $ - -version 0.1 (2006.01.??): - * - -version 0.0 (2006.01.06): - * LICENSE is GPL - * doc is in README - * new object classes: - * [commutator], [commutative-test] - * [associator], [associative-test] - * [invertor], [invertible-test] - * [distributor], [distributive-test] - * [trichotomy-test], ... - * [twice], [3times], [4times], [^] - * [tree], [protocols-tree] - * [rtimer] - * for $1 in f,~ and some of #: - [$1.norm], [$1.taa], [$1.do], [$1.packunpack3], [$1.swap] - [$1.inlet], [$1.outlet] diff --git a/Makefile b/Makefile deleted file mode 100644 index 8383862..0000000 --- a/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# if you don't want the standard pd, set the PD-variable before doing "make" -# e.g. "PD=/home/matju/pd_devel_0_39_und/bin/pd make" -PD ?= pd -PDFLAGS = -lib pureunity -noaudio -path generics -path specifics -PDFLAGS += -lib gridflow -CFLAGS = -Wall - -test:: built - $(PD) $(PDFLAGS) main.pd - -built: Makefile pureunity.pd_linux - echo > built - -generic/%~.pd: generic/%.pd - -pureunity.pd_linux: pureunity.c Makefile - $(CC) $(CFLAGS) -shared -o pureunity.pd_linux pureunity.c - diff --git a/README b/README deleted file mode 100644 index 930c0a7..0000000 --- a/README +++ /dev/null @@ -1,594 +0,0 @@ -$Id: README,v 1.3 2007-01-03 00:44:28 matju Exp $ - -PureUnity - -Copyright 2006 by Mathieu Bouchard - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -See file ./COPYING for further informations on licensing terms. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -+-+-+--+---+-----+--------+-------------+---------------------+ -GOALS - - 1. To provide a unit-test framework, which also provide benchmarking - features, all made in Pd for use in Pd. - - 2. To provide tests for functionality in internals, externals, abstractions, - etc., in a modularized way, in a DRY/OAOO fashion, thus abstracting out - common features so that many objects share the same test patch for the - features that they have in common. - -+-+-+--+---+-----+--------+-------------+---------------------+ -REQUIREMENTS - - 1. Pd 0.39 (PureMSP or Devel) - -+-+-+--+---+-----+--------+-------------+---------------------+ -TEST PROTOCOL - - new: - create common (reusable) fixtures. - - inlet 0: - bang: - run all available tests in that class. individual tests don't have - to be available through individual methods but may. If they do, the - names of the methods must match those given in the test results. - - each test should build its own non-reusable fixtures and reinitialize - common fixtures, not assuming that the previous tests have left the - common fixtures in a normal state. - - outlet 0: - test results. a sequence of lists like: - list $passed? $accuracy $elapsed $name1 ... - - where: - $passed? is either 0 for failure or 1 for success - $accuracy is a float proportional to relative error on math - (if not applicable, use 0) - $elapsed is a nonnegative float, the time elapsed in milliseconds - or it is any negative float meaning the time hasn't been measured. - $name1 and the rest are symbols and/or floats identifying the test - - for example: - list 1 0 -1 commutative f + * - - Which means that the 1st test about commutativity passed ($2=1) because it - was perfectly accurate ($3==0) and that we didn't measure the time ($4=-). - -+-+-+--+---+-----+--------+-------------+---------------------+ -SEVERITIES (in decreasing order) - - * crash: Segmentation Fault, Bus Error, Illegal Instruction, Infinite Loop, - etc. You can't deal with those errors at the level of the tests. Maybe there - should be a way to tell a test object to skip certain tests, by name, in - order to be able to perform as many tests as possible while waiting for a - fix. It could become possible to rescue from some of those crashes if Pd - supported exceptions (stack-unwinding). - - * corruption: this may cause future crashes and failures on innocent - objects/features. I have no solution for this except to be careful. - - * post(),error(),pd_error(): Gets printed in the console. The problem is that - those can't be handled by the test objects, so someone has to read them and - interpret them. Also they prevent test objects to ensure that error - conditions produce error messages. - - * pd_error2(): I wish this would exist. It would be sort of like pd_error() - but it would produce a pd message instead, whose selector would be an - error code, designed to be both localizable and [route]able. By default, that - message would be sent to the console, but there would be an internal class - designed to catch those messages. (If stack-unwinding were possible, it would - be disabled by default on pd_error2 and could be enabled explicitly - by-selector). - - * failure: a test object reports a problem through outlet 0. - - * dropout: a failure in realtimeness... difficult for an object to detect. - - * inaccuracy: a test more or less succeeds but the test detected that the - epsilon sucks. - -+-+-+--+---+-----+--------+-------------+---------------------+ -PROTOCOL FOR [error] - -new: - optional argument which would either be a float - (e.g. the $0 of the enclosing abstraction) or a pointer. - -inlet 0: - set $scapegoat: - replaces the originator of the message by $scapegoat, which can be a - float or a pointer - - error $1 ...: - causes its arguments to be concatenated, space-separated (may include - floats), and then sent through pd_error using the appropriate - originator (scapegoat). - - list $1 ...: - for future use. would use pd_error2() (see README or previous mail). - $1 has to be a symbol. - -+-+-+--+---+-----+--------+-------------+---------------------+ -ACCURACY AND ERROR (in math-related unit tests) - -The "absolute error" between a practical result and the expected value -is considered to be the distance between the two value. That is the -absolute value of the difference. - -In the case of positions in 2D, 3D, etc., use the L2-Norm which is -a generalized Pythagoras' Theorem: dist^2 = x^2 + y^2 + z^2 + ... -A norm is a distance between something and zero. - -Sometimes you have several practical results for one expected value -and must extract a single absolute error out of that. Then you should pick -the largest of the individual absolute errors. - -Sometimes you don't have an expected value, you just have several -practical results that you expect to be quite the same. In that case, -the absolute error is the "diameter" of those results. The meaning -of diameter here is: the largest distance between any two results. - -If in a single test you must compare 2D errors with 3D errors and 1D -errors, etc., you may have to adjust them by dividing the error by -the square root of N (N is the number of dimensions). In that case, -the resulting value is called a RMS (Root-Mean-Square). - -The maximum error introduced by just representing a number as a float -(instead of an exact value) is at most proportional to the magnitude -of the number (e.g. usually 16 million times smaller: about 6 decimals). -Also, often we are only interested in relative error, which is absolute -error divided by the norm of the expected result, because small absolute -errors don't matter much with large results. This is the reason floats -exist in the first place. By default, use relative error as the $accuracy -in Pd tests. - -If you don't have an expected result, then compute the relative error as -being the absolute error divided by the norm of the average of practical -results. - -In the RMS case of relative error, the norms of expected results should also -be adjusted, but both adjustments cancel because they get divided by each -other. That means: don't divide by the sqrt(N) at all and you'll get an -appropriate result. - -+-+-+--+---+-----+--------+-------------+---------------------+ -TYPE PREFIXES - -Those have to be prefixes in order to be honored by DOLLSYM: -[$1norm] should expand to [fnorm], [lfnorm], [#norm], etc. - -Those prefixes are necessary in order to achieve polymorphism through -abstraction arguments. - -CURRENT: - f float - ~ signal - -FUTURE (from PureData): - s symbol - p gpointer - a anything - l list (of whatever) - lf list of floats - ls list of symbols - lp list of pointers - -FUTURE (from DesireData): - t stringpointer - L listpointer - v varpointer (instance symbol) - -FUTURE (from GridFlow): - # grid (of whatever) - #b grid of bytes (uint8) - #s grid of shorts (int16) - #i grid of ints (int32) - #l grid of longs (int64) - #f grid of floats (float32) - #d grid of doubles (float64) - #r grid of rubies (VALUE*) - -for a type prefix to be considered implemented, it has to -have the following class set: - - metaabstraction for floats for signals for grids - [$1.inlet] [inlet] [inlet~] [inlet] - [$1.outlet] [outlet] [outlet~] [outlet] - [$1.do $2 $3] [$2 $3] [$2~ $3] [# $2 $3] - [$1.taa] [t a a] noop [t a a] - [$1.swap] [swap] noop TODO - [$1.norm] [abs] [env~] [# sq]->[#ravel]->[#fold +]->[#export]->[sqrt] - [$1.packunpack3] pack,unpack noop TODO - -The first two cannot be implemented as abstractions and instead must be -defined as aliases in pureunity.c. - -extra metaabstractions: - [$1.rand] [f.rand] [~.rand]TODO [#.rand]TODO - -+-+-+--+---+-----+--------+-------------+---------------------+ -OTHER PROTOCOLS - -Those four classes are operators that give verify algebraic properties -of other operators. The more their outputs are close to zero, the more -those other operators are faithful to an algebraic property. - -(here, supported $types are f and ~) - -[commutator $type $class] (2 inlets) ab-ba -[associator $type $class] (2 inlets) (ab)c-a(bc) -[distributor $type $class1 $class2] (3 inlets) a&(b^c)-(a&b^a&c) -[invertor $type $class1 $class2] (2 inlets) ab/b-a - -+-+-+--+---+-----+--------+-------------+---------------------+ -TESTS AND RULES - -For each class, a test file's name is the class name followed by "-test.pd", -and a rule file's name is the class name followed by "-rule.pd", -in the same way as it is for help files. - -for a class called $foo, the protocol (aka interface aka rule) $foo is the -set of behaviours expected from the $foo class; the class called $foo-rule -must repect the $foo protocol as well, plus it should test that the inputs -are valid, and if they are, it should test for one or several results and -report any errors. - -(((To report errors and inaccuracies, output them through the properties outlet at the right. If there is no -properties outlet in $foo (curently almost nothing in Pd has one), -then $foo-rule must have one more outlet than $foo.))) - -(((Float messages coming out of the properties outlet of $foo-rule report -accuracy. Named error messages come out with selector "error" followed by -an error-symbol and then its arguments.))) - -(((In the case of true/false logic, a value of 0 means that a test has passed -and a 1 means that a test has failed. Those values represent failure and not -success. The reason is so that it matches with accuracy levels, where 0 is -perfectly accurate, but any inaccuracy shows up as a relative error fraction. -Any finite nonnegative value is allowed for accuracy, because it is expected -to be the result of a norm))). - -(((In standard math, "Discrete Metric" is when there are only two possible -distances between objects: together=0 and apart=1))) - -+-+-+--+---+-----+--------+-------------+---------------------+ -RANDOMIZERS (?) - -+-+-+--+---+-----+--------+-------------+---------------------+ -ETC - - -(write me!) - - - - -If +-test.pd tests [+], it can test for hotness, coldness, it can test -that only one result is produced per hot message, that all results are -float, that a few example additions work, and that with random inputs it -respects commutativity, associativity, invertibility, within appropriate -relative-error bounds, etc. - -However +-test.pd can't test that errormessages aren't printed during the -testing. This may be something that we want to check for, and currently -the best way to handle it is to search the console for error messages, and -if there are any, restart the tests in verbose mode and see where the -error happens exactly. - -[...] - -Floating-point is the scientific notation for numbers that we all -learned on paper in school. Rounding and inaccuracy are two sides -of the same coin. They are required when it is stupid to have perfect -results, that is, when it would mean too many computations for little -gain. - -However sometimes we want to make sure that our math is accurate enough. -Many algorithms are data-recursive: each computation uses previous -results. Many of those algorithms have chaotic and/or unstable -behaviours, which means that the inaccuracies may skyrocket instead of -fading out. - -+-+-+--+---+-----+--------+-------------+---------------------+ - -Date: Fri, 13 Jan 2006 04:07:59 +0900 -From: Mathieu Bouchard -Reply-To: ruby-core@ruby-lang.org -To: ruby-core@ruby-lang.org -Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings) - -On Fri, 13 Jan 2006, mathew wrote: - -> *Dean Wampler * writes: -> > Let me suggest an XP-style alternative; make thorough unit tests -> > required and make sure they "document" - and test! - the design -> > "contract". -> Unit tests are not an alternative. They are an additional requirement. - -I find unit-tests to be often decomposable like this. Start with something -like this: - - raise if Blah.new(666) != Blah.new(666) - raise if Blah.new(747) != Blah.new(747) - raise if Blah.new(242) != Blah.new(242) - raise if Blah.new(69) != Blah.new(69) - raise if Blah.new(37) != Blah.new(37) - -then generalize it ("equality is defined based on the arg of .new"): - - for x in [666,747,242,69,37] do - raise if Blah.new(x) != Blah.new(x) - end - -then extract a contract from it: - - class CheckedBlah < Blah - def self.new(x) - r = super(x) - raise if r != super(x) - r - end - end - -so now all Blah object creation may be checked throughout actual uses of a -program and not just unit tests. The unit test now reduces to: - - for x in [666,747,242,69,37] do Blah.new(x) end - -so for many unit tests, all you have to do is just do things and discard -the results, and the contract will do the job of checking. - - _ _ __ ___ _____ ________ _____________ _____________________ ... -| Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju -| Freelance Digital Arts Engineer, Montréal QC Canada - -+-+-+--+---+-----+--------+-------------+---------------------+ - -Date: Fri, 13 Jan 2006 05:05:19 +0900 -From: Mathieu Bouchard -Reply-To: ruby-core@ruby-lang.org -To: ruby-core@ruby-lang.org -Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings) - -On Fri, 13 Jan 2006, mathew wrote: - -> For example, consider a simple vector addition routine in a 3D library. -> The unit tests might test its behavior with Float and Integer vectors, -> since that's why it was written. - -Here's another way to factor unit-tests that I haven't mentioned in the -last mail. - -suppose you test for + using: - - class IntegerTest - def test; 2+2==4 or raise; end - end - class FloatTest - def test; 2.0+2.0==4.0 or raise; end - end - class RationalTest - def test; Rational(2,1)+Rational(2,1)==Rational(4,1) or raise; end - end - -you can refactor those tests like this: - - class NumericTest - def initialize nt; @nt; end - def make x; raise "abstract class" end - def test; make(2)+make(2)==make(4) or raise; end - end - class IntegerTest; def make x; Integer(x) end end - class FloatTest; def make x; Float(x) end end - class RationalTest; def make x; Rational(x,1) end end - -> However, to do that you need to know whether the feature of supporting -> (say) Complex vectors or BigDecimal vectors is intended or not. The unit -> tests won't tell you this. - -[...] - -> > One limitation of documentation is that it has no enforcement power, -> > so you have to write tests anyway to test conformance. -> Unit tests have no enforcement power either, because you can just change the -> test. Indeed, I've already had to do this once when it turned out that the -> unit test was wrong. (In net/ftp.) - -That was a pretty bad case of strawman argument. Dean was assuming that -your documentation was not executable when you had quite clearly stated -that it was the contracts that acted as documentation! - -[...] - -+-+-+--+---+-----+--------+-------------+---------------------+ - -Date: Fri, 13 Jan 2006 07:36:36 +0900 -From: Mathieu Bouchard -Reply-To: ruby-core@ruby-lang.org -To: ruby-core@ruby-lang.org -Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings) - -On Fri, 13 Jan 2006, mathew wrote: - -> > The XP view is -> > that you should eliminate the redundancy. -> Except it's not redundancy. -> Unit tests define a set of functionality that is required. Documentation tells -> you the functionality that is supported, which is generally a superset of the -> functionality required by the unit tests. - -Let's follow the argument of both of you to the end. - -1. Unit-tests often match inputs with outputs on a case-by-case basis. - -2. Redundancy should be eliminated. - -(1) suggests that there is a shorter way to express the unit-tests. -Suppose you are able to find a formula for generating output-validators -from inputs. Then that formula is a postcondition of a contract, and the -explicit output-validators of the unit-tests are redundant. - -(2) because part of the unit-tests are redundant, part of the unit-tests -should be eliminated. This causes the postconditions to become an -essential part of unit-testing. - -Unit-tests vs contracts is a false debate. - - _ _ __ ___ _____ ________ _____________ _____________________ ... -| Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju -| Freelance Digital Arts Engineer, Montréal QC Canada - - -+-+-+--+---+-----+--------+-------------+---------------------+ -Date: Fri, 13 Jan 2006 17:19:41 +0900 -From: Mathieu Bouchard -Reply-To: ruby-core@ruby-lang.org -To: ruby-core@ruby-lang.org -Subject: Re: Design contracts and refactoring (was Re: mathn: ugly warnings) - -[...] - -In order to entrench the tests-as-documentation habit firmly in the Ruby -community, we need a catchy acronym. Like RTFUT = Read the Fabulous Unit -Tests! - -+-+-+--+---+-----+--------+-------------+---------------------+ -http://lists.puredata.info/pipermail/pd-dev/2006-01/005920.html -Date: Fri, 20 Jan 2006 23:52:22 -0500 (EST) -From: Mathieu Bouchard -To: pd-dev -Subject: macros and such (was: pd-lib, SIMD) - -[...] - -I think that the Pd source doesn't use nearly enough macros or other -code-reducing tricks. - -The reduction of code isn't so much about making things use less RAM: the -RAM excuse is quickly evaporating as even the tiniest computers come with -plenty of RAM and even the faster kinds of RAM come in ever more copious -amounts (big caches). - -The reduction of code is programmer-oriented. I'm not talking about length -of identifiers here (this is a separate issue). Every line of code should -do something interesting by itself. Code should read like a good story and -not like a car. Ever tried to read a car? It's boring. The same damn -piston copy-pasted 12 times. - -The reduction of code is also documentation-oriented. Once the programmer -has been contaminated with the wisdom required to make small code or -understand small code, then why wouldn't the programmer explain it to his -students in higher-level terms instead of chanting 12 times the same -piston as if it were a marathon of Hail-Marys ? - -This is why Pd needs a taxonomy of object classes. If I don't get that -taxonomy in Pd itself nor in its help files, at least I'll have it in its -unit tests. - -Once and only once. -Once and only once. -Once and only once. -Three strikes and you refactor. -for x in [1,2,3] say: Once and only once - -http://c2.com/cgi/wiki/?ThreeStrikesAndYouRefactor - -BTW I'm not talking about only inheritance of implementations. The most -important thing to me is inheritance of expectations, so that if I name -100 classes that obey the rule "Operator2", then you have just learned -something common about 100 classes. - -Operator2 means right-inlet is cold, left-inlet is hot, there is a "set" -method for using left-inlet as cold, there is a "bang" for explicitly -activating the main computation. The main computation only produces one -message. That's what "Operator2" means in my taxonomy, and it's that much -that hasn't to be stated explicitly in each help patch. - -Help patches can be abstractions to be used to by other help patches. Just -put a [operator2-help] object in your help patch to indicate that the -currently documented class obeys the standard operator2 rules. - -Who's against it? - -+-+-+--+---+-----+--------+-------------+---------------------+ -http://lists.puredata.info/pipermail/pd-list/2006-02/035169.html -Date: Sat Feb 4 21:22:29 CET 2006 -From: Mathieu Bouchard -To: pd-list - - * Previous message: [PD] dealing with arguments and inlets - * Next message: [PD] Re: [PD-announce] A new version of FFTease is now available for Pd - * Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] - -On Fri, 3 Feb 2006, Hans-Christoph Steiner wrote: - -> The way I have been thinking is that the first inlet is the general -> inlet, and it can accept many types of messages. Then the second inlet -> lines up with the first argument, the third inlet to the second -> argument, etc. - -I agree. Many objects obey the rule that the k'th inlet matches argument -$k for several arguments in a row, usually all of them. - -> I think this is pretty clean and flexible, and I think -> it would be nice to have some kind of standard for this. - -And the best way to make sure people are following a standard is to make -it so easy to follow that it's harder to not follow it than to follow it. -Of course I don't mean adding hurdles to doing it otherwise, but rather -make a shortcut for those who follow the standard. Short of this, people -who make abstractions/externals can get a friendly reminder, from someone -who cares, that it would be better if they followed the standard. - -> Obviously, it doesn't work for all objects, but I think it would be good to -> standardize on objects it does work for. - -PureUnity's goal (when I work on it) is to design a taxonomy that -separates objects that obey certain properties, from those that don't, -because that's a way to reuse tests, but also because certainly it doesn't -hurt documentation either, and it's even better if it can influence how -abstractions are made. - - _ _ __ ___ _____ ________ _____________ _____________________ ... -| Mathieu Bouchard - tél:+1.514.383.3801 - http://artengine.ca/matju -| Freelance Digital Arts Engineer, Montréal QC Canada - -+-+-+--+---+-----+--------+-------------+---------------------+ -From matju@artengine.ca on Dec 18, 2006 - -I thought up some kind of classification of type systems, avoiding to call -them strong/weak or static/dynamic because those words are confusing. - -1. Typed expressions: each piece of code that can give a value, has a -type that can be figured out at compile-time. - -2. Typed variables/parameters: declarations allow runtime checks but not -compile-time checks. - -3. Typed values: variables don't have types, they can contain any value, -but every value has a type. - -4. Typed uses: values don't have types, a type is a way of using a value. - -Strictness, in the sense of forbidding things to the user, is not on that -scale, it's another aspect. A well-balanced strictness allows one to -bypass the system whenever needed, but without being too error-prone. - -However it's difficult to say what it means to "bypass the system" for all -four typing categories at once, or even within one category. diff --git a/TODO b/TODO deleted file mode 100644 index 126a2c1..0000000 --- a/TODO +++ /dev/null @@ -1,13 +0,0 @@ -$Id: TODO,v 1.1 2006-01-09 05:04:19 matju Exp $ - -TODO: - * benchmark - * signals - * grids - - * transitive, antisymmetric, predicate - * contracts : *-rule.pd - - * tests for the frameworks' own components? - - diff --git a/main.pd b/main.pd deleted file mode 100644 index fe34a76..0000000 --- a/main.pd +++ /dev/null @@ -1,89 +0,0 @@ -#N canvas 841 0 408 486 10; -#X obj 19 65 loadbang; -#X obj 28 87 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 41 373 print; -#N canvas 509 382 450 300 other 0; -#X obj 20 38 twice symbol foo bar; -#X obj 20 21 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 20 57 print; -#X obj 20 81 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 20 117 print; -#X obj 20 98 3times symbol foo bar baz; -#X obj 20 141 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 20 177 print; -#X obj 20 158 4times symbol foo bar baz fnord; -#X connect 0 0 2 0; -#X connect 1 0 0 0; -#X connect 3 0 5 0; -#X connect 5 0 4 0; -#X connect 6 0 8 0; -#X connect 8 0 7 0; -#X restore 323 80 pd other; -#X obj 19 111 t b b b; -#X obj 71 354 +; -#X msg 121 354 0; -#X msg 71 316 float \$1; -#X obj 41 297 t a a; -#X obj 96 354 t f; -#X obj 19 346 f; -#X obj 71 335 == 0; -#X obj 19 392 print total_failures; -#X obj 226 251 sel 0; -#X obj 234 312 bng 100 250 50 0 empty empty empty 0 -6 0 8 -258699 --1 -262144; -#X msg 234 293 color \$1 \, bang; -#X msg 226 270 16; -#X msg 256 270 13; -#X text 24 437 This does not count errors not reported by the tests -; -#X text 25 464 Consult the console for more information; -#X obj 4 6 cnv 15 400 40 empty empty PureUnity 8 20 1 18 -34345 -68160 -0; -#X text 130 7 TM; -#X obj 15 35 cnv 1 380 1 empty empty Copyright_2006_by_Mathieu_Bouchard -150 -4 1 9 -258699 -262144 0; -#X text 25 450 Such as Syntax Error \, Class Not Found \, etc.; -#X text 297 253 Green: PASS; -#X text 311 265 Red: FAIL; -#X obj 85 150 glue-test; -#X obj 41 131 t b b b; -#X text 6 48 from the bit rot prevention department; -#X obj 284 149 protocols-tree; -#X obj 284 168 print; -#X symbolatom 284 133 10 0 0 0 - - -; -#X msg 284 114 symbol field; -#X obj 63 169 arith-test f; -#X obj 41 188 comparators-test f; -#X connect 0 0 4 0; -#X connect 1 0 4 0; -#X connect 4 0 10 0; -#X connect 4 1 27 0; -#X connect 4 2 6 0; -#X connect 5 0 9 0; -#X connect 5 0 10 1; -#X connect 6 0 5 1; -#X connect 7 0 11 0; -#X connect 8 0 2 0; -#X connect 8 1 7 0; -#X connect 9 0 5 1; -#X connect 10 0 12 0; -#X connect 10 0 13 0; -#X connect 11 0 5 0; -#X connect 13 0 16 0; -#X connect 13 1 17 0; -#X connect 15 0 14 0; -#X connect 16 0 15 0; -#X connect 17 0 15 0; -#X connect 26 0 8 0; -#X connect 27 0 34 0; -#X connect 27 1 33 0; -#X connect 27 2 26 0; -#X connect 29 0 30 0; -#X connect 31 0 29 0; -#X connect 32 0 31 0; -#X connect 33 0 8 0; -#X connect 34 0 8 0; diff --git a/pureunity.c b/pureunity.c deleted file mode 100644 index f010533..0000000 --- a/pureunity.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - $Id: pureunity.c,v 1.1 2006-01-09 05:04:19 matju Exp $ - PureUnity - Copyright 2006 by Mathieu Bouchard - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - See file ./COPYING for further informations on licensing terms. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#include -/*#include */ -#include "../../pd/src/m_pd.h" -#define ALIAS(y,x) class_addcreator((t_newmethod)getfn(m,gensym(x)),gensym(y),A_GIMME,0); - -typedef struct { - t_text o; - struct timeval t0; -} t_rtimer; - -t_class *rtimer_class; -void rtimer_reset(t_rtimer *self) {gettimeofday(&self->t0,0);} -void *rtimer_new(t_symbol *s) { - t_rtimer *self = (t_rtimer *)pd_new(rtimer_class); - inlet_new((t_text *)self, (t_pd *)self, gensym("bang"), gensym("1_bang")); - outlet_new((t_text *)self, gensym("float")); - rtimer_reset(self); - return self; -} - -void rtimer_1_bang(t_rtimer *self) { - struct timeval t1; - gettimeofday(&t1,0); - outlet_float(self->o.ob_outlet, - (t1.tv_sec -self->t0.tv_sec )*1000.0 + - (t1.tv_usec-self->t0.tv_usec)/1000.0); -} - -void pureunity_setup() { - t_pd *m = &pd_objectmaker; - ALIAS( "f.inlet","inlet" ); - ALIAS( "#.inlet","inlet" ); - ALIAS( "~.inlet","inlet~" ); - ALIAS("f.outlet","outlet" ); - ALIAS("#.outlet","outlet" ); - ALIAS("~.outlet","outlet~"); - ALIAS( "f.swap","swap" ); - rtimer_class = class_new(gensym("rtimer"),(t_newmethod)rtimer_new,0,sizeof(t_rtimer),0,0); - class_addbang(rtimer_class,rtimer_reset); - class_addmethod(rtimer_class, (t_method)rtimer_1_bang, gensym("1_bang"), 0); -} - -- cgit v1.2.1