Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

For Review : Basic Trace features and entropy function in density #1333

Merged
merged 24 commits into from Jul 1, 2012

Conversation

Projects
None yet
6 participants
@gdevanla
Copy link
Contributor

gdevanla commented Jun 7, 2012

This PR is just to review the overall design of Trace operation. The current version only implements full trace and ignore the indices used while creating Tr object for partial traces.

I have comments in function that needs to be reviewed by implementation is crystallized.

@gdevanla

This comment has been minimized.

Copy link
Contributor Author

gdevanla commented Jun 7, 2012

@flacjacket @ellisonbg @certik Please review this pull request. This PR is purely for review and will help me with your comments.

Note, that I have created some shell functions and also put in some implementation that may not work in all cases. I look forward to such corrections.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 7, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYwu0aDA

Interpreter: /opt/pym32/bin/python2.5 (2.5.6-final-0)
Architecture: Linux (32-bit)
Cache: yes
Test command: setup.py test
master hash: 3920a39
branch hash: 1b227dcb7463669051968b89b4cd1fecde1fd842

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 7, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYxrsbDA

Interpreter: /usr/bin/python2.7 (2.7.2-final-0)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: 3920a39
branch hash: 1b227dcb7463669051968b89b4cd1fecde1fd842

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 7, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sY1L4aDA

Interpreter: /usr/bin/python3 (3.2.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: 3920a39
branch hash: 1b227dcb7463669051968b89b4cd1fecde1fd842

Automatic review by SymPy Bot.

@ellisonbg

View changes

sympy/core/trace.py Outdated
indices = args[2] if len(args) == 3 else -1 #-1 indicates full trace

if isinstance(expr, Matrix):
return Expr.__new__(cls, expr, indices)

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

For the Matrix case, we should just compute the actual trace. The problem with Matrix is that it is not a subclass of sympy.Basic so it can't go into args.

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

The same probably goes for any scipy or numpy matrix formats. I'm not sure how much use these get in SymPy outside of the quantum module, but it would be nice to have somewhere.

This comment has been minimized.

@gdevanla

gdevanla Jun 8, 2012

Author Contributor

Since, trace is under core, it does not have any reference to scipy or numpy related classes defined in quantum/matrixutils.py. If I need to check for the args type in trace.py I will have to add a reference, which probably we should not do at this level.

Any suggestions on how to approach this? One alternative is to add _eval_trace() and let the doit() workflow take care of it. but that would not be consistent with Matrix behavior. I will think of something meanwhile, till I get some suggestions.

This comment has been minimized.

@ellisonbg

ellisonbg Jun 8, 2012

Member

You could use hasattr to see if the object being passed in has a method with the right name. We could simply look up the method names of the numpy/scipy.sparse trace methods.

@ellisonbg

View changes

sympy/core/trace.py Outdated

if isinstance(expr, Matrix):
return Expr.__new__(cls, expr, indices)
elif isinstance(expr, Add):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

Maybe a list comprehension like Add(*[Tr(arg,indices) for arg in expr.args])

@ellisonbg

View changes

sympy/core/trace.py Outdated
else:
return Mul(*c_part)*Expr.__new__(cls, Mul(*nc_part), indices)
elif isinstance(expr, Pow):
return expr

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

This should be Expr.__new__(*args) right?

This comment has been minimized.

@gdevanla

gdevanla Jun 8, 2012

Author Contributor

Yes, will fix it.

@ellisonbg

View changes

sympy/core/trace.py Outdated

"""

if (isinstance(self.args[0], Matrix)):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

Remove the Matrix handling here as it will always be handled by __new__.

@ellisonbg

View changes

sympy/core/trace.py Outdated
else: # call _eval_trace based on argument type
if hasattr(self.args[0], '_eval_trace'):
return self.args[0]._eval_trace()
raise NotImplementedError("%s.%s is not found" % \

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

It should probably just return self instead of raising.

@ellisonbg

View changes

sympy/core/trace.py Outdated
inst = Expr.__new__(cls, expr, indices)
return inst

def doit(self):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

Please add **kwargs handling to doit and pass those to _eval_trace.

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

You should call .doit() on whatever you return, I think this is controlled by a deep kwarg, which is True by default, you can check the doit method in Basic or Expr to double check that.

This comment has been minimized.

@gdevanla

gdevanla Jun 10, 2012

Author Contributor

I am just returning a Tr in case I don't find _eval_trace. So, I couldnt possible do a doit() on Tr again.

This comment has been minimized.

@flacjacket

flacjacket Jun 10, 2012

Member

I misspoke, what I meant to say is you should call the doit on the args of whatever you return.

@ellisonbg

View changes

sympy/core/trace.py Outdated
return self.args[0].trace()
else: # call _eval_trace based on argument type
if hasattr(self.args[0], '_eval_trace'):
return self.args[0]._eval_trace()

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

We need some logic here to trigger the calling of Density.doit to get the density operator into a sum of OuterProducts. Also, in general doit tends to be recursive. But I see you are calling doit below in Density._eval_trace. Hmm, not sure how to handle this.

@ellisonbg

View changes

sympy/physics/quantum/density.py Outdated
result = result + mul.args[0]*mul.args[1]._eval_trace()
return result
else: # only one mul expr
if ( isinstance(expr.args[1], Operator)):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

What if it is a scalar*Operator?

@ellisonbg

View changes

sympy/physics/quantum/density.py Outdated
return expr.args[1]._eval_trace()


def entropy(density):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

Do you think this should be a method of Density?

This comment has been minimized.

@gdevanla

gdevanla Jun 8, 2012

Author Contributor

I went back and forth on this. Currently, the entropy function also handles cases where the object is of type 'numpy' or 'scipy.sparse'. Therefore, I left it out of the object.

If it belongs to the density object, we need to decide how to handle the numpy/scipy.sparse types and how they could use this function.

This comment has been minimized.

@ellisonbg

ellisonbg Jun 8, 2012

Member

But there shouldn't be any problem with custom numpy/scipy.sparse logic in density.py though right?

This comment has been minimized.

@gdevanla

gdevanla Jun 8, 2012

Author Contributor

Yes, we don't have any problem with this being in density.py

I also have the test cases for numpy/scipy.parse in the test scripts.

@ellisonbg

View changes

sympy/physics/quantum/operator.py Outdated
@@ -215,6 +219,10 @@ def _eval_power(self, exp):
else:
return Operator._eval_power(self, exp)

def _eval_trace(self):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

We don't need this here if the raising is in the base Operator class.

@ellisonbg

View changes

sympy/physics/quantum/operator.py Outdated
@@ -175,6 +175,10 @@ def _eval_inverse(self):
# TODO: make non-commutative Exprs print powers using A**-1, not 1/A.
return self**(-1)

def _eval_trace(self):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

I think this can even be missing in the base Operator class as the Tr.doit method will not call it i it doesn't exist.

@@ -353,6 +364,14 @@ def _represent(self, **options):
b = self.bra._represent(**options)
return k*b

def _eval_trace(self,**kwargs):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

Make sure **kwargs is handled properly everywhere.

#For now eval at default basis

# is it efficient to represent each time
# to do a trace?

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

It is N**2 work rather than N. We just need the diagonal elements. I think we have a way of getting the basis kets and then we could do the diagonal inner products and sum ourselves. But, someclasses might have custom representation logic to handle more cases and I am guessing that is the case here. Maybe @flacjacket can comment on the best way to compute this here.

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

There currently isn't a way to get out basis states, since they're just |j,m> for m in (-j,j), whenever I needed basis states, I just generated them. Most of the custom logic went into states rather than operators, so there isn't a great method of getting the basis class. There is an .basis property for the spin operators, but it is a string used for doing .rewrite when applying states in non-default bases. I'd thought about trying to dovetail something that would give basis states for discrete bases into Tomo's represent stuff when that was merged. There are matrix_element methods, but those are only defined for the default basis, so generalizing them to change of basis would be tricky.

If the .basis property could be worked into a Ket, that might be used to generate the diagonal elements and easily allow for a different basis to be defined by the kwargs for doing the trace. That would at least work for most cases without having to do anything with getting such functionality into the represent PR.

This comment has been minimized.

@gdevanla

gdevanla Jun 10, 2012

Author Contributor

I have not addressed this yet on the newly updated PR. Does this PR need to have it or can this be in the next iteration, when I fix **kwargs.

So, should I handle this add assume basis set could be passed with **kwargs?

@@ -957,6 +966,20 @@ def _eval_innerproduct_JzBra(self, bra, **hints):
result *= KroneckerDelta(self.j, bra.j) * KroneckerDelta(self.m, bra.m)
return result

def _eval_trace(self, bra, **hints):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

Isn't _eval_trace handled above?

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

@ellisonbg This is for SpinState rather than SpinOpBase.

@ellisonbg

View changes

sympy/core/trace.py Outdated
result = Add(result, Tr(arg, indices))
return result
elif isinstance(expr, Mul):
c_part, nc_part = expr.args_cnc()

This comment has been minimized.

@ellisonbg

ellisonbg Jun 7, 2012

Member

For the Mul case we need to cyclically permute the args so that the "smallest" arg is first. This will always make sure the traces are put into a canonical form, which enables comparisons.

This comment has been minimized.

@gdevanla

gdevanla Jun 8, 2012

Author Contributor

@ellisonbg My understanding is the Mul is doing this already. For example:

a, b, d, Y = symbols('a b c d Y')
A, B = symbols('A B C D', commutative=False)
Tr(d_a_A_B_b_2_Y) is permuted as 2_Y_a_b_d_Tr(A_B)

Is this what was expected?

This comment has been minimized.

@ellisonbg

ellisonbg Jun 8, 2012

Member

No, more like this:

a, b, c = symbols('a b c')
A, B, C = symbols('A B C', commutative=False)
Tr(a*b*c*C*A*B) -> a*b*c*Tr(A*B*C)

The important thing is that C*A*B is cyclically permuted to A*B*C because A<B<C. You have the find the "smallest" element and put it first (only running through cyclic permutations to get there).

@flacjacket

View changes

sympy/core/trace.py Outdated


"""
expr = args[1]

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

args[0] (unless I'm missing something)

@flacjacket

View changes

sympy/core/trace.py Outdated

"""

@classmethod

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

Ah, __new__ doesn't need to be a classmethod, that's what's giving you the class in args and why you need to use args[1]

@flacjacket

View changes

sympy/physics/quantum/density.py Outdated
@@ -171,3 +171,65 @@ def _print_operator_name_latex(self, printer, *args):

def _print_operator_name_pretty(self, printer, *args):
return prettyForm(u"\u03C1")

def _eval_trace(self, **kwargs):
expr = self.doit(); # get sum of scalars*OuterProduct

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

After this, you can probably do a Tr(expr).doit(), then all the handling of splitting up Add's/Mul's/etc can be handled there.

This comment has been minimized.

@gdevanla

gdevanla Jun 10, 2012

Author Contributor

Great idea. Thx.

# OR

# Inner product of |i><j| = Trace(Outer Product).
# we could just use this unless there are cases when this is not true

This comment has been minimized.

@flacjacket

flacjacket Jun 7, 2012

Member

Without dealing with change of basis, I think it's <i|j> + <j|i>. For change of basis cases, you might want to handle the rewrites in OuterProduct so this could be kept simple (2 * KroneckerDelta(i, j) for states in the same basis and the trace in the same basis) and the change of basis stuff can done more generally for any states (not just spin).

This comment has been minimized.

@gdevanla

gdevanla Jun 7, 2012

Author Contributor

@flacjacket I did not get your train of thought here. Could you please elaborate a little more(or IRC?).

Could you also say what you meant by trace in the same basis.
Also, can you refer me to examples when inner_products = Tr(outerproduct) fails. I think I am being ignorant of some behavior of states here.

This comment has been minimized.

@flacjacket

flacjacket Jun 8, 2012

Member

So I may have been wrong about this. What I was thinking was, say you have an outer product JzKet(1, 1) * JzBra(1, 1). If you take the trace in the Jz basis, Sum( JzBra(1, m) * JzKet(1, 1) * JzBra(1, 1) * JzKet(1, m), (m, -1, 1)) ,it's clearly just 1. What I was thinking is that if you evaluated the trace in a different basis, e.g. the Jx basis Sum( JxBra(1, m) * JzKet(1, 1) * JzBra(1, 1) * JxKet(1, m), (m, -1, 1)), it would be different, but since you use the rotation operator to evaluate those inner products and the rotation operator is unitary, it doesn't matter if you do it in a different basis like this. At least in spin cases, I couldn't think of anything that wouldn't be handled by just evaluating this inner product.

This comment has been minimized.

@gdevanla

gdevanla Jun 10, 2012

Author Contributor

@flacjacket Thanks for the explanation. So, looks like we can leave it the way it is for now.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 8, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sY4IwbDA

Interpreter: /opt/pym32/bin/python2.5 (2.5.6-final-0)
Architecture: Linux (32-bit)
Cache: yes
Test command: setup.py test
master hash: 0c2f7e0
branch hash: 1b227dcb7463669051968b89b4cd1fecde1fd842

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 8, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sY1r4aDA

Interpreter: /usr/bin/python2.7 (2.7.2-final-0)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: 0c2f7e0
branch hash: 1b227dcb7463669051968b89b4cd1fecde1fd842

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 8, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYq58aDA

Interpreter: /usr/bin/python3 (3.2.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: 0c2f7e0
branch hash: 1b227dcb7463669051968b89b4cd1fecde1fd842

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 10, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sY4Y8aDA

Interpreter: /opt/pym32/bin/python2.5 (2.5.6-final-0)
Architecture: Linux (32-bit)
Cache: yes
Test command: setup.py test
master hash: c0f8840
branch hash: 27a18fbdf83c9472d320076dd1ac4cdd240418f1

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 10, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sY4o8aDA

Interpreter: /usr/bin/python2.7 (2.7.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: c0f8840
branch hash: 27a18fbdf83c9472d320076dd1ac4cdd240418f1

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 10, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYpvUaDA

Interpreter: /usr/bin/python3 (3.2.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: c0f8840
branch hash: 27a18fbdf83c9472d320076dd1ac4cdd240418f1

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 10, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYnqcaDA

Interpreter: /opt/pym32/bin/python2.5 (2.5.6-final-0)
Architecture: Linux (32-bit)
Cache: yes
Test command: setup.py test
master hash: c0f8840
branch hash: 0a3c8abc53eeff1622f452cc4aa082613e372f3e

Automatic review by SymPy Bot.

@travisbot

This comment has been minimized.

Copy link

travisbot commented Jun 27, 2012

This pull request passes (merged b2e82d2 into aa989ce).

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 27, 2012

SymPy Bot Summary: ✳️ All tests have passed.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYteQdDA

Interpreter: /opt/pym32/bin/python2.5 (2.5.6-final-0)
Architecture: Linux (32-bit)
Cache: yes
Test command: setup.py test
master hash: aa989ce
branch hash: b2e82d2

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 27, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYwYseDA

Interpreter: /usr/bin/python2.7 (2.7.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: aa989ce
branch hash: b2e82d2

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 27, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sY14MeDA

Interpreter: /usr/bin/python3 (3.2.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: aa989ce
branch hash: b2e82d2

Automatic review by SymPy Bot.

e = sympify(e)
if isinstance(e, Expr):
if (e.is_Integer or e.is_Float or
e.is_Rational or e.is_Number or

This comment has been minimized.

@flacjacket

flacjacket Jun 28, 2012

Member

Do you need is_Integer, is_Float and is_Rational if you use is_Number?

This comment has been minimized.

@gdevanla

gdevanla Jun 28, 2012

Author Contributor

The is_number() method had to be included since it was called during the caching workflow(from cache.py). I believe the other methods could be implemented if needed by workflow.

Plus, without evaluating the Tr it may not be possible to guess if the values are Integer or Float or Rational.

"""
if hasattr(self.args[0], '_eval_trace'):
return self.args[0]._eval_trace()

This comment has been minimized.

@flacjacket

flacjacket Jun 28, 2012

Member

You need to pass the kwargs here.

This comment has been minimized.

@gdevanla

gdevanla Jun 28, 2012

Author Contributor

In this version, the **kwargs are ignored by all _eval_trace() methods. This is fixed in the next PR.

I believe doit() does not need **kwargs here. So, in the next PR, the function looks like this:

def doit(self): if hasattr(self.args[0], '_eval_trace'): return self.args[0]._eval_trace(indices=self.args[1]) #where args[1], will be a empty list for full trace, or have ints for partial trace.

return self

@flacjacket

This comment has been minimized.

Copy link
Member

flacjacket commented Jun 28, 2012

Other than my couple comments, I think this looks pretty good.

return Tr(self.doit()).doit()


def entropy(density):

This comment has been minimized.

@ellisonbg

ellisonbg Jun 28, 2012

Member

I guess I am leaning towards entropy being a method of the density op class. What do you both think? Oh, but now I remember that we want it to work with Matrices as well. Hmm, maybe let's leave it as a function, but also add a method on the class that calls it?

@ellisonbg

This comment has been minimized.

Copy link
Member

ellisonbg commented Jun 28, 2012

OK, I had just a few minor comments, once those are addressed, I think this is ready to go.

@travisbot

This comment has been minimized.

Copy link

travisbot commented Jun 28, 2012

This pull request fails (merged a2a7ab4 into aa989ce).

@travisbot

This comment has been minimized.

Copy link

travisbot commented Jun 28, 2012

This pull request passes (merged 1b2d36f into aa989ce).

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 28, 2012

SymPy Bot Summary: ✳️ All tests have passed.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYyLIeDA

Interpreter: /opt/pym32/bin/python2.5 (2.5.6-final-0)
Architecture: Linux (32-bit)
Cache: yes
Test command: setup.py test
master hash: 1238e32
branch hash: 1b2d36f

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 28, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sY5tQdDA

Interpreter: /usr/bin/python2.7 (2.7.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: 1238e32
branch hash: 1b2d36f

Automatic review by SymPy Bot.

@Krastanov

This comment has been minimized.

Copy link
Member

Krastanov commented Jun 28, 2012

SymPy Bot Summary: 🔴 There were test failures.

@gdevanla: Please fix the test failures.

Test results html report: http://reviews.sympy.org/report/agZzeW1weTNyDAsSBFRhc2sYybIeDA

Interpreter: /usr/bin/python3 (3.2.3-candidate-2)
Architecture: Linux (64-bit)
Cache: yes
Test command: setup.py test
master hash: 1238e32
branch hash: 1b2d36f

Automatic review by SymPy Bot.

@certik

This comment has been minimized.

Copy link
Member

certik commented Jul 1, 2012

Sounds good. Brian gave +1, so I am merging it.

certik added a commit that referenced this pull request Jul 1, 2012

Merge pull request #1333 from gdevanla/densityop_trace_entropy
For Review : Basic Trace features and entropy function in density

@certik certik merged commit 2dda1c3 into sympy:master Jul 1, 2012

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.