Changeset 16349


Ignore:
Timestamp:
12/07/18 19:51:23 (6 months ago)
Author:
gkronber
Message:

#2915: added abs, cube, cuberoot, aq to native interpreter (does not produce exactly the same results as the BatchInterpreter)

Location:
branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/README.md

    r16274 r16349  
    1111- Visual Studio
    1212
    13     `cmake -G "Microsoft Visual Studio 15 2017 [arch]" <path-to-repository>`. Leave `arch` empty for x86 or `Win64` for x64.
     13    `cmake -G "Visual Studio 15 2017 [arch]" <path-to-repository>`. Leave `arch` empty for x86 or `Win64` for x64.
    1414   
    1515    `cmake --build . --config Release`
  • branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/instruction.h

    r16269 r16349  
    2323    Root = 23,
    2424    Square = 28,
    25     Sqrt = 29
     25    Sqrt = 29,
     26    Absolute = 48,
     27    AnalyticalQuotient = 49,
     28    Cube = 50,
     29    CubeRoot = 51
    2630};
    2731
  • branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/interpreter.h

    r16274 r16349  
    1212        switch (in.opcode)
    1313        {
     14            case OpCodes::Const: /* nothing to do */ break;
    1415            case OpCodes::Var:
    1516                {
     
    105106                    break;
    106107                }
     108            case OpCodes::Square:
     109                {
     110                    in.value = std::pow(code[in.childIndex].value, 2.);
     111                    break;
     112                }
     113            case OpCodes::CubeRoot:
     114                {
     115                    in.value = std::pow(code[in.childIndex].value, 1./3.);
     116                    break;
     117                }
     118            case OpCodes::Cube:
     119                {
     120                    in.value = std::pow(code[in.childIndex].value, 3.);
     121                    break;
     122                }
     123            case OpCodes::Absolute:
     124                {
     125                    in.value = std::abs(code[in.childIndex].value);
     126                    break;
     127                }
     128            case OpCodes::AnalyticalQuotient:
     129                {
     130                    double x = code[in.childIndex].value;
     131                    double y = code[in.childIndex + 1].value;
     132                    in.value = x / std::sqrt(1 + y*y);
     133                    break;
     134                }
     135            default: in.value = NAN;
    107136        }
    108137    }
     
    131160                    break;
    132161                }
     162            case OpCodes::Const: /* nothing to do because buffers for constants are already set */ break;
    133163            case OpCodes::Add:
    134164                {
     
    222252            case OpCodes::Square:
    223253                {
    224                     square(in.buf, code[in.childIndex].buf);
    225                     break;
    226                 }
    227         }
     254                    pow(in.buf, code[in.childIndex].buf, 2.);
     255                    break;
     256                }
     257            case OpCodes::Sqrt:
     258                {
     259                    pow(in.buf, code[in.childIndex].buf, 1./2.);
     260                    break;
     261                }
     262            case OpCodes::CubeRoot:
     263                {
     264                    pow(in.buf, code[in.childIndex].buf, 1./3.);
     265                    break;
     266                }
     267            case OpCodes::Cube:
     268                {
     269                    pow(in.buf, code[in.childIndex].buf, 3.);
     270                    break;
     271                }
     272            case OpCodes::Absolute:
     273                {
     274                    abs(in.buf, code[in.childIndex].buf);
     275                    break;
     276                }
     277            case OpCodes::AnalyticalQuotient:
     278                {
     279                    load(in.buf, code[in.childIndex].buf);
     280                    analytical_quotient(in.buf, code[in.childIndex + 1].buf);
     281                    break;
     282                }
     283            default: load(in.buf, NAN);
     284            }
    228285    }
    229286}
  • branches/2915-AbsoluteSymbol/HeuristicLab.ExtLibs/HeuristicLab.NativeInterpreter/0.1/NativeInterpreter-0.1/src/vector_operations.h

    r16274 r16349  
    5353inline void inv(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = 1. / b[i]; }
    5454inline void neg(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = -b[i]; }
     55inline void abs(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] = std::abs(b[i]); }
     56inline void analytical_quotient(double* __restrict a, double const * __restrict b) noexcept { FOR(i) a[i] /= hl_sqrt(b[i]*b[i] + 1.); }
    5557
    5658// vector - scalar operations
     
    6062inline void mul(double* __restrict a, double s) noexcept { FOR(i) a[i] *= s; }
    6163inline void div(double* __restrict a, double s) noexcept { FOR(i) a[i] /= s; }
     64inline void pow(double* __restrict dst, double const * __restrict src, double s) noexcept { FOR(i) dst[i] = hl_pow(src[i], s); }
    6265
    6366// vector operations
Note: See TracChangeset for help on using the changeset viewer.