nm

11453 Reputation

20 Badges

13 years, 75 days

MaplePrimes Activity


These are questions asked by nm

I found a big problem.

When adding kernelopts('assertlevel'=2): which I like to have it on all the time to catch (actual) errors, but now Maple server hangs then crashes on what should be no issue at all. 

This happens when I am using an object, which is used at global type. Here is a MWE

restart;

interface(warnlevel=4);
kernelopts('assertlevel'=2);

local ode_type:=module()
    option object;
    export ode;
    local ModuleLoad::static:=()->
           TypeTools:-AddType(':-ode_type', ode_type);
    ModuleLoad()       
end module:

A:=module()
  export foo:=proc()
    C:-foo();
  end proc;

  local B:=module()
    export foo:=proc()
      local ODE::ode_type;
      return ODE;
    end proc;
  end module;

  local C:=module()
    export foo:=proc()
      local the_ode::ode_type;  #THIS CAUSES the hang
                                #using the_ode::':-ode_type'; makes no difference
      #DEBUG
      the_ode:=B:-foo();
    end proc;
  end module;
end module;

There is nothing wrong with the above code as far as I can see. But now A:-foo(); crashes the Maple server.

If I change the line local the_ode::ode_type; to local the_ode; i.e. remove the type on the local variable, it works.

So assert thinks the type being returned is not ode_type

It also works if I remove the assert and keep the type there. Like this

restart;

interface(warnlevel=4);

local ode_type:=module()
    option object;
    export ode; 
    local ModuleLoad::static:=()->
           TypeTools:-AddType(':-ode_type', ode_type);
    ModuleLoad()       
end module:

A:=module()
  export foo:=proc()
    C:-foo();
  end proc;

  local B:=module()
    export foo:=proc()
      local ODE::ode_type;
      return ODE;
    end proc;
  end module;

  local C:=module()
    export foo:=proc()
      local the_ode::ode_type;  #NOW IT WORKS
      the_ode:=B:-foo();
    end proc;
  end module;
end module;

In my actual code, when I remove the kernelopts('assertlevel'=2); I do get correct final output. So it is not like I am bypassing some wrong code or something. The code works as expected.

Now now I have two choices, either remove  kernelopts('assertlevel'=2); or remove the type from the defintion of the local variables, when the type of object defined as above.

edit

another version below. When I copied the code above from my .mpl files to the worksheet to make a MWE, there was a local next to the object module (because that is how it is in my main code), and I did not notice it at first.

When I removed it to make new MWE in the worksheet, an error still shows up. But now Maple server do not hang/crash but it still does not like the assignment being made. So here is another version

restart;
interface(warnlevel=4);
kernelopts('assertlevel'=2):


ode_type:=module()  #note that local ode_type:=module()  crashes Maple.
    option object;
    export ode; #can be list      
    local ModuleLoad::static:=()->
           TypeTools:-AddType(':-ode_type', ode_type);
    ModuleLoad()       
end module:

A:=module()
  export foo:=proc()
    C:-foo();
  end proc;

  local B:=module()
    export foo:=proc()
      local ODE::ode_type;
      return ODE;
    end proc;
  end module;

  local C:=module()
    export foo:=proc()
      local the_ode::ode_type;
      #DEBUG();
      the_ode:=B:-foo();
    end proc;
  end module;
end module;

And now A:-foo(); do not crash the server, but still gives error

     Error, (in foo) assertion failed in assignment to the_ode, expected ode_type, got ODE

Why? since ODE is of type ode_type, and I am returning. Can one not return Object like this? 

Is there something I am doing wrong?

 

 

is it possible for a string such as "res:=boo()" to be evaluated after calling parse, and have res have the value that the function boo() returned?

Now, it does not work. I must do   res:=eval(parse("boo()")) , meaning the result of the call to boo() is outside the string.

Here is an example of what I mean

boo:=proc()
   return 99;
end proc;  

foo:=proc()
  local s,res,i;
  s:="res:=boo()";
  eval(parse(s)):
  print(res);
end proc;

foo();

The above does not work. It displays res but this works

boo:=proc()
   return 99;
end proc;  

foo:=proc()
  local s,res,i;
  s:="boo()";
  res:=eval(parse(s)):
  print(res);
end proc;

foo();

The above works, and prints 99.

The reason I am asking, is that I was thinking of storing in a data base the complete Maple command as string, along with the LHS of the call, and just load the string the evaluate it, and it will have res automatically set.

It is no problem if this can't work, I could always just eval the command itself, without the assignment being there. Just thought to ask if there is a way.

 

I have about 30 modules under one root common module.  The total code is about 25,000 lines.

Currently during development, when I change a line of code and want to run a test, I just do

interface(warnlevel=4);
kernelopts('assertlevel'=2):
read   "my_root_module.mpl";
#run some test 

From a worksheet. This works fine, but it is very slow. it takes now about 8-10 minutes to finish each time.

So each time I make small change to the source code, which all sit in separate .mpl plain text files, I have to wait and wait for the read to complete.

This is way too slow. 

The thing is, my my_root_module.mpl files includes child modules (using the $include directive), and each child module might also have $include to pull in its own child modules, if any. Each module is onbe separate .mpl file.

So at the end my_root_module.mpl will end up reading all the code, which is now about 25,000 lines over 30 or so modules. Here is an example of the layout I have

my_root_module.mpl
=======
export my_root_module:=module()
$include  "B.mpl"   
$include  "C.mpl"                            
$include  "D.mpl"   
   export foo:-proc()....     B:-foo().... end proc;
end module:

B.mpl
=======
local B:=module()
$include  "B1.mpl"   
$include  "B2.mpl"                            

   export foo:=proc()..... end proc;
end module:

C.mpl
=======
local C:=module()
$include  "C1.mpl"   

   export foo:=proc()..... end proc;
end module:

etc...

There must be faster way to do this. Having to wait about 10 minutes each time to test one small code change each time is not practical.

What do others do when they develope large code in Maple? Is this a typical time?

I do not want to break my main modules into separate name spaces again in order to  use separate mla for each module, so that my changes only affects one mla file.  This will speed things, as I would then only have to rebuild one small modules, the one I changed.

But I want to put all my modules under one common module, which acts just as a common name space, and have only one mla file.

Are there ways to speed  reading mpl file?

Edit

Thanks to all the answers. It turned out indeed to be the slow Maple GUI again. The option interface(prettyprint= 0) did not help in the worksheet to speed the GUI.

I wrote the commands to read the mpl file and build the mla in a file, and used the DOS command line, and turned off the warning messages using DOS option, and now it finished almost instantly.

"C:\Program Files\Maple 2021\bin.X86_64_WINDOWS\cmaple.exe" UPDATE_MLA.mpl 1> nul

    memory used=18.6MB, alloc=73.3MB, time=0.52

Notice, in the above 1>nul will not even display the warning messages on the terminal. 2>nul does not work, since these are not error messages. Here are the different redirection options from the net

 

But even without using this redirection, and keeping the messages scroll on the terminal, it was still very very fast from the command line

I complained about how slow the Maple Java GUI when it comes to scrolling and how it can can cause  slow down many times before, so will not complain again about. May be one day Maplesoft will fix this.

I noticed PDEtools:-Solve hangs sometimes on some input where solve does not. When I change the solver for PDEtools:-Solve to use solve, it did not hang.

This means PDEtools:-Solve default solver is something else. I did not see what it is by looking at help.

Here is an example

restart;
eq:=[1/3*(-334*I*(-4807763*I+27000*I*2^(1/2)+60*(1746675+72116445*2^(1/2))^(1/2))^(1/3)-2*(-4807763*I+27000*I*2^(1/2)+60*(1746675+72116445*2^(1/2))^(1/2))^(2/3)+56978)/(-4807763*I+27000*I*2^(1/2)+60*(1746675+72116445*2^(1/2))^(1/2))^(1/3)*v[1]-20*I*2^(1/2)*v[2] = 0, (-18000*I*2^(1/2)+33400*I-40*(1746675+72116445*2^(1/2))^(1/2)-40*(-167*I*(1746675+72116445*2^(1/2))^(1/2)+75150*2^(1/2)+10*(-4807763*I+27000*I*2^(1/2)+60*(1746675+72116445*2^(1/2))^(1/2))^(2/3)+145445)/(-4807763*I+27000*I*2^(1/2)+60*(1746675+72116445*2^(1/2))^(1/2))^(1/3))/(167*I*(-4807763*I+27000*I*2^(1/2)+60*(1746675+72116445*2^(1/2))^(1/2))^(1/3)+(-4807763*I+27000*I*2^(1/2)+60*(1746675+72116445*2^(1/2))^(1/2))^(2/3)-28489)*v[2]-20*I*2^(1/2)*t = 0];

solve(eq,[v[1],v[2]]); #OK
PDEtools:-Solve(eq,[v[1],v[2]],solver=solve); #OK
PDEtools:-Solve(eq,[v[1],v[2]]); #hangs

 

Maple 2021

I am merging two separate modules  B,C to be child modules inside one main A module.

Now, I found the code breaks, because uses does not work any more.

Before merging, C module did uses B. But now this gives an error when both B,C sit inside one parent module.  An example make this easier to explain

restart;
interface(warnlevel=4);
kernelopts('assertlevel'=2):

A:=module()

   export B:=module()
     export foo:=proc()
         print("In B:-foo()");
     end proc;
   end module;

   export C:=module()
      uses B; #this cases problem
      export boo:=proc()
           foo();
      end proc;
   end module;
end module;

Error, (in A:-C) no bindings were specified or implied

Changing uses B; to uses A:-B; does not help. I get error Error, (in A:-C) `A` does not evaluate to a module

I also tried uses :-A:-B; , now this does not give error, but it does not work. i.e. when doing  A:-C:-boo() Maple does not end up calling foo() inside module B as expected.

One way to avoid all this, is not to use uses B inside the module and do this instead

A:=module()

   export B:=module()
     export foo:=proc()
         print("In B:-foo()");
     end proc;
   end module;

   export C:=module()      
      export boo:=proc()
           B:-foo(); 
      end proc;
   end module;
end module;

But it means I have to now change lots of code inside the C module, and add an explicit B:- everywhere

This is how it was before the merging

B:=module()
   export foo:=proc()
       print("In B:-foo()");
   end proc;
end module;

C:=module()  
  uses B;    #no problem now
  export boo:=proc()
      foo();  #this now uses B:-foo() automatically due to uses.
  end proc;
end module;

The above works. Now I can do C:-boo() and it works as expected.

The question is: How to make it work after moving both C and B inside one parent module so I do not have to change lots of code? I tried many things, but can't get it to work.

Maple 2021 on windows 10

Edit

Thanks for the answers below. I think I have to change my code then either way to add a prefix to the call. I actually always use the long form of the call for everything as in module:-function() but for one function, which I use so much everywhere, using the fully qualified name would make things hard to read.  This function converts Maple expressions to Latex after some filtering. Here is an example

cat(",toX(y),"' = f_0(",toX(f),")",toX(y),"+f_1(",toX(x),")",toX(g),"^n \\tag{2}, etc.....")

Now the function toX comes from one module, the one I had uses for it. Now I have to change the above to becomes

",module_name:-toX(f),"' = f_0(",module_name:-toX(x),")",module_name:-toX(y),"+f_1(",module_name:-toX(x),")",module_name:-toX(g),"^n \\tag{2}

Since my strings are very long as it is, (program generates Latex on the fly as it runs), this will make them even longer and harder to read.

But I can change all this in the editor, using global search and replace.

I was just hoping I do not have to just because I moved the modules all into one main module. I still do not understand why Maple does not allow uses when moving the modules inside one bigger module, but I guess this is by design.

First 89 90 91 92 93 94 95 Last Page 91 of 201