| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-30 08:52:55 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-30 08:52:55 +0200 | 
| commit | d68040d87385c360719e35941ad4f0112d9d0c03 (patch) | |
| tree | 92300e4c84a1476fe7b7bc546e323bd2264273c6 /src/core | |
| parent | 19d1cd96cc2d862869dbb852d663996a1b64bd9d (diff) | |
Fixes random number in choice generation.
Diffstat (limited to 'src/core')
4 files changed, 180 insertions, 4 deletions
| diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 94e013d..f30d433 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -22,6 +22,7 @@ import tonkadur.wyrd.v1.lang.instruction.SetPC;  import tonkadur.wyrd.v1.compiler.util.BinarySearch;  import tonkadur.wyrd.v1.compiler.util.IfElse;  import tonkadur.wyrd.v1.compiler.util.If; +import tonkadur.wyrd.v1.compiler.util.RemoveAt;  import tonkadur.wyrd.v1.compiler.util.IterativeSearch;  import tonkadur.wyrd.v1.compiler.util.CountOccurrences; @@ -949,8 +950,114 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor           )        )        { -         result_as_computation = -            Operation.rand(operands.get(0), operands.get(1)); +         final List<Instruction> push_rand, pop_rand; +         final Register result, zero_holder; + +         push_rand = new ArrayList<Instruction>(); +         pop_rand = new ArrayList<Instruction>(); + +         result = reserve(Type.INT); +         zero_holder = reserve(Type.INT); + +         result_as_computation = result.get_value(); +         result_as_address = result.get_address(); + +         push_rand.add +         ( +            new SetValue +            ( +               result_as_address, +               Operation.rand(operands.get(0), operands.get(1)) +            ) +         ); + +         push_rand.add +         ( +            new SetValue +            ( +               new RelativeAddress +               ( +                  compiler.registers().get_rand_value_holder().get_address(), +                  new Cast +                  ( +                     new Size +                     ( +                        compiler.registers().get_rand_value_holder +                        ( +                        ).get_address() +                     ), +                     Type.STRING +                  ), +                  Type.INT +               ), +               result_as_computation +            ) +         ); + +         pop_rand.add +         ( +            new SetValue +            ( +               result_as_address, +               new ValueOf +               ( +                  new RelativeAddress +                  ( +                     compiler.registers().get_rand_value_holder().get_address(), +                     new Cast(Constant.ZERO, Type.STRING), +                     Type.INT +                  ) +               ) +            ) +         ); + +         pop_rand.add(new SetValue(zero_holder.get_address(), Constant.ZERO)); + +         pop_rand.add +         ( +            RemoveAt.generate +            ( +               compiler.registers(), +               compiler.assembler(), +               zero_holder.get_address(), +               new Size +               ( +                  compiler.registers().get_rand_value_holder().get_address() +               ), +               compiler.registers().get_rand_value_holder().get_address() +            ) +         ); + +         init_instructions.add +         ( +            IfElse.generate +            ( +               compiler.registers(), +               compiler.assembler(), +               Operation.equals +               ( +                  compiler.registers().get_rand_mode_holder().get_value(), +                  Constant.ZERO +               ), +               new SetValue +               ( +                  result_as_address, +                  Operation.rand(operands.get(0), operands.get(1)) +               ), +               IfElse.generate +               ( +                  compiler.registers(), +                  compiler.assembler(), +                  Operation.equals +                  ( +                     compiler.registers().get_rand_mode_holder().get_value(), +                     Constant.ONE +                  ), +                  compiler.assembler().merge(push_rand), +                  compiler.assembler().merge(pop_rand) +               ) +            ) +         );        }        else if        ( diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 42df895..4672f21 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -1379,6 +1379,29 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor           )        ); +      result.add +      ( +         new SetValue +         ( +            compiler.registers().get_rand_mode_holder().get_address(), +            new Constant(Type.INT, "0") +         ) +      ); + +      result.add +      ( +         Clear.generate +         ( +            compiler.registers(), +            compiler.assembler(), +            new Size +            ( +               compiler.registers().get_rand_value_holder().get_address() +            ), +            compiler.registers().get_rand_value_holder().get_address() +         ) +      ); +        compiler.registers().push_hierarchical_instruction_level();        for        ( @@ -1424,6 +1447,15 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        result.add        ( +         new SetValue +         ( +            compiler.registers().get_rand_mode_holder().get_address(), +            new Constant(Type.INT, "1") +         ) +      ); + +      result.add +      (           compiler.assembler().mark_after           (              new SetValue @@ -1468,6 +1500,15 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        result.add        ( +         new SetValue +         ( +            compiler.registers().get_rand_mode_holder().get_address(), +            new Constant(Type.INT, "-1") +         ) +      ); + +      result.add +      (           compiler.assembler().mark_after           (              new SetPC diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index fb3119d..cf23045 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -8,6 +8,9 @@ import tonkadur.wyrd.v1.lang.meta.Instruction;  import tonkadur.wyrd.v1.lang.World;  import tonkadur.wyrd.v1.lang.Register; +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.computation.Constant;  public class SequenceCompiler  {     /* Utility Class */ @@ -122,6 +125,16 @@ public class SequenceCompiler        ic = new InstructionCompiler(compiler); +      compiler.assembler().handle_adding_instruction +      ( +         new SetValue +         ( +            compiler.registers().get_rand_mode_holder().get_address(), +            Constant.ZERO +         ), +         compiler.world() +      ); +        for        (           final tonkadur.fate.v1.lang.meta.Instruction fate_instruction: diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java index 8af7754..653fcbe 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java @@ -37,17 +37,22 @@ public class RegisterManager     protected final Map<String, StackableRegisterContext> context_by_name;     protected final Deque<RegisterContext> context;     protected final RegisterContext base_context, parameter_context; -   protected final Register next_pc, pc_stack, choice_number; +   protected final Register next_pc, pc_stack; +   protected final Register choice_number, rand_mode, rand_value;     protected int created_contexts;     public RegisterManager ()     {        base_context = new RegisterContext("base context");        parameter_context = new RegisterContext("parameter context", ".param."); +        next_pc = base_context.reserve(Type.INT); -      choice_number = base_context.reserve(Type.INT);        pc_stack = base_context.reserve(new MapType(Type.INT)); +      choice_number = base_context.reserve(Type.INT); +      rand_mode = base_context.reserve(Type.INT); +      rand_value = base_context.reserve(new MapType(Type.INT)); +        context_by_name = new HashMap<String, StackableRegisterContext>();        context = new ArrayDeque<RegisterContext>();        created_contexts = 0; @@ -75,6 +80,16 @@ public class RegisterManager        return choice_number;     } +   public Register get_rand_mode_holder () +   { +      return rand_mode; +   } + +   public Register get_rand_value_holder () +   { +      return rand_value; +   } +     public void create_stackable_context (final String context_name)     {        final StackableRegisterContext result; | 


