HP Forums

Full Version: How do I get CAS to evaluate a Python-in-CAS function? (Solved)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
How do I get this function to evaluate...
All I get is the name of the function returned
(The Python string syntax may need correcting too

Code:

CAS file: 
#cas
HAMMINGCAS():=
BEGIN
def hammingdistance(s1, s2) -> int:
    """Return the Hamming distance between equal-length sequences."""
    if len(s1) != len(s2):
        raise ValueError("Undefined for sequences of unequal length.")
    count = 0
    for ii in s1
     el1 = s1(ii)
     el2 = s2(ii)
     if el1 != el2:
      count = count+1
    return count

    """return sum(el1 != el2 for el1, el2 in zip(s1, s2)) """
END;
#end

PPL file:

 EXPORT TRY()
 BEGIN
  LOCAL ST1:="AB";
  LOCAL ST2:="AB";
  RETURN CAS("eval(hammingdist(ST1,ST2))");
 END;

EXPORT HAMMING()
BEGIN
  //def hamming_distance(s1, s2) -> int:
  // """Return the Hamming distance between equal-length sequences."""
  //  if len(s1) != len(s2):
  //      raise ValueError("Undefined for sequences of unequal length.")
  //  return sum(el1 != el2 for el1, el2 in zip(s1, s2))
END;
Remove
HAMMINGCAS():=
BEGIN
and
END;
Then check your function from the shell.
Your loop is incorrect, it should be for ii in range(size(s1)): and you should write s1[ii] and s2[ii] (with 0 starting index, run index:=0 if required)
BTW, this is called hamdist in Xcas.
The function works fine in CAS and PPL shell, and now from PPL

My error was naming the function hamming distance but calling hammingdist.
Fixing that it evaluates as expected.

Code:


CAS:
#cas
def hammingdist(s1, s2) -> int:
    """Return the Hamming distance between equal-length sequences."""
    if len(s1) != len(s2):
        raise ValueError("Undefined for sequences of unequal length.")
    count = 0
    for ii in range(size(s1)):
     if s1[ii] != s2[ii]:
      count = count+1
    return count

    """return sum(el1 != el2 for el1, el2 in zip(s1, s2)) """


PPL:

 EXPORT TRY()
 BEGIN
  LOCAL ST1:="AB";
  LOCAL ST2:="AB";
  PRINT( CAS("(hammingdist(ST1,ST2))") ); 
  PRINT(CAS("sum(N^2,N,1,5)")); //works
  RETURN CAS("(hammingdist(ST1,ST2))");
 END;
Reference URL's