Comments (82)
Hellow. I right understand, that I should write tests fo protected method elltool.core.AGenEllipsoid.isEqualInternal? Shoud I create new class heir in my test for access this metod?
from ellipsoids.
No, isEqual calls isEqualinternal so you should write tests for isEqual. Just study the source code of ellipsoid.isEqual and everything will become clear.
from ellipsoids.
Good evening, I'm analyzed elltool.core.AGenEllipsoid.isEqualInternal, and understanded, that in this function variable tollerance = ell1Obj.RelTol, and than it pass in function absrelcompare like AbsTol, if I write test like this
cv1 = [0;0];
cv2 = [0;0];
Q1 = eye(2);
Q2 = eye(2);
Q2(1,1)=Q2(1,1)+1e-4;
absTol1=1e-3;
ell1Obj = ellipsoid(cv1,Q1,'absTol',absTol1);
ell2Obj = ellipsoid(cv2,Q2);
it answer that ellipsoid dosen't equal, (becase standart value (in constructor) relTol fo first ellipsoid = 1e-5). This is dosen't right. Should I write any others fail test? Es example the test which demonstrated the opposite situation or one test will be enougth? Because, I cant't understand what anothers test will be really usefull.
from ellipsoids.
Also i think it's better in function elltool.core.AGenEllipsoid.isEqualInternal selected absTol=min(ell1Obj.absTol,ell2Obj.absTol) and relTol = min(ell1Obj.relTol, ell2Obj.relTol). Because now the elementary property of symmetric (isEqual(ell1Obj,ell2Obj))=isEqual(ell2Obj,ell1Obj). dosen't. work The function work so wrong (in my opinion) that i can write a lot of fail tests but its won't be real usefull.
from ellipsoids.
- The test you suggested is ok (apart from terribly wrong variable names). But I think we will need at least the following tests:
a) The one that checks a comparison of ellipsoidal arrays created via ellipsoid.fromRepMat method. This test should check that isEqual for arrays works consistently with absTol and relTol specified in fromRepMat method.
b) Same as a) but for arrays of ellipsoids consisting of elements with different values of absTol and relTol. You can create such arrays manually like this:
ell1=ellipsoid(..., precision 1)
ell2=ellipsoid(...., precision 2)
ellVec=[ell1,ell2]
or like this
ell1Vec=ellipsoid.fromRepMat( precision 1)
ell2Vec=ellipsoid.fromRepMat( precision 2)
ellMat=[ell1Vec;ell2Vec]
- The more tests you write - the better. The one checks that isEqual(ell1Obj,ell2Obj))=isEqual(ell2Obj,ell1Obj) is great, you should write it. Also please check a symmetry of isEqual for ellipsoidal arrays as well. In general what matters is not the number of tests but a total test coverage i.e. your tests should test as much code as possible with minimum overlapping between each other. For instance the test that usees
Q2(1,1)=Q2(1,1)+1e-4;
absTol1=1e-3;
doesn't check for symmetry of isEqual so you cannot skip the symmetry test, it should be there as well. Please think of other cases of incorrect behavior of isEqual and see if they all are covered by your tests. If not - you need to write more tests before fixing isEqual.
from ellipsoids.
Hellow, i have question about how should works isEqual an ideal, if we have two Vecs of Ells like this
Ell1Vec = [Ell11Obj(absTol11,relTol11); Ell12Obj(absTol12,relTol12)]
Ell2Vec = [Ell21Obj(absTol21,relTol21); Ell22Obj(absTol22,relTol22)]
when we call isEqual(Ell1Vec,Ell2Vec) we compare Ell11Obj with Ell21Obj and Ell12Obj with Ell22Obj, as result we have a ResVec dim (1,2); The quastion is follow: when we compare Ell11Obj with Ell12Obj we should use as absTol the min_{i=1,2,j=1,2}(absTol(i,j)) and relTol is the min_{i=1,2,j=1,2}(relTol(i,j)), i.e we have the same relTol and absTol for all pairs
or we should use as absTol1 the min_{i=1,2}(absTol(i)1) and relTol1 is the min_{i=1,2}(relTol(i)1) i.e. we have in common case we should use diffrent absTol and relTol for coporation the first pair and the second
from ellipsoids.
absTol and relTol should be calculated for each pair separately i.e.
abs1Tol=min(abs11Tol,abs21Tol) - absolute tolerance for comparing Ell1Vec(1) and Ell2Vec(1)
abs2Tol=min(abs12Tol,abs22Tol) - absolute tolerance for comparing Ell1Vec(2) and Ell2Vec(2)
The same rule should be used for relative tolerance. Thus each pair is compared independently of other pairs.
Just in case - Ell1Vec is a bad name - see our naming convention.
from ellipsoids.
Hello, I decided restart my work. I did clone last master version and when i tried install toolbox there was one problem...
adding
[C:\ellipsoids\lib\jmodgen\FileUtils\bin\modgenfileutils.jar]
to C:\ellipsoids\install\javaclasspath.txt :done
Warning: files
[C:\ellipsoids\lib\jmodgen\FileUtils\bin\modgenfileutils.jar]
have been added to Java static class path,
files
[]
have been deleted from Java static class path,
<<<<------ PLEASE RESTART MATLAB ------->>>>
In modgen.common.throwwarn (line 26)
In modgen.java.AJavaStaticPathMgr/setUp (line 90)
In s_setjavapath (line 6)
In s_install (line 7)
Undefined variable "modgen" or class "modgen.io.FileUtils.isDirectory".
Error in modgen.io.isdir (line 16)
isPositive=modgen.io.FileUtils.isDirectory(dirName);
Error in modgen.system.ExistanceChecker.isDir (line 38)
isPositive=modgen.io.isdir(nameStr);
Error in modgen.containers.ondisk.AHashMap (line 97)
if ~ExistanceChecker.isDir(self.storageLocation)
Error in modgen.containers.ondisk.HashMapXMLMetaData (line 35)
self=[email protected](regArgList{:},...
Error in modgen.configuration.ConfRepoManager (line 86)
storage=modgen.containers.ondisk.HashMapXMLMetaData(...
Error in modgen.configuration.AdaptiveConfRepoManager (line 59)
self=[email protected](...
Error in elltool.conf.ConfRepoMgr (line 17)
self=[email protected](varargin{:});
Error in elltool.conf.Properties.init (line 47)
confRepoMgr=elltool.conf.ConfRepoMgr();
Error in ellipsoidsinit (line 7)
Properties.init();
Error in s_install (line 11)
ellipsoidsinit();
is it important?
from ellipsoids.
I'm restarted matlab. And all things are OK. Sorry, for last comment
from ellipsoids.
This is a normal behavior - see installation instructions in Wiki. The reason you need to restart Matlab is to add jar (Java archives) to a static java path of Matlab.
from ellipsoids.
Hello. I already asked this question, but I want to clarify.
You sad, that, if we have two arrays of ellipsoids, where different ellipsoids has different value absTol and relTol, then "absTol and relTol should be calculated for each pair separately", but structcomparevec (also as in absrelcompare) suppose, that we have union absTol and relTol for comparing all array's ellements.
Should I change stucture of function and compare each pairs
separately?
Or should I select union absTol and relTol and compare arrays?
Now i write tests and want understand how isEqual should work.
from ellipsoids.
Yes, you need to change isEqualInternal a little bit - you should use the first output arguments of getAbsTol and getRelTol methods i.e. arrays of absTol and relTol instead of second outputs that are scalar values of these properties (see help headers of getAbsTol and getRelTol for more details).
This way you will be able to use the tolerances as I described above in my comment on Nov 12.
from ellipsoids.
Hello, I updated to actual master. And, if I riqht understand, I shoud correct function isEqualInternal now.
I have an question about an function.
function SComp=formCompStruct(SEll,SFieldNiceNames,...
absTol,isPropIncluded) %#ok
if (~isempty(SEll.QMat))
SComp.(SFieldNiceNames.QMat)=SEll.QMat;
else
SComp.(SFieldNiceNames.QMat)=[];
end
SComp.(SFieldNiceNames.centerVec)=SEll.centerVec;
if (~isempty(SEll.QInfMat))
SComp.(SFieldNiceNames.QInfMat)=SEll.QInfMat;
else
SComp.(SFieldNiceNames.QInfMat)=[];
end
if (isPropIncluded)
SComp.(SFieldNiceNames.absTol)=SEll.absTol;
end
end
If I correct understand, now in function isEqualInternal it use for rename struct fields to NiceNames,
but
- for what this function requires argument absTol?
- why field relTol (it is in structure returned by toStruct, if isPropInclude==true (now it is false)) is descriminated, also as fields nPlot2dPoints , nPlot3dPoints?
- what this function shoud do really?
from ellipsoids.
Please have a look at #42 (comment) - I expect Alexander to fix this problem tomorrow.
Anyways,
-
absTol is not required
-
same reason as absTol - if isPropIncluded =true then all properties should go to SComp, otherwise - only centerVec and shapeMat for ellipsoid class (and some others for hyperplane and GenEllipsoid 3) see 2 above.
from ellipsoids.
Last comment, I asked about method formCompStruct(), but I looked formCompStruct() in class GenEllipsoid, and in real formCompStruct() from class ellipsoid work. Sorry for my mistake. Nonetheless I have some questions about formCompStruct() from class ellipsoid.
methods (Static)
function SComp = formCompStruct(SEll, SFieldNiceNames, absTol, isPropIncluded)
if (~isempty(SEll.shapeMat))
SComp.(SFieldNiceNames.shapeMat) = gras.la.sqrtmpos(SEll.shapeMat, absTol);
else
SComp.(SFieldNiceNames.shapeMat) = [];
end
SComp.(SFieldNiceNames.centerVec) = SEll.centerVec;
if (isPropIncluded)
SComp.(SFieldNiceNames.absTol) = SEll.absTol;
SComp.(SFieldNiceNames.relTol) = SEll.relTol;
SComp.(SFieldNiceNames.nPlot2dPoints) = SEll.nPlot2dPoints;
SComp.(SFieldNiceNames.nPlot3dPoints) = SEll.nPlot3dPoints;
end
end
end
- Why is it so different from GenEllipsoid's method?
- For what we take sqrtm from ShapeMat?
SComp.(SFieldNiceNames.shapeMat) = gras.la.sqrtmpos(SEll.shapeMat, absTol)?
Can I deleted commands
SEll1Array = arrayfun(@(SEll)ellFirstArr.formCompStruct(SEll,...
SFieldNiceNames, absTol, isPropIncluded), SEll1Array);
SEll2Array = arrayfun(@(SEll)ellSecArr.formCompStruct(SEll,...
SFieldNiceNames, absTol, isPropIncluded), SEll2Array);
because they work very strange, and write normal fail test for the rest of the code?
In real it doesn't matter how the structure's field are named for their comparations, becase in structcomparevec() the command fieldnames() is using.
from ellipsoids.
I of course can try to write adequat test for full code, that check diffence between absTol and relTol, but extract the matrix root from two ShapeMatrixs before compare them..., can I delete this command?
from ellipsoids.
Can you please name all your questions with sequential numbers, not always 1,2 in each comment. Otherwise it is hard to refer to specific points in your comments. Anyways, please have a look at #42 (comment)
- you should not delete these lines, you should concentrate on the tests while Alexander fixes the implementation
- we need these lines for two reasons
a) isEqual method returns two output arguments, the second is "reportStr" which is supposed to be human-readable. The idea is to have matrix "shapeMat" referred to in this report as "Q" because it is more familiar (actually it should be QSqrt because actually it is a square root of Q, not just Q
c) we cannot just compare shapeMat because of the way we treat precision. Let us consider 2-dimensional ellipsoid in axes x and y and units of x and y are centimeters. Then If you want to represent this 2-dimensional ellipsoid as a matrix transformation of circle with radius=1 you use sqrt(Q), not Q because "units" of Q squared centimeters. Units of absTol are centimeters and we cannot compare something that is measured in squared centimeters with something that is just in centimiters. That is what we compare sqrt(Q_1)-sqrt(Q_2) (in centimiters) with absTol (also in centimiters).
Does it make sense?
from ellipsoids.
Yes, thank you.
from ellipsoids.
I added some fail tests
text_test_result with properties:
textOutFid: 1
verbosityLevel: 1
isDotDispMode: 1
isAllShown: 0
errors: {}
failures: {'elltool.core.test.mlunit.EllipsoidTestCase/testIsEqual' [1x2073 char]}
should_stop: 0
+--------------------------------------------------------------------------------+
| << FAILED >> || TESTS: 197, FAILURES: 1, ERRORS: 0, RUN TIME(sec.): 1945.9 |
+--------------------------------------------------------------------------------+
And I hope they are right.
However the question of creartion some test for repMat method rest, because I don't understand what test should I do? Of corse all test that right for two ells, have analogues for repMat array, but I don't want copypaste. And more logical test, in my opinion, is cheking that: if smth right for ell1 and ell2, then the same right for repMat(ell1), repMat(ell2), but these test don't fail now.
Should I do any another test?
from ellipsoids.
Sorry, I forgot add issue number in my commit message. Is this very bad?
from ellipsoids.
I will review your changes tomorrow, yes, it is not a good thing - if you can - please revert changes made in your branch and make a new commit with a corrected commit message, this is easy to do.
from ellipsoids.
I reverted changes and made new commit, but I'm not sure, that I did all right.
from ellipsoids.
- You should always use an issue number preceded with # sign in your commit messages - see https://github.com/SystemAnalysisDpt-CMC-MSU/ellipsoids/wiki/Issue-workflow-policy-with-GIT for more details
Please revert your commit and make it again with a correct commit message this time.
-
Please define constants like 1e-5, 1e-6 as separate constant variables (capital letters with underscores).
-
Get rid of copy-pasting by placing repeating blocks of code into nested functions
-
Always use a second output of isEqual like this:
[isOk,reportStr]=a.isEqual(b)...
mlunitext.assert(isOk,reportStr);
if such asset fails a content of reportStr is displayed making it possible to understand why the test failed.
- make sure you do not use assert on vectors or matrices like this
mlunitext.assert(all(aMat==bMat));
because all((aMat==bMat) returns a logical vector while assert expects a scalar. You should use all(aMat(:)==bMat(:))
-
As for sufficiency of these tests - first of all you need to write tests that "prove" that absTol is not used. For that purpose you need to write tests that should pass if absTol were taken into account but fail in our case. Then, after fixing the bug in isEqualInternal you will make sure that these tests pass. I.e. tests should fail with the current (incorrect) implementation and should pass with the correct implementation (when absTol is not ignored).
-
Please do rebase on latest changes in master.
from ellipsoids.
- Sorry, I'm not understand what you mean.
Now, in function isEqualInternal the value absTol is really ignored, but it is replaced by value relTol taken by first ellipsoid
[25] [~, tolVal] = ellFirstArr.getRelTol();
[55-56] modgen.struct.structcomparevec(SEll1Array,...
SEll2Array, tolVal); % the tolVal give to func like absTol
If relTol doesn't set clearly then absTol replaced by default value relTol, as I understand. So now
the ellipsoids are allways compared with absTol, but with wrong value absTol.
And I wrote one test that chek this situation.
testEll1 = ellipsoid([0;0],eye(2),'absTol',1e-6,'relTol',1e-4);
testEll2 = ellipsoid([1e-5;1e-5],eye(2),...
'absTol',1e-6,'reltol',1e-4);
mlunitext.assert(isEqual(testEll1,testEll2),false);
Also there is an test thet chek situation when ellipsoids aren't equal if we use only absTol but should be equal when we use two presision parametrs. The case when relTol is really important.
Can you clarify what another test should I add?
from ellipsoids.
- This is comment for my code or this is answer for my question:
"However the question of creartion some test for repMat method rest, because I don't understand what test should I do? Of corse all test that right for two ells, have analogues for repMat array, but I don't want copypaste."
from ellipsoids.
- In any case, I don't understand what block are repeating.
Because every test consists two logical part
first : creation of ellipsoids % different for different test
second: comparations % one command
and mluninttextassert % different for different test
When I asked about copy past I mean logical copypast, i.e.
if test like
testEll1=ellipsoid();
testEll2 = ellipsoid()
is fail test, then test like
testEll1Mat = repMat(testEll1,sizeVec)
testEll2Mat = repMat(testEll2, sizeVec)
is fail test too. And I'm not sure that it is useful.
from ellipsoids.
-
Thanks for explanation, I believe that the tests you already have are just enough. Now is the time to fix the implementation (once you are done with 1-7 of course)
-
Well, in your example
testEll1=ellipsoid();
testEll1Mat = repMat(testEll1,sizeVec)
should be placed into a nested/sub function if you are going to use the same logic more than once.
Another example of copy-pasting is
testEll1 = ellipsoid([0;0],eye(2),'absTol',1e-4,'relTol',1e-4);
testEll2 = ellipsoid([0;0],eye(2),'absTol',1e-5,'relTol',1e-5);
testEll3 = ellipsoid([0;0],eye(2),'absTol',1e-6,'relTol',1e-6);
the only difference between these 3 lines are values of absTol and relTol. If create a nested
function ellObj=create(absTol,relTol)
ellObj = ellipsoid([0;0],eye(2),'absTol',absTol,'relTol',relTol);
end
then the block above will be transformed into
testEll1=create(1e-4,1e-4);
testEll2=create(...
testEll3=create(...)
which is much more compact but not compact enough. Thus the text step would be creating one more nested function which will accept a list of absTol,relTol pairs and produce a vector of ellipsoid objects. I.e. testEll1, ... , testEll6 should be returned by this function as testEllVec.
- permsTestEllPairMat is a logical variable with incorrect name - please see our coding policy to figure out a correct name.
from ellipsoids.
- Hello, I don't understand, about reportStr:
Can you explain me at the first test, as example.
ABS_TOL1 = 1e-4;
REL_TOL1 = ABS_TOL1;
ABS_TOL2 = 1e-5;
REL_TOL2 = ABS_TOL2;
testEll1 = ellipsoid([0;0],eye(2),'absTol',ABS_TOL1,'relTol',REL_TOL1);
testEll2 = ellipsoid([1e-4;1e-4],eye(2),...
'absTol',ABS_TOL2,'reltol',REL_TOL2);
isOk = isEqual(testEll1,testEll2)==isEqual(testEll2,testEll1);
mlunitext.assert(isOk)
This test check that symmetric property is fail. But if I do smth like
[isOk1, reportStr1] = isEqual(testEll1,testEll2);
[isOk2, reportStr2] = isEqual(testEll2,testEll1);
then isEqual return: reportStr1 = ' ', reportStr2 = ' '. And both of reportStr aren't informative. Shoud I return smth like this
myReportStr = 'isEqual :: symmetry properties of the relation of equality is fail'
mlunitext.assert(isOk,myReportStr)
from ellipsoids.
reportStr is not empty when isEqual returns false. All you need to do is to pass reportStr into assert function, no need to change reportStr. This way when a test fails assert prints out reportStr.
from ellipsoids.
Thank you
from ellipsoids.
Stop, in my exmaple in real
[isOk1, reportStr1] = isEqual(testEll1,testEll2);
[isOk2, reportStr2] = isEqual(testEll2,testEll1);
In real
reportStr1 is empty, and reportStr2 is not empty and contain message that explain why testElll2 isn't equal testEll1, but I wrote the test that compare isOk1 and isOk2, they shoud be equal but they are not.
and I wanted write
mluinttext.assert(isOk1 == isOk2), what reportStr shoud I add?
I.e. in this test isEqual call twice, but return different result (in logic shoud return the same)
from ellipsoids.
Should I write smth like this
if isEqual(testEll1,testEll2)
[isOk, reportStr] = isEqual(testEll2,testEll1);
mluint.assert(isOk,reportStr)
end
from ellipsoids.
No, this is not efficient, you should call isEqual only once
from ellipsoids.
And how can I chek that symmetry property, and transitive property is fail, using only one call in one test?
P.S. these fails aren't linked with replasing absTol by relTol, but this is due to the fact that is taken tollerance from first elllipsoid and ignore tollerance from second.
[~, tolVal] = ellFirstArr.getRelTol()
You said (12 Nov 2015) in real shoud use minimum of two tollerance.
from ellipsoids.
I can curtainly using smth like this
testEll1Vec = [testEll1,testEll2];
testEll2Vec = [testEll2, testEll1];
[isEqVec, reportStr ] =isEqual(testEll1Vec, testEll2Vec).
Shoud I do so?
from ellipsoids.
Ah, sorry, I didnt notice that you swapped inputs, but still you should never call isEqual with just output.
from ellipsoids.
With just one output I mean. Yes, you can vectorize calls
from ellipsoids.
Sorry, there is one problem with vectorize calls, I didn't think about it last night, because I was a little tired.
The fact that
if
ABS_TOL1 = 1e-4;
REL_TOL1 = ABS_TOL1;
ABS_TOL2 = 1e-5;
REL_TOL2 = ABS_TOL2;
testEll1 = ellipsoid([0;0],eye(2),'absTol',ABS_TOL1,'relTol',REL_TOL1);
testEll2 = ellipsoid([1e-4;1e-4],eye(2),'absTol',ABS_TOL2,'reltol',REL_TOL2);
then
[isOk1, reportStr] = isEqual(testEll1, testEll2)
% return [1, ' ']
[isOk2, reportStr] = isEqual(testEll2, testEll1)
% return [0, q-->Max. absolute difference (0.0001) is greater than the specified tolerance (1e-05)]
[isEqVec, reportStr] = isEqual([testEll1, testEll2],[testEll2,testEll1])
% return isEqVec = [0,0]
reportStr =
(1).q-->Max. absolute difference (0.0001) is greater than the specified tolerance (1e-05)
(2).q-->Max. absolute difference (0.0001) is greater than the specified tolerance (1e-05)
this is because now ellipsoids aren't comparing independly in pairs.
i.e
[25] [~, tolVal] = ellFirstArr.getRelTol(); % get minimum of RelTol in array, i.e. min(relTol1, relTol2)
...
[54] [isEqualArr, reportStr] =...
modgen.struct.structcomparevec(SEll1Array,...
SEll2Array, tolVal);
i.e we compare two vectors with one value AbsTol (in fact it is min(relTol1, relTol2)), not pairs of ells.
We disscused this problem yet. And your said use first output arguments of getAbsTol and getRelTol methods. And also I wrote 5 test (with perms ) which catsh this fail.
But the question how I shoud write first, second, and last test, using inly one call, rest?
first test checks symmetry property equality two ells.
snd test checks transitive property three ells.
last (5th) test checks that if ellipsoid's pairs are equal then any
permutation of these ellipsoids in the array gives the same result.
from ellipsoids.
Why I can't do commit?
git.exe push --progress "origin" issue_14_IvanovaElena
To https://github.com/SystemAnalysisDpt-CMC-MSU/ellipsoids.git
! [rejected] issue_14_IvanovaElena -> issue_14_IvanovaElena (non-fast-forward)
error: failed to push some refs to 'https://github.com/SystemAnalysisDpt-CMC-MSU/ellipsoids.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
from ellipsoids.
Because you didn't pay attention to what I said on my seminar about pushing after rebase. You need to use force flag because rebase changes structure of the branch. I hope you do not expect me to repeat myself so please re-read official git documentation for git rebase and make sure to ask other guys who completed at least the first task like Alex Timchenko or Nikita Zuyanov or Ilya Shirokih to explain the whole git workflow.
from ellipsoids.
Thank you very much for your explanation. I will try fix my errors, and do all right next time.
But what about general question?
Now isEqualInternal works like this
- it takes relTol from ellFirstArr, in real it take relTol = min(relTol1,relTol2,...relToln), where
relTol1 is relative tolerance fisrt element from ellFirstArr, relToln is relative tolerance n element from ellFirstArr
[25] [~, tolVal] = ellFirstArr.getRelTol(); - then it compare two structArray using relTol as absTol (one for the whole array)
[54] [isEqualArr, reportStr] =...
modgen.struct.structcomparevec(SEll1Array,...
SEll2Array, tolVal);
We decide that isEqual shoud work so
- take [absTol1Arr,
] = ellFirstArr.getAbsTol(); [relTol1Arr,]=ellSndArr.getRelTol();
[absTol2Arr,]=ellFirstArr.getAbsTol(); [relTol2Arr,]=ellSndArr.getRelTol(); - to compare the ellipsoids in pairs with absTol(i)=min(absTol1Arr(i),absTol2Arr(i)) and relTol(i)=min(relTol1Arr(i), relTol2Arr(i)).
So I indicated following problem in isEqualInternal
it use toleranse only from first argument and ingnore from scnd. As result, symmertry and transitive property of equation are fail
- it replacing absTol by relTol
- it compare two arrays of ellipsoids (with one value tolerance), not pairs of ellipsoids.
AND NOW THE QUESTION. It nessery for me (another worlds I don't know how to do it otherwise) using several calls of isEqual in one test.
As example, the test that check that symmetry property is fail
ABS_TOL1 = 1e-4;
REL_TOL1 = ABS_TOL1;
ABS_TOL2 = 1e-5;
REL_TOL2 = ABS_TOL2;
testEll1 = ellipsoid([0;0],eye(2),'absTol',ABS_TOL1,'relTol',REL_TOL1);
testEll2 = ellipsoid([1e-4;1e-4],eye(2),'absTol',ABS_TOL2,'reltol',REL_TOL2);
then
[isOk1, reportStr] = isEqual(testEll1, testEll2)
% return [1, ' ']
[isOk2, reportStr] = isEqual(testEll2, testEll1)
% return [0, q-->Max. absolute difference (0.0001) is greater than the specified tolerance (1e-05)]
[isEqVec, reportStr] = isEqual([testEll1, testEll2],[testEll2,testEll1])
% return isEqVec = [0,0]
reportStr =
(1).q-->Max. absolute difference (0.0001) is greater than the specified tolerance (1e-05)
(2).q-->Max. absolute difference (0.0001) is greater than the specified tolerance (1e-05)
Now ellipsoids aren't comparing independly in pairs. and I can't using vectorize calls, for cheking.
- how can I decide the problem of several calls another ways?
from ellipsoids.
- how can I decide the problem of several calls another ways?
I suggest we stick with using a single value of both relTol and absTol for the whole array instead of pair-wise comparison. I remember that I suggested to use a pair-wise comparison earlier but that was before I created issue #44 which is supposed to fix the vectorization problem once and for all. In issue #44 we only need to implement a isEqualScalarInternal method (for comparing two scalar objects) while the rest (comparison of arrays) will be handled automatically by the logic already implemented in HandleObjectCloner class. So for now let us just use the second output of getRelTol and getAbsTol
As for vectorized comparison - you can use arrayfun like this
[isOkCArr,reportStrCArr]=arrayfun(@isEqual,ellFirstArr,ellSecArr,'UniformOutput',false);
isOkArr=cell2mat(isOkCArr);
from ellipsoids.
Thanks
10) I also have an question. When assert fail (first time ) we abort from test function. Should I write 5 test function (because all test should be fail), Or may be there is an method put all test in one function?
from ellipsoids.
The more tests - the better as long as there is no any copy-pasting. So let us have separate methods (tests) and place common code into sub functions or separate not test methods.
from ellipsoids.
I fixed the tests. Are they right now? Can I start fix the function?
from ellipsoids.
You can work on the tests and the methods (not functions!) in parallel.
-
But the tests are not ok because there are still a lot of problems with the variable names, please fix them.
-
Some tests are very similar, like
testIsEqualAbsTolRepByRelTol
and
testIsEqualDifBetweenAbsTolAndRelTol
Please put a common portion of these tests into a separate function or non-test method.
from ellipsoids.
nFirstElems = numel(ellFirstArr);
nSecElems = numel(ellSecArr);
...
isnFirstScalar=nFirstElems > 1;
isnSecScalar=nSecElems > 1;
...
if isnFirstScalar&&isnSecScalar
if ~isequal(firstSizeVec, secSizeVec)
throwerror('wrongSizes',...
'sizes of ellipsoidal arrays do not match');
end;
compare();
isEqualArr = reshape(isEqualArr, firstSizeVec);
elseif isnFirstScalar
SEll2Array=repmat(SEll2Array, firstSizeVec);
compare();
isEqualArr = reshape(isEqualArr, firstSizeVec);
else
SEll1Array=repmat(SEll1Array, secSizeVec);
compare();
isEqualArr = reshape(isEqualArr, secSizeVec);
end
- Do I right understand that this code allows compare one ellipsoid with array of ellipsoids?
Should I save this functionality, when I correct the method
I did 12) and perhaps 11)
from ellipsoids.
- Do I right understand that this code allows compare one ellipsoid with array of ellipsoids?
Yes
Should I save this functionality, when I correct the method
Yes
- prefix f is only for function_handle variables, not for the functions
- please use correct suffices for costants as well ("_VEC" for vectors)
- constants should be used everywhere, please do not use in-line constants
no need to define - fCreateEllVec is not a method, why is it within methods/end scope?
- Please move it outside of classdef/end (but keep in the same m file). This way you can declare
functions in a class file without creating a separate file for those functions. - instead of [TOL(1),TOL(2)] please write TOL(1:2), please apply this concept to all your code
- in all your tests please a) check that elltool.conf.Properties.getAbsTol and getRelTol returns tolerances
you expect. Right now if someone changes configuration via elltool.editconf('default') some of your tests
will fail. b) directly pass absTol and relTol into ellipsoid constructor and make sure that the results
are the same with and without passing in the tolerances directly. This can be done by replacing
"ellipsoid" with fCreateEll which takes two values: fCreateEll=@ellipsoid and fCreateEll=@(varargin)ellipsoid(varargin{:},'absTol',absTol,'relTol',relTol).
This way you can transform each of the tests into a nested function "checkMaster" and call it twice (one for each value of fCreateEll)
from ellipsoids.
14)Has function name any special sufficient or prefix, according to the coding policy?
20) a) Sorry, I don't understand what you mean. Could you clarify, please?
Now all tests, which I have done, compare ellipsoids with directly set value relTol, absTol. None ellipsoid is created with default value.
from ellipsoids.
- no, just remove f prefix and make the function name start with a small letter.
- here is an example to demonstrate my idea
function testSomething
fCreateEll=@ellipsoid;
checkMaster();
fCreateEll=@(varargin)ellipsoid(varargin{:},'absTol',absTol,'relTol',relTol).
checkMaster();
function checkMaster()
shMat=...
ellObj=fCreateEll(shMat);
%do some comparisons and make assert calls.
end
end
from ellipsoids.
- And how can I define expected result for tests without directly set values relTol and absTol?
If someone change configuration, the result of comparation can change (and can be right or false) , and I can't guess it.
from ellipsoids.
- So, when the tolerances are not specified in the constructor the default values from xml configuration are used (see https://github.com/SystemAnalysisDpt-CMC-MSU/ellipsoids/wiki/Toolbox-configuration-management).
Please note that when you normally use the toolbox the configuration parameters from xml file opened with elltool.editconf
are used but when you use ellipsoid classes from tests the parameters from a different file edited via elltool.test.editconf
are used.
In your test you can access the values loaded from xml file via elltool.conf.Properties.getAbsTol()
and elltool.conf.Properties.getRelTol()
. This way you will know which tolerances to use for comparison.
- Your task assumes that you need to write tests not just for
ellipsoid
class, but also for GenEllipsoid andhyperplane
. The easiest way to avoid copy-pasting is to do this following these steps:
1. Move all your tests from products/+elltool/+core/+test/+mlunit/EllipsoidTestCase.m
into a separate test case class (you need to create it).
2. Read the last section in https://github.com/SystemAnalysisDpt-CMC-MSU/ellipsoids/wiki/MLUNITEXT-unit-testing-framework-description and make sure you understand how to write parameterized tests. You can use elltool.reach.test.run_cont_tests
as an example of test parameterization. Then parameterize your test case with ellipsoid/hyperplane constructor. This means that instead of calling ellipsoid
directly you will pass a variable fCreate=@ellipsoid or [email protected] from outside, parse it in set_up_param
method as explained in the manual and put it into a private field of the test case. Then in each test you would call self.fCreate(shMat,centerVec) instead of calling ellipsoid(shaMat,centerVec)
directly.
Please note that in case of hyperplane you will have to improvise a bit, like this for example:
fCreate=@(x,y)hyperplane(x(:,1),y(1)) to make sure that hyperplane can be constructed as if it were an ellipsoid. I hope you understand the idea - make the tests think that they create ellipsoid while in fact they create one of three objects: hyperplane, ellipsoid and GenEllipsoid.
from ellipsoids.
Hello, I try write parametric tests, but I have a problem
22) with GenEllipsoid constructor
If I do smth like this
- elltool.core.GenEllipsoid([0;0],eye(2),'absTol',1e-5,'relTol',1e-2)
or - elltool.core.GenEllipsoid([0;0],eye(2),[1,2;3,4],'absTol',1e-5,'relTol',1e-2)
there is an error: Error using elltool.core.GenEllipsoid (line 169)
Incorrect number of parameters
If I right understand what's happend, the error throw from GenEllipsoid constructor
[168] if nInput>3
[169] throwerror('wrongParameters',...
[170] 'Incorrect number of parameters');
I don't understand smth, or now I can't directly set absTol and relTol in constructor for GenEllipsoids? Or how I can?
from ellipsoids.
This is a bug, I just fixed it in master, please rebase.
from ellipsoids.
Hello, I still have questions about
20) If I right understand what you said: I might have problems, when the tolerances are not specified in the constructor. But in all my tests the tolerances specified in the constructors? I choose special ellipsoids with set values of tolerances, centVecs, and shapeMatrixs for which isEqual doesn't work so, as we want?
from ellipsoids.
Not in all of your tests - please re-read what I wrote above - you need to run the same tests twice - once without the tolerances specified in the constructor and once - with the tolerances specified in the constructor. In the first case you need to use elltool.conf.Properties class to extract the default values of tolerances (since you do not specify them in the constructor and this is the only way to know what tolerances are used).
from ellipsoids.
- But the results of working isEqual are not the same with and without passing in the tolerances directly in the general case:
as example
ell1=ellipsoid([0;0], eye(2));
ell2=ellipsoid([1e-4;1e-4],eye(2));
isEqual(ell1,ell2) return 0 because default absTol=1e-6, relTol=1e-5
in the same time
ell3 =ellipsoid([0;0],eye(2),'absTol',1e-3,'relTol',1e-2)
ell4=ellipsoid([1e-4;1e-4],eye(2),'absTol',1e-3,'relTol',1e-2);
isEqual(ell3,ell4) return 1. And it's right.
from ellipsoids.
Right. For exactly that reason you need to
a) pass tolerances directly
b) do not pass them directly and just check that the tolerances returned by elltool.conf.Properties match your expectation. If this assumption doesn't hold - you just skip testing without passing the tolerances directly, if there is a match - you test as usual.
Ideally using fixed tolerances in your tests is not a good idea because as you correctly mentioned the default tolerances can take any values. Thus in case b) you can use something like this:
defAbsTol=elltool.conf.Properties.getAbsTol();
defRelTol=elltool.conf.Properties.getRelTol();
ell3 =ellipsoid([0;0],eye(2),'absTol',defAbsTol_1e+3,'relTol',defRelTol_1e+4)
etc...
This way your test will always work and you won't have to skip b) part just because the default tolerances from "Properties" class do not match your expectations.
from ellipsoids.
And another question, because the tests are fail
function testSomething
fCreateEll=@ellipsoid;
checkMaster();
% in this moment we return from testSomething and 2nd call checkMaster won;t work
fCreateEll=@(varargin)ellipsoid(varargin{:},'absTol',absTol,'relTol',relTol).
checkMaster();
function checkMaster()
shMat=...
ellObj=fCreateEll(shMat);
%do some comparisons and make assert calls.
end
end
Should I put 2 calls checkMaster in two different function?
from ellipsoids.
If you make checkMaster use the tolerances that depend on what you specify in fCreateEll the second call should also work. It doesn't matter how many times you call checkMaster, what matters is what tolerances are used inside it.
from ellipsoids.
I fixed the tests
from ellipsoids.
Ok, let us wait for the test result on the server. Meanwhile you can switch to issue #44
from ellipsoids.
Ok, not sure what you fixed but I see 4 test failures.
from ellipsoids.
Oh, sorry, I push version EllipsoidTestCase with not actaul tests. I will correct
- When I create new class PrameterizatedTC I'm also create file run_param_test where I put runner for prametric case. And this construction didn't work. Should I replaced runner in run_tests file?
from ellipsoids.
Should I replaced runner in run_tests file?
No need to replace it, just combine your suites with suite
object in run_tests using fromSuites
static method.
from ellipsoids.
I did. Now there is 9 fail test. Should I correct the isEqualInternal and did the test pass, or I should start #44?
from ellipsoids.
When I mentioned issue #44 I thought that you fixed all the tests. Since this is not the case you need to fully complete this task first and only then move to issue #44. Thanks.
from ellipsoids.
I corrected the function. But the code is still unstabel. There is 6 failures, but I don't know what was failed,because error_fail_list.txt is empty?
from ellipsoids.
It is not empty, please be more attentive: https://groups.google.com/forum/#!topic/ellipsoids-tests-notification/ae6TiIeNmf8
from ellipsoids.
I looked the test that was failed. I'm afraid that all of them had been written, such way, that all of them passed with wrong isEqual. Because in all test the relTol are used, as the shift parametr). (Expcept may be testEllunionEa, I dont't really understand what's happend in this test yet)
from ellipsoids.
Right. You need to figure out how these tests work and modify them so that they pass keeping in mind that now isEqual accounts for relTol as well.
from ellipsoids.
Ok
18 Фев 2016 г. 13:15 пользователь "Peter Gagarinov" <
[email protected]> написал:
Right. You need to figure out how these tests work and modify them so that
they pass keeping in mind that now isEqual accounts for relTol as well.—
Reply to this email directly or view it on GitHub
#14 (comment)
.
from ellipsoids.
EllTbx_Win64_2015b » issue_14_IvanovaElena - Build # 12 - Fixed: I right understand, that all tests pass now?
from ellipsoids.
What should I do now?
from ellipsoids.
- Please make getTol function
function tolVec=getTol(ellFirstArr,ellSecArr)
ellArr=[ellFirstArr(:);ellSecArr(:)];
[,tolVec(1)]=ellArr.getAbsTol();,tolVec(2)]=ellArr.getRelTol();
[
end
return absTol and relTol separately instead of tolVec vector. All this is to make
our source code more readable.
- In
hyp
function you created please use more meaningful names based on our
naming convention instead of just x and y:
function res = hyp(x,y,varargin)
res = hyperplane(x,y(1),varargin{:});
end
- In the following code please also pass absTol and relTol as separate input arguments:
classdef PrameterizedTC < mlunitext.test_case
properties (Access=private)
fCreateObj;
end
methods (Access=private)
function objCVec = createObjCVec(self,centCVec,varargin)
matCVec=repmat(num2cell(eye(numel(centCVec{1})),...
[1,2]),1,numel(centCVec));
if numel(varargin)==0
fCrObVec = @(cent,mat,tol) self.fCreateObj(cent,mat);
objCVec=cellfun(fCrObVec,centCVec,matCVec,...
'UniformOutput',false);
else
fCrObVec = @(cent,mat,tol) self.fCreateObj(cent,mat,...
'absTol',tol(1),'relTol',tol(2));
objCVec=cellfun(fCrObVec,centCVec,matCVec,varargin{:},...
'UniformOutput',false);
end
end
end
Also, in the same code
objCVec=cellfun(fCrObVec,centCVec,matCVec,varargin{:},...
'UniformOutput',false);
should be outside of if else then because it will always work even when nargin(varargin)==0
- in
tolCVec=num2cell([10*defTol,100*defTol,defTol;10*defTol,...
100*defTol,defTol],1);
num2cell is not necessary, jus use {} like this {1,2;3,4}
Same goes for
matCVec=repmat(num2cell(eye(numel(centCVec{1})),...
[1,2]),1,numel(centCVec));
- In
function set_up_param(self, varargin)
import modgen.common.throwerror;
nArgs = numel(varargin);
if nArgs == 1
self.fCreateObj=varargin{1};
elseif nArgs > 1
throwerror('wrongInput','Too many parameters');
end
end
insted of
nArgs = numel(varargin);
if nArgs == 1
please use
if nargin==2
....
- Please make all lines shorter than 74 by using "..."
- Logical variables should always have "is" or "has" prefix
- see our coding convention
- In
fCrObVec = @(cent,mat,tol) self.fCreateObj(cent,mat,...
'absTol',tol(1),'relTol',tol(2));
cent,mat are incorrect names - where are suffices for matrices and vectors?
tol needs to be replaced with separate absTol and relTol inputs
- In HyperplaneTestCase removing checks for the output message is not a good idea,
all you need to do is to replace replace the expected messages with the correct ones
Same goes for all other places that contained checks for expected messages. You cannot
remove such checks, you can only replace the expected message with a correct one.
from ellipsoids.
I did 24)-32)
from ellipsoids.
You can merge to master now, please follow these steps:
- Rebase against the latest master and wait for the test results
- Switch to master
- Merge -> from -> origin/remotes/your branch (using local branch can dangerous because it can contain unpushed changes)
- Important !!! Set "no fast forward flag". Press OK
- DO NOT PUSH JUST YET. Right click and open log. It should look like "petlya".
- If eveything is ok - press push.
While you wait for the test results you can start working on your next task: #44
from ellipsoids.
Sorry, I have a probllem with merge?
git.exe merge --no-ff remotes/origin/issue_14_IvanovaElena
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@ABasicEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+elltool/+core/@AEllipsoid': Permission denied
error: cannot stat 'products/+gras/+ellapx/+lreachplain/+probdef/+test/+mlunit': Permission denied
error: cannot stat 'products/+gras/+ellapx/+lreachplain/+probdef/+test/+mlunit': Permission denied
error: cannot stat 'products/+gras/+ellapx/+lreachplain/+probdyn/+test/+mlunit': Permission denied
error: cannot stat 'products/+gras/+ellapx/+lreachplain/+probdyn/+test/+mlunit': Permission denied
error: cannot stat 'products/+gras/+ellapx/+lreachuncert/+probdef/+test/+mlunit': Permission denied
error: cannot stat 'products/+gras/+ellapx/+lreachuncert/+probdyn/+test/+mlunit': Permission denied
error: cannot stat 'products/+gras/+ellapx/+lreachuncert/+probdyn/+test/+mlunit': Permission denied
git did not exit cleanly (exit code 128) (375 ms @ 24.02.2016 23:42:55)
from ellipsoids.
I think this is because you didn't close matlab or some other app is blocking those files.
Please reboot your pc just in case. Then switch/checkout to origin/master with checkbox "recreate branch if exisits". This will create a fresh copy of local master. Then switch to this local restored master and run merge again.
from ellipsoids.
thanks, but there is another question. I look test results in test group
and build #15 Failure in the same time build #17 Succseful, but the message about build #15 is upper than build #17? Test are fail or no?
from ellipsoids.
You should always look at the latest build, no matter when you receive emails. You tests have passed.
from ellipsoids.
Hello! Sorry to bother you. I use Matlab 2018a. Please allow me to explain my installation process to you first. When I installed ET-2.1 in MATLAB 2018a, start_matlab2015b_win64 did not work; So I run s_install.m and the result is as follows:
-------------------elltool.deploy.JavaStaticPathMgr-------------------
adding
[D:\Software\Research_Software\ellipsoids-2.1\lib\jmodgen\FileUtils\bin\modgenfileutils.jar]
to D:\Software\Research_Software\ellipsoids-2.1\install\javaclasspath.txt :done
Warning: files
[D:\Software\Research_Software\ellipsoids-2.1\lib\jmodgen\FileUtils\bin\modgenfileutils.jar]
have been added to Java static class path,
files
[]
have been deleted from Java static class path,
<<<<------ PLEASE RESTART MATLAB ------->>>>
In modgen.common.throwwarn (line 26)
In modgen.java.AJavaStaticPathMgr/setUp (line 90)
In s_setjavapath (line 6)
In s_install (line 7)
Undefined variable "modgen" or class "modgen.io.FileUtils.isDirectory".
Error in modgen.io.isdir (line 16)
isPositive=modgen.io.FileUtils.isDirectory(dirName);
Error in modgen.system.ExistanceChecker.isDir (line 38)
isPositive=modgen.io.isdir(nameStr);
Error in modgen.containers.ondisk.AHashMap (line 97)
if ~ExistanceChecker.isDir(self.storageLocation)
Error in modgen.containers.ondisk.HashMapXMLMetaData (line 35)
self=[email protected](regArgList{:},...
Error in modgen.configuration.ConfRepoManager (line 86)
storage=modgen.containers.ondisk.HashMapXMLMetaData(...
Error in modgen.configuration.AdaptiveConfRepoManager (line 59)
self=[email protected](...
Error in elltool.conf.ConfRepoMgr (line 17)
self=[email protected](varargin{:});
Error in elltool.conf.Properties.init (line 47)
confRepoMgr=elltool.conf.ConfRepoMgr();
Error in ellipsoidsinit (line 7)
Properties.init();
Error in s_install (line 11)
ellipsoidsinit();
……………………………………………………………………
I closed MATLAB, re-opened it, and ran s_install.m again, there is a new problem:
…………………………………………………….
files
[]
are in current static path but not
in D:\Software\Research_Software\ellipsoids-2.1\install\javaclasspath.txt while files
[D:\Software\Research_Software\ellipsoids-2.1\lib\jmodgen\FileUtils\bin\modgenfileutils.jar]
are in D:\Software\Research_Software\ellipsoids-2.1\install\javaclasspath.txt but not in
current static path.
It can be that C:\Users\DG\AppData\Roaming\MathWorks\MATLAB\R2018a\javaclasspath.txt file contains the same entries
as D:\Software\Research_Software\ellipsoids-2.1\install\javaclasspath.txt.
If that is the case please remove those entries and restart Matlab!
…………………………………………………………………………………………………….
Then I deleted D:\Software\Research_Software\ellipsoids-2.1\install\javaclasspath.txt. Close MATLAB, re-open it, and run s_install.m again. The same results appear as in the beginning. Now I have no idea about this. I would be very grateful if you could give me some advice
from ellipsoids.
Related Issues (20)
- Regularization error in ReachContinuous HOT 6
- Implement the remaining methods of "ellipsoid" class in "GenEllipsoid" class HOT 5
- Cover problem dynamics and problem definition classes with tests HOT 12
- Mac Support? HOT 11
- Problem with legend of plot in Ellipsoid toolbox v 2.01
- Finish getting rid of dependency on Symbolic toolbox and deploy doxygen-based documentation HOT 4
- Fix problem with legend of plot, improve displayed names in legend
- Make it possible to plot 2d and 3d ellipsoids from the same array, make ellipsoid.plot create axes labels, implement typization of graphic objects
- Create more demo examples in documentation
- Create demo for an inverted pendulum on a cart
- Create demo for a pendulum with a flywheel HOT 3
- Create demo for a two-link planar manipulator HOT 1
- Create demo for a safety verification of a controlled cooperative platoon HOT 2
- Create demo for a blending tank with delay
- Add support for Mac HOT 1
- Improve numerically instable code connected to comparisons and CVX
- Improve configuration framework for ET
- Fix test for getRhoBoundary
- problem with installation HOT 2
- installation problem HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ellipsoids.